diff --git a/9.3.5/assets/images/MX_laptop.png b/9.3.5/assets/images/MX_laptop.png index 7a5b456..b86da9d 100644 Binary files a/9.3.5/assets/images/MX_laptop.png and b/9.3.5/assets/images/MX_laptop.png differ diff --git a/9.3.5/assets/images/MX_laptop_ORG.png b/9.3.5/assets/images/MX_laptop_ORG.png new file mode 100644 index 0000000..7a5b456 Binary files /dev/null and b/9.3.5/assets/images/MX_laptop_ORG.png differ diff --git a/docs/9.3.5/assets/images/MX_laptop.png b/docs/9.3.5/assets/images/MX_laptop.png index 7a5b456..b86da9d 100644 Binary files a/docs/9.3.5/assets/images/MX_laptop.png and b/docs/9.3.5/assets/images/MX_laptop.png differ diff --git a/docs/9.3.5/assets/images/MX_laptop_ORG.png b/docs/9.3.5/assets/images/MX_laptop_ORG.png new file mode 100644 index 0000000..7a5b456 Binary files /dev/null and b/docs/9.3.5/assets/images/MX_laptop_ORG.png differ diff --git a/docs/9.3.5/co_configuration_properties.html b/docs/9.3.5/co_configuration_properties.html index 35f567d..ba4552a 100644 --- a/docs/9.3.5/co_configuration_properties.html +++ b/docs/9.3.5/co_configuration_properties.html @@ -5217,7 +5217,7 @@

Configuration properties

nl.\[LOCALE\] - For globalization support of the theme's display name. \[LOCALE\] is the locale code that identifies the language (e.g.,"en", "fr", "fr_CA", "zh").
-After modifying these settings, restart the http task to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect.
+After modifying these settings, restart the Leap server to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect.

Examples:
diff --git a/docs/9.3.5/search/search_index.json b/docs/9.3.5/search/search_index.json index b808765..a9fcc27 100644 --- a/docs/9.3.5/search/search_index.json +++ b/docs/9.3.5/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"index.html","text":"","title":"Introducing Leap"},{"location":"ac_accessibility_features_for_designers.html","text":"Accessibility features for application designers HCL Leap contains accessibility features so users with disabilities can create forms and applications. To make designing forms and applications easier for users with disabilities, Leap has the following keyboard shortcuts: Adding items to your form To add items to your form from the Palette, set focus on the form item with the Tab key and press Enter. The item appears on the form where indicated by a blue line. Focus indicator When a form item has focus the background changes color, and the area that is occupied by the form item is defined by a colored line. Item triggers When an item has focus, you can trigger it by pressing the Enter key or space bar. The browser that you use determines whether you must press the Enter key or space bar. Tab key You can navigate to any visible form item, link, or menu by pressing the Tab key. Tab navigation The Properties side panel contains multiple tabs. To navigate between tabs, use the arrow keys. Tab order of form items When you place items on a form, the tab order is set based on item placement. If you insert a form item before existing items, the tab order is automatically reset. You do not have to manually configure tab order when you insert additional items into a form. Navigating between Palettes You can navigate between the Common, and Specialized palettes. When the focus is on one Palette use any arrow key to collapse the open Palette and expand another one. If you want to switch palettes while focus is on a form item, you must use the Tab key to move to the palette name, then navigate with the arrow keys. You cannot navigate between palettes when a form item has focus. Keyboard commands for common items Leap has three menu items: Save , Preview , and Cancel . The following keyboard commands are available so you do not have to navigate away from your form. Save: Ctrl+s Preview: Ctrl+e Cancel: Ctrl+q When designing forms the Properties side panel contains a box titled \u201cAccessibility - Alternative text ID\u201d. Use this box to provide a text description that is used by accessibility tools to describe the item. The following WAI ARIA attributes are automatically added to form items when you design forms: aria-labelledby and Aria-label are added to fields to associate the correct label with each field. aria-describedby are added to fields where more description is needed to describe the function of a field. aria-required is added to inform a user that the field is mandatory. aria-invalid is added to fields when the value is not valid. aria-alert is used with Aria-invalid in error messages. Screen readers read the Aria-alert text to the user. aria-valuemin and aria-valuemax are used to denote if the file has an acceptable value range. If the value is outside the range, the aria-invalid attribute is set. Parent topic: Accessibility overview","title":"Accessibility features for application designers"},{"location":"ac_accessibility_features_for_designers.html#accessibility-features-for-application-designers","text":"HCL Leap contains accessibility features so users with disabilities can create forms and applications. To make designing forms and applications easier for users with disabilities, Leap has the following keyboard shortcuts:","title":"Accessibility features for application designers"},{"location":"ac_accessibility_features_for_designers.html#adding-items-to-your-form","text":"To add items to your form from the Palette, set focus on the form item with the Tab key and press Enter. The item appears on the form where indicated by a blue line.","title":"Adding items to your form"},{"location":"ac_accessibility_features_for_designers.html#focus-indicator","text":"When a form item has focus the background changes color, and the area that is occupied by the form item is defined by a colored line.","title":"Focus indicator"},{"location":"ac_accessibility_features_for_designers.html#item-triggers","text":"When an item has focus, you can trigger it by pressing the Enter key or space bar. The browser that you use determines whether you must press the Enter key or space bar.","title":"Item triggers"},{"location":"ac_accessibility_features_for_designers.html#tab-key","text":"You can navigate to any visible form item, link, or menu by pressing the Tab key.","title":"Tab key"},{"location":"ac_accessibility_features_for_designers.html#tab-navigation","text":"The Properties side panel contains multiple tabs. To navigate between tabs, use the arrow keys.","title":"Tab navigation"},{"location":"ac_accessibility_features_for_designers.html#tab-order-of-form-items","text":"When you place items on a form, the tab order is set based on item placement. If you insert a form item before existing items, the tab order is automatically reset. You do not have to manually configure tab order when you insert additional items into a form.","title":"Tab order of form items"},{"location":"ac_accessibility_features_for_designers.html#navigating-between-palettes","text":"You can navigate between the Common, and Specialized palettes. When the focus is on one Palette use any arrow key to collapse the open Palette and expand another one. If you want to switch palettes while focus is on a form item, you must use the Tab key to move to the palette name, then navigate with the arrow keys. You cannot navigate between palettes when a form item has focus.","title":"Navigating between Palettes"},{"location":"ac_accessibility_features_for_designers.html#keyboard-commands-for-common-items","text":"Leap has three menu items: Save , Preview , and Cancel . The following keyboard commands are available so you do not have to navigate away from your form. Save: Ctrl+s Preview: Ctrl+e Cancel: Ctrl+q When designing forms the Properties side panel contains a box titled \u201cAccessibility - Alternative text ID\u201d. Use this box to provide a text description that is used by accessibility tools to describe the item. The following WAI ARIA attributes are automatically added to form items when you design forms: aria-labelledby and Aria-label are added to fields to associate the correct label with each field. aria-describedby are added to fields where more description is needed to describe the function of a field. aria-required is added to inform a user that the field is mandatory. aria-invalid is added to fields when the value is not valid. aria-alert is used with Aria-invalid in error messages. Screen readers read the Aria-alert text to the user. aria-valuemin and aria-valuemax are used to denote if the file has an acceptable value range. If the value is outside the range, the aria-invalid attribute is set. Parent topic: Accessibility overview","title":"Keyboard commands for common items"},{"location":"ac_accessibility_features_for_users.html","text":"Accessibility features for application users When given the link to an HCL Leap application, a user is provided with many built in accessibility features. To make using forms and applications easier for users with disabilities, Leap has the following accessibility features and keyboard shortcuts: Screen reader compatibility : Leap is compatible with screen readers that comply with WCAG 2.0 and WAI-ARIA. Some screen readers perform a read through of web pages from start to finish as the default. Tab key : You can navigate to any visible form item, link, or menu by pressing the Tab key. Parent topic: Accessibility overview","title":"Accessibility features for application users"},{"location":"ac_accessibility_features_for_users.html#accessibilityfeaturesforapplicationusers","text":"When given the link to an HCL Leap application, a user is provided with many built in accessibility features. To make using forms and applications easier for users with disabilities, Leap has the following accessibility features and keyboard shortcuts: Screen reader compatibility : Leap is compatible with screen readers that comply with WCAG 2.0 and WAI-ARIA. Some screen readers perform a read through of web pages from start to finish as the default. Tab key : You can navigate to any visible form item, link, or menu by pressing the Tab key. Parent topic: Accessibility overview","title":"Accessibility features for application users"},{"location":"ac_creating_accessible_application.html","text":"Creating an accessible application When you create a form or application, the following information helps you design an accessible form for users with disabilities. HCL Leap is designed to make building accessible forms easy. For example, the tab order of form items is set to start at the first item on the page, and work through consecutive items. You do not have to reset the tab order if you must add items to the beginning of a form. There are several things that you can do to make your forms more accessible to users with disabilities: During the creation of your application, accessibility standards, such as WCAG 2.0 , should be considered with regards to layout and content. Leap does not prevent authors from creating non-accessible forms. When you add items to your form, give each form item a clear description or name. Screen readers read the name that is associated with a form item. You can also use a Text item as a data label instead of the field provided. For more information, see Using a Text item as a label . Add hints to each form item by modifying the Add hint field. The Hint provides more information when read to the user. For example, if your form has a Name field, the hint tells the user your preference for how to enter their given and surnames. Text blocks are not automatically part of the tab order. Screen readers do not put focus on text blocks, and your users might miss vital information. To ensure that text information is not omitted, select the text item, in the properties side panel, select the check box for Add to tab order . The text is added to the tab order, and is read by screen readers. If you add images or media items to your forms, open the Properties side panel and add descriptive text to the Alternative text property. A screen reader uses the alternative text to describe the image or media item to the user. You can add text items to your form and have them associate with other form items. You can use this technique to create formatted titles for your form items. However, you must link the text item and the form item together. For example, you have a Select One item on your form. You want its title to be rich text so it can have a color, background, and format different from the default title. You add the title with the Text form item, which gives the formatting you want. However, the text item is not read by the screen reader, and the user might not know what the choice list represents. To ensure that the Text field is read by a screen reader, go to the choice list Properties side panel. Insert the name of the Text field into the Accessibility \u2013 Alternative label ID field. A screen reader reads the appropriate text for the choice list. When using the new dynamic layout, it might be necessary to group items into Sections to convey the proper meaning to users. For example, when creating a custom label via the alternative text ID option. When using Sections , if a label exists, it provides a navigation landmark using WAI-ARIA that is available to assistive technologies. For more information, WAI_ARIA roles . Using a Text item as a label For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. Parent topic: Creating and managing applications","title":"Creating an accessible application"},{"location":"ac_creating_accessible_application.html#creatinganaccessibleapplication","text":"When you create a form or application, the following information helps you design an accessible form for users with disabilities. HCL Leap is designed to make building accessible forms easy. For example, the tab order of form items is set to start at the first item on the page, and work through consecutive items. You do not have to reset the tab order if you must add items to the beginning of a form. There are several things that you can do to make your forms more accessible to users with disabilities: During the creation of your application, accessibility standards, such as WCAG 2.0 , should be considered with regards to layout and content. Leap does not prevent authors from creating non-accessible forms. When you add items to your form, give each form item a clear description or name. Screen readers read the name that is associated with a form item. You can also use a Text item as a data label instead of the field provided. For more information, see Using a Text item as a label . Add hints to each form item by modifying the Add hint field. The Hint provides more information when read to the user. For example, if your form has a Name field, the hint tells the user your preference for how to enter their given and surnames. Text blocks are not automatically part of the tab order. Screen readers do not put focus on text blocks, and your users might miss vital information. To ensure that text information is not omitted, select the text item, in the properties side panel, select the check box for Add to tab order . The text is added to the tab order, and is read by screen readers. If you add images or media items to your forms, open the Properties side panel and add descriptive text to the Alternative text property. A screen reader uses the alternative text to describe the image or media item to the user. You can add text items to your form and have them associate with other form items. You can use this technique to create formatted titles for your form items. However, you must link the text item and the form item together. For example, you have a Select One item on your form. You want its title to be rich text so it can have a color, background, and format different from the default title. You add the title with the Text form item, which gives the formatting you want. However, the text item is not read by the screen reader, and the user might not know what the choice list represents. To ensure that the Text field is read by a screen reader, go to the choice list Properties side panel. Insert the name of the Text field into the Accessibility \u2013 Alternative label ID field. A screen reader reads the appropriate text for the choice list. When using the new dynamic layout, it might be necessary to group items into Sections to convey the proper meaning to users. For example, when creating a custom label via the alternative text ID option. When using Sections , if a label exists, it provides a navigation landmark using WAI-ARIA that is available to assistive technologies. For more information, WAI_ARIA roles . Using a Text item as a label For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. Parent topic: Creating and managing applications","title":"Creating an accessible application"},{"location":"ac_experience_builder_accessibility.html","text":"Accessibility overview HCL Leap contains a number of built-in accessibility features to make applications easy to create and use by people with disabilities. Leap provides the best accessibility experience when used with the newest release of the browser and the newest release of the screen reader. For more information, see the following URLs: Accessible Rich Internet Applications (WAI-ARIA) 1.0 Web Content Accessibility Guidelines (WCAG) 2.0 Accessibility features for application designers HCL Leap contains accessibility features so users with disabilities can create forms and applications. Accessibility features for application users When given the link to an HCL Leap application, a user is provided with many built in accessibility features.","title":"Accessibility Overview"},{"location":"ac_experience_builder_accessibility.html#experiencebuilderaccessibility","text":"HCL Leap contains a number of built-in accessibility features to make applications easy to create and use by people with disabilities. Leap provides the best accessibility experience when used with the newest release of the browser and the newest release of the screen reader. For more information, see the following URLs: Accessible Rich Internet Applications (WAI-ARIA) 1.0 Web Content Accessibility Guidelines (WCAG) 2.0 Accessibility features for application designers HCL Leap contains accessibility features so users with disabilities can create forms and applications. Accessibility features for application users When given the link to an HCL Leap application, a user is provided with many built in accessibility features.","title":"Accessibility overview"},{"location":"ac_using_text_item_as_label.html","text":"Using a Text item as a label For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. The following instructions describe how to set a text item as the title of a field. For this example, the title is displayed to the left of the field where the user will type information. You can also use these instructions inside a Section, which allows you to format the spacing between the Text item and the Entry Field without affecting the spacing of the rest of your form. Add a Text item to the left column of the grid. The Edit Text Properties side panel opens. Type the title you want to display to users on the form. Copy the information displayed in the ID field. On a new form, where the text item is the first item on the form, the default name is F_Text1. You can change this ID to be any name you want, however each form item must have a unique ID. Add a Single Line Entry , or Multi-Line Entry to the right of the Text item. In the properties side panel, delete the text from the Title field. Go to Data Label and paste the unique ID you copied from the Text field. When you save and preview the form, the text item appears as the label for the entry field. Parent topic: Creating an accessible application","title":"Using a Text item as a label"},{"location":"ac_using_text_item_as_label.html#settingatextitemasalabel","text":"For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. The following instructions describe how to set a text item as the title of a field. For this example, the title is displayed to the left of the field where the user will type information. You can also use these instructions inside a Section, which allows you to format the spacing between the Text item and the Entry Field without affecting the spacing of the rest of your form. Add a Text item to the left column of the grid. The Edit Text Properties side panel opens. Type the title you want to display to users on the form. Copy the information displayed in the ID field. On a new form, where the text item is the first item on the form, the default name is F_Text1. You can change this ID to be any name you want, however each form item must have a unique ID. Add a Single Line Entry , or Multi-Line Entry to the right of the Text item. In the properties side panel, delete the text from the Title field. Go to Data Label and paste the unique ID you copied from the Text field. When you save and preview the form, the text item appears as the label for the entry field. Parent topic: Creating an accessible application","title":"Using a Text item as a label"},{"location":"ad_managing_db2_database.html","text":"Backing up and restoring the DB2 database Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Backing up and restoring data in DB2\u00ae is done using the Backup and Restore commands. If you plan to restore data from a server with a different bit order than the one currently storing the data, you must use the Data Movement Tool. For more information, see Data Movement Tool . Parent topic: Administering Leap","title":"Backing up and restoring the DB2 database"},{"location":"ad_managing_db2_database.html#managingyourdb2database","text":"Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Backing up and restoring data in DB2\u00ae is done using the Backup and Restore commands. If you plan to restore data from a server with a different bit order than the one currently storing the data, you must use the Data Movement Tool. For more information, see Data Movement Tool . Parent topic: Administering Leap","title":"Backing up and restoring the DB2 database"},{"location":"admin_application_dashboard.html","text":"Admin Application Dashboard The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups. An Admin tab will appear in the top banner for users with permission. The page provides information about all the applications on the Leap server. To manage the load on the server, the details are gathered using a timer task that runs at a regular configurable interval (see Application Statistics collection timer in Configuration properties ). The dashboard shows the following: The total number of applications. A breakdown of the applications by status (i.e. running, undeployed). The total number of application records across all applications. A filterable table of all the applications. Clicking on a row in the table reveals additional details about the selected application. The data may be updated by clicking Refresh . The data may be exported to a spreadsheet by clicking Export to spreadsheet . For more information, see Application statistics REST API . Parent topic: Administering Leap","title":"Admin Application Dashboard"},{"location":"admin_application_dashboard.html#admin_application_dashboard","text":"The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups. An Admin tab will appear in the top banner for users with permission. The page provides information about all the applications on the Leap server. To manage the load on the server, the details are gathered using a timer task that runs at a regular configurable interval (see Application Statistics collection timer in Configuration properties ). The dashboard shows the following: The total number of applications. A breakdown of the applications by status (i.e. running, undeployed). The total number of application records across all applications. A filterable table of all the applications. Clicking on a row in the table reveals additional details about the selected application. The data may be updated by clicking Refresh . The data may be exported to a spreadsheet by clicking Export to spreadsheet . For more information, see Application statistics REST API . Parent topic: Administering Leap","title":"Admin Application Dashboard"},{"location":"administering_leap.html","text":"Administering Leap The following topics contain information on administering Leap. Backing up and restoring the DB2 database Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Strict CSP HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Admin Application Dashboard The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups.","title":"Administering"},{"location":"administering_leap.html#administering_leap","text":"The following topics contain information on administering Leap. Backing up and restoring the DB2 database Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Strict CSP HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Admin Application Dashboard The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups.","title":"Administering Leap"},{"location":"app_stats_restapi.html","text":"Application statistics REST API Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Statistics are collected by a timer task which can be configured by an administrator using Configuration properties . Authentication All REST API calls must be made as an authenticated user in Administrator or Super Administrator role. If you want to exercise the API with code, you may use basic authentication. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string. REST actions The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb ActionName /apps-basic/secure/org/admin/apps GET list /apps-basic/secure/org/admin/apps/{app-uid} GET app detail Note: app-uid is the UID of the application. List This action retrieves a list of all apps, available query parameters: forceRefresh : executes statistics collection on all apps. Default value: false includeForms : whether includes app forms information in response. Default value: false includeAdmins : whether includes app administrators information in response. Default value: false format : (case sensitive) acceptable values: json, application/json, xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet filename : only used when pFormat is set to xlsx format. The file extension has to be xlsx. Note: When the format is an open document and a file is downloaded, if the file name is not set, the default file name is app.xlsx. App detail This action retrieves the details for a single app. Parent topic: REST API reference","title":"Application statistics REST API"},{"location":"app_stats_restapi.html#app_stats_restapi","text":"Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Statistics are collected by a timer task which can be configured by an administrator using Configuration properties . Authentication All REST API calls must be made as an authenticated user in Administrator or Super Administrator role. If you want to exercise the API with code, you may use basic authentication. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string. REST actions The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb ActionName /apps-basic/secure/org/admin/apps GET list /apps-basic/secure/org/admin/apps/{app-uid} GET app detail Note: app-uid is the UID of the application.","title":"Application statistics REST API"},{"location":"app_stats_restapi.html#section_p5n_2bc_kyb","text":"This action retrieves a list of all apps, available query parameters: forceRefresh : executes statistics collection on all apps. Default value: false includeForms : whether includes app forms information in response. Default value: false includeAdmins : whether includes app administrators information in response. Default value: false format : (case sensitive) acceptable values: json, application/json, xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet filename : only used when pFormat is set to xlsx format. The file extension has to be xlsx. Note: When the format is an open document and a file is downloaded, if the file name is not set, the default file name is app.xlsx.","title":"List"},{"location":"app_stats_restapi.html#section_qwb_qbc_kyb","text":"This action retrieves the details for a single app. Parent topic: REST API reference","title":"App detail"},{"location":"as_assigning_users_or_groups_to_roles.html","text":"Assigning users or groups to roles Give the users in your organization permission to work with the data relevant to them by assigning them roles. After you establish roles for the users in your organization, you can start assigning users to those roles by adding them individually, or in groups using the Access tab in HCL Leap. For example, you can assign users or groups as defined in your LDAP to Roles . You can use the search to find users and groups within your company directory, or database. There are several predefined groups from which to choose: All Authenticated Users Any user who is authenticated with your organization. Anonymous Users Any user who you want to work anonymously with the application. Invited Users Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Note: Requires allowed anonymous access. Instance Creator The user who submitted a form. Note: You cannot add All Authenticated Users to any role that has application Edit permissions. This prevents the applications from all other users from appearing in your Manage tab, making your applications easier to find. This also prevents your application from appearing on the Manage page for every other authenticated user. To add users from predefined groups: In the Access tab, go to the navigation tree and click the role you want to assign in the Assign Users menu. The Assign Users window opens. Add new usersor groups, or select from a predefined group: To create new usersor groups, enter the name of an individual useror group. Select it, then click the Add user plus sign. Note: There is a limit to the length of a single user name, or ID. The limit varies by language and character set. For example, the English limit is 256 characters. If you exceed the character limit, you are shown an error message when you attempt to save the form. To use an existing group, select the group and click the Add group plus sign. The Role Members window shows the members that are assigned to the role. You can remove members from a role by clicking Delete user for the name of the member., or run a test to see whether Leap can find the member. To remove a member from a group, click Delete group for the name of the member. To test if Leap can find a group member, click Validate . Parent topic: Securing","title":"Assigning users or groups to roles"},{"location":"as_assigning_users_or_groups_to_roles.html#assigning-users-or-groups-to-roles","text":"Give the users in your organization permission to work with the data relevant to them by assigning them roles. After you establish roles for the users in your organization, you can start assigning users to those roles by adding them individually, or in groups using the Access tab in HCL Leap. For example, you can assign users or groups as defined in your LDAP to Roles . You can use the search to find users and groups within your company directory, or database. There are several predefined groups from which to choose:","title":"Assigning users or groups to roles"},{"location":"as_assigning_users_or_groups_to_roles.html#all-authenticated-users","text":"Any user who is authenticated with your organization.","title":"All Authenticated Users"},{"location":"as_assigning_users_or_groups_to_roles.html#anonymous-users","text":"Any user who you want to work anonymously with the application.","title":"Anonymous Users"},{"location":"as_assigning_users_or_groups_to_roles.html#invited-users","text":"Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Note: Requires allowed anonymous access.","title":"Invited Users"},{"location":"as_assigning_users_or_groups_to_roles.html#instance-creator","text":"The user who submitted a form. Note: You cannot add All Authenticated Users to any role that has application Edit permissions. This prevents the applications from all other users from appearing in your Manage tab, making your applications easier to find. This also prevents your application from appearing on the Manage page for every other authenticated user. To add users from predefined groups: In the Access tab, go to the navigation tree and click the role you want to assign in the Assign Users menu. The Assign Users window opens. Add new usersor groups, or select from a predefined group: To create new usersor groups, enter the name of an individual useror group. Select it, then click the Add user plus sign. Note: There is a limit to the length of a single user name, or ID. The limit varies by language and character set. For example, the English limit is 256 characters. If you exceed the character limit, you are shown an error message when you attempt to save the form. To use an existing group, select the group and click the Add group plus sign. The Role Members window shows the members that are assigned to the role. You can remove members from a role by clicking Delete user for the name of the member., or run a test to see whether Leap can find the member. To remove a member from a group, click Delete group for the name of the member. To test if Leap can find a group member, click Validate . Parent topic: Securing","title":"Instance Creator"},{"location":"as_assigning_users_to_maintain_the_application.html","text":"Assigning users to maintain the application To define who can edit an HCL Leap application, use the design settings in the Access tab. By default, only administrators can edit and maintain an application. However, you can also assign other roles to do the task. In the Manage tab, an administrator can grant permission for other users to edit applications. To change who can edit an application, click Design Settings in the Access tab. The Design Settings table opens, displaying roles and their access permissions. To grant or remove edit permission from a user role, click the Edit check box next to that role. Parent topic: Securing","title":"Assigning users to maintain the application"},{"location":"as_assigning_users_to_maintain_the_application.html#assigninguserstomaintaintheapplication","text":"To define who can edit an HCL Leap application, use the design settings in the Access tab. By default, only administrators can edit and maintain an application. However, you can also assign other roles to do the task. In the Manage tab, an administrator can grant permission for other users to edit applications. To change who can edit an application, click Design Settings in the Access tab. The Design Settings table opens, displaying roles and their access permissions. To grant or remove edit permission from a user role, click the Edit check box next to that role. Parent topic: Securing","title":"Assigning users to maintain the application"},{"location":"as_define_security_roles.html","text":"Defining basic security roles for users Create roles for users in your organization so they can work with data that is relevant to them. HCL Leap uses a customizable role-based model to define who can access data and who can modify the application. Roles allow the assignment of data access, and application maintenance permissions.Individuals or groups are then assigned to the roles with the access component, or programmatically through web services. There are three predefined roles: Administrator A role that includes users, or groups, with administrator privileges for an application. Initiator A role that includes any user, or group, who can submit a form or initiate an application. For example, if the application was for Vacation Requests, you can allow all users in your organization to initiate, or submit, a Vacation Request. Record Owner A role that contains the user, or group, who submitted the form dynamically at run time. Each role can be Open (dynamic) or Closed (static). Open roles \u2013 where assignments are done either statically, or dynamically with a web service call defined on a stage action within stages. Users are assigned based on data that is gathered during the form submission. For example, a web service looks up a manager for each user who submits a form, and assigns the manager a role. Closed roles \u2013 where assignments of users and groups to the roles must be done explicitly from within the Access tab. Closed roles do not assign users dynamically with a web service. To add a role: In the design environment, click the Access tab. The Define Roles window opens. Click the Add role green plus sign to add a role. For example, you can name the new role, \u201cManager\u201d. Click the Add role plus sign to define another role. For example, your form also requires a \u201cShift Supervisor\u201d. Use the radio buttons to select whether the role is Open or Closed . Parent topic: Securing","title":"Defining basic security roles for users"},{"location":"as_define_security_roles.html#defining-basic-security-roles-for-users","text":"Create roles for users in your organization so they can work with data that is relevant to them. HCL Leap uses a customizable role-based model to define who can access data and who can modify the application. Roles allow the assignment of data access, and application maintenance permissions.Individuals or groups are then assigned to the roles with the access component, or programmatically through web services. There are three predefined roles:","title":"Defining basic security roles for users"},{"location":"as_define_security_roles.html#administrator","text":"A role that includes users, or groups, with administrator privileges for an application.","title":"Administrator"},{"location":"as_define_security_roles.html#initiator","text":"A role that includes any user, or group, who can submit a form or initiate an application. For example, if the application was for Vacation Requests, you can allow all users in your organization to initiate, or submit, a Vacation Request.","title":"Initiator"},{"location":"as_define_security_roles.html#record-owner","text":"A role that contains the user, or group, who submitted the form dynamically at run time. Each role can be Open (dynamic) or Closed (static). Open roles \u2013 where assignments are done either statically, or dynamically with a web service call defined on a stage action within stages. Users are assigned based on data that is gathered during the form submission. For example, a web service looks up a manager for each user who submits a form, and assigns the manager a role. Closed roles \u2013 where assignments of users and groups to the roles must be done explicitly from within the Access tab. Closed roles do not assign users dynamically with a web service. To add a role: In the design environment, click the Access tab. The Define Roles window opens. Click the Add role green plus sign to add a role. For example, you can name the new role, \u201cManager\u201d. Click the Add role plus sign to define another role. For example, your form also requires a \u201cShift Supervisor\u201d. Use the radio buttons to select whether the role is Open or Closed . Parent topic: Securing","title":"Record Owner"},{"location":"as_setting_stage_permissions.html","text":"Setting Stage permissions Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. A Stage is a step in the life of a form. By default, each form has a Start and Submitted stage. The Start stage is activated when a user begins a form. The Submitted stage is the end of the workflow. You can define different permissions for each role on different stages. There are four actions users can take in the Access tab: Create By default, an initiator can create a form when the application is deployed. Read By default, only record owners and administrators can read the form when it is submitted. Update By default, no one can change the form after it is submitted. However, you can authorize users to update the form in the View Data section. Delete By default, only administrators can delete a form from the database. For example, you can add a custom stage for manager approval by adding a stage, and giving a manager permission to modify the form. The following steps describe how to set the permission for a stage. Before using the following instructions, you must create a Stage between the Start and Submitted stages. Click the Access tab. In the Stage Settings parent, select the new stage that you created. Check the permissions for the stage for each role. Permissions must be set for each stage of a form. The permissions that are set on one stage do not carry forward to another stage. Parent topic: Securing","title":"Setting Stage permissions"},{"location":"as_setting_stage_permissions.html#settingstagepermissions","text":"Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. A Stage is a step in the life of a form. By default, each form has a Start and Submitted stage. The Start stage is activated when a user begins a form. The Submitted stage is the end of the workflow. You can define different permissions for each role on different stages. There are four actions users can take in the Access tab:","title":"Setting Stage permissions"},{"location":"as_setting_stage_permissions.html#create","text":"By default, an initiator can create a form when the application is deployed.","title":"Create"},{"location":"as_setting_stage_permissions.html#read","text":"By default, only record owners and administrators can read the form when it is submitted.","title":"Read"},{"location":"as_setting_stage_permissions.html#update","text":"By default, no one can change the form after it is submitted. However, you can authorize users to update the form in the View Data section.","title":"Update"},{"location":"as_setting_stage_permissions.html#delete","text":"By default, only administrators can delete a form from the database. For example, you can add a custom stage for manager approval by adding a stage, and giving a manager permission to modify the form. The following steps describe how to set the permission for a stage. Before using the following instructions, you must create a Stage between the Start and Submitted stages. Click the Access tab. In the Stage Settings parent, select the new stage that you created. Check the permissions for the stage for each role. Permissions must be set for each stage of a form. The permissions that are set on one stage do not carry forward to another stage. Parent topic: Securing","title":"Delete"},{"location":"as_setting_up_security_for_anon_access.html","text":"Setting up security for anonymous access Using the correct permissions, you can allow anonymous users to access a form. To allow anyone to complete a form anonymously, without asking for authentication, use the following steps. No data about the user is captured or stored. Note: Administrators must allow anonymous access first. Start a new application. Enter an application name. From the dashboard in the design environment, click Access . Click the Initiator role in the Access navigation. In the Add Users window, click the Add group icon next to the predefined \u201cAnonymous Users\u201d group. Once selected, the group appears in the Role Members window. In the Stage Settings section of the Access tab, select the Start stage for your form. Confirm that the Initiator has the Create permission selected. This setting allows anonymous users to submit responses. If a registered user is identified, they can either create a form anonymously or log in using their credentials. Note: If a user logs on using their credentials, they are no longer anonymous and their user data will be stored. In the Stage Settings section of the Access tab, select the Submitted stage for your form. Confirm that the Initiator has the Read permission selected. This setting allows anonymous users to view responses. You can now send users the View Data URL from the Manage tab. For more information on the View Data URL, see Viewing submitted responses . Parent topic: Securing","title":"Setting up security for anonymous access"},{"location":"as_setting_up_security_for_anon_access.html#settingupsecurityforanonymyousorguestaccess","text":"Using the correct permissions, you can allow anonymous users to access a form. To allow anyone to complete a form anonymously, without asking for authentication, use the following steps. No data about the user is captured or stored. Note: Administrators must allow anonymous access first. Start a new application. Enter an application name. From the dashboard in the design environment, click Access . Click the Initiator role in the Access navigation. In the Add Users window, click the Add group icon next to the predefined \u201cAnonymous Users\u201d group. Once selected, the group appears in the Role Members window. In the Stage Settings section of the Access tab, select the Start stage for your form. Confirm that the Initiator has the Create permission selected. This setting allows anonymous users to submit responses. If a registered user is identified, they can either create a form anonymously or log in using their credentials. Note: If a user logs on using their credentials, they are no longer anonymous and their user data will be stored. In the Stage Settings section of the Access tab, select the Submitted stage for your form. Confirm that the Initiator has the Read permission selected. This setting allows anonymous users to view responses. You can now send users the View Data URL from the Manage tab. For more information on the View Data URL, see Viewing submitted responses . Parent topic: Securing","title":"Setting up security for anonymous access"},{"location":"builtin_properties_widgets.html","text":"Built-In Properties Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. The following built-in properties are supported for custom widgets: 'required' : for data widgets, allows the app author to ensure that a value is collected. Requiredness will be enforced beyond the UI; the integrity of the data will be enforced when it is submitted to the server. 'title' : this is used in various contexts to allow for editing and display of the name of a widget instance. 'seenInOverview' : allows the app author to decide if the widget's data should be displayed in the View Data page. 'range' : this adds a Range with minimum and maximum properties to the property panel and allows an app author to specify minimum and maximum value. This property can be used with widgets with datatype of number, time, date and timestamp. 'format' : this adds a Format property to the property panel and allows an app author to specify a format for the string. This property can be used by widgets with datatype of string only. Example: const myWidgetDefinition = { ... builtInProperties : [{ id: 'required'}, {id: 'title'}, {id: 'seenInOverview', defaultValue: true}], ... } Note: All widgets will be implicitly given an ID property. The default value of this property will be auto-incrementing unique value based on the last substring of the widget definition's id. For example, a widget with an id of 'example.YesNo' will result in a default ID of ' F_YesNo1'. Similar to Leap's built-in widgets, the app author is free to alter the ID to suit their needs. Parent topic: Custom Widget API","title":"Built-In Properties"},{"location":"builtin_properties_widgets.html#builtin_properties_widgets","text":"Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. The following built-in properties are supported for custom widgets: 'required' : for data widgets, allows the app author to ensure that a value is collected. Requiredness will be enforced beyond the UI; the integrity of the data will be enforced when it is submitted to the server. 'title' : this is used in various contexts to allow for editing and display of the name of a widget instance. 'seenInOverview' : allows the app author to decide if the widget's data should be displayed in the View Data page. 'range' : this adds a Range with minimum and maximum properties to the property panel and allows an app author to specify minimum and maximum value. This property can be used with widgets with datatype of number, time, date and timestamp. 'format' : this adds a Format property to the property panel and allows an app author to specify a format for the string. This property can be used by widgets with datatype of string only. Example: const myWidgetDefinition = { ... builtInProperties : [{ id: 'required'}, {id: 'title'}, {id: 'seenInOverview', defaultValue: true}], ... } Note: All widgets will be implicitly given an ID property. The default value of this property will be auto-incrementing unique value based on the last substring of the widget definition's id. For example, a widget with an id of 'example.YesNo' will result in a default ID of ' F_YesNo1'. Similar to Leap's built-in widgets, the app author is free to alter the ID to suit their needs. Parent topic: Custom Widget API","title":"Built-In Properties"},{"location":"co_config_app_server_enviro.html","text":"Application server environment configuration The following general information describes the requirements for configuring your application server environment. By default the settings available from WebSphere\u00ae Application Server are sufficient for general usage. Refer to the WebSphere Application Server documentation for general set-up. For basic architecture of Leap, see Leap Basic Architecture . Loading/performance: When you set up your Application Server environment for HCL Leap, you should follow the performance tuning guidelines in the WebSphere Application Server documentation . To achieve the best performance for the workload on your system, you might want to consider altering the following settings: Use a web server and configure the WebSphere Application Server plugins to provide load balancing, fail-over, and the ability to deploy in a DMZ. Update the Java heap size for your server. For further information, see WebSphere Application Server documentation . Increase the web container threads within WebSphere Application Server Increase the JDBC connection pool to the Leap database. For more information, see WebSphere Application Server documentation . Security: When you consider security, standard web application security practices must be considered. Leap provides application-level security. However it relies on the server environment for extra security. Ensure that your information is secure by using SSL whenever possible. Communication between the web browser and Leap when you use service descriptions and web services through the HTTP Service Transport, and the JDBC connection between Leap and the Leap database must be secured. Setting up an HTTP Strict Transport Security provides a method to ensure SSL communications from your application environment. Restrict cookies to HTTP requests whenever possible to prevent access from JavaScript, especially relating to sessions and authentication (LTPA tokens). Restrict the ability to put Leap content in an iFrame if embedding is not part of your planned integration. Adding HTTP headers such as X-Frames-Options or Content-Security-Policy provides an extra layer of security. Use IBM HTTP Server as a front end server to prevent direct access to the Application Server environment. Using a front end server allows for clustering through the WebSphere Application Server plug-in. Keep your system updated with all security and maintenance patches to ensure a safe and stable environment. Watch for security bulletins in the HCL Support Portal, or by subscribing to My Notifications for updates. For more WebSphere Application Server information, see WebSphere Application Server documentation , and Advanced Security Hardening WebSphere Application Server . Parent topic: Configuring","title":"Application server environment configuration"},{"location":"co_config_app_server_enviro.html#concept_zdw_tzs_nv","text":"The following general information describes the requirements for configuring your application server environment. By default the settings available from WebSphere\u00ae Application Server are sufficient for general usage. Refer to the WebSphere Application Server documentation for general set-up. For basic architecture of Leap, see Leap Basic Architecture . Loading/performance: When you set up your Application Server environment for HCL Leap, you should follow the performance tuning guidelines in the WebSphere Application Server documentation . To achieve the best performance for the workload on your system, you might want to consider altering the following settings: Use a web server and configure the WebSphere Application Server plugins to provide load balancing, fail-over, and the ability to deploy in a DMZ. Update the Java heap size for your server. For further information, see WebSphere Application Server documentation . Increase the web container threads within WebSphere Application Server Increase the JDBC connection pool to the Leap database. For more information, see WebSphere Application Server documentation . Security: When you consider security, standard web application security practices must be considered. Leap provides application-level security. However it relies on the server environment for extra security. Ensure that your information is secure by using SSL whenever possible. Communication between the web browser and Leap when you use service descriptions and web services through the HTTP Service Transport, and the JDBC connection between Leap and the Leap database must be secured. Setting up an HTTP Strict Transport Security provides a method to ensure SSL communications from your application environment. Restrict cookies to HTTP requests whenever possible to prevent access from JavaScript, especially relating to sessions and authentication (LTPA tokens). Restrict the ability to put Leap content in an iFrame if embedding is not part of your planned integration. Adding HTTP headers such as X-Frames-Options or Content-Security-Policy provides an extra layer of security. Use IBM HTTP Server as a front end server to prevent direct access to the Application Server environment. Using a front end server allows for clustering through the WebSphere Application Server plug-in. Keep your system updated with all security and maintenance patches to ensure a safe and stable environment. Watch for security bulletins in the HCL Support Portal, or by subscribing to My Notifications for updates. For more WebSphere Application Server information, see WebSphere Application Server documentation , and Advanced Security Hardening WebSphere Application Server . Parent topic: Configuring","title":"Application server environment configuration"},{"location":"co_config_toc.html","text":"Configuring This section contains information on how to configure Leap. Application server environment configuration The following general information describes the requirements for configuring your application server environment. Configuring the properties file When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system.","title":"Configuring"},{"location":"co_config_toc.html#configtocdita","text":"This section contains information on how to configure Leap. Application server environment configuration The following general information describes the requirements for configuring your application server environment. Configuring the properties file When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system.","title":"Configuring"},{"location":"co_configuration_properties%28org%29.html","text":"Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ``` ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP ``` anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked | |appFilesWhiteList appFilesBlackList appFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi | |appStats.timerEnabled appStats.refreshHour appStats.refreshDays |By default, the timer is enabled and the collection time is set to 3am daily local server timer. Note: Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour Sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 | |attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) attachmentFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi | |blockAnonAccess|As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: enabled - anonymous access is blocked disabled - anonymous access is allowed redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect | |customThemes.[ID].displayName customThemes.[ID].location customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] |The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: customThemes.[ID].displayName customThemes.[ID].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] isDefault - If set to true, designates the theme as the default selection for new applications. nl.[LOCALE] - For globalization support of the theme's display name. [LOCALE] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the http task to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: ``` {#codeblock_wgh_s51_hzb} customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css | |detectBrowser|If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn **Example:** ``` {#codeblock_iqt_j2f_gzb} ibm.nitro.NitroConfig.detectBrowser=warn | |disableUseTab|Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: true - \"Use\" tab is hidden false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true | |EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents |Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: EventHandler.infoLevelEvents EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: \"builder/app/delete\" \u2013 Application is deleted \"builder/app/deploy\" \u2013 Application is deployed for the first time \"builder/app/redeploy\" \u2013 A deployed application is deployed again \"builder/app/stop\" \u2013 A deployed application is stopped \"builder/app/import\" \u2013 Application is imported \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data \"builder/app/export\" \u2013 Application is exported \"builder/app/exportWithData\" \u2013 Application is exported with data \"builder/app/upgrade\" \u2013 Application is upgraded \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced \"builder/app/result/export\" \u2013 Application data is exported from View Data (or REST API) \"builder/app/retrieve/source\" \"builder/app/query/deployed\" \"builder/record/submit\" \u2013 A form is submitted \"builder/record/update\" \u2013 A specific form record is updated \"builder/record/delete\" \u2013 A specific form record is deleted \"builder/data/insert/user\" \"builder/data/insert/code\" \"builder/data/update/user\" \"builder/data/update/code\" \"builder/data/delete/user\" \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit | |exportDataWithEmails|By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: true - emails are exported with application data false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true | |imageDomainWhitelist.enabled=true imageDomainWhitelist.[N].domain |The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.[N].domain = where \"[N]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com | |InfoEntryPoint.dailyInfo|Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help. Example: ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** | |LogoutServlet.postLogoutRedirectURL|The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ``` {#codeblock_zxm_42f_gzb} ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout | |maximumRecordsToRetrieve|Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. **Note:** The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. **Example:** ``` {#codeblock_qy1_1df_gzb} ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 | |MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName | MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias vmmAdmin to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn | |purgeOrphanFilesHours|In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 | |runtimeCSP|The runtimeCSP setting defines the Content-Security-Policy header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP For more information on Strict CSP, see Strict CSP . Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * | |runtimeResources.[N]|Additional web resources to load into the Domino Leap UI for leveraging the Custom Widget API . The values from these settings will be injected into the section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = ibm.nitro.NitroConfig.runtimeResources.2 = ibm.nitro.NitroConfig.runtimeResources.3 = | |secureJS|Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to FALSE might expose users to malicious JavaScript. Only set to FALSE in a secured environment where Leap applications are created by trusted users. For more information, see JavaScript API for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true | |serviceAuthorization.enabled serviceAuthorization.jxpath-sample |Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by ibm.was.MemberManager.userProps.id = mail and ibm.was.MemberManager.groupProps.id = name respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set ibm.nitro.NitroConfig.serviceAuthorization.enabled=true .Multiple services may be defined. To define a service authorization, add ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples. Note: A backslash (\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } | |serverURI|Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar. Example: ibm.nitro.NitroConfig.serverURI = http://host:9080/apps | |servicesWhitelist.enabled servicesWhitelist.[N].actions servicesWhitelist.[N].domain |The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting servicesWhitelist.enabled=true , for each service two additional parameters must be set: servicesWhitelist.[N].domain = servicesWhitelist.[N].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ``` {#codeblock_qdk_2ff_gzb} ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT **Note:** This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. | |SetupAll.setupStatus|After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. **Example**: ``` {#codeblock_twt_qs5_jzb} ibm.nitro.SetupAll.setupStatus = start | |viewResponsesMaximumCount|For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 | |wchApiUrl|IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/ | |wchEnabled|Enables integration with IBM Watson Content Hub . This allows Leap applications to select assets from IBM Watson Content Hub.Where: true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub (a Watson Content Hub subscription is required) false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false | |xFrameOptions|Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN | Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuration_properties%28org%29.html#configuration-properties","text":"The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ``` ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP ``` anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked | |appFilesWhiteList appFilesBlackList appFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi | |appStats.timerEnabled appStats.refreshHour appStats.refreshDays |By default, the timer is enabled and the collection time is set to 3am daily local server timer. Note: Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour Sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 | |attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) attachmentFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi | |blockAnonAccess|As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: enabled - anonymous access is blocked disabled - anonymous access is allowed redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect | |customThemes.[ID].displayName customThemes.[ID].location customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] |The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: customThemes.[ID].displayName customThemes.[ID].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] isDefault - If set to true, designates the theme as the default selection for new applications. nl.[LOCALE] - For globalization support of the theme's display name. [LOCALE] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the http task to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: ``` {#codeblock_wgh_s51_hzb} customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css | |detectBrowser|If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn **Example:** ``` {#codeblock_iqt_j2f_gzb} ibm.nitro.NitroConfig.detectBrowser=warn | |disableUseTab|Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: true - \"Use\" tab is hidden false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true | |EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents |Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: EventHandler.infoLevelEvents EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: \"builder/app/delete\" \u2013 Application is deleted \"builder/app/deploy\" \u2013 Application is deployed for the first time \"builder/app/redeploy\" \u2013 A deployed application is deployed again \"builder/app/stop\" \u2013 A deployed application is stopped \"builder/app/import\" \u2013 Application is imported \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data \"builder/app/export\" \u2013 Application is exported \"builder/app/exportWithData\" \u2013 Application is exported with data \"builder/app/upgrade\" \u2013 Application is upgraded \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced \"builder/app/result/export\" \u2013 Application data is exported from View Data (or REST API) \"builder/app/retrieve/source\" \"builder/app/query/deployed\" \"builder/record/submit\" \u2013 A form is submitted \"builder/record/update\" \u2013 A specific form record is updated \"builder/record/delete\" \u2013 A specific form record is deleted \"builder/data/insert/user\" \"builder/data/insert/code\" \"builder/data/update/user\" \"builder/data/update/code\" \"builder/data/delete/user\" \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit | |exportDataWithEmails|By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: true - emails are exported with application data false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true | |imageDomainWhitelist.enabled=true imageDomainWhitelist.[N].domain |The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.[N].domain = where \"[N]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com | |InfoEntryPoint.dailyInfo|Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help. Example: ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** | |LogoutServlet.postLogoutRedirectURL|The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ``` {#codeblock_zxm_42f_gzb} ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout | |maximumRecordsToRetrieve|Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. **Note:** The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. **Example:** ``` {#codeblock_qy1_1df_gzb} ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 | |MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName | MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias vmmAdmin to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn | |purgeOrphanFilesHours|In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 | |runtimeCSP|The runtimeCSP setting defines the Content-Security-Policy header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP For more information on Strict CSP, see Strict CSP . Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * | |runtimeResources.[N]|Additional web resources to load into the Domino Leap UI for leveraging the Custom Widget API . The values from these settings will be injected into the section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = ibm.nitro.NitroConfig.runtimeResources.2 = ibm.nitro.NitroConfig.runtimeResources.3 = | |secureJS|Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to FALSE might expose users to malicious JavaScript. Only set to FALSE in a secured environment where Leap applications are created by trusted users. For more information, see JavaScript API for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true | |serviceAuthorization.enabled serviceAuthorization.jxpath-sample |Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by ibm.was.MemberManager.userProps.id = mail and ibm.was.MemberManager.groupProps.id = name respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set ibm.nitro.NitroConfig.serviceAuthorization.enabled=true .Multiple services may be defined. To define a service authorization, add ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples. Note: A backslash (\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } | |serverURI|Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar. Example: ibm.nitro.NitroConfig.serverURI = http://host:9080/apps | |servicesWhitelist.enabled servicesWhitelist.[N].actions servicesWhitelist.[N].domain |The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting servicesWhitelist.enabled=true , for each service two additional parameters must be set: servicesWhitelist.[N].domain = servicesWhitelist.[N].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ``` {#codeblock_qdk_2ff_gzb} ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT **Note:** This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. | |SetupAll.setupStatus|After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. **Example**: ``` {#codeblock_twt_qs5_jzb} ibm.nitro.SetupAll.setupStatus = start | |viewResponsesMaximumCount|For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 | |wchApiUrl|IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/ | |wchEnabled|Enables integration with IBM Watson Content Hub . This allows Leap applications to select assets from IBM Watson Content Hub.Where: true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub (a Watson Content Hub subscription is required) false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false | |xFrameOptions|Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN | Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuration_properties.html","text":"Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked appFilesWhiteList appFilesBlackList appFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi appStats.timerEnabled appStats.refreshHour appStats.refreshDays By default, the timer is enabled and the collection time is set to 3am daily local server timer.**Note:** Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty \\(everything is allowed\\) attachmentFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi blockAnonAccess As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: - enabled - anonymous access is blocked - disabled - anonymous access is allowed - redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect customThemes.\\[ID\\].displayName customThemes.\\[ID\\].location customThemes.\\[ID\\].isDefault customThemes.\\[ID\\].nl.\\[LOCALE\\] The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: - customThemes.\\[ID\\].displayName - customThemes.\\[ID\\].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: - customThemes.\\[ID\\].isDefault - customThemes.\\[ID\\].nl.\\[LOCALE\\] isDefault - If set to true, designates the theme as the default selection for new applications. nl.\\[LOCALE\\] - For globalization support of the theme's display name. \\[LOCALE\\] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the http task to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css detectBrowser If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn Example: ibm.nitro.NitroConfig.detectBrowser=warn disableUseTab Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: - true - \"Use\" tab is hidden - false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap\\_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: - EventHandler.infoLevelEvents - EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: - \"builder/app/delete\" \u2013 Application is deleted - \"builder/app/deploy\" \u2013 Application is deployed for the first time - \"builder/app/redeploy\" \u2013 A deployed application is deployed again - \"builder/app/stop\" \u2013 A deployed application is stopped - \"builder/app/import\" \u2013 Application is imported - \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed - \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data - \"builder/app/export\" \u2013 Application is exported - \"builder/app/exportWithData\" \u2013 Application is exported with data - \"builder/app/upgrade\" \u2013 Application is upgraded - \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced - \"builder/app/result/export\" \u2013 Application data is exported from View Data \\(or REST API\\) - \"builder/app/retrieve/source\" - \"builder/app/query/deployed\" - \"builder/record/submit\" \u2013 A form is submitted - \"builder/record/update\" \u2013 A specific form record is updated - \"builder/record/delete\" \u2013 A specific form record is deleted - \"builder/data/insert/user\" - \"builder/data/insert/code\" - \"builder/data/update/user\" - \"builder/data/update/code\" - \"builder/data/delete/user\" - \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit exportDataWithEmails By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: - true - emails are exported with application data - false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true imageDomainWhitelist.enabled=true imageDomainWhitelist.\\[N\\].domain The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.\\[N\\].domain = where \"\\[N\\]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com InfoEntryPoint.dailyInfo Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help.**Example:** ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** LogoutServlet.postLogoutRedirectURL The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout maximumRecordsToRetrieve Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. Note: The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. Example: ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias **vmmAdmin** to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn purgeOrphanFilesHours In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 runtimeCSP The runtimeCSP setting defines the `Content-Security-Policy` header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see [https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP](https://apc01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FHTTP%2FCSP&data=05%7C01%7Cnatalie.mezzina%40hcl.com%7C8a7d42f352b44ca3836e08dacdb6b55a%7C189de737c93a4f5a8b686f4ca9941912%7C0%7C0%7C638048482179359357%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=EaK4MB589PFSRNjwx%2BZebUAajhhBcSLoGfPuyha2eY8%3D&reserved=0) For more information on Strict CSP, see [Strict CSP](leap_strict_csp.md). Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * runtimeResources.\\[N\\] Additional web resources to load into the Domino Leap UI for leveraging the [Custom Widget API](customwidgetapi_landing.md). The values from these settings will be injected into the section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = ibm.nitro.NitroConfig.runtimeResources.2 = ibm.nitro.NitroConfig.runtimeResources.3 = secureJS Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to `FALSE` might expose users to malicious JavaScript. Only set to `FALSE` in a secured environment where Leap applications are created by trusted users. For more information, see [JavaScript API](ref_javascript_api.md) for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true serviceAuthorization.enabled serviceAuthorization.jxpath-sample Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by `ibm.was.MemberManager.userProps.id = mail` and `ibm.was.MemberManager.groupProps.id = name` respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set `ibm.nitro.NitroConfig.serviceAuthorization.enabled=true`.Multiple services may be defined. To define a service authorization, add `ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN` where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples.**Note:** A backslash \\(\\\\\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } serverURI Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar.**Example:** ibm.nitro.NitroConfig.serverURI = http://host:9080/apps servicesWhitelist.enabled servicesWhitelist.\\[N\\].actions servicesWhitelist.\\[N\\].domain The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting `servicesWhitelist.enabled=true`, for each service two additional parameters must be set: - servicesWhitelist.\\[N\\].domain = - servicesWhitelist.\\[N\\].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] < is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT Note: This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. SetupAll.setupStatus After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. Example: ibm.nitro.SetupAll.setupStatus = start viewResponsesMaximumCount For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 wchApiUrl IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/ wchEnabled Enables integration with [IBM Watson Content Hub](https://www.digitalexperience.ibm.com/). This allows Leap applications to select assets from IBM Watson Content Hub.Where: - true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub \\(a Watson Content Hub subscription is required\\) - false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false xFrameOptions Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuration_properties.html#configuration-properties","text":"The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked appFilesWhiteList appFilesBlackList appFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi appStats.timerEnabled appStats.refreshHour appStats.refreshDays By default, the timer is enabled and the collection time is set to 3am daily local server timer.**Note:** Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty \\(everything is allowed\\) attachmentFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi blockAnonAccess As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: - enabled - anonymous access is blocked - disabled - anonymous access is allowed - redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect customThemes.\\[ID\\].displayName customThemes.\\[ID\\].location customThemes.\\[ID\\].isDefault customThemes.\\[ID\\].nl.\\[LOCALE\\] The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: - customThemes.\\[ID\\].displayName - customThemes.\\[ID\\].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: - customThemes.\\[ID\\].isDefault - customThemes.\\[ID\\].nl.\\[LOCALE\\] isDefault - If set to true, designates the theme as the default selection for new applications. nl.\\[LOCALE\\] - For globalization support of the theme's display name. \\[LOCALE\\] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the http task to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css detectBrowser If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn Example: ibm.nitro.NitroConfig.detectBrowser=warn disableUseTab Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: - true - \"Use\" tab is hidden - false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap\\_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: - EventHandler.infoLevelEvents - EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: - \"builder/app/delete\" \u2013 Application is deleted - \"builder/app/deploy\" \u2013 Application is deployed for the first time - \"builder/app/redeploy\" \u2013 A deployed application is deployed again - \"builder/app/stop\" \u2013 A deployed application is stopped - \"builder/app/import\" \u2013 Application is imported - \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed - \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data - \"builder/app/export\" \u2013 Application is exported - \"builder/app/exportWithData\" \u2013 Application is exported with data - \"builder/app/upgrade\" \u2013 Application is upgraded - \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced - \"builder/app/result/export\" \u2013 Application data is exported from View Data \\(or REST API\\) - \"builder/app/retrieve/source\" - \"builder/app/query/deployed\" - \"builder/record/submit\" \u2013 A form is submitted - \"builder/record/update\" \u2013 A specific form record is updated - \"builder/record/delete\" \u2013 A specific form record is deleted - \"builder/data/insert/user\" - \"builder/data/insert/code\" - \"builder/data/update/user\" - \"builder/data/update/code\" - \"builder/data/delete/user\" - \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit exportDataWithEmails By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: - true - emails are exported with application data - false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true imageDomainWhitelist.enabled=true imageDomainWhitelist.\\[N\\].domain The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.\\[N\\].domain = where \"\\[N\\]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com InfoEntryPoint.dailyInfo Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help.**Example:** ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** LogoutServlet.postLogoutRedirectURL The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout maximumRecordsToRetrieve Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. Note: The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. Example: ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias **vmmAdmin** to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn purgeOrphanFilesHours In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 runtimeCSP The runtimeCSP setting defines the `Content-Security-Policy` header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see [https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP](https://apc01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FHTTP%2FCSP&data=05%7C01%7Cnatalie.mezzina%40hcl.com%7C8a7d42f352b44ca3836e08dacdb6b55a%7C189de737c93a4f5a8b686f4ca9941912%7C0%7C0%7C638048482179359357%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=EaK4MB589PFSRNjwx%2BZebUAajhhBcSLoGfPuyha2eY8%3D&reserved=0) For more information on Strict CSP, see [Strict CSP](leap_strict_csp.md). Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * runtimeResources.\\[N\\] Additional web resources to load into the Domino Leap UI for leveraging the [Custom Widget API](customwidgetapi_landing.md). The values from these settings will be injected into the section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = ibm.nitro.NitroConfig.runtimeResources.2 = ibm.nitro.NitroConfig.runtimeResources.3 = secureJS Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to `FALSE` might expose users to malicious JavaScript. Only set to `FALSE` in a secured environment where Leap applications are created by trusted users. For more information, see [JavaScript API](ref_javascript_api.md) for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true serviceAuthorization.enabled serviceAuthorization.jxpath-sample Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by `ibm.was.MemberManager.userProps.id = mail` and `ibm.was.MemberManager.groupProps.id = name` respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set `ibm.nitro.NitroConfig.serviceAuthorization.enabled=true`.Multiple services may be defined. To define a service authorization, add `ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN` where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples.**Note:** A backslash \\(\\\\\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } serverURI Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar.**Example:** ibm.nitro.NitroConfig.serverURI = http://host:9080/apps servicesWhitelist.enabled servicesWhitelist.\\[N\\].actions servicesWhitelist.\\[N\\].domain The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting `servicesWhitelist.enabled=true`, for each service two additional parameters must be set: - servicesWhitelist.\\[N\\].domain = - servicesWhitelist.\\[N\\].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] < is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT Note: This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. SetupAll.setupStatus After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. Example: ibm.nitro.SetupAll.setupStatus = start viewResponsesMaximumCount For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 wchApiUrl IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/ wchEnabled Enables integration with [IBM Watson Content Hub](https://www.digitalexperience.ibm.com/). This allows Leap applications to select assets from IBM Watson Content Hub.Where: - true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub \\(a Watson Content Hub subscription is required\\) - false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false xFrameOptions Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuring_the_properties_file.html","text":"Configuring the properties file When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system. To use the provided properties file, you must move it to the extensions folder, then adjust the settings to match your system. Note: In a horizontally clustered environment, the Leap_config.properties must be configured for each node. Define extensions directory in the fsp.properties Go to /deploy, and locate Leap_config.properties. Copy the file and paste it to: Windows \u2013 C:\\HCL\\Leap\\extensions Linux , AIX \u2013 /opt/HCL/Leap/extensions Open the Leap_config.properties file and configure the settings to match your system. Customizing the location of the extensions directory To customize the location of the Leap_config.properties file, you must edit the fsp.properties file. Go to the fsp.properties file. The default location of the fsp.properties file is: \\AppServer\\profiles\\AppSrv01\\installedApps\\\\Experience Builder.ear\\builder.war\\WEB-INF\\classes. Open the properties file in a text editor and add a valid extensions= parameter. For example, extensions = /usr/HCL/Leap/extensions. Define extensions directory with jvm property Add the option -Dfsp.extensions.dirs to the jvm where Leap is deployed. The value is the path(s) to the extensions directory. AIX : -Dfsp.extensions.dirs=/customFolder/extensions,/customFolder2/extensions Windows -Dfsp.extensions.dirs=c:\\customFolder\\extensions,c:\\customFolder2\\extensions Validate which directory is loaded Check the Leap SystemOut.log . There is an entry that indicates which directory is recognized and loaded. For example: [5/21/14 22:51:37:095 PDT] 0000001b IntegratorSta I com.ibm.form.platform.service.startup.IntegratorStartup phase1Start Extensions folder: /usr/HCL/Leap/extensions Note: Some configuration properties require a restart of the Leap server. If you do not see your changes applied within a few minutes of modifying the properties file, restart the server. Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Parent topic: Configuring","title":"Configuring the properties file"},{"location":"co_configuring_the_properties_file.html#configuringthepropertiesfile","text":"When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system. To use the provided properties file, you must move it to the extensions folder, then adjust the settings to match your system. Note: In a horizontally clustered environment, the Leap_config.properties must be configured for each node.","title":"Configuring the properties file"},{"location":"co_configuring_the_properties_file.html#section_xfj_ds5_jzb","text":"Go to /deploy, and locate Leap_config.properties. Copy the file and paste it to: Windows \u2013 C:\\HCL\\Leap\\extensions Linux , AIX \u2013 /opt/HCL/Leap/extensions Open the Leap_config.properties file and configure the settings to match your system.","title":"Define extensions directory in the fsp.properties"},{"location":"co_configuring_the_properties_file.html#section_nmd_q4f_zzb","text":"To customize the location of the Leap_config.properties file, you must edit the fsp.properties file. Go to the fsp.properties file. The default location of the fsp.properties file is: \\AppServer\\profiles\\AppSrv01\\installedApps\\\\Experience Builder.ear\\builder.war\\WEB-INF\\classes. Open the properties file in a text editor and add a valid extensions= parameter. For example, extensions = /usr/HCL/Leap/extensions.","title":"Customizing the location of the extensions directory"},{"location":"co_configuring_the_properties_file.html#section_fjf_4t5_jzb","text":"Add the option -Dfsp.extensions.dirs to the jvm where Leap is deployed. The value is the path(s) to the extensions directory. AIX : -Dfsp.extensions.dirs=/customFolder/extensions,/customFolder2/extensions Windows -Dfsp.extensions.dirs=c:\\customFolder\\extensions,c:\\customFolder2\\extensions","title":"Define extensions directory with jvm property"},{"location":"co_configuring_the_properties_file.html#section_h25_tt5_jzb","text":"Check the Leap SystemOut.log . There is an entry that indicates which directory is recognized and loaded. For example: [5/21/14 22:51:37:095 PDT] 0000001b IntegratorSta I com.ibm.form.platform.service.startup.IntegratorStartup phase1Start Extensions folder: /usr/HCL/Leap/extensions Note: Some configuration properties require a restart of the Leap server. If you do not see your changes applied within a few minutes of modifying the properties file, restart the server. Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Parent topic: Configuring","title":"Validate which directory is loaded"},{"location":"cr_adding_formula_from_settings_tab.html","text":"Creating a formula from the Settings tab The Settings tab contains a Formula section from which you can view and create formulas. When you select the Formulas menu option, you are shown the formulas for your form. They are divided into two categories: General Formulas and Item Formulas. Item Formulas is a list of the formulas created in the form using the Properties side panel. General Formulas are complex formulas created on the Settings tab. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. To create a complex formula: Click Add Formula . Add a title and description to your formula. Although the description is optional, it is useful for users to distinguish between several similarly titled formulas. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function input areas, and a result area are shown. Click either the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click either the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click Result to select where the result of the formula is shown to the user. Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. To create complex formulas, click the Add green plus icon. A second set of inputs is shown. Set values for the inputs and the result to create the second function. You can add as many additional functions as required to complete your formula. The formula runs when there are changes to the item. If you do not want the formula to automatically run, clear the check box for Automatically run this formula when there are changes to item values . You can change the order of functions in a formula by clicking the Move up or Move down arrows located. Click OK to save and apply the formula. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a formula from the Settings tab"},{"location":"cr_adding_formula_from_settings_tab.html#creatingaformulafromthesettingstab","text":"The Settings tab contains a Formula section from which you can view and create formulas. When you select the Formulas menu option, you are shown the formulas for your form. They are divided into two categories: General Formulas and Item Formulas. Item Formulas is a list of the formulas created in the form using the Properties side panel. General Formulas are complex formulas created on the Settings tab. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. To create a complex formula: Click Add Formula . Add a title and description to your formula. Although the description is optional, it is useful for users to distinguish between several similarly titled formulas. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function input areas, and a result area are shown. Click either the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click either the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click Result to select where the result of the formula is shown to the user. Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. To create complex formulas, click the Add green plus icon. A second set of inputs is shown. Set values for the inputs and the result to create the second function. You can add as many additional functions as required to complete your formula. The formula runs when there are changes to the item. If you do not want the formula to automatically run, clear the check box for Automatically run this formula when there are changes to item values . You can change the order of functions in a formula by clicking the Move up or Move down arrows located. Click OK to save and apply the formula. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a formula from the Settings tab"},{"location":"cr_adding_formula_running_formula_from_event.html","text":"Running a formula from an event After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. General formulas by default run whenever a form item is changed by the user. You can set formulas to run upon a specific event. For example, if a customer is entering information into an order form, you can set a formula to calculate sales tax and a subtotal when the user clicks a button. To run a formula when a user clicks a button: Add a button to your form. Select the newly added button. The Properties side panel opens. Click the Events tab. Select onClick from the list of Client Side events. The onClick options window opens. Select Run a Formula . Click the list to reveal the list of General formula created in the Settings tab. Click Add/Edit Formula to create a formula. After you either select or create the formula, click OK to close the onClick window. Parent topic: Adding formulas to your application","title":"Running a formula from an event"},{"location":"cr_adding_formula_running_formula_from_event.html#runningaformulafromanevent","text":"After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. General formulas by default run whenever a form item is changed by the user. You can set formulas to run upon a specific event. For example, if a customer is entering information into an order form, you can set a formula to calculate sales tax and a subtotal when the user clicks a button. To run a formula when a user clicks a button: Add a button to your form. Select the newly added button. The Properties side panel opens. Click the Events tab. Select onClick from the list of Client Side events. The onClick options window opens. Select Run a Formula . Click the list to reveal the list of General formula created in the Settings tab. Click Add/Edit Formula to create a formula. After you either select or create the formula, click OK to close the onClick window. Parent topic: Adding formulas to your application","title":"Running a formula from an event"},{"location":"cr_adding_formulas_from_properties_window.html","text":"Creating a Formula from the Properties side panel You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. You must set the formula on the form item that stores the result. For example, if you want to add two numbers together, set the formula on the field where you want the result shown. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. Select the form item. The Properties side panel opens. Click the Formula tab. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function, input areas and a result area are shown. Click the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a Formula from the Properties side panel"},{"location":"cr_adding_formulas_from_properties_window.html#usingtheformulaeditorfromthepropertieswindow","text":"You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. You must set the formula on the form item that stores the result. For example, if you want to add two numbers together, set the formula on the field where you want the result shown. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. Select the form item. The Properties side panel opens. Click the Formula tab. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function, input areas and a result area are shown. Click the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a Formula from the Properties side panel"},{"location":"cr_adding_formulas_toc.html","text":"Adding formulas to your application You can create and edit formulas to assign values to an item on your HCL Leap form. There are two places within Leap where you can access the Formula editor: The Formula tab of the Properties side panel. The Formula menu item from the Settings tab. Creating a Formula from the Properties side panel You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. Creating a formula from the Settings tab The Settings tab contains a Formula section from which you can view and create formulas. Running a formula from an event After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. Parent topic: Creating and managing applications","title":"Adding formulas to your application"},{"location":"cr_adding_formulas_toc.html#addingformulastoyourapplication","text":"You can create and edit formulas to assign values to an item on your HCL Leap form. There are two places within Leap where you can access the Formula editor: The Formula tab of the Properties side panel. The Formula menu item from the Settings tab. Creating a Formula from the Properties side panel You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. Creating a formula from the Settings tab The Settings tab contains a Formula section from which you can view and create formulas. Running a formula from an event After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. Parent topic: Creating and managing applications","title":"Adding formulas to your application"},{"location":"cr_copying_items.html","text":"Copying items Items may be copied from one form to another form within any application. If you want to copy an item from one form to another, select the item and press Ctrl+C . Select the target form and press Ctrl+V . If a cell on the target form's page is selected, the copy is inserted there, otherwise it will be inserted into the first available cell on that page. If there is no empty cell, then a new row will be added with the pasted item. Note: Table items cannot be copied. Note: Copying an entire page is not supported at this time. Usage details Use Ctrl+C to copy the selected item. Use Ctrl+V to paste the item to the selected page within any Leap application. Users can only copy one item at a time. If the browser clipboard is not accessible, the copy/paste action will not be allowed. Parent topic: Creating and managing applications","title":"Copying items"},{"location":"cr_copying_items.html#cr_copying_items","text":"Items may be copied from one form to another form within any application. If you want to copy an item from one form to another, select the item and press Ctrl+C . Select the target form and press Ctrl+V . If a cell on the target form's page is selected, the copy is inserted there, otherwise it will be inserted into the first available cell on that page. If there is no empty cell, then a new row will be added with the pasted item. Note: Table items cannot be copied. Note: Copying an entire page is not supported at this time.","title":"Copying items"},{"location":"cr_copying_items.html#section_f3b_1vn_hvb","text":"Use Ctrl+C to copy the selected item. Use Ctrl+V to paste the item to the selected page within any Leap application. Users can only copy one item at a time. If the browser clipboard is not accessible, the copy/paste action will not be allowed. Parent topic: Creating and managing applications","title":"Usage details"},{"location":"cr_creating_and_managing_toc.html","text":"Creating and managing applications Creating and managing applications contains a variety of topics on how to build and efficiently use applications. Creating an application This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. Creating an application from an excel spreadsheet Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. Styling your application with a custom theme Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. Upgrading an application design The upgrade feature allows an application design to be replaced by a new version. Copying items Items may be copied from one form to another form within any application. Moving items on a form Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Creating an accessible application When you create a form or application, the following information helps you design an accessible form for users with disabilities. Enabling dynamic layout When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. Globalization features The following information describes the languages formatting features supported by HCL Leap. Creating rules in your application Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. Labeling data, performing data analysis, and exporting data You can add labels to data elements in your application that become the label in the export file. Incorporating web services into your applications The following topics describe how to incorporate web services into your HCL Leap application. Adding formulas to your application You can create and edit formulas to assign values to an item on your HCL Leap form. Adding specialized form items You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Managing the files associated with your application You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab Leap document integration Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Adding Stages to an application It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Deploying applications and viewing data responses After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses.","title":"Building Apps"},{"location":"cr_creating_and_managing_toc.html#creatingandmanagingapplicationstoc","text":"Creating and managing applications contains a variety of topics on how to build and efficiently use applications. Creating an application This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. Creating an application from an excel spreadsheet Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. Styling your application with a custom theme Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. Upgrading an application design The upgrade feature allows an application design to be replaced by a new version. Copying items Items may be copied from one form to another form within any application. Moving items on a form Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Creating an accessible application When you create a form or application, the following information helps you design an accessible form for users with disabilities. Enabling dynamic layout When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. Globalization features The following information describes the languages formatting features supported by HCL Leap. Creating rules in your application Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. Labeling data, performing data analysis, and exporting data You can add labels to data elements in your application that become the label in the export file. Incorporating web services into your applications The following topics describe how to incorporate web services into your HCL Leap application. Adding formulas to your application You can create and edit formulas to assign values to an item on your HCL Leap form. Adding specialized form items You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Managing the files associated with your application You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab Leap document integration Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Adding Stages to an application It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Deploying applications and viewing data responses After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses.","title":"Creating and managing applications"},{"location":"cr_creating_application_excel.html","text":"Creating an application from an excel spreadsheet Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. The following steps describe how to prepare a spreadsheet that you want to import into Leap and how to create the application from the spreadsheet. Prepare the spreadsheet for importation. Points to consider: Each sheet in the spreadsheet file will be turned into a form in a new application. The first non-empty row in the sheet will be considered the 'header row'. If all the sheets in the spreadsheet have no header rows, the import will fail. The contents of a header row cell will be the name of the widget for that column. There can be a horizontal gap of a single cell between the header row cells. If there is a gap of more than one cell in the header row, then the cells to the right of the gap will not be processed. Header titles get processed to only have valid characters and then are assigned to the corresponding widget name. If after processing there are too few characters, the widget gets a default name. The contents of cells under the header row cell will be used for the data import process. There can be one gap of up to two columns in the data and header row. There can be a gap between the left-hand edge of the spreadsheet and the header row. There can be a gap between the header row and data. Parsing of rows will stop after parsing 10 empty rows in a row. If the column under a non-blank header row cell is empty, then the resulting widget will be a single line entry. Web links must have https:// or http:// at the beginning of the URL. Select many widgets can be created when the contents of a cell contains [value],[value],[value].... with no spaces between values and commas. Values cannot be duplicated, and the cell cannot begin or end with a comma. Commas are used as delimiters for multi select widgets; therefore, any comma will not be part of the value itself and will separate values. For a widget to be selectable (i.e. a Dropdown, Select One, Select Many, etc.), then the number of possible values must be greater than one and less than a certain value, currently set at 30. If there are only numbers and currency cells in a column, then the column widget type will be whichever count is greater. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from an Excel spreadsheet. For a topic covering creating applications from a blank canvas, see Creating an application . Click From Spreadsheet . An upload file dialog will open. Upload the prepared excel spreadsheet here, then click Next . Leap will parse the spreadsheet one sheet at a time. Each column in the main data range will be used to create a widget in the form. Leap will go through the rows of each column within that range, then attempt to assign a type based on the contents of the cells of the column. Choose the fields, names, and types of your application. On the next dialog, the names of sheets (forms) and columns (widgets) can be changed. Additionaly, the type of the created widgets can be changed (within limits of the imported data). When the names and types are set up properly, click Next . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . Parent topic: Creating and managing applications","title":"Creating an application from an excel spreadsheet"},{"location":"cr_creating_application_excel.html#creatinganapplicationexcel","text":"Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. The following steps describe how to prepare a spreadsheet that you want to import into Leap and how to create the application from the spreadsheet. Prepare the spreadsheet for importation. Points to consider: Each sheet in the spreadsheet file will be turned into a form in a new application. The first non-empty row in the sheet will be considered the 'header row'. If all the sheets in the spreadsheet have no header rows, the import will fail. The contents of a header row cell will be the name of the widget for that column. There can be a horizontal gap of a single cell between the header row cells. If there is a gap of more than one cell in the header row, then the cells to the right of the gap will not be processed. Header titles get processed to only have valid characters and then are assigned to the corresponding widget name. If after processing there are too few characters, the widget gets a default name. The contents of cells under the header row cell will be used for the data import process. There can be one gap of up to two columns in the data and header row. There can be a gap between the left-hand edge of the spreadsheet and the header row. There can be a gap between the header row and data. Parsing of rows will stop after parsing 10 empty rows in a row. If the column under a non-blank header row cell is empty, then the resulting widget will be a single line entry. Web links must have https:// or http:// at the beginning of the URL. Select many widgets can be created when the contents of a cell contains [value],[value],[value].... with no spaces between values and commas. Values cannot be duplicated, and the cell cannot begin or end with a comma. Commas are used as delimiters for multi select widgets; therefore, any comma will not be part of the value itself and will separate values. For a widget to be selectable (i.e. a Dropdown, Select One, Select Many, etc.), then the number of possible values must be greater than one and less than a certain value, currently set at 30. If there are only numbers and currency cells in a column, then the column widget type will be whichever count is greater. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from an Excel spreadsheet. For a topic covering creating applications from a blank canvas, see Creating an application . Click From Spreadsheet . An upload file dialog will open. Upload the prepared excel spreadsheet here, then click Next . Leap will parse the spreadsheet one sheet at a time. Each column in the main data range will be used to create a widget in the form. Leap will go through the rows of each column within that range, then attempt to assign a type based on the contents of the cells of the column. Choose the fields, names, and types of your application. On the next dialog, the names of sheets (forms) and columns (widgets) can be changed. Additionaly, the type of the created widgets can be changed (within limits of the imported data). When the names and types are set up properly, click Next . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . Parent topic: Creating and managing applications","title":"Creating an application from an excel spreadsheet"},{"location":"cr_creating_application_overview.html","text":"Creating an application This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. The following steps are a general overview of the lifecycle of an application. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from a blank canvas. For a topic covering creating applications from spreadsheets, see Creating an application from an excel spreadsheet . Click From Blank . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . An application opens. A blank grid appears with a Palette of form items. Add items from the Palette to build the form. The grid automatically expands as you add form items, and automatically aligns items in the cells. You can change the size of columns or rows in the grid. Right-click on the edge of the grid to reveal row or column properties. You can insert additional pages to a form in the Outline view. Page order is flexible, and you can reorder the pages in your form by dragging dropping them to your preferred order. Many form items can be edited directly on the grid. Click the title of a form item to edit it. You can modify the properties of each form item by using the Properties side panel. The panel contains tabs that allows the creation of rules, web service calls, or event triggers. You can save and preview the form at any time by using the Save and Preview icons. Click the Style tab to customize the appearance of your application. Select or customize a theme or add your own custom CSS to change the style of your application. Use the Access tab to define user roles, such as \u201cAdministrator\u201d, \u201cSupervisor\u201d, or \u201cRecord Owner\u201d. You can add as many users as required for your application to function. For example, when a user completes a vacation request form, the form is sent only to the user\u2019s supervisor. You can also add groups of users to specific roles. For example, you might have a time sheet application that is sent to a group of supervisors upon submission. For more information, see Security overview . Use the Workflow tab to define stages within a form. You can create as many stages as required for your form or workflow. For example, an employee completes a vacation request form. The employee does not see the part of the form where the supervisor approves or rejects the request. When the supervisor receives the form, the next stage is visible, and the request is granted, or refused. You can also use stages to set buttons at specific points in your form. For example, you might want to allow a user to save a draft copy of the form after they reach a specific stage. For more information, see Adding Stages to an application . Use the Events tab to review any custom Javascript added to the application. Click the Validation tab to check your application for errors. After an application is built, click the Manage tab. You must now deploy the application. Click Deploy . Adjust the Deployment Settings and click Start . Click Launch to view the live application in a web browser. The link URL is what is sent to users so they can access the application. Note: As an application creator, you can edit an application at any time. If you edit a live application, you must redeploy and relaunch it after your changes are saved. If a user is entering data into an application as you redeploy, their work is not saved. Parent topic: Creating and managing applications","title":"Creating an application"},{"location":"cr_creating_application_overview.html#creatinganapplication","text":"This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. The following steps are a general overview of the lifecycle of an application. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from a blank canvas. For a topic covering creating applications from spreadsheets, see Creating an application from an excel spreadsheet . Click From Blank . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . An application opens. A blank grid appears with a Palette of form items. Add items from the Palette to build the form. The grid automatically expands as you add form items, and automatically aligns items in the cells. You can change the size of columns or rows in the grid. Right-click on the edge of the grid to reveal row or column properties. You can insert additional pages to a form in the Outline view. Page order is flexible, and you can reorder the pages in your form by dragging dropping them to your preferred order. Many form items can be edited directly on the grid. Click the title of a form item to edit it. You can modify the properties of each form item by using the Properties side panel. The panel contains tabs that allows the creation of rules, web service calls, or event triggers. You can save and preview the form at any time by using the Save and Preview icons. Click the Style tab to customize the appearance of your application. Select or customize a theme or add your own custom CSS to change the style of your application. Use the Access tab to define user roles, such as \u201cAdministrator\u201d, \u201cSupervisor\u201d, or \u201cRecord Owner\u201d. You can add as many users as required for your application to function. For example, when a user completes a vacation request form, the form is sent only to the user\u2019s supervisor. You can also add groups of users to specific roles. For example, you might have a time sheet application that is sent to a group of supervisors upon submission. For more information, see Security overview . Use the Workflow tab to define stages within a form. You can create as many stages as required for your form or workflow. For example, an employee completes a vacation request form. The employee does not see the part of the form where the supervisor approves or rejects the request. When the supervisor receives the form, the next stage is visible, and the request is granted, or refused. You can also use stages to set buttons at specific points in your form. For example, you might want to allow a user to save a draft copy of the form after they reach a specific stage. For more information, see Adding Stages to an application . Use the Events tab to review any custom Javascript added to the application. Click the Validation tab to check your application for errors. After an application is built, click the Manage tab. You must now deploy the application. Click Deploy . Adjust the Deployment Settings and click Start . Click Launch to view the live application in a web browser. The link URL is what is sent to users so they can access the application. Note: As an application creator, you can edit an application at any time. If you edit a live application, you must redeploy and relaunch it after your changes are saved. If a user is entering data into an application as you redeploy, their work is not saved. Parent topic: Creating and managing applications","title":"Creating an application"},{"location":"cr_custom_theme.html","text":"Styling your application with a custom theme Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. An application can have one theme; the theme is applied to all forms in the application. Themes are customized in the Style tab. Settings made in the General section of the Theme Editor will be applied to specific attributes of all items in your application, but will be overridden by settings made to a more specific item type. For example, settings made in General > Fonts > General can be overridden by values set in General > Fonts > Label Fonts or set in Buttons > Fonts . A section's background color and border visibility can be set in the item's properties. This will override the theme settings. Background images maintain aspect ratio, but are stretched to fit the browser window. During application design, themes, and custom CSS are not applied to your application. To see how your application will display to end users, use the Preview button in either the Theme Editor dialog or the main banner. Browsers support different font file types (eg. .woff, .woff2, .ttf, eot, and .otf), so when specifying a custom font in your theme, you may need to include multiple font file types for a specific font family in order for it to render in all browsers. Themes can be exported and then imported into another application. To increase the portability of your customized theme, use the option to Maintain a link to the file only for font files and background image, instead of importing them into your application. Some limitations exist in IE8, including differences around the way IE8 displays background images. Custom CSS can be used in combination with themes. Custom CSS that you have included in your application is applied after all theme styling is applied except when the replace theme checkbox is selected. In this case, the custom CSS is the only styling that is applied to your application. CSS precedence rules still apply though, so some custom CSS may not override all theme settings. The Show CSS feature in the Style tab can be used by custom CSS developers to understand the CSS that is being generated by the theme. Custom CSS is not applied to the sample form in the Theme Editor dialog but is applied to the sample form in the Style tab. Parent topic: Creating and managing applications","title":"Styling your application with a custom theme"},{"location":"cr_custom_theme.html#concept_bwx_vwd_gy","text":"Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. An application can have one theme; the theme is applied to all forms in the application. Themes are customized in the Style tab. Settings made in the General section of the Theme Editor will be applied to specific attributes of all items in your application, but will be overridden by settings made to a more specific item type. For example, settings made in General > Fonts > General can be overridden by values set in General > Fonts > Label Fonts or set in Buttons > Fonts . A section's background color and border visibility can be set in the item's properties. This will override the theme settings. Background images maintain aspect ratio, but are stretched to fit the browser window. During application design, themes, and custom CSS are not applied to your application. To see how your application will display to end users, use the Preview button in either the Theme Editor dialog or the main banner. Browsers support different font file types (eg. .woff, .woff2, .ttf, eot, and .otf), so when specifying a custom font in your theme, you may need to include multiple font file types for a specific font family in order for it to render in all browsers. Themes can be exported and then imported into another application. To increase the portability of your customized theme, use the option to Maintain a link to the file only for font files and background image, instead of importing them into your application. Some limitations exist in IE8, including differences around the way IE8 displays background images. Custom CSS can be used in combination with themes. Custom CSS that you have included in your application is applied after all theme styling is applied except when the replace theme checkbox is selected. In this case, the custom CSS is the only styling that is applied to your application. CSS precedence rules still apply though, so some custom CSS may not override all theme settings. The Show CSS feature in the Style tab can be used by custom CSS developers to understand the CSS that is being generated by the theme. Custom CSS is not applied to the sample form in the Theme Editor dialog but is applied to the sample form in the Style tab. Parent topic: Creating and managing applications","title":"Styling your application with a custom theme"},{"location":"cr_deploy_and_launch_toc.html","text":"Deploying applications and viewing data responses After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses. Deploying an application Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. Updating and stopping a deployment The following instructions describe how to update, or stop, the deployment of an HCL Leap application. Launching an application After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. Viewing submitted responses After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. Importing data in View Data Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. Parent topic: Creating and managing applications","title":"Deploying applications and viewing data responses"},{"location":"cr_deploy_and_launch_toc.html#deployingandlaunchingapplications","text":"After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses. Deploying an application Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. Updating and stopping a deployment The following instructions describe how to update, or stop, the deployment of an HCL Leap application. Launching an application After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. Viewing submitted responses After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. Importing data in View Data Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. Parent topic: Creating and managing applications","title":"Deploying applications and viewing data responses"},{"location":"cr_deploying_an_application.html","text":"Deploying an application Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. You can update Leap applications with existing data that are currently deployed. However, these types of changes might impact existing data, and forms in-progress, depending on the type of changes made to the application. The impact occurs when the application is deployed, not during the design phase. The following changes might result in data loss, or prevent in-progress forms from being completed: If you delete fields that capture data from a form, any existing data for those fields is removed. If you change the ID of a field that contains data, any existing data is removed. If you change Access settings, users might no longer have access to existing data or forms in progress. If you change Stage IDs, in-progress applications at or before the stage are not completed. Before deploying an application, click Save to ensure the latest version of the application is saved. Note: If you make changes to an application while it is deployed, a warning icon is displayed on the Manage tab next to Deploy . This is to remind you to redeploy the application after making changes. Go to the Manage tab, and click Deploy for the application. The Deployment Settings window opens. Set the deployment options for your application from the Basic and Advanced tabs. Leap can send out email notifications when an application is deployed or stopped. These notifications are triggered from the Email Notifications section on the Deployment Setting window. The notifications are not triggered if the application is stopped on a preset Stop Date. The Stop notifications are only sent if the deployment is stopped manually using the Deployment Settings dialog. Click Start to deploy the application. After an application is deployed, the Launch tool is activated. Parent topic: Deploying applications and viewing data responses","title":"Deploying an application"},{"location":"cr_deploying_an_application.html#deployinganapplication","text":"Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. You can update Leap applications with existing data that are currently deployed. However, these types of changes might impact existing data, and forms in-progress, depending on the type of changes made to the application. The impact occurs when the application is deployed, not during the design phase. The following changes might result in data loss, or prevent in-progress forms from being completed: If you delete fields that capture data from a form, any existing data for those fields is removed. If you change the ID of a field that contains data, any existing data is removed. If you change Access settings, users might no longer have access to existing data or forms in progress. If you change Stage IDs, in-progress applications at or before the stage are not completed. Before deploying an application, click Save to ensure the latest version of the application is saved. Note: If you make changes to an application while it is deployed, a warning icon is displayed on the Manage tab next to Deploy . This is to remind you to redeploy the application after making changes. Go to the Manage tab, and click Deploy for the application. The Deployment Settings window opens. Set the deployment options for your application from the Basic and Advanced tabs. Leap can send out email notifications when an application is deployed or stopped. These notifications are triggered from the Email Notifications section on the Deployment Setting window. The notifications are not triggered if the application is stopped on a preset Stop Date. The Stop notifications are only sent if the deployment is stopped manually using the Deployment Settings dialog. Click Start to deploy the application. After an application is deployed, the Launch tool is activated. Parent topic: Deploying applications and viewing data responses","title":"Deploying an application"},{"location":"cr_enabling_dynamic_layout.html","text":"Enabling dynamic layout When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. To set dynamic width on a page: In the Outline menu, click the Properties icon for the desired page. The Properties side panel opens. In the Width: options, select Dynamic Value , and enter a minimum and maximum value. Note: If you click the green plus sign to add another page to your application, the values you set are automatically copied to the new page. To set Dynamic Layout on a page or in a section: Click the check box beside Enable dynamic layout , and set the minimum window width. Select whether the user sees form items in single column mode, or in carousel mode. The default is single column mode. Note: If you have or add a Section on the page, the Dynamic Layout settings of the Page are duplicated in the Section. For best results, Carousel mode should be used on forms that do not contain sections. Parent topic: Creating and managing applications","title":"Enabling dynamic layout"},{"location":"cr_enabling_dynamic_layout.html#enablingdynamiclayout","text":"When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. To set dynamic width on a page: In the Outline menu, click the Properties icon for the desired page. The Properties side panel opens. In the Width: options, select Dynamic Value , and enter a minimum and maximum value. Note: If you click the green plus sign to add another page to your application, the values you set are automatically copied to the new page. To set Dynamic Layout on a page or in a section: Click the check box beside Enable dynamic layout , and set the minimum window width. Select whether the user sees form items in single column mode, or in carousel mode. The default is single column mode. Note: If you have or add a Section on the page, the Dynamic Layout settings of the Page are duplicated in the Section. For best results, Carousel mode should be used on forms that do not contain sections. Parent topic: Creating and managing applications","title":"Enabling dynamic layout"},{"location":"cr_import_data_in_view_responses.html","text":"Importing data in View Data Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. The import operation is available for application Owners to use as an alternative to keying each row of data into the Launch experience of their Leap application and as an alternative to using the Data Access Rest API to programmatically add the data. Each row of data in the spreadsheet is imported into the Start stage of your Leap application as a new submitted record. Supported spreadsheet formats are Microsoft Excel 97 workbook and Microsoft Excel workbook (.xls and .xlsx). Note: Microsoft Excel 5.0/95 workbooks are not supported. When using other spreadsheet tools, save the spreadsheet file into one to the supported formats before attempting to import your data. Only spreadsheet data on the active sheet can be imported. To indicate where in your application each column of spreadsheet data should be imported, the first row of your spreadsheet must be modified to provide data mapping instructions. Each column header must include the ID of the item within your application where the data is mapped. An item's ID can be found on the Advanced tab of the Properties Dialog when editing the application. The Import Data button on the View Data page is available only to an application's Owners/Administrators and only active when the following is true: Imports respect the access settings that are configured within the application, so the application owner must be included in the list of people in the Initiator role. The application must not be configured to Limit to single submission per Authenticated User . The application must be deployed and not stopped. Validation and enforcement of your applications data types, required elements, and rules are performed on import. Custom JavaScript added to the applications UI is not run during data import. Some data elements, including dates and times, need to be in a specific format to import successfully. To identify the correct input format, it can be helpful to add a record of data using the application Launch UI, and then exporting the row from View Data and review the output format. Table data and Attachments can not be imported. Surveys and Select Many items can contain values that are lists of multiple selected choices. Use commas to separate the selected choices. In cases where one of the selected choices contains a comma, the following sequence can be used as an alternative separator: __#__ The data import operation stops when it encounters blank columns or rows in the spreadsheet. The data import operation supports a maximum of 1000 rows of data. To import data that has been exported from a HCL Leap application: You must replace the column header label with the item IDs required for mapping. The metadata can not be imported and must be removed from the spreadsheet or mapped to a form item. Stage transition emails configured in your application will be sent, so depending on the nature of the emails and the number of records being imported, application owners may want to disable the stage action email associated with the Start stage prior to running the import operation. Import operations can not be undone and bulk deletion of records is not available. Using some of the following recommendations can help ensure the desired outcome when using the bulk data import. Select one or two rows or spreadsheet data to import as an initial test to help ensure the mapping is set up as expected and the data types are compatible. Review the imported data in View Data after the import to see that it imported as expected. To quickly remove all data from an application, on the Manage page, choose to Export your application without including submitted data and then choose to Upgrade your application and select the option to Replace submitted data . Prior to performing a large bulk data import into an application that already has submitted data, creating a backup of the application and all existing records is recommended. On the Manage page, select the Export operation for your application and be sure to select the option to Include submitted data . This will provide an archive of the application and data in the state it was in just prior to the import. Parent topic: Deploying applications and viewing data responses","title":"Importing data in View Data"},{"location":"cr_import_data_in_view_responses.html#concept_gxl_bf2_gy","text":"Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. The import operation is available for application Owners to use as an alternative to keying each row of data into the Launch experience of their Leap application and as an alternative to using the Data Access Rest API to programmatically add the data. Each row of data in the spreadsheet is imported into the Start stage of your Leap application as a new submitted record. Supported spreadsheet formats are Microsoft Excel 97 workbook and Microsoft Excel workbook (.xls and .xlsx). Note: Microsoft Excel 5.0/95 workbooks are not supported. When using other spreadsheet tools, save the spreadsheet file into one to the supported formats before attempting to import your data. Only spreadsheet data on the active sheet can be imported. To indicate where in your application each column of spreadsheet data should be imported, the first row of your spreadsheet must be modified to provide data mapping instructions. Each column header must include the ID of the item within your application where the data is mapped. An item's ID can be found on the Advanced tab of the Properties Dialog when editing the application. The Import Data button on the View Data page is available only to an application's Owners/Administrators and only active when the following is true: Imports respect the access settings that are configured within the application, so the application owner must be included in the list of people in the Initiator role. The application must not be configured to Limit to single submission per Authenticated User . The application must be deployed and not stopped. Validation and enforcement of your applications data types, required elements, and rules are performed on import. Custom JavaScript added to the applications UI is not run during data import. Some data elements, including dates and times, need to be in a specific format to import successfully. To identify the correct input format, it can be helpful to add a record of data using the application Launch UI, and then exporting the row from View Data and review the output format. Table data and Attachments can not be imported. Surveys and Select Many items can contain values that are lists of multiple selected choices. Use commas to separate the selected choices. In cases where one of the selected choices contains a comma, the following sequence can be used as an alternative separator: __#__ The data import operation stops when it encounters blank columns or rows in the spreadsheet. The data import operation supports a maximum of 1000 rows of data. To import data that has been exported from a HCL Leap application: You must replace the column header label with the item IDs required for mapping. The metadata can not be imported and must be removed from the spreadsheet or mapped to a form item. Stage transition emails configured in your application will be sent, so depending on the nature of the emails and the number of records being imported, application owners may want to disable the stage action email associated with the Start stage prior to running the import operation. Import operations can not be undone and bulk deletion of records is not available. Using some of the following recommendations can help ensure the desired outcome when using the bulk data import. Select one or two rows or spreadsheet data to import as an initial test to help ensure the mapping is set up as expected and the data types are compatible. Review the imported data in View Data after the import to see that it imported as expected. To quickly remove all data from an application, on the Manage page, choose to Export your application without including submitted data and then choose to Upgrade your application and select the option to Replace submitted data . Prior to performing a large bulk data import into an application that already has submitted data, creating a backup of the application and all existing records is recommended. On the Manage page, select the Export operation for your application and be sure to select the option to Include submitted data . This will provide an archive of the application and data in the state it was in just prior to the import. Parent topic: Deploying applications and viewing data responses","title":"Importing data in View Data"},{"location":"cr_in_app_service.html","text":"Adding and configuring a service The following instructions describe how to add and configure a service so you can map it within your application. These instructions provide a general overview of adding and configuring services. They are used whenever you want to add a service to your application. Click \"Add/Edit Service Configuration\" The Service Configuration window opens. Enter the URL of your service Or, select a service to select a service from a list. To specify options for the URL, click the Properties icon located to the right of URL field. Use the Service Details dialog to configure how Leap should call the service. You can add details to the URL in the URL field. Specify the HTTP method for the service Make URL parameters and segments available for input mapping by selecting Assignable . The display name specified is used in the input mapping interface. URL parameters are query parameters within a URL. The first parameter follows the question mark in the URL. Additional parameters follow an ampersand. For example: https://server.com?this=1&that=2, where this is the first parameter, and that is the second parameter. When you make a parameter assignable, the parameter value is replaced at runtime. In the example https://server.com?this=1&that=2, if this is assignable, the value of this is replaced with the mapped input value from the form. For example:https://server.com?this=AAAAA&that=2, where AAAAA is the value from the form. URL segments are path elements within a URL. For example https://server.com/resources/identifier, where resources is the first segment, and identifier is the second segment. When you make a segment assignable, the segment is replaced at runtime. In the example https://server.com/resources/identifier, assigning identifier a value of 1234 results in a URL that reads: https://server.com/resources/1234. Note: To add or remove URL parameters or segments, you must modify the URL and tab out of the URL field. Specify authentication options in the Authentication section. If you want to add request headers, expand the Request header section and click Add a required request header . You can also make request headers assignable for input mapping. In the Sample Response JSON section, you can Fetch a sample JSON response, or insert your own. Elements in the provided JSON are automatically added as assignable outputs in the Outputs mapping tab. When you click Fetch , the Fetch a response window opens. You can modify the URL as required to connect to the service. Click Submit to fetch the response. Note: For Post and Put HTTP methods, you can enter Sample Request JSON. Elements in the provided JSON are automatically added as assignable inputs in the Inputs mapping tab. If you want to add response headers, expand the Response header section and click Add a required response header . Response headers are automatically assignable for output mapping. When you have finished making configuration changes click OK . Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Note: If you need to make changes to the service, or configure service details, click the Properties icon located to the right of URL. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Adding and configuring a service"},{"location":"cr_in_app_service.html#task_kgx_11y_mv","text":"The following instructions describe how to add and configure a service so you can map it within your application. These instructions provide a general overview of adding and configuring services. They are used whenever you want to add a service to your application. Click \"Add/Edit Service Configuration\" The Service Configuration window opens. Enter the URL of your service Or, select a service to select a service from a list. To specify options for the URL, click the Properties icon located to the right of URL field. Use the Service Details dialog to configure how Leap should call the service. You can add details to the URL in the URL field. Specify the HTTP method for the service Make URL parameters and segments available for input mapping by selecting Assignable . The display name specified is used in the input mapping interface. URL parameters are query parameters within a URL. The first parameter follows the question mark in the URL. Additional parameters follow an ampersand. For example: https://server.com?this=1&that=2, where this is the first parameter, and that is the second parameter. When you make a parameter assignable, the parameter value is replaced at runtime. In the example https://server.com?this=1&that=2, if this is assignable, the value of this is replaced with the mapped input value from the form. For example:https://server.com?this=AAAAA&that=2, where AAAAA is the value from the form. URL segments are path elements within a URL. For example https://server.com/resources/identifier, where resources is the first segment, and identifier is the second segment. When you make a segment assignable, the segment is replaced at runtime. In the example https://server.com/resources/identifier, assigning identifier a value of 1234 results in a URL that reads: https://server.com/resources/1234. Note: To add or remove URL parameters or segments, you must modify the URL and tab out of the URL field. Specify authentication options in the Authentication section. If you want to add request headers, expand the Request header section and click Add a required request header . You can also make request headers assignable for input mapping. In the Sample Response JSON section, you can Fetch a sample JSON response, or insert your own. Elements in the provided JSON are automatically added as assignable outputs in the Outputs mapping tab. When you click Fetch , the Fetch a response window opens. You can modify the URL as required to connect to the service. Click Submit to fetch the response. Note: For Post and Put HTTP methods, you can enter Sample Request JSON. Elements in the provided JSON are automatically added as assignable inputs in the Inputs mapping tab. If you want to add response headers, expand the Response header section and click Add a required response header . Response headers are automatically assignable for output mapping. When you have finished making configuration changes click OK . Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Note: If you need to make changes to the service, or configure service details, click the Properties icon located to the right of URL. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Adding and configuring a service"},{"location":"cr_launching_an_application.html","text":"Launching an application After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. You must deploy your application before you can launch it. See Deploying an application for instructions on how to deploy your application. To launch an application: Go to Manage tab, and click Launch . The application is launched in a web browser. Click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. Copy the URL and paste it into a web browser, or disseminate it through email, or your web site. Parent topic: Deploying applications and viewing data responses","title":"Launching an application"},{"location":"cr_launching_an_application.html#launchinganapplication","text":"After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. You must deploy your application before you can launch it. See Deploying an application for instructions on how to deploy your application. To launch an application: Go to Manage tab, and click Launch . The application is launched in a web browser. Click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. Copy the URL and paste it into a web browser, or disseminate it through email, or your web site. Parent topic: Deploying applications and viewing data responses","title":"Launching an application"},{"location":"cr_moving_items_on_a_form.html","text":"Moving items on a form Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Moving items on a single page of a form is done by clicking the item and dragging it to a new column or row. Notification is displayed by the mouse cursor if the location to which you move the form item is valid or not. You can move all Palette items between pages in a form. If you want to move an item from Page 1 to Page 2 of your form, select the item and drag it to the Outline view. Hover your mouse over Page 2. You can either drop the item on Page 2, where it is inserted into the first available cell of the page, or drag it onto a specific cell on Page 2. Usage details If you want to have a form item on multiple pages of your form, duplicate the item and move the duplicate to the other page. The duplicate icon is located to the right of the Rules icon on each form item. When you duplicate a form item: Rules : If a form item is part of a Rule, the Rule is replicated and applies to the duplicate form item. Formulas : If a form item uses a Formula, the Formula is replicated and applies to the duplicate form item. Events : If an Event is set on a form item, the Event is replicated and applies to the duplicate form item. Stage settings : Stage settings for a form item are not replicated onto the new form item. You must apply Stage settings to the new item in the Workflow tab. You can move forms and form items in the Outline view. This includes moving child pages, such as the ones created when you add a table to your form. Items in a table can be moved only within the same table. You can move entire Tables between form pages, but you cannot move a form item from inside one table to a table on another page. Keyboard shortcuts to move items between pages: Tab : Focus on a cell, or to move focus from one cell to another Space or Enter : Select focused item Ctrl+M : Drop an item on the cell that has focus Esc : Cancel selection. Parent topic: Creating and managing applications","title":"Moving items on a form"},{"location":"cr_moving_items_on_a_form.html#movingitemsonaform","text":"Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Moving items on a single page of a form is done by clicking the item and dragging it to a new column or row. Notification is displayed by the mouse cursor if the location to which you move the form item is valid or not. You can move all Palette items between pages in a form. If you want to move an item from Page 1 to Page 2 of your form, select the item and drag it to the Outline view. Hover your mouse over Page 2. You can either drop the item on Page 2, where it is inserted into the first available cell of the page, or drag it onto a specific cell on Page 2. Usage details If you want to have a form item on multiple pages of your form, duplicate the item and move the duplicate to the other page. The duplicate icon is located to the right of the Rules icon on each form item. When you duplicate a form item: Rules : If a form item is part of a Rule, the Rule is replicated and applies to the duplicate form item. Formulas : If a form item uses a Formula, the Formula is replicated and applies to the duplicate form item. Events : If an Event is set on a form item, the Event is replicated and applies to the duplicate form item. Stage settings : Stage settings for a form item are not replicated onto the new form item. You must apply Stage settings to the new item in the Workflow tab. You can move forms and form items in the Outline view. This includes moving child pages, such as the ones created when you add a table to your form. Items in a table can be moved only within the same table. You can move entire Tables between form pages, but you cannot move a form item from inside one table to a table on another page. Keyboard shortcuts to move items between pages: Tab : Focus on a cell, or to move focus from one cell to another Space or Enter : Select focused item Ctrl+M : Drop an item on the cell that has focus Esc : Cancel selection. Parent topic: Creating and managing applications","title":"Moving items on a form"},{"location":"cr_updating_and_stopping_deployment.html","text":"Updating and stopping a deployment The following instructions describe how to update, or stop, the deployment of an HCL Leap application. There are many reasons why you might need to update, or stop, a deployed application. You might want to update the deployment parameters, such as adding a start and stop date. Or, you might need to stop the deployment to perform updates to the application, and do not want to impact existing data. To update, or stop, a deployment: Go to the Manage tab and click Deploy for the application. The Deployment Setting window opens. Modify the deployment settings: To update a deployment, update the deployment settings and click Update . To stop the deployment, click Stop . Note: If you want to set a Deployment period, you must stop the deployment first, set the Start and Stop dates, then deploy the application again. Parent topic: Deploying applications and viewing data responses","title":"Updating and stopping a deployment"},{"location":"cr_updating_and_stopping_deployment.html#updatingandstoppingadeployment","text":"The following instructions describe how to update, or stop, the deployment of an HCL Leap application. There are many reasons why you might need to update, or stop, a deployed application. You might want to update the deployment parameters, such as adding a start and stop date. Or, you might need to stop the deployment to perform updates to the application, and do not want to impact existing data. To update, or stop, a deployment: Go to the Manage tab and click Deploy for the application. The Deployment Setting window opens. Modify the deployment settings: To update a deployment, update the deployment settings and click Update . To stop the deployment, click Stop . Note: If you want to set a Deployment period, you must stop the deployment first, set the Start and Stop dates, then deploy the application again. Parent topic: Deploying applications and viewing data responses","title":"Updating and stopping a deployment"},{"location":"cr_uploading_and_using_files.html","text":"Uploading files for use in your application The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. There are two ways to upload files into a Leap application: Upload all files in the Settings tab before building the application. Upload files one by one as needed when you build the application. To upload files in the Settings tab: Open your Leap application, and click the Settings tab at the top of the page. Click Files from the menu on the left side of the screen, then click Add . The Add File or URL Link window opens. Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . The file is listed on the Files page. After multiple files are uploaded, you can sort the files by type, upload date, or relationship. To use the uploaded files during form design: Add form items, such as Button, Image or Media to your form. The Properties side panel opens. Click the drop-down menu to select from an available list of files. Note: Only the supported files types for the form item are displayed in the drop-down menu. A list of supported file types is provided on the window. Add form items, such as Button, Image, Media to your form, the Properties side panel opens and click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . Parent topic: Managing the files associated with your application Uploading files during form design To upload files while you build your form. Add form items, such as Button, Image, Media to your form, the Properties side panel opens, then click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK .","title":"Uploading files for use in your application"},{"location":"cr_uploading_and_using_files.html#uploadingfiles","text":"The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. There are two ways to upload files into a Leap application: Upload all files in the Settings tab before building the application. Upload files one by one as needed when you build the application. To upload files in the Settings tab: Open your Leap application, and click the Settings tab at the top of the page. Click Files from the menu on the left side of the screen, then click Add . The Add File or URL Link window opens. Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . The file is listed on the Files page. After multiple files are uploaded, you can sort the files by type, upload date, or relationship. To use the uploaded files during form design: Add form items, such as Button, Image or Media to your form. The Properties side panel opens. Click the drop-down menu to select from an available list of files. Note: Only the supported files types for the form item are displayed in the drop-down menu. A list of supported file types is provided on the window. Add form items, such as Button, Image, Media to your form, the Properties side panel opens and click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . Parent topic: Managing the files associated with your application","title":"Uploading files for use in your application"},{"location":"cr_uploading_and_using_files.html#usinguploadedfiles","text":"To upload files while you build your form. Add form items, such as Button, Image, Media to your form, the Properties side panel opens, then click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK .","title":"Uploading files during form design"},{"location":"cr_using_apps_as_services_toc.html","text":"Incorporating web services into your applications The following topics describe how to incorporate web services into your HCL Leap application. Adding and configuring a service The following instructions describe how to add and configure a service so you can map it within your application. Service Oriented Architecture \u2013 Exposing a service to HCL Leap The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. Triggering a service from a button You can use a service to add information to a form automatically after a user clicks a button. Using a service to populate form items You can use a web service to populate to a Drop Down, Select One, and Select Many form item. Integrating your application with existing HCL Leap applications Each Leap application can be used within another Leap applications as a service. Parent topic: Creating and managing applications","title":"Incorporating web services into your applications"},{"location":"cr_using_apps_as_services_toc.html#usingapplicationsasservices","text":"The following topics describe how to incorporate web services into your HCL Leap application. Adding and configuring a service The following instructions describe how to add and configure a service so you can map it within your application. Service Oriented Architecture \u2013 Exposing a service to HCL Leap The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. Triggering a service from a button You can use a service to add information to a form automatically after a user clicks a button. Using a service to populate form items You can use a web service to populate to a Drop Down, Select One, and Select Many form item. Integrating your application with existing HCL Leap applications Each Leap application can be used within another Leap applications as a service. Parent topic: Creating and managing applications","title":"Incorporating web services into your applications"},{"location":"cr_using_apps_exposing_service_to.html","text":"Service Oriented Architecture \u2013 Exposing a service to HCL Leap The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. The Leap has an extensible services architecture which allows Leap applications to send and receive data from any external system. The Services Architecture consists of the following components: Service Transports \u2013 The Service Transport is the Java\u2122 code responsible for communicating with an external service, such as a public REST service. It can send data out to the external service or receive data from the external service. The transport also uses JDBC to store and retrieve data from any database. Alternatively, the transport can simply implement a \u201cservice\u201d itself, such as a unit conversion library. You can add any custom transport installation to the Leap installation by placing an appropriate JAR file in a specific directory on the Leap server; however, Leap already includes a generic HTTP transport which can send and receive data over the internet or intranet, and will suffice for many use cases. For more information, see Service Description . Service Descriptions \u2013 The Service Description provides the interface for a Service Transport. A Service Description is usually described by an XML file, although it is also possible to programmatically create a Service Description. The Service Description specifies a service's name, description, input parameters, and output parameters. These attributes are what appear to the application designer when they are hooking up services to a Leap application. Data Mapping \u2013 Each service description can contain an optional \u201cmapping\u201d component which describes how the data coming from the Service Transport can be mapped to the outputs defined in the Service Description, or vice versa. The advantage of the mapping component is that it allows multiple Service Descriptions, each with its own name, description, input, and outputs to use to use the same generic transport. By using XPath-like references, the mapping component supports the mapping of complex data structures such as an XML document. The mapping of constant values is also supported. Service Configuration \u2013 The Service Configuration is another layer of mapping meant for application designers. It maps items in the form to the inputs and outputs of the Service Description. The application designer is responsible for creating service configurations and connecting form items to the service inputs and outputs. Service configurations are stored inside the application. Supporting documents Use the following documents to gain a better understanding of the steps required to expose a service to Leap. Understanding the HTTP transport \u2013 The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the service mapping engine of Leap, the HTTP Service Transport can extract data from an HTTP response and make it available to your application. The HTTP Service Transport can be used to communicate with any standard HTTP server. While there are some limits on the capabilities of the HTTP Service Transport, it is all that is needed to communicate with a basic HTTP server, or RESTful service, in most cases. For more information, see HTTP Service Transport Creating and deploying service descriptions \u2013 The Service Description provides an interface to Leap mapping interface, and an interface to a Service Transport. For more information on creating Service Descriptions, see Service Description Parent topic: Incorporating web services into your applications","title":"Service Oriented Architecture \u2013 Exposing a service to Leap"},{"location":"cr_using_apps_exposing_service_to.html#exposingaservicetofeb","text":"The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. The Leap has an extensible services architecture which allows Leap applications to send and receive data from any external system. The Services Architecture consists of the following components: Service Transports \u2013 The Service Transport is the Java\u2122 code responsible for communicating with an external service, such as a public REST service. It can send data out to the external service or receive data from the external service. The transport also uses JDBC to store and retrieve data from any database. Alternatively, the transport can simply implement a \u201cservice\u201d itself, such as a unit conversion library. You can add any custom transport installation to the Leap installation by placing an appropriate JAR file in a specific directory on the Leap server; however, Leap already includes a generic HTTP transport which can send and receive data over the internet or intranet, and will suffice for many use cases. For more information, see Service Description . Service Descriptions \u2013 The Service Description provides the interface for a Service Transport. A Service Description is usually described by an XML file, although it is also possible to programmatically create a Service Description. The Service Description specifies a service's name, description, input parameters, and output parameters. These attributes are what appear to the application designer when they are hooking up services to a Leap application. Data Mapping \u2013 Each service description can contain an optional \u201cmapping\u201d component which describes how the data coming from the Service Transport can be mapped to the outputs defined in the Service Description, or vice versa. The advantage of the mapping component is that it allows multiple Service Descriptions, each with its own name, description, input, and outputs to use to use the same generic transport. By using XPath-like references, the mapping component supports the mapping of complex data structures such as an XML document. The mapping of constant values is also supported. Service Configuration \u2013 The Service Configuration is another layer of mapping meant for application designers. It maps items in the form to the inputs and outputs of the Service Description. The application designer is responsible for creating service configurations and connecting form items to the service inputs and outputs. Service configurations are stored inside the application.","title":"Service Oriented Architecture \u2013 Exposing a service to HCL Leap"},{"location":"cr_using_apps_exposing_service_to.html#supporting-documents","text":"Use the following documents to gain a better understanding of the steps required to expose a service to Leap. Understanding the HTTP transport \u2013 The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the service mapping engine of Leap, the HTTP Service Transport can extract data from an HTTP response and make it available to your application. The HTTP Service Transport can be used to communicate with any standard HTTP server. While there are some limits on the capabilities of the HTTP Service Transport, it is all that is needed to communicate with a basic HTTP server, or RESTful service, in most cases. For more information, see HTTP Service Transport Creating and deploying service descriptions \u2013 The Service Description provides an interface to Leap mapping interface, and an interface to a Service Transport. For more information on creating Service Descriptions, see Service Description Parent topic: Incorporating web services into your applications","title":"Supporting documents"},{"location":"cr_using_other_apps_as_services.html","text":"Integrating your application with existing HCL Leap applications Each Leap application can be used within another Leap applications as a service. You can use another application to provide data to populate a drop-down menu on your form. Or, you can search a list of products that are maintained by another application. The ability to share data is a powerful feature of Leap. To use an application as a service, the designer of an application must set the requisite permissions on the Access tab of the application. Access can be set for Read , or Read/Write . If you set Read access, other applications are able to Retrieve and Search information from a specific application. If you set Read/Write access, other applications are able to Retrieve, Search, Delete, and Submit information to and from a specific application. For more information about setting permissions, see Defining permissions to share data with other applications . Note: When you use another Leap application as a service, mandatory items must be explicitly mapped in the service mapping Inputs and Outputs. Default Items in the form do not satisfy the mandatory requirement as they are not evaluated on the server. If any value is marked as mandatory, it must have a value that is mapped to it in the mappings dialog. When mapping input parameters, each target has a Search Operator that can change how the inputs are interpreted. For example, you can apply a search operator to create an assignment that links the input with the target, and the operator. To apply the operator, you have to set the View to constant and then type the operator keyword in the editable field. The following table contains the list of available search operators. Search Operators Description equals Equal to notequals Not equal to lt Less than lte Less than or equal to gt Greater than gte Greater than or equal to Endswith The target ends with Startswith The target starts with contains The target contains The services also provide access to metadata about the records, such as author, creation time, and the current stage. When you call these services, metadata can be used to filter the results. The search results can be sorted by form data, such as a field in an application, or by some metadata, such as the lastUpdated time. The default sort order is ascending. To change it to descending, you must prefix your sort field with \u201cDESC\u201d. For example, the following string sorts ascending, \"F_Name\" . The following string sorts descending, \"DESCF_Name\" . The following values are available for you to use when you are searching with metadata: Metadata field Sort key Last update time \"lastUpdated\" Author name \"itemAuthor\" Stage name \"flowState\" Line ID \"dbId\" You can also limit the results by setting a Page Size that limits how many entries you return, or a Page, which limits pages to return. If you do not provide paging values, then all records that meet your filters are returned. To see the list of applications available as services select the HCL Leap Applications entry in the Service Catalog list. A list of all applications and methods available for Service mapping is shown. Each application can expose the following methods that are based on Access settings: Retrieve : Use Retrieve retrieve a single record from another application. For example, use Retrieve to pre-populate information that is based on an employee serial number that is entered by the user into the form. The retrieve returns a single row, and cannot be mapped to a repeating or list item. Search : Use Search to return a list of records from another application that meets the search criteria. For example, use Search to populate a drop-down with a list of values from another Leap application. The results from a search must be mapped to a repeating/list, drop-down, or table item. Delete : When Delete service method is called, it deletes the record in the target application that meets the supplied parameters. Use this method with caution as there is no way to retrieve the data after the record is deleted. Create : The Create method is used to create a record in the target application. Create replicates a user interacting with, and submitting, the target form. Update : The Update method is used to update an existing record in the target application. Update replicates a user interacting with, and submitting changes to a record in the target form Parent topic: Incorporating web services into your applications","title":"Integrating your application with existing Leap applications"},{"location":"cr_using_other_apps_as_services.html#definingaservicetotheexperiencebuilder","text":"Each Leap application can be used within another Leap applications as a service. You can use another application to provide data to populate a drop-down menu on your form. Or, you can search a list of products that are maintained by another application. The ability to share data is a powerful feature of Leap. To use an application as a service, the designer of an application must set the requisite permissions on the Access tab of the application. Access can be set for Read , or Read/Write . If you set Read access, other applications are able to Retrieve and Search information from a specific application. If you set Read/Write access, other applications are able to Retrieve, Search, Delete, and Submit information to and from a specific application. For more information about setting permissions, see Defining permissions to share data with other applications . Note: When you use another Leap application as a service, mandatory items must be explicitly mapped in the service mapping Inputs and Outputs. Default Items in the form do not satisfy the mandatory requirement as they are not evaluated on the server. If any value is marked as mandatory, it must have a value that is mapped to it in the mappings dialog. When mapping input parameters, each target has a Search Operator that can change how the inputs are interpreted. For example, you can apply a search operator to create an assignment that links the input with the target, and the operator. To apply the operator, you have to set the View to constant and then type the operator keyword in the editable field. The following table contains the list of available search operators. Search Operators Description equals Equal to notequals Not equal to lt Less than lte Less than or equal to gt Greater than gte Greater than or equal to Endswith The target ends with Startswith The target starts with contains The target contains The services also provide access to metadata about the records, such as author, creation time, and the current stage. When you call these services, metadata can be used to filter the results. The search results can be sorted by form data, such as a field in an application, or by some metadata, such as the lastUpdated time. The default sort order is ascending. To change it to descending, you must prefix your sort field with \u201cDESC\u201d. For example, the following string sorts ascending, \"F_Name\" . The following string sorts descending, \"DESCF_Name\" . The following values are available for you to use when you are searching with metadata: Metadata field Sort key Last update time \"lastUpdated\" Author name \"itemAuthor\" Stage name \"flowState\" Line ID \"dbId\" You can also limit the results by setting a Page Size that limits how many entries you return, or a Page, which limits pages to return. If you do not provide paging values, then all records that meet your filters are returned. To see the list of applications available as services select the HCL Leap Applications entry in the Service Catalog list. A list of all applications and methods available for Service mapping is shown. Each application can expose the following methods that are based on Access settings: Retrieve : Use Retrieve retrieve a single record from another application. For example, use Retrieve to pre-populate information that is based on an employee serial number that is entered by the user into the form. The retrieve returns a single row, and cannot be mapped to a repeating or list item. Search : Use Search to return a list of records from another application that meets the search criteria. For example, use Search to populate a drop-down with a list of values from another Leap application. The results from a search must be mapped to a repeating/list, drop-down, or table item. Delete : When Delete service method is called, it deletes the record in the target application that meets the supplied parameters. Use this method with caution as there is no way to retrieve the data after the record is deleted. Create : The Create method is used to create a record in the target application. Create replicates a user interacting with, and submitting, the target form. Update : The Update method is used to update an existing record in the target application. Update replicates a user interacting with, and submitting changes to a record in the target form Parent topic: Incorporating web services into your applications","title":"Integrating your application with existing HCL Leap applications"},{"location":"cr_viewing_submitted_responses.html","text":"Viewing submitted responses After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. To review user submitted responses, click View Data for a specific application. The View Data page opens, and you are presented with two options to view the submitted results: Viewing individual responses on the View Data page. The default is to see a list of responses. Viewing a summary of response data displayed in either a pie, bar chart, or table on the Summary page. Viewing responses in a list The following features are available on the View Data page: When you click on a response, it opens in a window so you can see all information easily. Print, email, and delete buttons are available on each row. You can access these buttons without having to open each individual response. If you choose to email the link to a response, the recipient receives not only a method of printing the response, but also a link to open and view the response. To obtain the View Data URL link On the Manage tab, click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. In the URL Links: section, change Launch Form to View Data . Copy the URL and paste it into a web browser, or disseminate it through email. Viewing summary responses in a chart Charts are available for the following form items: Check Box Currency Drop Down Number \u2013 both decimal and integer Select Many Select One Survey If there are no charts to display, or if you do not have the required access to view the submitted data, an error message is displayed. Access is configured when the application is created. The same access permissions that allow users to view and edit the form are used to display submitted results. The following list is a Summary of page chart features: Display type \u2013 By default, charts are displayed as pie charts. You can select to have the chart display as a bar chart. Selecting which charts to display \u2013 The Summary page displays charts for the first 10 form items in a form. If your form contains more than 10 items that can be displayed as charts, click Customize to add or remove form items from the Summary page. Selected charts are remembered as a personal setting from session to session and are also reflected in the distributed Share URLs. What a chart means \u2013 The question on which the results are based is displayed with each chart. If the form item charted is a survey, the survey title is displayed with each of the survey questions. Displaying choice results \u2013 Charts display the most popular 10 answers for a question. If there are more than 10 choices available to a user, the most popular 9 are displayed and the rest of the responses are grouped into an Other category. Displaying numerical results \u2013 If the form item requests a numerical value from the user, the first 10 values are displayed. If there are more than 10 submitted responses, the numerical values are grouped into Ranges . Although the range is automatically determined, some decisions for the range are based on form item configuration when the application is designed. Filtering data \u2013 You can filter the results that are displayed in the charts by clicking Filters and setting parameters. The charts display only the filtered results. Clearing the filters returns the original data set. You can also quickly filter data by clicking a section of the chart. The filter that results from the click is presented in the search dialog prior to application. Filters are applied to the overall set of submitted records and are therefore reflected in all charts. Filters are remembered as a personal setting from session to session, and are also reflected in any distributed Share URLs. Note that Filtering and Quick Filtering is not supported for the Select Many form item. Sharing charts \u2013 You can share the complete set of charts or individual charts by clicking Share . From the Share options, select whether to email or embed the URL of the chart. When you share a chart, the chart information is not static, and will continue to reflect new submissions. Any filters applied to the charts are also included when the chart URL is shared. Note: When you share charts, the people to whom you send the chart URL must have appropriate access permissions. Otherwise, an error message rather than the chart is displayed. iFrame embedding of charts \u2013 You can share charts by embedding the charts into an iFrame. You can use the embedding feature to show a chart on your own HTML page, or with an iFrame capable Portlet, such as the Web Clipping portlet. The iFrame content is also used to host the chart in a Leap application using the HTML form item. Statistical data provided \u2013 Each chart displays the number of times the question was answered from the total number of submitted responses. If questions in your form are not mandatory, you can see how many people answered the question, and how many did not answer the question. Charts that are based on Number or Currency form items display statistical data, such as the minimum, maximum, range, and average of the submitted values. Reflecting new data submission in existing charts \u2013 Click Refresh to reflect newly submitted data in existing charts. Viewing individual responses \u2013 A list of submitted responses is displayed in a table. By clicking the row of a response, the user\u2019s submitted form is displayed in the Application View frame. If the form contains workflow elements, such as approving or denying the form, buttons that are associated with the workflow are provided for you. Parent topic: Deploying applications and viewing data responses","title":"Viewing submitted responses"},{"location":"cr_viewing_submitted_responses.html#viewingsubmittedresponses","text":"After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. To review user submitted responses, click View Data for a specific application. The View Data page opens, and you are presented with two options to view the submitted results: Viewing individual responses on the View Data page. The default is to see a list of responses. Viewing a summary of response data displayed in either a pie, bar chart, or table on the Summary page. Viewing responses in a list The following features are available on the View Data page: When you click on a response, it opens in a window so you can see all information easily. Print, email, and delete buttons are available on each row. You can access these buttons without having to open each individual response. If you choose to email the link to a response, the recipient receives not only a method of printing the response, but also a link to open and view the response. To obtain the View Data URL link On the Manage tab, click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. In the URL Links: section, change Launch Form to View Data . Copy the URL and paste it into a web browser, or disseminate it through email. Viewing summary responses in a chart Charts are available for the following form items: Check Box Currency Drop Down Number \u2013 both decimal and integer Select Many Select One Survey If there are no charts to display, or if you do not have the required access to view the submitted data, an error message is displayed. Access is configured when the application is created. The same access permissions that allow users to view and edit the form are used to display submitted results. The following list is a Summary of page chart features: Display type \u2013 By default, charts are displayed as pie charts. You can select to have the chart display as a bar chart. Selecting which charts to display \u2013 The Summary page displays charts for the first 10 form items in a form. If your form contains more than 10 items that can be displayed as charts, click Customize to add or remove form items from the Summary page. Selected charts are remembered as a personal setting from session to session and are also reflected in the distributed Share URLs. What a chart means \u2013 The question on which the results are based is displayed with each chart. If the form item charted is a survey, the survey title is displayed with each of the survey questions. Displaying choice results \u2013 Charts display the most popular 10 answers for a question. If there are more than 10 choices available to a user, the most popular 9 are displayed and the rest of the responses are grouped into an Other category. Displaying numerical results \u2013 If the form item requests a numerical value from the user, the first 10 values are displayed. If there are more than 10 submitted responses, the numerical values are grouped into Ranges . Although the range is automatically determined, some decisions for the range are based on form item configuration when the application is designed. Filtering data \u2013 You can filter the results that are displayed in the charts by clicking Filters and setting parameters. The charts display only the filtered results. Clearing the filters returns the original data set. You can also quickly filter data by clicking a section of the chart. The filter that results from the click is presented in the search dialog prior to application. Filters are applied to the overall set of submitted records and are therefore reflected in all charts. Filters are remembered as a personal setting from session to session, and are also reflected in any distributed Share URLs. Note that Filtering and Quick Filtering is not supported for the Select Many form item. Sharing charts \u2013 You can share the complete set of charts or individual charts by clicking Share . From the Share options, select whether to email or embed the URL of the chart. When you share a chart, the chart information is not static, and will continue to reflect new submissions. Any filters applied to the charts are also included when the chart URL is shared. Note: When you share charts, the people to whom you send the chart URL must have appropriate access permissions. Otherwise, an error message rather than the chart is displayed. iFrame embedding of charts \u2013 You can share charts by embedding the charts into an iFrame. You can use the embedding feature to show a chart on your own HTML page, or with an iFrame capable Portlet, such as the Web Clipping portlet. The iFrame content is also used to host the chart in a Leap application using the HTML form item. Statistical data provided \u2013 Each chart displays the number of times the question was answered from the total number of submitted responses. If questions in your form are not mandatory, you can see how many people answered the question, and how many did not answer the question. Charts that are based on Number or Currency form items display statistical data, such as the minimum, maximum, range, and average of the submitted values. Reflecting new data submission in existing charts \u2013 Click Refresh to reflect newly submitted data in existing charts. Viewing individual responses \u2013 A list of submitted responses is displayed in a table. By clicking the row of a response, the user\u2019s submitted form is displayed in the Application View frame. If the form contains workflow elements, such as approving or denying the form, buttons that are associated with the workflow are provided for you. Parent topic: Deploying applications and viewing data responses","title":"Viewing submitted responses"},{"location":"create_postgresql_db.html","text":"Creating a PostgreSQL database The following instructions describe how to manually create the PostgreSQL database for Leap. In a production environment, you must create a PostgreSQL database before you install HCL Leap to WebSphere Application Server. Note: Do not create a new database if you want to continue using the same database with the existing user content. Create an empty PostgreSQL database following standard naming conventions. There are two methods: Use PGAdmin. Run psql.exe and execute the command create database mydbname;. Note: The default page size will be 8KB. Optionally, you may create a user for administering the Leap database: CREATE ROLE \u201cleap-admin\u201d WITH NOLOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD \u2018xxx\u2019; GRANT pg_database_owner to \u201cleap-admin\u201d WITH ADMIN OPTION; Parent topic: Create a Database","title":"Creating a PostgreSQL database"},{"location":"create_postgresql_db.html#create_postgresql_db","text":"The following instructions describe how to manually create the PostgreSQL database for Leap. In a production environment, you must create a PostgreSQL database before you install HCL Leap to WebSphere Application Server. Note: Do not create a new database if you want to continue using the same database with the existing user content. Create an empty PostgreSQL database following standard naming conventions. There are two methods: Use PGAdmin. Run psql.exe and execute the command create database mydbname;. Note: The default page size will be 8KB. Optionally, you may create a user for administering the Leap database: CREATE ROLE \u201cleap-admin\u201d WITH NOLOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD \u2018xxx\u2019; GRANT pg_database_owner to \u201cleap-admin\u201d WITH ADMIN OPTION; Parent topic: Create a Database","title":"Creating a PostgreSQL database"},{"location":"custom_properties_widgets.html","text":"Custom Properties The custom widget can define an array of custom properties for the app author to modify. Each property is an object with the following attributes: id : (required) uniquely identifies this property for this widget. label : (required) the property's label. propType : (required) one of: 'string' : rendered as a textbox. 'string-multiline' : rendered as a textarea. 'enum' : rendered as a dropdown. must be accompanied by a values attribute (see example below). 'boolean' : rendered as a checkbox. 'number' : rendered as a number input, for any number. 'integer' : rendered as a number input, for integers only. 'customOptions' : see the following listed items. values : required if propType is 'enum' (see the following example). defaultValue : (optional) the property's default value. constraints : (optional) min : (optional) minimum allowed property value for numbers. max : (optional) maximum allowed property value for numbers. Example: const myWidgetDefintion = { ... properties: [ ... { id: 'messageType', label: 'Message Type', propType: 'enum', values: [{title: 'Information', value: 'info'}, {title: 'Warning', value: 'warn'}, {title: 'Error', value: 'error'}], defaultValue: 'info' }, ... ], ... }; Parent topic: Custom Widget API","title":"Custom Properties"},{"location":"custom_properties_widgets.html#custom_properties_widgets","text":"The custom widget can define an array of custom properties for the app author to modify. Each property is an object with the following attributes: id : (required) uniquely identifies this property for this widget. label : (required) the property's label. propType : (required) one of: 'string' : rendered as a textbox. 'string-multiline' : rendered as a textarea. 'enum' : rendered as a dropdown. must be accompanied by a values attribute (see example below). 'boolean' : rendered as a checkbox. 'number' : rendered as a number input, for any number. 'integer' : rendered as a number input, for integers only. 'customOptions' : see the following listed items. values : required if propType is 'enum' (see the following example). defaultValue : (optional) the property's default value. constraints : (optional) min : (optional) minimum allowed property value for numbers. max : (optional) maximum allowed property value for numbers. Example: const myWidgetDefintion = { ... properties: [ ... { id: 'messageType', label: 'Message Type', propType: 'enum', values: [{title: 'Information', value: 'info'}, {title: 'Warning', value: 'warn'}, {title: 'Error', value: 'error'}], defaultValue: 'info' }, ... ], ... }; Parent topic: Custom Widget API","title":"Custom Properties"},{"location":"customwidgetapi_landing.html","text":"Custom Widget API This API provides a mechanism to incorporate custom widgets into the HCL Leap product. Getting started Product Configuration Additional resources can be loaded into Leap UI's by adding ibm.nitro.NitroConfig.runtimeResources properties to Leap_config.properties . These additional resources are expected to include definitions of your custom widgets and any auxiliary styles or libraries that are required to support them. For example: ibm.nitro.NitroConfig.runtimeResources.1 = \\ ; \\n\\ ; \\n\\ \\n\\ \\n Registering a Widget As your custom .js is loaded into the page, it is expected to register one or more widget definitions: const myWidgetDefinition = {...}; nitro.registerWidget(myWidgetDefintion); Full descriptions and examples are provided in the following topics. The following example is the basic skeleton of a custom widget: const myWidgetDefinition = { id: 'example.YesNo', // uniquely identifies this widget version: '2.0.0', // the widget's version apiVersion: '1.0.0', // the version of this API label: 'Yes/No', description: 'Allows user to choose \"Yes\" or \"No\"', datatype: { type: 'string' // must be one of 'string', 'date', 'number', 'boolean', 'time', 'timestamp' }, // for placement in the palette category: { id: 'example.choice.widgets', label: 'Choice Components' }, iconClassName: 'myYesNoIcon', // styling of this class expected in custom .css builtInProperties: [...], // use existing properties: 'title', 'required', etc properties: [...], // custom properties, of prescribed types // called by Leap to initialize widget in the DOM with initial properties, and set-up event handling instantiate: function (context, domNode, initialProps, eventManager) { return { // (optional) for display in various parts of the UI getDisplayTitle: function () { return ... }, // (required) for Leap to get widget's data value getValue: function () { return ... }, // (required) for Leap to set widget's data value setValue: function (val) { ... }, // (optional) for additional validation of value validateValue: function (val) { // return true, false, or custom error message }, // (required) called when properties change in the authoring environment, or via JavaScript API setProperty: function (propName, propValue) { ... }, // (optional) method to enable/disable widget setDisabled: function (isDisabled) { ... }, // (optional) determines what the author can do with the widget via custom JavaScript getJSAPIFacade: function () { return { ... }; } }; } }; Data Widgets vs Display Widgets Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). Data Types Data widgets can declare one of the listed data types, each with additional optional constraints. Rules App authors will be able to incorporate custom widgets in rules. Built-In Properties Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. Custom Properties The custom widget can define an array of custom properties for the app author to modify. Widgets with Options Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author. Widget Instantiation The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. Validation Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. Internationalization Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. Usage of JavaScript API Custom widgets can use Leap's JavaScript API to help achieve their objectives. Versioning This topic describes the widget's version . Upgrading The exact techniques for upgrading widgets from one major version to the next has not yet been established. Security Considerations This topic describes security considerations for Custom Widget API. Incorporating third-party libraries This topic describes incorporating third-party libraries. Known limitations Examples Parent topic: Reference","title":"Custom Widget API v1.0.0"},{"location":"customwidgetapi_landing.html#customwidgetapi_landing","text":"This API provides a mechanism to incorporate custom widgets into the HCL Leap product.","title":"Custom Widget API"},{"location":"customwidgetapi_landing.html#section_m5p_4cn_jyb","text":"Product Configuration Additional resources can be loaded into Leap UI's by adding ibm.nitro.NitroConfig.runtimeResources properties to Leap_config.properties . These additional resources are expected to include definitions of your custom widgets and any auxiliary styles or libraries that are required to support them. For example: ibm.nitro.NitroConfig.runtimeResources.1 = \\ ; \\n\\ ; \\n\\ \\n\\ \\n Registering a Widget As your custom .js is loaded into the page, it is expected to register one or more widget definitions: const myWidgetDefinition = {...}; nitro.registerWidget(myWidgetDefintion); Full descriptions and examples are provided in the following topics. The following example is the basic skeleton of a custom widget: const myWidgetDefinition = { id: 'example.YesNo', // uniquely identifies this widget version: '2.0.0', // the widget's version apiVersion: '1.0.0', // the version of this API label: 'Yes/No', description: 'Allows user to choose \"Yes\" or \"No\"', datatype: { type: 'string' // must be one of 'string', 'date', 'number', 'boolean', 'time', 'timestamp' }, // for placement in the palette category: { id: 'example.choice.widgets', label: 'Choice Components' }, iconClassName: 'myYesNoIcon', // styling of this class expected in custom .css builtInProperties: [...], // use existing properties: 'title', 'required', etc properties: [...], // custom properties, of prescribed types // called by Leap to initialize widget in the DOM with initial properties, and set-up event handling instantiate: function (context, domNode, initialProps, eventManager) { return { // (optional) for display in various parts of the UI getDisplayTitle: function () { return ... }, // (required) for Leap to get widget's data value getValue: function () { return ... }, // (required) for Leap to set widget's data value setValue: function (val) { ... }, // (optional) for additional validation of value validateValue: function (val) { // return true, false, or custom error message }, // (required) called when properties change in the authoring environment, or via JavaScript API setProperty: function (propName, propValue) { ... }, // (optional) method to enable/disable widget setDisabled: function (isDisabled) { ... }, // (optional) determines what the author can do with the widget via custom JavaScript getJSAPIFacade: function () { return { ... }; } }; } }; Data Widgets vs Display Widgets Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). Data Types Data widgets can declare one of the listed data types, each with additional optional constraints. Rules App authors will be able to incorporate custom widgets in rules. Built-In Properties Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. Custom Properties The custom widget can define an array of custom properties for the app author to modify. Widgets with Options Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author. Widget Instantiation The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. Validation Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. Internationalization Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. Usage of JavaScript API Custom widgets can use Leap's JavaScript API to help achieve their objectives. Versioning This topic describes the widget's version . Upgrading The exact techniques for upgrading widgets from one major version to the next has not yet been established. Security Considerations This topic describes security considerations for Custom Widget API. Incorporating third-party libraries This topic describes incorporating third-party libraries. Known limitations Examples Parent topic: Reference","title":"Getting started"},{"location":"da_controlling_data_available_for_export.html","text":"Controlling data available for export Use Filters to set rules, and select which data you want to export. You can set rules about which search results you see, as well as what is exported to an XML file or spreadsheet. Click the Manage tab. Select the application and click View Data for the application you want to manage. Click Create Filters . The Search window opens. Create a rule to search for the results you want to see using the menu. For example, select Created By from the Select Item menu. Select Equals from the Choose Operator menu and enter text in the field, such as Frank Adams. The rule searches for all records created by Frank Adams. To add another rule, click Add search filter . This time, select Last Updated by from the Select Items menu. Select Equals from the Choose Operator menu, and enter text in the field, such as Amadou Alain. Select the And radio button. Click Search . Leap searches the records for any that were created by Frank Adams and last updated by Amadou Alain. To return to your full result set, click Clear Filters . Parent topic: Exporting data from your application","title":"Controlling data available for export"},{"location":"da_controlling_data_available_for_export.html#controllingdataavailableforexport","text":"Use Filters to set rules, and select which data you want to export. You can set rules about which search results you see, as well as what is exported to an XML file or spreadsheet. Click the Manage tab. Select the application and click View Data for the application you want to manage. Click Create Filters . The Search window opens. Create a rule to search for the results you want to see using the menu. For example, select Created By from the Select Item menu. Select Equals from the Choose Operator menu and enter text in the field, such as Frank Adams. The rule searches for all records created by Frank Adams. To add another rule, click Add search filter . This time, select Last Updated by from the Select Items menu. Select Equals from the Choose Operator menu, and enter text in the field, such as Amadou Alain. Select the And radio button. Click Search . Leap searches the records for any that were created by Frank Adams and last updated by Amadou Alain. To return to your full result set, click Clear Filters . Parent topic: Exporting data from your application","title":"Controlling data available for export"},{"location":"da_data_analysis_and_exporting_data.html","text":"Labeling data, performing data analysis, and exporting data You can add labels to data elements in your application that become the label in the export file. After capturing data from users, you can label data elements to help analyze the data when it is exported to a spreadsheet, or database. You can also set which data points other users see with security rules. For example, you can restrict managers from seeing the time sheets of employees who are not on their team. Or, you can choose to hide all forms that are in an end state and do not need attention. You can also export tables. In the spreadsheet, Leap creates one row for each header and one row for each table. With these topics, learn how to label data, how to export data, and how labels affect the exported data. Changing the Saved Value of a form item You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Adding Data Labels to form items Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Exporting data from your application After users complete and submit forms, you can export the data to a spreadsheet. Parent topic: Creating and managing applications","title":"Labeling data, performing data analysis, and exporting data"},{"location":"da_data_analysis_and_exporting_data.html#danaanalysisandexportingdata","text":"You can add labels to data elements in your application that become the label in the export file. After capturing data from users, you can label data elements to help analyze the data when it is exported to a spreadsheet, or database. You can also set which data points other users see with security rules. For example, you can restrict managers from seeing the time sheets of employees who are not on their team. Or, you can choose to hide all forms that are in an end state and do not need attention. You can also export tables. In the spreadsheet, Leap creates one row for each header and one row for each table. With these topics, learn how to label data, how to export data, and how labels affect the exported data. Changing the Saved Value of a form item You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Adding Data Labels to form items Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Exporting data from your application After users complete and submit forms, you can export the data to a spreadsheet. Parent topic: Creating and managing applications","title":"Labeling data, performing data analysis, and exporting data"},{"location":"da_exporting_data_from_your_application.html","text":"Exporting data from your application After users complete and submit forms, you can export the data to a spreadsheet. HCL Leap exports the data from your application to an Atom feed in XML format, JSON JavaScript\u2122 Object Notification file, an OpenDocument spreadsheet, or Microsoft\u2122 Excel. By default, all data for a specific application to which you have access is exported, unless you restrict the data set using Search. From the Manage tab, click View Data under the application you want to export. Click the Responses tab and select Export Data . Click the Export To to button and select the format of the file you want. Controlling data available for export Use Filters to set rules, and select which data you want to export. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Exporting data from your application"},{"location":"da_exporting_data_from_your_application.html#exportingdatafromyourapplication","text":"After users complete and submit forms, you can export the data to a spreadsheet. HCL Leap exports the data from your application to an Atom feed in XML format, JSON JavaScript\u2122 Object Notification file, an OpenDocument spreadsheet, or Microsoft\u2122 Excel. By default, all data for a specific application to which you have access is exported, unless you restrict the data set using Search. From the Manage tab, click View Data under the application you want to export. Click the Responses tab and select Export Data . Click the Export To to button and select the format of the file you want. Controlling data available for export Use Filters to set rules, and select which data you want to export. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Exporting data from your application"},{"location":"da_labeling_fields_in_a_form.html","text":"Adding Data Labels to form items Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Display Values are shown to users when they view forms. While informative, Display Values may not make the best column headings. When analyzing an exported spreadsheet, a descriptive Data Label provides a column name, and gives context to the data viewed outside of the form. The following instructions describe how to add Data Labels to form items: Select the form item to reveal the properties side panel. Add text in the Data Label field. When you export the data, the text you entered in the data label becomes the name of the column. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Adding Data Labels to form items"},{"location":"da_labeling_fields_in_a_form.html#labelingfieldsinaform","text":"Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Display Values are shown to users when they view forms. While informative, Display Values may not make the best column headings. When analyzing an exported spreadsheet, a descriptive Data Label provides a column name, and gives context to the data viewed outside of the form. The following instructions describe how to add Data Labels to form items: Select the form item to reveal the properties side panel. Add text in the Data Label field. When you export the data, the text you entered in the data label becomes the name of the column. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Adding Data Labels to form items"},{"location":"da_labeling_saved_values_in_forms.html","text":"Changing the Saved Value of a form item You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Display Values are shown to users when they view forms. By default, the Display Value is the Saved Value. Altering Saved Values is useful when exporting data to a spreadsheet. For example, in a Drop Down, Select One, Select Many, or Survey, users are presented with a list of options. Changing the Saved Value of a form item is useful if you want to quantify, or rank the choices users make without presenting such ranks to the users. If the Saved Value of the data is shorter and more descriptive than the Displayed Value, it is easier for reviewers to understand when viewing the exported data in a spreadsheet. Select the form item with predefined choices, such as a Drop Down, or Select One, the Properties side panel appears. Enter a value in the Displayed Value field. The Displayed Value is what the user sees when viewing the form. What you type in the Displayed Value field is automatically used as the Saved Value. Enter a value in the Saved Value field. The Saved Value is displayed when you view the responses during an export. Click the green plus sign next to the Saved Value field to add another row to the list. If you want to have one option display to the users as a preselected default, click the radio button for the Saved Value field. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Changing the Saved Value of a form item"},{"location":"da_labeling_saved_values_in_forms.html#labelingsavedvaluesinforms","text":"You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Display Values are shown to users when they view forms. By default, the Display Value is the Saved Value. Altering Saved Values is useful when exporting data to a spreadsheet. For example, in a Drop Down, Select One, Select Many, or Survey, users are presented with a list of options. Changing the Saved Value of a form item is useful if you want to quantify, or rank the choices users make without presenting such ranks to the users. If the Saved Value of the data is shorter and more descriptive than the Displayed Value, it is easier for reviewers to understand when viewing the exported data in a spreadsheet. Select the form item with predefined choices, such as a Drop Down, or Select One, the Properties side panel appears. Enter a value in the Displayed Value field. The Displayed Value is what the user sees when viewing the form. What you type in the Displayed Value field is automatically used as the Saved Value. Enter a value in the Saved Value field. The Saved Value is displayed when you view the responses during an export. Click the green plus sign next to the Saved Value field to add another row to the list. If you want to have one option display to the users as a preselected default, click the radio button for the Saved Value field. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Changing the Saved Value of a form item"},{"location":"datatypes_widgets.html","text":"Data Types Data widgets can declare one of the listed data types, each with additional optional constraints. Constraints on the data type goes beyond the UI. These constraints will be enforced when data is submitted to the server. **string** A piece of text. Constraints: length : the max number of characters allowed, including multi-byte charaters. Note, if this length is greater than 255 the submitted value will be stored as CLOB in the database and will not be sortable. Default value: 50 subType Email URL format : limit user's input to specific format, use # for numbers 0-9, @ for letters A-Z and ? for number or letter simplePattern invalidMessage multiValue - true or false . If true , the value returned by the widget is an array of strings, otherwise it is a single string. The default value is false . const myWidgetDefinition = { ... datatype: { type: 'string', length: 50, format: { simplePattern: '#####,#####-####' // US zip code invalidMessage: 'Please enter a valid US zip code' } } ... }; 'boolean' A true or false value. A null value is not supported. The default value is false Constraints: None. 'number' A number. Contraints: numberType : one of 'decimal' or 'integer' . Default: 'decimal' decimalPlaces : if number is a 'decimal' , will round to the given number of decimal places. Default: 2 minValue : minimum value of number expected. Can be omitted or set to null if no minimum maxValue : maximum value of number expected. Can be omitted or set to null if no maximum const myWidgetDefinition = { ... datatype: { type: 'number', numberType: 'decimal', decimalPlaces: 2 } ... }; 'date' A date-only value in 'YYYY-MM-DD' string format. Custom widgets are expected to handle the setting of the date in a 'YYYY-MM-DD' string format, or as a Date object. Contraints: minValue : minimum value of date expected. Can be omitted or set to null if no minimum maxValue : maximum value of date expected. Can be omitted or set to null if no maximum 'time' A time-only value in 'hh:mm' string format (24-hour clock). Contraints: minValue : minimum value of time expected. Can be omitted or set to null if no minimum maxValue : maximum value of time expected. Can be omitted or set to null if no maximum 'timestamp' A date-time value in ISO 8601 'YYYY-MM-DDThh:mmZ' string format, normalized to the UTC timezone (denoted by Z ) Custom widgets are expected to handle the setting of the date ISO 8601 'YYYY-MM-DDThh:mmZ' format, or as a Date object. Constraints: minValue : minimum value of time stamp expected. Can be omitted or set to null if no minimum maxValue : maximum value of time stamp expected. Can be omitted or set to null if no maximum Parent topic: Custom Widget API","title":"Data Types"},{"location":"datatypes_widgets.html#datatypes_widgets","text":"Data widgets can declare one of the listed data types, each with additional optional constraints. Constraints on the data type goes beyond the UI. These constraints will be enforced when data is submitted to the server. **string** A piece of text. Constraints: length : the max number of characters allowed, including multi-byte charaters. Note, if this length is greater than 255 the submitted value will be stored as CLOB in the database and will not be sortable. Default value: 50 subType Email URL format : limit user's input to specific format, use # for numbers 0-9, @ for letters A-Z and ? for number or letter simplePattern invalidMessage multiValue - true or false . If true , the value returned by the widget is an array of strings, otherwise it is a single string. The default value is false . const myWidgetDefinition = { ... datatype: { type: 'string', length: 50, format: { simplePattern: '#####,#####-####' // US zip code invalidMessage: 'Please enter a valid US zip code' } } ... }; 'boolean' A true or false value. A null value is not supported. The default value is false Constraints: None. 'number' A number. Contraints: numberType : one of 'decimal' or 'integer' . Default: 'decimal' decimalPlaces : if number is a 'decimal' , will round to the given number of decimal places. Default: 2 minValue : minimum value of number expected. Can be omitted or set to null if no minimum maxValue : maximum value of number expected. Can be omitted or set to null if no maximum const myWidgetDefinition = { ... datatype: { type: 'number', numberType: 'decimal', decimalPlaces: 2 } ... }; 'date' A date-only value in 'YYYY-MM-DD' string format. Custom widgets are expected to handle the setting of the date in a 'YYYY-MM-DD' string format, or as a Date object. Contraints: minValue : minimum value of date expected. Can be omitted or set to null if no minimum maxValue : maximum value of date expected. Can be omitted or set to null if no maximum 'time' A time-only value in 'hh:mm' string format (24-hour clock). Contraints: minValue : minimum value of time expected. Can be omitted or set to null if no minimum maxValue : maximum value of time expected. Can be omitted or set to null if no maximum 'timestamp' A date-time value in ISO 8601 'YYYY-MM-DDThh:mmZ' string format, normalized to the UTC timezone (denoted by Z ) Custom widgets are expected to handle the setting of the date ISO 8601 'YYYY-MM-DDThh:mmZ' format, or as a Date object. Constraints: minValue : minimum value of time stamp expected. Can be omitted or set to null if no minimum maxValue : maximum value of time stamp expected. Can be omitted or set to null if no maximum Parent topic: Custom Widget API","title":"Data Types"},{"location":"datawidgets_displaywidgets.html","text":"Data Widgets vs Display Widgets Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). A data widget is required to: Declare a datatype property (described below). Provide setValue() and getValue() functions. Publish an onChange event when its value is changed by the user. This will trigger a call to the widget's getValue() function, and validateValue() function if supplied. Some display widgets are still expected to trigger events (for example, onClick ), which can be used by the app author to invoke an action, by custom JavaScript or other techniques. Parent topic: Custom Widget API","title":"Data Widgets vs Display Widgets"},{"location":"datawidgets_displaywidgets.html#datawidgets_displaywidgets","text":"Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). A data widget is required to: Declare a datatype property (described below). Provide setValue() and getValue() functions. Publish an onChange event when its value is changed by the user. This will trigger a call to the widget's getValue() function, and validateValue() function if supplied. Some display widgets are still expected to trigger events (for example, onClick ), which can be used by the app author to invoke an action, by custom JavaScript or other techniques. Parent topic: Custom Widget API","title":"Data Widgets vs Display Widgets"},{"location":"deploy_container_kubernetes_openliberty.html","text":"Deploying to a Container (Kubernetes) Platform - Open Liberty The following sections describe how to deploy Leap to a Kubernetes-friendly container platform. All of the possible configuration parameters may be found in the values.yaml which is part of the deployment package. Prerequisite - Specifying persistant volumes Kubernetes must have: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. Note: If files are added to these volumes while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system or a location supplied by a cloud provider.","title":"Deploying to a Container \\(Kubernetes\\) Platform - Open Liberty {#deploy_container_kubernetes_openliberty .concept}"},{"location":"deploy_container_kubernetes_openliberty.html#deploy_container_kubernetes_openliberty","text":"The following sections describe how to deploy Leap to a Kubernetes-friendly container platform. All of the possible configuration parameters may be found in the values.yaml which is part of the deployment package.","title":"Deploying to a Container (Kubernetes) Platform - Open Liberty"},{"location":"deploy_container_kubernetes_openliberty.html#section_f4f_24s_gxb","text":"Kubernetes must have: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. Note: If files are added to these volumes while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system or a location supplied by a cloud provider.","title":"Prerequisite - Specifying persistant volumes"},{"location":"deploytraditional_leap.html","text":"Deploying to a traditional platform The following topics describe how to deploy Leap to a traditional platform. Basic Architecture Leap relies on two central components: the application server and the database. Manually deploying to WebSphere Application Server The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Parent topic: Deploying Leap","title":"Deploying to a traditional platform"},{"location":"deploytraditional_leap.html#untitled6","text":"The following topics describe how to deploy Leap to a traditional platform. Basic Architecture Leap relies on two central components: the application server and the database. Manually deploying to WebSphere Application Server The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Parent topic: Deploying Leap","title":"Deploying to a traditional platform"},{"location":"di_adding_pdf_to.html","text":"Adding a PDF to Leap The following instructions describe how to add a PDF to Leap. Go to Settings > Files . Click Add . The Add File or URL Link window opens. Select your PDF: Add a file from your computer \u2013 Browse to the file location on your computer. The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .pdf file extension remains. You can also enter a description of the file, which is useful if you have several similarly named PDFs. Note: The name of the file is displayed to users when they populate the PDF. Click OK to save changes and close the window. Save the application. Note: You must save the application after the PDF is loaded. Without saving the application, the PDF is not available when you attempt to create a Service Configuration. Parent topic: Leap document integration","title":"Adding a PDF to Leap"},{"location":"di_adding_pdf_to.html#addingapdftofeb","text":"The following instructions describe how to add a PDF to Leap. Go to Settings > Files . Click Add . The Add File or URL Link window opens. Select your PDF: Add a file from your computer \u2013 Browse to the file location on your computer. The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .pdf file extension remains. You can also enter a description of the file, which is useful if you have several similarly named PDFs. Note: The name of the file is displayed to users when they populate the PDF. Click OK to save changes and close the window. Save the application. Note: You must save the application after the PDF is loaded. Without saving the application, the PDF is not available when you attempt to create a Service Configuration. Parent topic: Leap document integration","title":"Adding a PDF to Leap"},{"location":"di_creating_the_pdf_trigger.html","text":"Creating the PDF trigger The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. When the user clicks the button, the service that maps information from the form to the PDF is triggered. The PDF is displayed, or stored as an attachment, with user supplied information in the PDF fields. Add a Button to your form from the Palette. Change the Caption of the button so users know that clicking it populates a PDF. For example, change the caption of the button to Create PDF. In the Properties side panel, select Call a service when clicked . Select the Service Configuration you created from the menu. Save your application. When the application is deployed, you can click the Create PDF button and a PDF is populated containing the values that are entered in the Leap application. Note: You can use other common form events as triggers, including validateButtonPressed . Stage action buttons cannot be used as triggers. Parent topic: Leap document integration","title":"Creating the PDF trigger"},{"location":"di_creating_the_pdf_trigger.html#creatingthepdfbutton","text":"The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. When the user clicks the button, the service that maps information from the form to the PDF is triggered. The PDF is displayed, or stored as an attachment, with user supplied information in the PDF fields. Add a Button to your form from the Palette. Change the Caption of the button so users know that clicking it populates a PDF. For example, change the caption of the button to Create PDF. In the Properties side panel, select Call a service when clicked . Select the Service Configuration you created from the menu. Save your application. When the application is deployed, you can click the Create PDF button and a PDF is populated containing the values that are entered in the Leap application. Note: You can use other common form events as triggers, including validateButtonPressed . Stage action buttons cannot be used as triggers. Parent topic: Leap document integration","title":"Creating the PDF trigger"},{"location":"di_mapping_form_items_to_pdf_fields.html","text":"Mapping form items to PDF fields The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . When all inputs are mapped, click OK . Parent topic: Leap document integration","title":"Mapping form items to PDF fields"},{"location":"di_mapping_form_items_to_pdf_fields.html#mappingformitemstopdffields","text":"The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . When all inputs are mapped, click OK . Parent topic: Leap document integration","title":"Mapping form items to PDF fields"},{"location":"di_mapping_form_items_to_pdf_fields_and_attaching.html","text":"Mapping form items to PDF fields and storing the filled PDF NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. You must have added an attachment item to your application. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . In the Select Source window, switch from Basic view to Constant view. In the Event Value field type True . In the Select target window, select Create As Attachment and click the assign input button located between the two windows. The mapped value will appear in the list of Assigned Input . Click Next . The Outputs tab is active. Select Filled PDF from the Select Source window and select an attachment form item from the Select Target window. Click Assign Outputs button that is located between the two windows. The mapped value will appear in the list of Assigned Outputs . Click Ok . Parent topic: Leap document integration","title":"Mapping form items to PDF fields and storing the filled PDF"},{"location":"di_mapping_form_items_to_pdf_fields_and_attaching.html#mappingformitemstopdffields","text":"NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. You must have added an attachment item to your application. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . In the Select Source window, switch from Basic view to Constant view. In the Event Value field type True . In the Select target window, select Create As Attachment and click the assign input button located between the two windows. The mapped value will appear in the list of Assigned Input . Click Next . The Outputs tab is active. Select Filled PDF from the Select Source window and select an attachment form item from the Select Target window. Click Assign Outputs button that is located between the two windows. The mapped value will appear in the list of Assigned Outputs . Click Ok . Parent topic: Leap document integration","title":"Mapping form items to PDF fields and storing the filled PDF"},{"location":"di_pop_doc_with_app_data.html","text":"Leap document integration Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Where compliance or regulatory requirements mandate it, integrating Leap captured data with existing documents can be an important part of the overall Leap solution. These output documents can be provided for precise printing, document signing or archiving. You can now use a Leap form to collect user data, and display the information in a PDF. This process requires four steps: Load an existing PDF into Leap. Create a form that contains information fields that align with fields in the PDF. Create a service description by mapping fields from your form to fields in the PDF. Add a button that the user can click to populate and display a PDF. Note: For the Leap document integration, PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adding a PDF to Leap The following instructions describe how to add a PDF to Leap. Mapping form items to PDF fields The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. Mapping form items to PDF fields and storing the filled PDF NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. Creating the PDF trigger The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. Document integration usage details The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Parent topic: Creating and managing applications","title":"Leap document integration"},{"location":"di_pop_doc_with_app_data.html#generatingfillablepdfs","text":"Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Where compliance or regulatory requirements mandate it, integrating Leap captured data with existing documents can be an important part of the overall Leap solution. These output documents can be provided for precise printing, document signing or archiving. You can now use a Leap form to collect user data, and display the information in a PDF. This process requires four steps: Load an existing PDF into Leap. Create a form that contains information fields that align with fields in the PDF. Create a service description by mapping fields from your form to fields in the PDF. Add a button that the user can click to populate and display a PDF. Note: For the Leap document integration, PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adding a PDF to Leap The following instructions describe how to add a PDF to Leap. Mapping form items to PDF fields The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. Mapping form items to PDF fields and storing the filled PDF NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. Creating the PDF trigger The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. Document integration usage details The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Parent topic: Creating and managing applications","title":"Leap document integration"},{"location":"di_usage_details.html","text":"Document integration usage details The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Selecting PDF types : PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adobe\u2122 Acrobat Pro is the primary tool that is used for creating PDFs where you can complete fields, and can be used to reliably create or modify existing PDFs to make them compatible with the Leap document integration feature. In some cases, Adobe Acrobat Reader extensions are removed by Reader after the document is populated. XFA PDFs have partial support when they have \u201ccompatibility mode\u201d enabled. Encrypted PDFs cannot be populated. Some PDF documents are intended only for printing and have no data entry fields. These PDFs cannot be populated. A number of freely available PDF authoring tools on the web do not create compatible PDFs. Some PDF documents that are created or modified with these tools might appear to have direct text entry support but do not allow completion of fields. If a PDF has limitations that make it unusable for populating with data from Leap, you can still attach the PDF to the form and it is returned unmodified. This is useful if you want to return a static PDF containing detailed instructions. Populating fields in a signed PDF document results in a validation warning message that is displayed by the PDF Reader. The warning message tells users unsigned changes were added after the document was signed. When you work with languages that contain extended character sets, be sure to match the language of the Leap form with the Language/Font of the PDF item. Any character or glyph that is missing from a font is omitted from the value that is passed. The built-in PDF viewer on iOS/Safari does not properly render values of filled PDF's. This is an iOS/Safari limitation. Mapping information : Values can be mapped to PDF Text Fields that are marked as readonly. You can populate a PDF from values that are collected in the Leap form, while the PDF remains unmodifiable through direct entry. The design time exercise of creating a map to indicate how data moves from application to the PDF are made much easier when items on both sides are properly named. When you use the Leap mapping dialog, if items in the PDF do not have recognizable names, Adobe Acrobat Pro can be used to modify the PDF. Take care to understand the format and constraints of the item you are mapping to and from. In some cases, a poorly matched map results in a blank item in the PDF because no value is mapped. For example, mapping a Number into a PDF Date Text Field , or mapping multiple selections from a Select Many choice item into a PDF Radio Group . In other cases, a value appears in the PDF but might result in constraint violations within the PDF. For example, mapping an unconstrained Single-Line Entry into a PDF Field . Multi-lined values cannot be mapped to single lined text fields in a PDF. The Export Values for PDF choice type items can be determined by inspecting the PDF with an editing tool. The Export Values are also displayed as part of the Description property in the extra information hover text within the Leap mapping dialog. To see the Export Values , hover over the information icon next to any PDF item in the list to be mapped. For a successful map, the Saved Value for the Leap item should be adjusted to match the Export Value . To map choice items, the Saved Value for the selected choice must match the Export Value for the available choice in the PDF item. The Export Value is used as an indicator of whether a particular choice in the item is marked as selected, or turned \u201con\u201d. This note is applicable to Leap choice items such as Select One , Select Many , Drop Down , Survey , and Choice Slider . When you map a Check Box to a PDF Check Box , the Export Value is automatically determined so no special consideration needs to be made around matching the Export Value. Select Many A Select Many can be mapped into a PDF Radio Group . However, configure the Select Many with a constraint that allows only one choice selection so the constraints of the PDF Radio Group are not violated A Select Many should not be mapped to a cluster of PDF Check Boxes if the PDF Check Boxes do not have unique Export Values . In this case, the Leap form might need to be altered to replace the Select Many item with a cluster of individual Checkboxes . A Select Many maps well to a PDF List Box Multi-Select but can also be mapped to a cluster of PDF Check Boxes by creating multiple maps. One map from the Select Many to each Check Box in the cluster. When mapping from a Select Many to a PDF Check Box , the Saved Value of a selected choice must match the Export Value of the PDF Check Box for the PDF check box to be turned on. Each question in a Survey must be mapped separately, and must use the same rules for mapping as a Select One or Select Many . Leap tables are repeating rows of data and cannot be mapped directly into a PDF. Some Leap items that cannot be mapped are Image , HTML Fragments , Text , Button , Line , Media , Web Link , Attachment , Page Navigation , Section , and Tabbed Folder . Some PDF items that cannot be mapped are Button , Digital Signature , Image , and Text . Parent topic: Leap document integration","title":"Document integration usage details"},{"location":"di_usage_details.html#documentintegrationusagedetails","text":"The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Selecting PDF types : PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adobe\u2122 Acrobat Pro is the primary tool that is used for creating PDFs where you can complete fields, and can be used to reliably create or modify existing PDFs to make them compatible with the Leap document integration feature. In some cases, Adobe Acrobat Reader extensions are removed by Reader after the document is populated. XFA PDFs have partial support when they have \u201ccompatibility mode\u201d enabled. Encrypted PDFs cannot be populated. Some PDF documents are intended only for printing and have no data entry fields. These PDFs cannot be populated. A number of freely available PDF authoring tools on the web do not create compatible PDFs. Some PDF documents that are created or modified with these tools might appear to have direct text entry support but do not allow completion of fields. If a PDF has limitations that make it unusable for populating with data from Leap, you can still attach the PDF to the form and it is returned unmodified. This is useful if you want to return a static PDF containing detailed instructions. Populating fields in a signed PDF document results in a validation warning message that is displayed by the PDF Reader. The warning message tells users unsigned changes were added after the document was signed. When you work with languages that contain extended character sets, be sure to match the language of the Leap form with the Language/Font of the PDF item. Any character or glyph that is missing from a font is omitted from the value that is passed. The built-in PDF viewer on iOS/Safari does not properly render values of filled PDF's. This is an iOS/Safari limitation. Mapping information : Values can be mapped to PDF Text Fields that are marked as readonly. You can populate a PDF from values that are collected in the Leap form, while the PDF remains unmodifiable through direct entry. The design time exercise of creating a map to indicate how data moves from application to the PDF are made much easier when items on both sides are properly named. When you use the Leap mapping dialog, if items in the PDF do not have recognizable names, Adobe Acrobat Pro can be used to modify the PDF. Take care to understand the format and constraints of the item you are mapping to and from. In some cases, a poorly matched map results in a blank item in the PDF because no value is mapped. For example, mapping a Number into a PDF Date Text Field , or mapping multiple selections from a Select Many choice item into a PDF Radio Group . In other cases, a value appears in the PDF but might result in constraint violations within the PDF. For example, mapping an unconstrained Single-Line Entry into a PDF Field . Multi-lined values cannot be mapped to single lined text fields in a PDF. The Export Values for PDF choice type items can be determined by inspecting the PDF with an editing tool. The Export Values are also displayed as part of the Description property in the extra information hover text within the Leap mapping dialog. To see the Export Values , hover over the information icon next to any PDF item in the list to be mapped. For a successful map, the Saved Value for the Leap item should be adjusted to match the Export Value . To map choice items, the Saved Value for the selected choice must match the Export Value for the available choice in the PDF item. The Export Value is used as an indicator of whether a particular choice in the item is marked as selected, or turned \u201con\u201d. This note is applicable to Leap choice items such as Select One , Select Many , Drop Down , Survey , and Choice Slider . When you map a Check Box to a PDF Check Box , the Export Value is automatically determined so no special consideration needs to be made around matching the Export Value. Select Many A Select Many can be mapped into a PDF Radio Group . However, configure the Select Many with a constraint that allows only one choice selection so the constraints of the PDF Radio Group are not violated A Select Many should not be mapped to a cluster of PDF Check Boxes if the PDF Check Boxes do not have unique Export Values . In this case, the Leap form might need to be altered to replace the Select Many item with a cluster of individual Checkboxes . A Select Many maps well to a PDF List Box Multi-Select but can also be mapped to a cluster of PDF Check Boxes by creating multiple maps. One map from the Select Many to each Check Box in the cluster. When mapping from a Select Many to a PDF Check Box , the Saved Value of a selected choice must match the Export Value of the PDF Check Box for the PDF check box to be turned on. Each question in a Survey must be mapped separately, and must use the same rules for mapping as a Select One or Select Many . Leap tables are repeating rows of data and cannot be mapped directly into a PDF. Some Leap items that cannot be mapped are Image , HTML Fragments , Text , Button , Line , Media , Web Link , Attachment , Page Navigation , Section , and Tabbed Folder . Some PDF items that cannot be mapped are Button , Digital Signature , Image , and Text . Parent topic: Leap document integration","title":"Document integration usage details"},{"location":"ex_adding_ccs.html","text":"Adding customized CSS to your application You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Adding custom cascading style sheet (CSS) themes personalizes applications with the branding of your organization. Click the Style tab. Click Add file . The Add File or URL Link window opens. Select your custom style sheet: Add a file from your computer \u2013 Browse to the file location on your computer. Use a file on the internet \u2013 insert the URL of file location. Select whether you want to Import the file from the internet or Maintain a link to the file only . The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .css file extension remains. You can also enter a description of the file, which is useful if you have several similarly named style sheets. Click OK to save changes and close the window. To replace the built-in theme, select Replace built-in theme . You can use the built-in style sheets to complement your CSS, or you can replace them entirely with your CSS file with this option. After a style sheet is uploaded, you can select it from the drop-down menu. While you can upload many custom style sheets, you can select only one per application. Note: To see the style sheet that is applied to your application, either preview, or save and deploy the application. See Creating customized Cascading Style Sheets for information about creating your own custom CSS. Parent topic: Using custom style sheets","title":"Adding customized CSS to your application"},{"location":"ex_adding_ccs.html#addingcustomizedcascadingstylesheets","text":"You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Adding custom cascading style sheet (CSS) themes personalizes applications with the branding of your organization. Click the Style tab. Click Add file . The Add File or URL Link window opens. Select your custom style sheet: Add a file from your computer \u2013 Browse to the file location on your computer. Use a file on the internet \u2013 insert the URL of file location. Select whether you want to Import the file from the internet or Maintain a link to the file only . The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .css file extension remains. You can also enter a description of the file, which is useful if you have several similarly named style sheets. Click OK to save changes and close the window. To replace the built-in theme, select Replace built-in theme . You can use the built-in style sheets to complement your CSS, or you can replace them entirely with your CSS file with this option. After a style sheet is uploaded, you can select it from the drop-down menu. While you can upload many custom style sheets, you can select only one per application. Note: To see the style sheet that is applied to your application, either preview, or save and deploy the application. See Creating customized Cascading Style Sheets for information about creating your own custom CSS. Parent topic: Using custom style sheets","title":"Adding customized CSS to your application"},{"location":"ex_css_toc.html","text":"Using custom style sheets HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. See Creating customized Cascading Style Sheets for information on how to create your own custom CSS. Adding customized CSS to your application You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Removing a custom style sheet The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Parent topic: Extending","title":"Using custom style sheets"},{"location":"ex_css_toc.html#usingcustomstylesheets","text":"HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. See Creating customized Cascading Style Sheets for information on how to create your own custom CSS. Adding customized CSS to your application You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Removing a custom style sheet The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Parent topic: Extending","title":"Using custom style sheets"},{"location":"ex_removing_a_css.html","text":"Removing a custom style sheet The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Click the Settings tab, then click Files from the menu. A list of all uploaded files is shown. Locate the file that you want to delete and click Delete . A confirmation window is shown. Click Yes to delete the file. The file is removed from the list. Parent topic: Using custom style sheets","title":"Removing a custom style sheet"},{"location":"ex_removing_a_css.html#removingacustomstylesheet","text":"The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Click the Settings tab, then click Files from the menu. A list of all uploaded files is shown. Locate the file that you want to delete and click Delete . A confirmation window is shown. Click Yes to delete the file. The file is removed from the list. Parent topic: Using custom style sheets","title":"Removing a custom style sheet"},{"location":"ex_soa_service_transport.html","text":"Service Oriented Architecture \u2013 Service Transport HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Each Service Transport represents a single communication process. Leap provides a REST transport. Additional transports can be developed and integrated into Leap to allow you to access other Services than ones expressed as REST. Each transport is written in Java\u2122 as an OSGI bundle. Creating your own custom Service Transport By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. Parent topic: Adding services","title":"Service Oriented Architecture -\u2013 Service Transport"},{"location":"ex_soa_service_transport.html#soaservicetransport","text":"HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Each Service Transport represents a single communication process. Leap provides a REST transport. Additional transports can be developed and integrated into Leap to allow you to access other Services than ones expressed as REST. Each transport is written in Java\u2122 as an OSGI bundle. Creating your own custom Service Transport By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. Parent topic: Adding services","title":"Service Oriented Architecture \u2013 Service Transport"},{"location":"extending_toc.html","text":"Extending You can extend the functionality of HCL Leap through the use of customized cascading style sheets, Javascript APIs, and REST APIs, and Service Oriented Architecture modifications. Service Description: Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The Service Description provides a human-readable view on a service that uses a Service Transport. Service Descriptions are files stored on the server that make a service available toLeap when designing an application. For more information about creating a Service Description, see Service Oriented Architecture . JavaScript API: HCL Leap provides a JavaScript\u2122 API allowing designers to extend the customization provided by formulas, stages, rules, and services. The JavaScript is triggered on events tied to the user interface items in an application. The API has full access to the \u201cBusiness Object\u201d of the application. All JavaScript is covered by the security sandbox model. See the JavaScript API Reference document for full details on the available API methods, business object, security model, and event model. Data Access REST API: The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis. You might want to access the data directly for analysis and reporting. To allow this access, we provide a REST API that allows you access the data programmatically. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. For full details on this API, see Data access REST API . Using custom style sheets HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. Adding services The following topics describe how to add services to your Leap applications.","title":"Extending"},{"location":"extending_toc.html#extending","text":"You can extend the functionality of HCL Leap through the use of customized cascading style sheets, Javascript APIs, and REST APIs, and Service Oriented Architecture modifications. Service Description: Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The Service Description provides a human-readable view on a service that uses a Service Transport. Service Descriptions are files stored on the server that make a service available toLeap when designing an application. For more information about creating a Service Description, see Service Oriented Architecture . JavaScript API: HCL Leap provides a JavaScript\u2122 API allowing designers to extend the customization provided by formulas, stages, rules, and services. The JavaScript is triggered on events tied to the user interface items in an application. The API has full access to the \u201cBusiness Object\u201d of the application. All JavaScript is covered by the security sandbox model. See the JavaScript API Reference document for full details on the available API methods, business object, security model, and event model. Data Access REST API: The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis. You might want to access the data directly for analysis and reporting. To allow this access, we provide a REST API that allows you access the data programmatically. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. For full details on this API, see Data access REST API . Using custom style sheets HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. Adding services The following topics describe how to add services to your Leap applications.","title":"Extending"},{"location":"get_overview.html","text":"What is HCL Leap, and how is it used? This document provides an overview of the three main activities that are involved in using Leap. There are three main activities that are involved in using Leap: Building forms Publishing applications Reviewing submissions Forms and Applications Throughout the Leap documentation, the words form and application are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather the submitted input and automatically store the submissions in a database. Building forms When you start Leap, you are shown a screen with two tabs on the Forms toolbar: Use and Manage. The Use tab shows a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. When Leap opens, you are shown the Manage tab, which displays any applications you created, or for which you have edit permissions. To create an application, click New Application , enter a descriptive application name, and select Create . A blank form is displayed. Drag items from the Palette and drop them onto the form. As you add items, you can change the default name of each item directly on the form. Click the name of the widget on the canvas to edit the name. A built-in grid automatically aligns items on the form, and expands vertically when you add items to the form. The default layout is two columns and two rows. However, you have flexibility when you build your form. You can stretch one form item to span across all columns, and you can add and delete columns and rows as needed. Click any border of a column or row to access a menu with options for expanding or contracting your form. When you click the Rules icon, you can create rules for form items or for other objects. You can set a rule to show or hide a form item, page, or other object that is based on user input. Some form items must be edited by changing their properties. For example, you can add the survey questions on the form, but the question titles can be edited only in the properties panel. When an item is selected the properties panel appears on the side of the screen. There are many tabs within the properties panel where you can set various functions. For example: Properties tab : Edit properties such as whether the title of a form item appears on the form. The properties that are displayed vary based on the form item. Event tab : Define an event that happens based on user input, such as when the user selects a particular option. Formula tab : Create mathematical expressions to calculate field values and validate form data. Adding workflow elements to a form There are many cases where adding separate steps and restricting user access to part of a form makes the form more useful. For example, you can create a vacation request form that requires the approval of a supervisor, or an award nomination form that requires the approval of both a supervisor and a nomination committee. In the survey form example, the results from the survey are useful feedback, but by adding workflow elements, the curriculum supervisor can review comments before sending them to the instructor. Adding workflow elements is done with Roles and Stages. Adding or editing Roles is done in the Access or Workflow tab. Adding stages is done in the Workflow tab. Roles \u2013 You can create various roles with different levels of access to different information within an application. For example, you can specify that only an administrator can change an application, managers can review submitted data, and users can complete and submit the form. After roles are defined, you can assign users to the roles. Each role can have as many or as few people assigned to it as needed. You can even assign groups to a role. For example, all supervisors are assigned to one role, and all managers are assigned to another role. In the Access tab, each role can either be Open or Closed. If you have a web service, which pre-populates the role information, select Open . For example, you want to use a web service to scan the company email directory and automatically populate the name of the manager. If you do not plan to use web services in your application, leave the role Closed . The user must enter the name of the manager manually when they complete the form. Stages \u2013 Stages are the steps that a form goes through in its lifecycle. For example, in one stage the user submits data. In the next stage, the manager reviews and approves or rejects the submitted data. An application can have as many stages as needed. Stages are also useful as they allow a submitter to save a draft version of the form. For example, on a census form that has multiple pages, the submitter might not have time to complete the whole form in one session. With the Draft button, the user can complete part of the census, save a draft, then return to complete the census later. A stage can hide or display information that is necessary for one user, but not required for another. For example, in our survey form, the curriculum supervisor must see the name of who submitted the feedback. However, to allow for anonymous feedback, the user's name is hidden when the feedback is forwarded from the curriculum supervisor to the course instructor. By default, every form has a Start and Submitted stage. The Start stage is the first stage of every form. The Submitted stage can be modified and other stages added. To create a workflow, add stages in the Workflow tab. You may hover over the stage and click the plus icon, or click on \u201c+ Add Stage\u201d in the properties pane. When a new stage is added, you can modify its properties to build the form workflow as needed. For example, you can add a stage to a survey that thanks the user for submitting feedback and sends the curriculum supervisor an email that indicates that new feedback is available. After the feedback is reviewed by the supervisor, another stage can be added to block the user's name and company information and then forward the feedback to the course instructor. At any time during the form building process, you can save and preview your work in a web browser by clicking Preview . Ensure that your browser does not block pop-up windows because the preview form opens in a new window. The Submit and Cancel buttons are automatically added to your form, and are displayed when you preview the form. Deploying your application When you complete building your form and adding workflow elements, you must deploy your application to make it available to users. Deploying applications is done in the Manage tab. To deploy your application, click Deploy . A menu of deployment options is available. You can set your application to have a specific start and end date, and provide a custom message to instruct users when the application is unavailable. After an application is deployed, you can provide the URL link to your users. You can also get the URL to the application by clicking Launch and copying the address in the web browser. If you must change a form after it is deployed, you can do so at any time. However, you must deploy the form again after you complete your changes. Reviewing submitted data responses When users access the application and submit results, the form author, administrator, or other roles with appropriate access can view the submitted results. In the Manage tab, each application has a View Data link. When the View Data link is clicked, you can choose to analyze submitted responses by viewing summary charts or response records. The Summary screen displays the survey results in customizable charts. The View Data screen displays all submitted responses in a table. You can sort the submitted results by clicking any of the column titles. Selecting a response displays the submitted data in a new window. Forms that have extra stages have extra buttons in the View Data screen. For example, the curriculum supervisor has a button to accept the feedback, which forwards the feedback to the course instructor. In another example, such as a vacation request form, the manager can either accept or reject the vacation request. If the manager accepts the request, the request is forwarded to Human Resources to log against the available vacation days. In all cases, an email with the decision of the supervisor is sent to the employee. You also can export all data to a spreadsheet program, such as Open Office, or Microsoft\u2122 Excel. Conclusion This overview described the three high-level steps for creating Leap applications: building the form and adding workflow elements, deploying your completed application, and reviewing the submission results. For more Leap information, see: Building a Survey application \u2013 Use Leap to design and publish a basic survey application. Creating and managing applications for more specific instructions on various parts of creating a Leap application. HCL Software U: Application development \u2013 a 7-minute video that walks you through the activities that are described in this overview. The video describes how to open a new application, add items to a form, publish an application, and review submitted results. Leap Starter Packs \u2013 a series of prebuilt forms you can import into Leap and modify for your own use.","title":"What is HCL Leap, and how is it used?"},{"location":"get_overview.html#what-is-hcl-leap-and-how-is-it-used","text":"This document provides an overview of the three main activities that are involved in using Leap. There are three main activities that are involved in using Leap: Building forms Publishing applications Reviewing submissions","title":"What is HCL Leap, and how is it used?"},{"location":"get_overview.html#forms-and-applications","text":"Throughout the Leap documentation, the words form and application are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather the submitted input and automatically store the submissions in a database.","title":"Forms and Applications"},{"location":"get_overview.html#building-forms","text":"When you start Leap, you are shown a screen with two tabs on the Forms toolbar: Use and Manage. The Use tab shows a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. When Leap opens, you are shown the Manage tab, which displays any applications you created, or for which you have edit permissions. To create an application, click New Application , enter a descriptive application name, and select Create . A blank form is displayed. Drag items from the Palette and drop them onto the form. As you add items, you can change the default name of each item directly on the form. Click the name of the widget on the canvas to edit the name. A built-in grid automatically aligns items on the form, and expands vertically when you add items to the form. The default layout is two columns and two rows. However, you have flexibility when you build your form. You can stretch one form item to span across all columns, and you can add and delete columns and rows as needed. Click any border of a column or row to access a menu with options for expanding or contracting your form. When you click the Rules icon, you can create rules for form items or for other objects. You can set a rule to show or hide a form item, page, or other object that is based on user input. Some form items must be edited by changing their properties. For example, you can add the survey questions on the form, but the question titles can be edited only in the properties panel. When an item is selected the properties panel appears on the side of the screen. There are many tabs within the properties panel where you can set various functions. For example: Properties tab : Edit properties such as whether the title of a form item appears on the form. The properties that are displayed vary based on the form item. Event tab : Define an event that happens based on user input, such as when the user selects a particular option. Formula tab : Create mathematical expressions to calculate field values and validate form data.","title":"Building forms"},{"location":"get_overview.html#adding-workflow-elements-to-a-form","text":"There are many cases where adding separate steps and restricting user access to part of a form makes the form more useful. For example, you can create a vacation request form that requires the approval of a supervisor, or an award nomination form that requires the approval of both a supervisor and a nomination committee. In the survey form example, the results from the survey are useful feedback, but by adding workflow elements, the curriculum supervisor can review comments before sending them to the instructor. Adding workflow elements is done with Roles and Stages. Adding or editing Roles is done in the Access or Workflow tab. Adding stages is done in the Workflow tab. Roles \u2013 You can create various roles with different levels of access to different information within an application. For example, you can specify that only an administrator can change an application, managers can review submitted data, and users can complete and submit the form. After roles are defined, you can assign users to the roles. Each role can have as many or as few people assigned to it as needed. You can even assign groups to a role. For example, all supervisors are assigned to one role, and all managers are assigned to another role. In the Access tab, each role can either be Open or Closed. If you have a web service, which pre-populates the role information, select Open . For example, you want to use a web service to scan the company email directory and automatically populate the name of the manager. If you do not plan to use web services in your application, leave the role Closed . The user must enter the name of the manager manually when they complete the form. Stages \u2013 Stages are the steps that a form goes through in its lifecycle. For example, in one stage the user submits data. In the next stage, the manager reviews and approves or rejects the submitted data. An application can have as many stages as needed. Stages are also useful as they allow a submitter to save a draft version of the form. For example, on a census form that has multiple pages, the submitter might not have time to complete the whole form in one session. With the Draft button, the user can complete part of the census, save a draft, then return to complete the census later. A stage can hide or display information that is necessary for one user, but not required for another. For example, in our survey form, the curriculum supervisor must see the name of who submitted the feedback. However, to allow for anonymous feedback, the user's name is hidden when the feedback is forwarded from the curriculum supervisor to the course instructor. By default, every form has a Start and Submitted stage. The Start stage is the first stage of every form. The Submitted stage can be modified and other stages added. To create a workflow, add stages in the Workflow tab. You may hover over the stage and click the plus icon, or click on \u201c+ Add Stage\u201d in the properties pane. When a new stage is added, you can modify its properties to build the form workflow as needed. For example, you can add a stage to a survey that thanks the user for submitting feedback and sends the curriculum supervisor an email that indicates that new feedback is available. After the feedback is reviewed by the supervisor, another stage can be added to block the user's name and company information and then forward the feedback to the course instructor. At any time during the form building process, you can save and preview your work in a web browser by clicking Preview . Ensure that your browser does not block pop-up windows because the preview form opens in a new window. The Submit and Cancel buttons are automatically added to your form, and are displayed when you preview the form.","title":"Adding workflow elements to a form"},{"location":"get_overview.html#deploying-your-application","text":"When you complete building your form and adding workflow elements, you must deploy your application to make it available to users. Deploying applications is done in the Manage tab. To deploy your application, click Deploy . A menu of deployment options is available. You can set your application to have a specific start and end date, and provide a custom message to instruct users when the application is unavailable. After an application is deployed, you can provide the URL link to your users. You can also get the URL to the application by clicking Launch and copying the address in the web browser. If you must change a form after it is deployed, you can do so at any time. However, you must deploy the form again after you complete your changes.","title":"Deploying your application"},{"location":"get_overview.html#reviewing-submitted-data-responses","text":"When users access the application and submit results, the form author, administrator, or other roles with appropriate access can view the submitted results. In the Manage tab, each application has a View Data link. When the View Data link is clicked, you can choose to analyze submitted responses by viewing summary charts or response records. The Summary screen displays the survey results in customizable charts. The View Data screen displays all submitted responses in a table. You can sort the submitted results by clicking any of the column titles. Selecting a response displays the submitted data in a new window. Forms that have extra stages have extra buttons in the View Data screen. For example, the curriculum supervisor has a button to accept the feedback, which forwards the feedback to the course instructor. In another example, such as a vacation request form, the manager can either accept or reject the vacation request. If the manager accepts the request, the request is forwarded to Human Resources to log against the available vacation days. In all cases, an email with the decision of the supervisor is sent to the employee. You also can export all data to a spreadsheet program, such as Open Office, or Microsoft\u2122 Excel.","title":"Reviewing submitted data responses"},{"location":"get_overview.html#conclusion","text":"This overview described the three high-level steps for creating Leap applications: building the form and adding workflow elements, deploying your completed application, and reviewing the submission results. For more Leap information, see: Building a Survey application \u2013 Use Leap to design and publish a basic survey application. Creating and managing applications for more specific instructions on various parts of creating a Leap application. HCL Software U: Application development \u2013 a 7-minute video that walks you through the activities that are described in this overview. The video describes how to open a new application, add items to a form, publish an application, and review submitted results. Leap Starter Packs \u2013 a series of prebuilt forms you can import into Leap and modify for your own use.","title":"Conclusion"},{"location":"gl_forms_experience_builder_globalization.html","text":"Globalization features The following information describes the languages formatting features supported by HCL Leap. Supported languages Leap supports the following languages: Arabic Catalan Chinese (Simplified) Chinese (Traditional) Croatian (Croatia) Czech (Czech Republic) Danish (Denmark) Dutch English Finnish (Finland) French German Greek Hebrew Hungarian (Hungary) Italian Japanese (Japan) Kazakh Korean (South Korea) Norwegian Bokm\u00e5l (Norway) Polish Portuguese (Brazil) Portuguese (Portugal) Romanian (Romania) Russian (Russian) Slovak Slovenian (Slovenia) Spanish Swedish (Sweden) Thai Turkish (Turkey) The default language for designing applications is based on your web browser locale, or WebSphere\u00ae Portal container. If you do not want to use your default language, you can change to a specific language, or select \u201cUser\u2019s Language\u201d so the application applies the user\u2019s web browser language settings when the application is opened. Formatting Form items, such as currency, date, and time, are based on the locale of the form. For example, if a currency item is set on a form with a locale of Germany, the currency is shown as Euros. It is important to note that no monetary conversion is done if the locale of the form changes. The format of the currency symbol on the form changes, but the amount entered is shown as entered. For example, if a user enters $100 into a currency field with a locale of United States, the currency is shown as $100 US on a form with a locale of Germany. You can edit the currency type, with the Currency field selected, in the Properties side panel. Locale settings can also affect dates. Countries can have specific requirements for how dates are written. For example, one country might want a date written month/day/year: 06/29/2012. While another country has a standard of day/month/date/year: Friday June 29, 2012. How the date is shown is determined by the locale of the form. You can manually change the date format, with the date field selected, in the Properties side panel. Setting a language The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. Parent topic: Creating and managing applications","title":"Globalization features"},{"location":"gl_forms_experience_builder_globalization.html#experiencebuilderglobalization","text":"The following information describes the languages formatting features supported by HCL Leap.","title":"Globalization features"},{"location":"gl_forms_experience_builder_globalization.html#supported-languages","text":"Leap supports the following languages: Arabic Catalan Chinese (Simplified) Chinese (Traditional) Croatian (Croatia) Czech (Czech Republic) Danish (Denmark) Dutch English Finnish (Finland) French German Greek Hebrew Hungarian (Hungary) Italian Japanese (Japan) Kazakh Korean (South Korea) Norwegian Bokm\u00e5l (Norway) Polish Portuguese (Brazil) Portuguese (Portugal) Romanian (Romania) Russian (Russian) Slovak Slovenian (Slovenia) Spanish Swedish (Sweden) Thai Turkish (Turkey) The default language for designing applications is based on your web browser locale, or WebSphere\u00ae Portal container. If you do not want to use your default language, you can change to a specific language, or select \u201cUser\u2019s Language\u201d so the application applies the user\u2019s web browser language settings when the application is opened.","title":"Supported languages"},{"location":"gl_forms_experience_builder_globalization.html#formatting","text":"Form items, such as currency, date, and time, are based on the locale of the form. For example, if a currency item is set on a form with a locale of Germany, the currency is shown as Euros. It is important to note that no monetary conversion is done if the locale of the form changes. The format of the currency symbol on the form changes, but the amount entered is shown as entered. For example, if a user enters $100 into a currency field with a locale of United States, the currency is shown as $100 US on a form with a locale of Germany. You can edit the currency type, with the Currency field selected, in the Properties side panel. Locale settings can also affect dates. Countries can have specific requirements for how dates are written. For example, one country might want a date written month/day/year: 06/29/2012. While another country has a standard of day/month/date/year: Friday June 29, 2012. How the date is shown is determined by the locale of the form. You can manually change the date format, with the date field selected, in the Properties side panel. Setting a language The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. Parent topic: Creating and managing applications","title":"Formatting"},{"location":"gl_setting_a_language.html","text":"Setting a language The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. To set a language for an application other than your default locale: Go to the Settings tab. Expand the Application Language menu and select either: a specific language from the list \u201cUser\u2019s Language\u201d Optional: Specify the language by expanding the Application Regional Options menu, and selecting a country where the language is used. If you want the language setting to apply to an application other than the one you are currently editing, enter the Application Name in the field. The field is automatically populated with the name of the current application. Click Save to apply the changes. Parent topic: Globalization features","title":"Setting a language"},{"location":"gl_setting_a_language.html#settingalanguage","text":"The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. To set a language for an application other than your default locale: Go to the Settings tab. Expand the Application Language menu and select either: a specific language from the list \u201cUser\u2019s Language\u201d Optional: Specify the language by expanding the Application Regional Options menu, and selecting a country where the language is used. If you want the language setting to apply to an application other than the one you are currently editing, enter the Application Name in the field. The field is automatically populated with the name of the current application. Click Save to apply the changes. Parent topic: Globalization features","title":"Setting a language"},{"location":"guide_me.html","text":"Guide Me The learning materials designed in this section contain instructions to help you perform specific tasks. Some of the how-to guides might may include code samples, which will help you to complete the tasks from end-to-end.","title":"Guide Me"},{"location":"guide_me.html#guide-me","text":"The learning materials designed in this section contain instructions to help you perform specific tasks. Some of the how-to guides might may include code samples, which will help you to complete the tasks from end-to-end.","title":"Guide Me"},{"location":"helm_admin_customsecret.html","text":"Provide admin user a custom secret Instead of providing\u202fadminUser\u202fand\u202fadminPassword\u202ffor Leap directly in the custom values, a secret can be used to pass the credentials to the deployments. Create a secret that will be used to reference credentials, this secret should contain the required credential attributes (e.g. \"username\", \"password\"). kubectl create secret generic --from-literal=username= --from- literal=password= --namespace= Reference the secret in the custom Helm values. When a secret is used, the\u202fadminUser\u202fand\u202fadminPassword\u202fvalues must be set to an empty string (\"\") or\u202fnull. Example configuration: security: leap: adminUser: \"\" adminPassword: \"\" customAdminSecret: \"my-custom-admin-secret\" Custom secrets Apart from the admin credentials there can be use cases where credentials, secrets or additional key files are required. To pass them to the deployment, the\u202fconfiguration.leap.customSecrets\u202fvalue can be used to reference additional\u202f Kubernetes Secrets . Secrets are both injected as environment variables and mounted as files in\u202f/mnt/customSecrets\u202fin a subfolder named like the referenced key. From there they can be referenced in the server configuration or the\u202fconfigOverrideFiles. All keys and values under\u202fcustomSecrets\u202fmust consist of lower-case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc').\u202fhelm install\u202fwill throw one of the following errors if this criterion is not met: \"configuration.leap.customSecrets: Additional property is not allowed\" \"configuration.leap.customSecrets.: Does not match pattern '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$'\" Using custom secrets for credentials The following is an example of creating a secret\u202f my-custom-db-credentials , which contains two entries\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD: kubectl create secret generic my-custom-db-credentials --from-literal=DB_USERNAME= --from- literal=DB_PASSWORD= --namespace= The secret is referenced as\u202f db-credentials \u202fin the custom Helm values: configuration: leap: customSecrets: db-credentials: my-custom-db-credentials This will result in: The environment variables\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing injected into the Pod. The files\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing mounted in\u202f /mnt/customSecrets/db-credentials \u202finside the Pod each containing the values specified in the secret. The environment variables can then be referenced in any of the server configurations. For example, to extend the DB2 configuration: configuration: leap: configOverrideFiles: db2Override: | ... ... Using custom secrets as key file Below is an example of creating a secret\u202f my-custom-ltpa-key \u202f from an LTPA key file including the entry\u202fLTPA_KEY: kubectl create secret generic my-custom-ltpa-key --from-file=./ltpa.keys --namespace= The secret is referenced as\u202f ltpa-key \u202fin the custom Helm values: configuration: leap: customSecrets: ltpa-key: my-custom-ltpa-key This will result in: The environment variables\u202f ltpa.keys \u202fbeing injected into the Pod. The file\u202f ltpa.keys \u202fbeing mounted in\u202f /mnt/customSecrets/ltpa-key \u202finside the Pod containing the same content as the input file. The file can then be referenced in any of the server configurations. For example, to use the LTPA key for the server: configuration: leap: configOverrideFiles: ltpaOverride: | Parent topic: Preparation","title":"Provide admin user a custom secret"},{"location":"helm_admin_customsecret.html#helm_admin_customsecret","text":"Instead of providing\u202fadminUser\u202fand\u202fadminPassword\u202ffor Leap directly in the custom values, a secret can be used to pass the credentials to the deployments. Create a secret that will be used to reference credentials, this secret should contain the required credential attributes (e.g. \"username\", \"password\"). kubectl create secret generic --from-literal=username= --from- literal=password= --namespace= Reference the secret in the custom Helm values. When a secret is used, the\u202fadminUser\u202fand\u202fadminPassword\u202fvalues must be set to an empty string (\"\") or\u202fnull. Example configuration: security: leap: adminUser: \"\" adminPassword: \"\" customAdminSecret: \"my-custom-admin-secret\"","title":"Provide admin user a custom secret"},{"location":"helm_admin_customsecret.html#section_gsj_vk4_hzb","text":"Apart from the admin credentials there can be use cases where credentials, secrets or additional key files are required. To pass them to the deployment, the\u202fconfiguration.leap.customSecrets\u202fvalue can be used to reference additional\u202f Kubernetes Secrets . Secrets are both injected as environment variables and mounted as files in\u202f/mnt/customSecrets\u202fin a subfolder named like the referenced key. From there they can be referenced in the server configuration or the\u202fconfigOverrideFiles. All keys and values under\u202fcustomSecrets\u202fmust consist of lower-case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc').\u202fhelm install\u202fwill throw one of the following errors if this criterion is not met: \"configuration.leap.customSecrets: Additional property is not allowed\" \"configuration.leap.customSecrets.: Does not match pattern '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$'\"","title":"Custom secrets"},{"location":"helm_admin_customsecret.html#section_nc2_1l4_hzb","text":"The following is an example of creating a secret\u202f my-custom-db-credentials , which contains two entries\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD: kubectl create secret generic my-custom-db-credentials --from-literal=DB_USERNAME= --from- literal=DB_PASSWORD= --namespace= The secret is referenced as\u202f db-credentials \u202fin the custom Helm values: configuration: leap: customSecrets: db-credentials: my-custom-db-credentials This will result in: The environment variables\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing injected into the Pod. The files\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing mounted in\u202f /mnt/customSecrets/db-credentials \u202finside the Pod each containing the values specified in the secret. The environment variables can then be referenced in any of the server configurations. For example, to extend the DB2 configuration: configuration: leap: configOverrideFiles: db2Override: | ... ... ","title":"Using custom secrets for credentials"},{"location":"helm_admin_customsecret.html#section_wc2_kl4_hzb","text":"Below is an example of creating a secret\u202f my-custom-ltpa-key \u202f from an LTPA key file including the entry\u202fLTPA_KEY: kubectl create secret generic my-custom-ltpa-key --from-file=./ltpa.keys --namespace= The secret is referenced as\u202f ltpa-key \u202fin the custom Helm values: configuration: leap: customSecrets: ltpa-key: my-custom-ltpa-key This will result in: The environment variables\u202f ltpa.keys \u202fbeing injected into the Pod. The file\u202f ltpa.keys \u202fbeing mounted in\u202f /mnt/customSecrets/ltpa-key \u202finside the Pod containing the same content as the input file. The file can then be referenced in any of the server configurations. For example, to use the LTPA key for the server: configuration: leap: configOverrideFiles: ltpaOverride: | Parent topic: Preparation","title":"Using custom secrets as key file"},{"location":"helm_certificates.html","text":"Certificates The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore. Parent topic: Preparation","title":"Certificates"},{"location":"helm_certificates.html#helm_certificates","text":"The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore. Parent topic: Preparation","title":"Certificates"},{"location":"helm_changing_log_level.html","text":"Changing the log level Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest Parent topic: Preparation","title":"Changing the log level"},{"location":"helm_changing_log_level.html#helm_changing_log_level","text":"Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest Parent topic: Preparation","title":"Changing the log level"},{"location":"helm_extending_image.html","text":"Enabling additional Open Liberty features Learn how to install additional Open Liberty server features by extending the Leap image. The Leap image is shipped with the following server features: adminCenter-1.0 appSecurity-3.0 federatedRegistry-1.0 javaMail-1.6 jdbc-4.2 jndi-1.0 jpa-2.2 jwtSso-1.0 ldapRegistry-3.0 localConnector-1.0 mpJwt-2.1 openidConnectClient-1.0 passwordUtilities-1.0 restConnector-2.0 servlet-4.0 transportSecurity-1.0 Open Liberty has many features that can be enabled. Some features have dependencies on other features, which will be installed automatically. For more information, see the Open Liberty documentation . If you require a different feature to be installed, you may extend our image. This can be accomplished by creating a Dockerfile. See the following example: FROM RUN /opt/openliberty/wlp/bin/featureUtility installFeature After creating a Dockerfile, build the new docker image: With docker engine running, open command prompt. Execute the following command: cd Execute the following command: docker build . A new image with the specified feature is installed. Use this extended image when running helm. Note: This is the only supported mechanism for enabling Open Liberty features. There are many features that can be added that have not been tested by HCL and you do so at your own risk. HCL will provide best-effort support for added features as it pertains to Leap.","title":"Enabling additional Open Liberty features"},{"location":"helm_extending_image.html#helm_extending_image","text":"Learn how to install additional Open Liberty server features by extending the Leap image. The Leap image is shipped with the following server features: adminCenter-1.0 appSecurity-3.0 federatedRegistry-1.0 javaMail-1.6 jdbc-4.2 jndi-1.0 jpa-2.2 jwtSso-1.0 ldapRegistry-3.0 localConnector-1.0 mpJwt-2.1 openidConnectClient-1.0 passwordUtilities-1.0 restConnector-2.0 servlet-4.0 transportSecurity-1.0 Open Liberty has many features that can be enabled. Some features have dependencies on other features, which will be installed automatically. For more information, see the Open Liberty documentation . If you require a different feature to be installed, you may extend our image. This can be accomplished by creating a Dockerfile. See the following example: FROM RUN /opt/openliberty/wlp/bin/featureUtility installFeature After creating a Dockerfile, build the new docker image: With docker engine running, open command prompt. Execute the following command: cd Execute the following command: docker build . A new image with the specified feature is installed. Use this extended image when running helm. Note: This is the only supported mechanism for enabling Open Liberty features. There are many features that can be added that have not been tested by HCL and you do so at your own risk. HCL will provide best-effort support for added features as it pertains to Leap.","title":"Enabling additional Open Liberty features"},{"location":"helm_install_commands.html","text":"Install commads to deploy This topic details install commands that are used to deploy HCL Leap Helm Charts. Install commands Important: Modification to any files (chart.yaml, templates, etc) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported. To run the installation of your prepared configurations using Helm, use the following command: # Helm install command helm install -n my-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl-leap- deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The my-namespace is the namespace where your HCL Leap deployment is installed to. The -f path/to/your/custom-values.yaml must point to the custom-values.yaml you have created, which contains all deployment configuration. your-release-name is the Helm release name and prefixes all resources created in that installation, such as Pods, Services, and others. path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you have extracted as described earlier in the planning and preparation steps. After a successful deployment, Helm responds with the following message: NAME: leap LAST DEPLOYED: Thu Jun 17 14:27:58 2023 NAMESPACE: my-namespace STATUS: deployed REVISION: 1 TEST SUITE: None Default URLs post installation During the configuration process, you might need the following URLs to access different user interfaces. Use the following default URLs to access HCL Leap and OpenLiberty Console: HCL Leap http://yourserver/apps HCL Leap Rest API http://yourserver/apps-basic There are a few endpoints that can be helpful for identifying and debugging datasource connections: View DataSource Configuration https://yourserver/ibm/api/config/dataSource/ The result is an html page that shows a json output of the configuration that is known by the server. Validate DataSource Connection https://yourserver/ibm/api/validation/dataSource/ Endpoint attempts to make a database connection, the result is a json output that shows the result. If the connection fails, the output may contain more detail to assist in the troubleshooting. Parent topic: Kubernetes Helm deployment","title":"Install commads to deploy"},{"location":"helm_install_commands.html#helm_install_commands","text":"This topic details install commands that are used to deploy HCL Leap Helm Charts.","title":"Install commads to deploy"},{"location":"helm_install_commands.html#section_ogm_n44_hzb","text":"Important: Modification to any files (chart.yaml, templates, etc) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported. To run the installation of your prepared configurations using Helm, use the following command: # Helm install command helm install -n my-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl-leap- deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The my-namespace is the namespace where your HCL Leap deployment is installed to. The -f path/to/your/custom-values.yaml must point to the custom-values.yaml you have created, which contains all deployment configuration. your-release-name is the Helm release name and prefixes all resources created in that installation, such as Pods, Services, and others. path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you have extracted as described earlier in the planning and preparation steps. After a successful deployment, Helm responds with the following message: NAME: leap LAST DEPLOYED: Thu Jun 17 14:27:58 2023 NAMESPACE: my-namespace STATUS: deployed REVISION: 1 TEST SUITE: None","title":"Install commands"},{"location":"helm_install_commands.html#section_hyj_w44_hzb","text":"During the configuration process, you might need the following URLs to access different user interfaces. Use the following default URLs to access HCL Leap and OpenLiberty Console: HCL Leap http://yourserver/apps HCL Leap Rest API http://yourserver/apps-basic There are a few endpoints that can be helpful for identifying and debugging datasource connections: View DataSource Configuration https://yourserver/ibm/api/config/dataSource/ The result is an html page that shows a json output of the configuration that is known by the server. Validate DataSource Connection https://yourserver/ibm/api/validation/dataSource/ Endpoint attempts to make a database connection, the result is a json output that shows the result. If the connection fails, the output may contain more detail to assist in the troubleshooting. Parent topic: Kubernetes Helm deployment","title":"Default URLs post installation"},{"location":"helm_jvm_options.html","text":"JVM options JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\" Parent topic: Preparation","title":"JVM options"},{"location":"helm_jvm_options.html#helm_jvn_options","text":"JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\" Parent topic: Preparation","title":"JVM options"},{"location":"helm_leap_properties.html","text":"Leap properties The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo =
Welcome to HCL Leap 9.3.2 in Kubernetes!
ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties . Parent topic: Preparation","title":"Leap properties"},{"location":"helm_leap_properties.html#helm_leap_properties","text":"The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo =
Welcome to HCL Leap 9.3.2 in Kubernetes!
ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties . Parent topic: Preparation","title":"Leap properties"},{"location":"helm_load_images.html","text":"Load images This section presents how to load the Leap Container or later images into your container image repository, tag them to fit your repository structure, and push them to your repository, so that all Nodes in your Kubernetes or OpenShift cluster can deploy HCL Leap Pods. To use HCL Leap in your Kubernetes or OpenShift cluster, you have to make the container images available to all nodes of your cluster. Usually this is done by providing them through a container image repository. Depending on your cloud provider, there may be different types of default container image repositories already configured. Refer to the documentation of your cloud provider for setup and use of such platform container image repository. It is assumed that you have a repository configured and running, and is reachable from all your Kubernetes or OpenShift cluster nodes. In the following guidance, the docker CLI is used as a command reference. Tools like Podman may also be used, but are not described in this documentation. The procedure for the use of such tools are the same. Retrieving container images The HCL Leap Container package is provided in a compressed .zip file, that can easily be unzipped using a utility of your choice. Download the HCL Leap package from FlexNet, unpack it locally and load the image into your container registry. To load the image file, you may use the following command: # Command to load container image into local repository # docker load < image-file-name.tar.gz docker load < hcl-leap-image_vXXX_XXX_XXXXXXXX-XXXX.tar.gz The custom-values.yaml must then reference the image tag: images: # Image tag for each application tags: leap: v1.0.0_20231010-0638_Leap_v9.3.3.40_pjs_release_leap-9.3.3 Parent topic: Preparation","title":"Load images"},{"location":"helm_load_images.html#helm_load_images","text":"This section presents how to load the Leap Container or later images into your container image repository, tag them to fit your repository structure, and push them to your repository, so that all Nodes in your Kubernetes or OpenShift cluster can deploy HCL Leap Pods. To use HCL Leap in your Kubernetes or OpenShift cluster, you have to make the container images available to all nodes of your cluster. Usually this is done by providing them through a container image repository. Depending on your cloud provider, there may be different types of default container image repositories already configured. Refer to the documentation of your cloud provider for setup and use of such platform container image repository. It is assumed that you have a repository configured and running, and is reachable from all your Kubernetes or OpenShift cluster nodes. In the following guidance, the docker CLI is used as a command reference. Tools like Podman may also be used, but are not described in this documentation. The procedure for the use of such tools are the same.","title":"Load images"},{"location":"helm_load_images.html#section_gnq_z34_hzb","text":"The HCL Leap Container package is provided in a compressed .zip file, that can easily be unzipped using a utility of your choice. Download the HCL Leap package from FlexNet, unpack it locally and load the image into your container registry. To load the image file, you may use the following command: # Command to load container image into local repository # docker load < image-file-name.tar.gz docker load < hcl-leap-image_vXXX_XXX_XXXXXXXX-XXXX.tar.gz The custom-values.yaml must then reference the image tag: images: # Image tag for each application tags: leap: v1.0.0_20231010-0638_Leap_v9.3.3.40_pjs_release_leap-9.3.3 Parent topic: Preparation","title":"Retrieving container images"},{"location":"helm_oidc_config.html","text":"Configuring Leap with OIDC This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider. Configuring Leap with OIDC Leap can be configured to leverage OpenID Connect (OIDC) as the primary authentication mechanism. This means that Leap will be turned into a Relying Party (RP) to the specified identify provider (IDP). When OIDC is used, the user and group lookup feature of Leap is not available and must be disabled as part of the configuration. The following tasks must be completed to establish this configuration: Configure the OIDC identity provider. Create a secret in Kubernetes container from the IDP server certificate. Add an OIDC definition as a server customization. Add configuration properties related to the OIDC configuration. Restart the pod. Configure OIDC identity Provider Many different identity providers offer OIDC capability. Refer to your chosen identity provider's documentation for more details on configuration. Create a secret in Kubernetes container from the IDP certificate As part of the configuration process for your identify provider, you will have created or obtained a digital certificate for configuring HTTPS. This certificate will also need to be deployed to Leap so that the two servers can communicate with each other. Note: The SSL certificate (.crt) and public key (.key) should be in PKCS12 format. After copying the .key and .crt to the kubernetes image, create a secret using the following command: kubectl -n myns create secret tls oidccert --key=\"/tmp/oidc.key\" --cert=\"/tmp/oidc.crt\" Next, this secret can be referenced in the yaml file: configuration: leap: customCertificateSecrets: keycloakCert: \"keycloakcert\" For more information, see to helm_admin_customsecret.md . Add OIDC definition as a server customization The properties that you need to specify may differ based on your identify provider. For additional information, see the Open Liberty documentation on OpenID Connect . Before moving on from this step: Verify that the discoveryEndpointURL is valid by opening it in a browser prior to entering it in the yaml file. Update the clientSecret with the proper value obtained from your IDP The following snippet is an example of an OIDC definition: configOverrideFiles: openIdConnect: | For more details on defining a server customization, see helm_open_liberty_custom.md . Add config properties related to OIDC config The following properties must be set to complete the OIDC configuration: hasUserLookups - By setting this to false it will disable user lookups, which is not available when configured with OIDC. hasUserGroups - By setting this to false it will disable group lookups, which is not available when configured with OIDC. postLogoutRedirectURL - This is the URL to which Leap will redirect the browser after a user chooses to log out. This is necessary to complete the loop with the OIDC IDP. configuration: leap: leapProperties: | ibm.nitro.NitroConfig.hasUserLookup=false ibm.nitro.NitroConfig.hasUserGroups=false ibm.nitro.LogoutServlet.postLogoutRedirectURL=https://myOIDCServer.com/realms/Leap/protocol/openid- connect/logout?client_id=hcl-leap-oidc-client&post_logout_redirect_uri=https://myLeapServer.com/apps/secure/org/ide/manager.html For more details on setting Leap properties, see helm_leap_properties.md . Restart the pod After restarting the Leap pod, accessing Leap should redirect you to authenticate using your OIDC IDP.","title":"Configuring Leap with OIDC"},{"location":"helm_oidc_config.html#helm_oidc_config","text":"This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider.","title":"Configuring Leap with OIDC"},{"location":"helm_oidc_config.html#section_lmm_5mt_b1c","text":"Leap can be configured to leverage OpenID Connect (OIDC) as the primary authentication mechanism. This means that Leap will be turned into a Relying Party (RP) to the specified identify provider (IDP). When OIDC is used, the user and group lookup feature of Leap is not available and must be disabled as part of the configuration. The following tasks must be completed to establish this configuration: Configure the OIDC identity provider. Create a secret in Kubernetes container from the IDP server certificate. Add an OIDC definition as a server customization. Add configuration properties related to the OIDC configuration. Restart the pod.","title":"Configuring Leap with OIDC"},{"location":"helm_oidc_config.html#section_zj4_xmt_b1c","text":"Many different identity providers offer OIDC capability. Refer to your chosen identity provider's documentation for more details on configuration.","title":"Configure OIDC identity Provider"},{"location":"helm_oidc_config.html#section_cch_1nt_b1c","text":"As part of the configuration process for your identify provider, you will have created or obtained a digital certificate for configuring HTTPS. This certificate will also need to be deployed to Leap so that the two servers can communicate with each other. Note: The SSL certificate (.crt) and public key (.key) should be in PKCS12 format. After copying the .key and .crt to the kubernetes image, create a secret using the following command: kubectl -n myns create secret tls oidccert --key=\"/tmp/oidc.key\" --cert=\"/tmp/oidc.crt\" Next, this secret can be referenced in the yaml file: configuration: leap: customCertificateSecrets: keycloakCert: \"keycloakcert\" For more information, see to helm_admin_customsecret.md .","title":"Create a secret in Kubernetes container from the IDP certificate"},{"location":"helm_oidc_config.html#section_vxv_fnt_b1c","text":"The properties that you need to specify may differ based on your identify provider. For additional information, see the Open Liberty documentation on OpenID Connect . Before moving on from this step: Verify that the discoveryEndpointURL is valid by opening it in a browser prior to entering it in the yaml file. Update the clientSecret with the proper value obtained from your IDP The following snippet is an example of an OIDC definition: configOverrideFiles: openIdConnect: | For more details on defining a server customization, see helm_open_liberty_custom.md .","title":"Add OIDC definition as a server customization"},{"location":"helm_oidc_config.html#section_r3z_knt_b1c","text":"The following properties must be set to complete the OIDC configuration: hasUserLookups - By setting this to false it will disable user lookups, which is not available when configured with OIDC. hasUserGroups - By setting this to false it will disable group lookups, which is not available when configured with OIDC. postLogoutRedirectURL - This is the URL to which Leap will redirect the browser after a user chooses to log out. This is necessary to complete the loop with the OIDC IDP. configuration: leap: leapProperties: | ibm.nitro.NitroConfig.hasUserLookup=false ibm.nitro.NitroConfig.hasUserGroups=false ibm.nitro.LogoutServlet.postLogoutRedirectURL=https://myOIDCServer.com/realms/Leap/protocol/openid- connect/logout?client_id=hcl-leap-oidc-client&post_logout_redirect_uri=https://myLeapServer.com/apps/secure/org/ide/manager.html For more details on setting Leap properties, see helm_leap_properties.md .","title":"Add config properties related to OIDC config"},{"location":"helm_oidc_config.html#section_zq2_vmt_b1c","text":"After restarting the Leap pod, accessing Leap should redirect you to authenticate using your OIDC IDP.","title":"Restart the pod"},{"location":"helm_open_liberty_custom.html","text":"Open Liberty server customizations The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details. Connecting to a DB2 Instance The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | Connecting to an Oracle Instance The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | Connecting to a PostgreSQL database The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | Connecting to an SMTP Server Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | Connecting to an LDAP Server Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | inetOrgPerson ou=People,dc=Acme groupOfUniqueNames ou=Groups,dc=Acme Configure SSL behavior The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | Parent topic: Preparation","title":"Open Liberty server customizations"},{"location":"helm_open_liberty_custom.html#helm_open_liberty_custom","text":"The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details.","title":"Open Liberty server customizations"},{"location":"helm_open_liberty_custom.html#section_z4t_ckh_jzb","text":"The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | ","title":"Connecting to a DB2 Instance"},{"location":"helm_open_liberty_custom.html#section_p2d_3kh_jzb","text":"The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | ","title":"Connecting to an Oracle Instance"},{"location":"helm_open_liberty_custom.html#section_cll_jkh_jzb","text":"The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | ","title":"Connecting to a PostgreSQL database"},{"location":"helm_open_liberty_custom.html#section_t4v_kkh_jzb","text":"Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | ","title":"Connecting to an SMTP Server"},{"location":"helm_open_liberty_custom.html#section_fwn_mkh_jzb","text":"Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | inetOrgPerson ou=People,dc=Acme groupOfUniqueNames ou=Groups,dc=Acme ","title":"Connecting to an LDAP Server"},{"location":"helm_open_liberty_custom.html#section_zlv_nkh_jzb","text":"The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | Parent topic: Preparation","title":"Configure SSL behavior"},{"location":"helm_persistent_volume.html","text":"PersistentVolumeClaims Defining persistent volumes (PVs) for Leap is optional and dependent on your needs. The 3 volumes that may be required to operate Leap: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. In order to pass custom extensions to Leap, create an \"extensions\" directory in this volume. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/extensions. Note: If files are added to this volume while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage and is labeled \u201clog\u201d in the .yaml file. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database and is labelled \u201crwo\u201d in the .yaml file. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system, or a location supplied by a cloud provider. Persistent volume types Important: Ensure that your PersistentVolumes (PVs) are created with the Reclaim Policy set to RETAIN. This allows for the reuse of PVs after a PersistentVolumeClaim (PVC) is deleted. This is important to keep data persisted, for example, between deployments or tests. Refrain from using the Reclaim Policy DELETE unless you have the experience in managing these operations successfully, to avoid unpredictable results. This is not recommended in production use, as deleting PVCs causes the Kubernetes or OpenShift cluster to delete the bound PV as well, thus, deleting all the data on it. ReadWriteOnce (RWO) ReadWriteOnce PVs allow only one pod per volume to perform reading and writing transactions. This means that the data on that PV cannot be shared with other pods and is linked to one pod at a time. ReadWriteMany (RWX) ReadWriteMany PVs support read and write operations by multiple pods. This means the data on that PV can be shared with other pods and can be linked to multiple pods at a time. Configuration parameters To access the PersistentVolumes (PVs) on your cluster, the HCL Leap Kubernetes or OpenShift deployment using Helm creates PersistentVolumeClaims (PVCs) that binds the PVs to the corresponding pods. Each PVC that Leap requires allows you to configure the following parameters, as shown below. For a PVC of the Leap application: # Persistent Volume Setup volumes: # Persistent Volumes for Leap leap: # RWX PVC shared by all Leap pods - RWX. Used to pass auxiliary binary files to all Pods on startup rwx: storageClassName: \"manual\" requests: storage: \"50Mi\" # Optional volume name to specifically map to volumeName: StorageClassName Depending on your Cluster configuration, you may have configured a specific StorageClass that should be used for your PVs and the PVCs of HCL Leap. This property allows you to enter the name of the StorageClass you want the deployment to use. PVCs then only accepts PVs that match the StorageClassName you have defined in the configuration. If there are no PVs that match, the pods remain pending and do not start until a fitting PV is provided by the cluster. If you enter an empty StorageClassName, Kubernetes falls back to the default StorageClass configured in your Cluster. Refer to your cloud provider for additional information about your default StorageClass, since this depends on your Kubernetes or OpenShift environment. Reference the original values.yaml file you have extracted as outlined in the Prepare configuration topic for all configurable PVCs. Requests Storage. Storage allows you to define the amount of space that is required by the PVC. Once defined, it only accepts PVs that have the same or more storage capacity as requested. If there are no PVs matching the definitions, the pods remain pending and do not start until a properly-sized PV is provided by the cluster. Selector If you want your deployment to pick up specific PVs that you have created, the selector option can be used to match PVs by their labels. A detailed description on how to use the selector can be found in the official Kubernetes documentation. A PVC will only match with a PV satisfying the selector and all the other requirements such as type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. VolumeName If you want your deployment to pick up a specific PV that you have created, use of the VolumeName can define that instruction. Ensure that the PV you created has a unique name. Then, add that name as a configuration parameter for the PVC. The PVCs only matches with a PV of that name, matching the other requirements-like type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. As a single persistent Volume is assigned using the volumeName, this should only be used for RWX claims or for Pods that are only ever scaled to one replica. If a second PersistentVolumeClaim is created with the same volumeName, it can never be fulfilled as the names for Volumes are unique. Please refer to the Selector section to select specific PersistentVolumes for multiple claims. Sample PVC configurations The following are some examples for configuration of the PersistentVolumeClaims (PVCs) using your custom-values.yaml: Specific volume names Specifying a name ensures that Kubernetes or OpenShift only assigns PVs with the matching name to the PVCs created for the applications: # Persistent Volume Setup volumes: leap: rwx: volumeName: \u201cleap-binaries\u201d Adjusted volume size for PVCs You may override the default sizes for PVCs by adjusting the storage requests: volumes: leap: rwx: requests: storage: \"500Mi\" rwo: requests: storage: \"50Mi\" log: requests: storage: \"250Mi\" Parent topic: Preparation","title":"PersistentVolumeClaims"},{"location":"helm_persistent_volume.html#helm_persistant_volume","text":"Defining persistent volumes (PVs) for Leap is optional and dependent on your needs. The 3 volumes that may be required to operate Leap: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. In order to pass custom extensions to Leap, create an \"extensions\" directory in this volume. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/extensions. Note: If files are added to this volume while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage and is labeled \u201clog\u201d in the .yaml file. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database and is labelled \u201crwo\u201d in the .yaml file. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system, or a location supplied by a cloud provider.","title":"PersistentVolumeClaims"},{"location":"helm_persistent_volume.html#section_bbh_5j4_hzb","text":"Important: Ensure that your PersistentVolumes (PVs) are created with the Reclaim Policy set to RETAIN. This allows for the reuse of PVs after a PersistentVolumeClaim (PVC) is deleted. This is important to keep data persisted, for example, between deployments or tests. Refrain from using the Reclaim Policy DELETE unless you have the experience in managing these operations successfully, to avoid unpredictable results. This is not recommended in production use, as deleting PVCs causes the Kubernetes or OpenShift cluster to delete the bound PV as well, thus, deleting all the data on it. ReadWriteOnce (RWO) ReadWriteOnce PVs allow only one pod per volume to perform reading and writing transactions. This means that the data on that PV cannot be shared with other pods and is linked to one pod at a time. ReadWriteMany (RWX) ReadWriteMany PVs support read and write operations by multiple pods. This means the data on that PV can be shared with other pods and can be linked to multiple pods at a time.","title":"Persistent volume types"},{"location":"helm_persistent_volume.html#section_hpf_xj4_hzb","text":"To access the PersistentVolumes (PVs) on your cluster, the HCL Leap Kubernetes or OpenShift deployment using Helm creates PersistentVolumeClaims (PVCs) that binds the PVs to the corresponding pods. Each PVC that Leap requires allows you to configure the following parameters, as shown below. For a PVC of the Leap application: # Persistent Volume Setup volumes: # Persistent Volumes for Leap leap: # RWX PVC shared by all Leap pods - RWX. Used to pass auxiliary binary files to all Pods on startup rwx: storageClassName: \"manual\" requests: storage: \"50Mi\" # Optional volume name to specifically map to volumeName: StorageClassName Depending on your Cluster configuration, you may have configured a specific StorageClass that should be used for your PVs and the PVCs of HCL Leap. This property allows you to enter the name of the StorageClass you want the deployment to use. PVCs then only accepts PVs that match the StorageClassName you have defined in the configuration. If there are no PVs that match, the pods remain pending and do not start until a fitting PV is provided by the cluster. If you enter an empty StorageClassName, Kubernetes falls back to the default StorageClass configured in your Cluster. Refer to your cloud provider for additional information about your default StorageClass, since this depends on your Kubernetes or OpenShift environment. Reference the original values.yaml file you have extracted as outlined in the Prepare configuration topic for all configurable PVCs. Requests Storage. Storage allows you to define the amount of space that is required by the PVC. Once defined, it only accepts PVs that have the same or more storage capacity as requested. If there are no PVs matching the definitions, the pods remain pending and do not start until a properly-sized PV is provided by the cluster. Selector If you want your deployment to pick up specific PVs that you have created, the selector option can be used to match PVs by their labels. A detailed description on how to use the selector can be found in the official Kubernetes documentation. A PVC will only match with a PV satisfying the selector and all the other requirements such as type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. VolumeName If you want your deployment to pick up a specific PV that you have created, use of the VolumeName can define that instruction. Ensure that the PV you created has a unique name. Then, add that name as a configuration parameter for the PVC. The PVCs only matches with a PV of that name, matching the other requirements-like type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. As a single persistent Volume is assigned using the volumeName, this should only be used for RWX claims or for Pods that are only ever scaled to one replica. If a second PersistentVolumeClaim is created with the same volumeName, it can never be fulfilled as the names for Volumes are unique. Please refer to the Selector section to select specific PersistentVolumes for multiple claims.","title":"Configuration parameters"},{"location":"helm_persistent_volume.html#section_i4t_hk4_hzb","text":"The following are some examples for configuration of the PersistentVolumeClaims (PVCs) using your custom-values.yaml: Specific volume names Specifying a name ensures that Kubernetes or OpenShift only assigns PVs with the matching name to the PVCs created for the applications: # Persistent Volume Setup volumes: leap: rwx: volumeName: \u201cleap-binaries\u201d Adjusted volume size for PVCs You may override the default sizes for PVCs by adjusting the storage requests: volumes: leap: rwx: requests: storage: \"500Mi\" rwo: requests: storage: \"50Mi\" log: requests: storage: \"250Mi\" Parent topic: Preparation","title":"Sample PVC configurations"},{"location":"helm_preparation.html","text":"Preparation This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported. Mandatory Prepare a namespace Prepare configuration Load images PersistentVolumeClaims Provide admin user a custom secret Optional Probes configuration in values.yaml file SAML configuration Certificates Open Liberty server customizations Service Catalog Leap properties JVM options Changing the log level Enabling additional Open Liberty features Parent topic: Kubernetes Helm deployment","title":"Preparation"},{"location":"helm_preparation.html#helm_preparation","text":"This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported.","title":"Preparation"},{"location":"helm_preparation.html#section_rkz_1h4_hzb","text":"Prepare a namespace Prepare configuration Load images PersistentVolumeClaims Provide admin user a custom secret","title":"Mandatory"},{"location":"helm_preparation.html#section_bwh_bh4_hzb","text":"Probes configuration in values.yaml file SAML configuration Certificates Open Liberty server customizations Service Catalog Leap properties JVM options Changing the log level Enabling additional Open Liberty features Parent topic: Kubernetes Helm deployment","title":"Optional"},{"location":"helm_prepare_namespace.html","text":"Prepare a namespace You need to create a namespace in your Kubernetes cluster that contains all the resources related to your HCL Leap Container deployment. It is recommended that the namespace is created before the deployment. Identify a name for your namespace and create it using the following syntax: On Kubernetes platforms: Kubectl # Command to create a namespace using kubectl # This example creates a namespace called \"my-namespace\" kubectl create ns my-namespace OpenShift: For OpenShift, you must create a namespace with specific settings. Use the following namespace definition and save it as namespace.yaml. You must replace my-namespace in the template with the name of the namespace you are using: apiVersion: v1 kind: Namespace metadata: name: my-namespace annotations: openshift.io/sa.scc.mcs: \"s0:c24,c4\" openshift.io/sa.scc.supplemental-groups: \"1001/10000\" openshift.io/sa.scc.uid-range: \"1000/10000\" OpenShift client: # Command to create namespace from template file oc apply -f namespace.yaml Parent topic: Preparation","title":"Prepare a namespace"},{"location":"helm_prepare_namespace.html#helm_prepare_namespace","text":"You need to create a namespace in your Kubernetes cluster that contains all the resources related to your HCL Leap Container deployment. It is recommended that the namespace is created before the deployment. Identify a name for your namespace and create it using the following syntax: On Kubernetes platforms: Kubectl # Command to create a namespace using kubectl # This example creates a namespace called \"my-namespace\" kubectl create ns my-namespace OpenShift: For OpenShift, you must create a namespace with specific settings. Use the following namespace definition and save it as namespace.yaml. You must replace my-namespace in the template with the name of the namespace you are using: apiVersion: v1 kind: Namespace metadata: name: my-namespace annotations: openshift.io/sa.scc.mcs: \"s0:c24,c4\" openshift.io/sa.scc.supplemental-groups: \"1001/10000\" openshift.io/sa.scc.uid-range: \"1000/10000\" OpenShift client: # Command to create namespace from template file oc apply -f namespace.yaml Parent topic: Preparation","title":"Prepare a namespace"},{"location":"helm_probes_config_valuesfile.html","text":"Probes configuration in values.yaml file The liveness and readiness probes such as the status thresholds and time values can be modified. # Liveness probe using the applications HTTP probe endpoint livenessProbe: failureThreshold: 4 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 # Readiness probe using the applications HTTP probe endpoint readinessProbe: failureThreshold: 2 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 Information about the configuration options can be found in the Kubernetes documentation . Parent topic: Preparation","title":"Probes configuration in values.yaml file"},{"location":"helm_probes_config_valuesfile.html#helm_probes_config_valuesfile","text":"The liveness and readiness probes such as the status thresholds and time values can be modified. # Liveness probe using the applications HTTP probe endpoint livenessProbe: failureThreshold: 4 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 # Readiness probe using the applications HTTP probe endpoint readinessProbe: failureThreshold: 2 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 Information about the configuration options can be found in the Kubernetes documentation . Parent topic: Preparation","title":"Probes configuration in values.yaml file"},{"location":"helm_saml_config.html","text":"SAML configuration The Leap Helm chart and container offer a basic SAML configuration through the Helm values. To enable SAML you must pass the IdP Metadata of the identity provider. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. Example: security: leap: saml: idpMetadata: | ... Parent topic: Preparation","title":"SAML configuration"},{"location":"helm_saml_config.html#helm_saml_config","text":"The Leap Helm chart and container offer a basic SAML configuration through the Helm values. To enable SAML you must pass the IdP Metadata of the identity provider. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. Example: security: leap: saml: idpMetadata: | ... Parent topic: Preparation","title":"SAML configuration"},{"location":"helm_service_catalog.html","text":"Service Catalog The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | sample-service-description en HTTPServiceTransport Sample service Description . . . Parent topic: Preparation","title":"Service Catalog"},{"location":"helm_service_catalog.html#helm_service_catalog","text":"The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | sample-service-description en HTTPServiceTransport Sample service Description . . . Parent topic: Preparation","title":"Service Catalog"},{"location":"helm_uninstall.html","text":"Uninstall Helm deployment To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall. Uninstall command To run the uninstall, use the following command as shown in this example: # Helm uninstall command helm uninstall your-release-name -n my-namespace Where my-namespace is the namespace where your HCL Leap deployment is installed to and your-release-name is the Helm release name you selected during installation. After a successful deployment, Helm responds with the following message: release \"your-release-name\" uninstalled Parent topic: Kubernetes Helm deployment","title":"Uninstall Helm deployment"},{"location":"helm_uninstall.html#helm_uninstall","text":"To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall.","title":"Uninstall Helm deployment"},{"location":"helm_uninstall.html#section_m4v_cp4_hzb","text":"To run the uninstall, use the following command as shown in this example: # Helm uninstall command helm uninstall your-release-name -n my-namespace Where my-namespace is the namespace where your HCL Leap deployment is installed to and your-release-name is the Helm release name you selected during installation. After a successful deployment, Helm responds with the following message: release \"your-release-name\" uninstalled Parent topic: Kubernetes Helm deployment","title":"Uninstall command"},{"location":"helm_update_install.html","text":"Update the settings of an existing installation This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. This section assumes that you prepared your cluster and your custom-values.yaml file, using guidance provided in the Preparation before installing Leap and using Helm topic, and then installed your deployment using the instructions in the Install topic. Overview of Helm configuration updates Once an HCL Leap deployment is installed, it is possible to update its configuration directly using the standard Kubernetes or OpenShift commands (for example, by updating values in the various config maps). However, this is NOT the recommended approach. Some of the configuration parameters have interdependencies, as outlined in the Preparation before installing Leap using Helm topic. These require knowledgeable management to make changes that are compatible with interdependency requirements. The recommended approach for configuration changes is to update the custom-values.yaml file used to install the deployment, and then run a Helm upgrade. This has the added benefit that your custom-values.yaml file remains an up-to-date description of the configuration of your environment. Helm upgrade configuration command After making the needed changes to your custom-values.yaml file, use the following command: # Helm upgrade command helm upgrade -n your-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl -leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The your-namespace is the namespace in which your HCL Leap deployment is installed and your-release-name is the Helm release name you used when installing. The -f path/to/your/custom-values.yaml parameter must point to the custom-values.yaml you have updated. The path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you extracted in the preparation steps. Parent topic: Kubernetes Helm deployment","title":"Update the settings of an existing installation"},{"location":"helm_update_install.html#helm_update_install","text":"This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. This section assumes that you prepared your cluster and your custom-values.yaml file, using guidance provided in the Preparation before installing Leap and using Helm topic, and then installed your deployment using the instructions in the Install topic.","title":"Update the settings of an existing installation"},{"location":"helm_update_install.html#section_vrr_mp4_hzb","text":"Once an HCL Leap deployment is installed, it is possible to update its configuration directly using the standard Kubernetes or OpenShift commands (for example, by updating values in the various config maps). However, this is NOT the recommended approach. Some of the configuration parameters have interdependencies, as outlined in the Preparation before installing Leap using Helm topic. These require knowledgeable management to make changes that are compatible with interdependency requirements. The recommended approach for configuration changes is to update the custom-values.yaml file used to install the deployment, and then run a Helm upgrade. This has the added benefit that your custom-values.yaml file remains an up-to-date description of the configuration of your environment.","title":"Overview of Helm configuration updates"},{"location":"helm_update_install.html#section_ixp_4p4_hzb","text":"After making the needed changes to your custom-values.yaml file, use the following command: # Helm upgrade command helm upgrade -n your-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl -leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The your-namespace is the namespace in which your HCL Leap deployment is installed and your-release-name is the Helm release name you used when installing. The -f path/to/your/custom-values.yaml parameter must point to the custom-values.yaml you have updated. The path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you extracted in the preparation steps. Parent topic: Kubernetes Helm deployment","title":"Helm upgrade configuration command"},{"location":"in_basic_architecture.html","text":"Basic Architecture Leap relies on two central components: the application server and the database. Leap relies on two central components: the application server and the database. The following diagram shows how these components are set up in a typical installation: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere\u00ae Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. If you plan to use Leap with WebSphere Portal, the following diagram describes the basic architecture: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. Leap Portlet: When installed and configured to point at the Leap server, it enables content to be rendered within a WebSphere Portal environment. User registry : Leap relies on a user registry, such as an LDAP, to manage access to the system. This is connected to the Leap application server. For more information on supported user registries, see Leap system requirements . Note: The detailed system requirements page displays Leap 8.6.0 requirements. In the upper left corner of the page, there is a menu from which you can select version 9.3. Email server : Leap can optionally send emails when configured with a proper email relay. Parent topic: Deploying to a traditional platform Related information Manually deploying to WebSphere Application Server","title":"Basic Architecture"},{"location":"in_basic_architecture.html#feb_basic_architecture","text":"Leap relies on two central components: the application server and the database. Leap relies on two central components: the application server and the database. The following diagram shows how these components are set up in a typical installation: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere\u00ae Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. If you plan to use Leap with WebSphere Portal, the following diagram describes the basic architecture: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. Leap Portlet: When installed and configured to point at the Leap server, it enables content to be rendered within a WebSphere Portal environment. User registry : Leap relies on a user registry, such as an LDAP, to manage access to the system. This is connected to the Leap application server. For more information on supported user registries, see Leap system requirements . Note: The detailed system requirements page displays Leap 8.6.0 requirements. In the upper left corner of the page, there is a menu from which you can select version 9.3. Email server : Leap can optionally send emails when configured with a proper email relay. Parent topic: Deploying to a traditional platform Related information Manually deploying to WebSphere Application Server","title":"Basic Architecture"},{"location":"in_create_db.html","text":"Create a Database This section describes how to prepare a database for Leap. Leap is compatible with a DB2 or an Oracle database. Creating a DB2 database The following instructions describe how to manually create the DB2\u00ae database for Leap. Creating an Oracle database The following steps describe how to manually create an Oracle database for use with Leap. Creating a PostgreSQL database The following instructions describe how to manually create the PostgreSQL database for Leap. Parent topic: Preparing to deploy","title":"Create a Database"},{"location":"in_create_db.html#createdb","text":"This section describes how to prepare a database for Leap. Leap is compatible with a DB2 or an Oracle database. Creating a DB2 database The following instructions describe how to manually create the DB2\u00ae database for Leap. Creating an Oracle database The following steps describe how to manually create an Oracle database for use with Leap. Creating a PostgreSQL database The following instructions describe how to manually create the PostgreSQL database for Leap. Parent topic: Preparing to deploy","title":"Create a Database"},{"location":"in_create_db2.html","text":"Creating a DB2 database The following instructions describe how to manually create the DB2\u00ae database for Leap. In a production environment, you must create DB2 database before you install HCL Leap to WebSphere\u00ae Application Server. Note: Do not create a database if you want to continue using the same database with the existing user content. To set up the DB2 database: Create an empty DB2 database with a maximum database name of 8 characters, and a maximum page size of 32768. Connect to the database and create a User Temporary table space. Use the following settings for the temporary table space: Large_usertemp pagesize 32K Managed by automatic storage extentsize 16 is the name of your DB2 large buffer pool. Each DB2 server can have a different name. db2 \"CREATE DB FEBDB using codeset UTF-8 territory us PAGESIZE 32768\" db2 connect to FEBDB db2 \"CREATE BUFFERPOOL bufferpool-name IMMEDIATE SIZE 250 PAGESIZE 32K\" db2 \"CREATE USER TEMPORARY TABLESPACE LARGE_USERTEMP PAGESIZE 32k MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 16 PREFETCHSIZE 16 BUFFERPOOL bufferpool-name\" Parent topic: Create a Database","title":"Creating a DB2 database"},{"location":"in_create_db2.html#settingupwas","text":"The following instructions describe how to manually create the DB2\u00ae database for Leap. In a production environment, you must create DB2 database before you install HCL Leap to WebSphere\u00ae Application Server. Note: Do not create a database if you want to continue using the same database with the existing user content. To set up the DB2 database: Create an empty DB2 database with a maximum database name of 8 characters, and a maximum page size of 32768. Connect to the database and create a User Temporary table space. Use the following settings for the temporary table space: Large_usertemp pagesize 32K Managed by automatic storage extentsize 16 is the name of your DB2 large buffer pool. Each DB2 server can have a different name. db2 \"CREATE DB FEBDB using codeset UTF-8 territory us PAGESIZE 32768\" db2 connect to FEBDB db2 \"CREATE BUFFERPOOL bufferpool-name IMMEDIATE SIZE 250 PAGESIZE 32K\" db2 \"CREATE USER TEMPORARY TABLESPACE LARGE_USERTEMP PAGESIZE 32k MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 16 PREFETCHSIZE 16 BUFFERPOOL bufferpool-name\" Parent topic: Create a Database","title":"Creating a DB2 database"},{"location":"in_deploying_was.html","text":"Manually deploying to WebSphere Application Server The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Prior to deploying HCL Leap to WebSphere Application Server, you must create a new DB2\u00ae , or Oracle 12c database. Set up your database. To set up the DB2 database, see Creating a DB2 database . To set up an Oracle database, see Creating an Oracle database To set up a PostgreSQL database, see Creating a PostgreSQL database . To deploy Leap to WebSphere Application Server, open the WebSphere Application Server Administrative console. Configure the data sources. Depending on your version of WebSphere Application Server, go to either: Resources or Application server Expand the JDBC tree, and go to Data sources . Create a new data source Provide the host name, port, database name (PDB database service name must be used for Oracle 12c), connection ID, and password. The connection ID must have dbadmin access granted for the database. If you are connecting to a DB2 database with WebSphere Application Server 8.0 Connection pool data source, ensure that you select a non-XA DB2 JDBC provider, and use a Type 4 driver when configuring the data source. Click Test connection to ensure that the connection is made. You must set additional properties for the created data source. Click the name link for the created data source, then click Custom Properties . DB2 only - Locate fullyMaterializeLobData, and change the value to false . DB2 only - Add a property called progressiveStreaming, and set the value to 2. DB2 only - Set streamBufferSize to 2097152 (2MB). Add this property if it doesn't exist. Set the webSphereDefaultIsolationLevel to 2 Go to Mail > Mail sessions . Select the correct scope and choose New . Choose Built-in Mail Provider . Provide a name, and a JNDI Name. Depending on your version of WebSphere Application Server, you might need to click Apply before setting the following properties. Complete the Outgoing Mail Properties . Set the Server , and Return email address fields. Click OK Go to Application Servers > server1 > Java and Process Management > Process definition > Java Virtual Machine , and set the default maximum heap size to at least 1024 MB. Deploy the Leap EAR: Go to Applications > Application Types > WebSphere Enterprise Applications . Select Install . Select Local file system , provide the location of the EAR file, and click Next . For example: /deploy/hcl-leap.ear. From the \u201cHow do you want to install the application?\u201d options, select Detailed , then click Next . Accept the defaults presented by clicking Next for all steps until Map resource references to resource . On Map resource references to resource : In the javax.mail.Session section, go to Target Resource JNDI Name , and select the mail source. In the javax.sql.DataSource section, go to Target Resource JNDI Name , and select the data source. Click Next . Accept the defaults for the next step and click Next . On Map context roots for web modules use the default context roots, and click Next . On Map security roles to users or groups : Select the SuperAdminUsers role, and click Map Users... or Map Groups... . Select the super administrative users or groups to map to the role. Select the EditApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Select the AdministrativeUsers role, and click Map Users... or Map Groups... . Select the administrative users or groups to map to the role. Select the UseApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Additional information about available roles: SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process as described in Completing the installation . A sample setting is: \u201cSpecial subject: None, Mapped users, admin_user_name \u201d. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. A sample setting is: \u201cSpecial subject: All authenticated in Application's Realms\u201d. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers , and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers , and EditApplicationUsers roles. Otherwise, leave this role unmapped. A sample setting, if you must map the role, is: \u201cSpecial subject: All authenticated in Trusted Realms\u201d. You must map Administrative users and Edit Application users to an appropriate realm. Continue to the summary page. Click Finish to deploy the ear file. Set the class loading and update detection: Go to Enterprise Applications > Leap > Class loader . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d. Go to Enterprise Applications > Leap > Manage Modules > HCL Leap xxx.war . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d Click Apply to apply changes. Enabling security: Expand the Security tree and select Global security . In the Administrative security section, select the check box beside Enable administrative security . In the Application security section, select the check box beside Enable application security . In the User Account Repository , ensure Current Realm Definition is set to Federated repositories. Click Apply to apply your changes. Configure user accounts: Go to Users and Groups > Manage Users . For more information about configuring accounts, see the WebSphere Application Server documentation. Configure VMM J2C Alias: Go to Security > Global Security > Authentication > Java Authentication and Authorization Service > J2C authentication data . Click New... Enter the following information Alias : vmmAdmin User Id : websphere_admin_user_id Password : websphere_admin_user_password Click Apply to apply your changes. Parent topic: Deploying to a traditional platform Related information Basic Architecture","title":"Manually deploying to WebSphere Application Server"},{"location":"in_deploying_was.html#settingupwas","text":"The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Prior to deploying HCL Leap to WebSphere Application Server, you must create a new DB2\u00ae , or Oracle 12c database. Set up your database. To set up the DB2 database, see Creating a DB2 database . To set up an Oracle database, see Creating an Oracle database To set up a PostgreSQL database, see Creating a PostgreSQL database . To deploy Leap to WebSphere Application Server, open the WebSphere Application Server Administrative console. Configure the data sources. Depending on your version of WebSphere Application Server, go to either: Resources or Application server Expand the JDBC tree, and go to Data sources . Create a new data source Provide the host name, port, database name (PDB database service name must be used for Oracle 12c), connection ID, and password. The connection ID must have dbadmin access granted for the database. If you are connecting to a DB2 database with WebSphere Application Server 8.0 Connection pool data source, ensure that you select a non-XA DB2 JDBC provider, and use a Type 4 driver when configuring the data source. Click Test connection to ensure that the connection is made. You must set additional properties for the created data source. Click the name link for the created data source, then click Custom Properties . DB2 only - Locate fullyMaterializeLobData, and change the value to false . DB2 only - Add a property called progressiveStreaming, and set the value to 2. DB2 only - Set streamBufferSize to 2097152 (2MB). Add this property if it doesn't exist. Set the webSphereDefaultIsolationLevel to 2 Go to Mail > Mail sessions . Select the correct scope and choose New . Choose Built-in Mail Provider . Provide a name, and a JNDI Name. Depending on your version of WebSphere Application Server, you might need to click Apply before setting the following properties. Complete the Outgoing Mail Properties . Set the Server , and Return email address fields. Click OK Go to Application Servers > server1 > Java and Process Management > Process definition > Java Virtual Machine , and set the default maximum heap size to at least 1024 MB. Deploy the Leap EAR: Go to Applications > Application Types > WebSphere Enterprise Applications . Select Install . Select Local file system , provide the location of the EAR file, and click Next . For example: /deploy/hcl-leap.ear. From the \u201cHow do you want to install the application?\u201d options, select Detailed , then click Next . Accept the defaults presented by clicking Next for all steps until Map resource references to resource . On Map resource references to resource : In the javax.mail.Session section, go to Target Resource JNDI Name , and select the mail source. In the javax.sql.DataSource section, go to Target Resource JNDI Name , and select the data source. Click Next . Accept the defaults for the next step and click Next . On Map context roots for web modules use the default context roots, and click Next . On Map security roles to users or groups : Select the SuperAdminUsers role, and click Map Users... or Map Groups... . Select the super administrative users or groups to map to the role. Select the EditApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Select the AdministrativeUsers role, and click Map Users... or Map Groups... . Select the administrative users or groups to map to the role. Select the UseApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Additional information about available roles: SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process as described in Completing the installation . A sample setting is: \u201cSpecial subject: None, Mapped users, admin_user_name \u201d. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. A sample setting is: \u201cSpecial subject: All authenticated in Application's Realms\u201d. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers , and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers , and EditApplicationUsers roles. Otherwise, leave this role unmapped. A sample setting, if you must map the role, is: \u201cSpecial subject: All authenticated in Trusted Realms\u201d. You must map Administrative users and Edit Application users to an appropriate realm. Continue to the summary page. Click Finish to deploy the ear file. Set the class loading and update detection: Go to Enterprise Applications > Leap > Class loader . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d. Go to Enterprise Applications > Leap > Manage Modules > HCL Leap xxx.war . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d Click Apply to apply changes. Enabling security: Expand the Security tree and select Global security . In the Administrative security section, select the check box beside Enable administrative security . In the Application security section, select the check box beside Enable application security . In the User Account Repository , ensure Current Realm Definition is set to Federated repositories. Click Apply to apply your changes. Configure user accounts: Go to Users and Groups > Manage Users . For more information about configuring accounts, see the WebSphere Application Server documentation. Configure VMM J2C Alias: Go to Security > Global Security > Authentication > Java Authentication and Authorization Service > J2C authentication data . Click New... Enter the following information Alias : vmmAdmin User Id : websphere_admin_user_id Password : websphere_admin_user_password Click Apply to apply your changes. Parent topic: Deploying to a traditional platform Related information Basic Architecture","title":"Manually deploying to WebSphere Application Server"},{"location":"in_migrating_feb.html","text":"Migrating from IBM Forms Experience Builder The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap. The process of upgrading from IBM Forms Experience Builder to HCL Leap is very similar to the instructions given in Upgrading Leap on a traditional platform . However, the default web module context roots have changed from /forms and /forms-basic to /apps and /apps-basic respectively. When upgrading to Leap you will want to ensure that you retain the same URLs used with IBM Forms Experience Builder. When upgrading the EAR in the WebSphere Application Server Administrative console, choose the Detailed option for \u201cHow do you want to install the application?\u201d. When you reach the Map context roots for Web modules step, ensure the Context Root values are the same as what you had previously. Parent topic: Deploying Leap","title":"Migrating from IBM Forms Experience Builder"},{"location":"in_migrating_feb.html#migratingformsexperiencebuilder","text":"The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap. The process of upgrading from IBM Forms Experience Builder to HCL Leap is very similar to the instructions given in Upgrading Leap on a traditional platform . However, the default web module context roots have changed from /forms and /forms-basic to /apps and /apps-basic respectively. When upgrading to Leap you will want to ensure that you retain the same URLs used with IBM Forms Experience Builder. When upgrading the EAR in the WebSphere Application Server Administrative console, choose the Detailed option for \u201cHow do you want to install the application?\u201d. When you reach the Map context roots for Web modules step, ensure the Context Root values are the same as what you had previously. Parent topic: Deploying Leap","title":"Migrating from IBM Forms Experience Builder"},{"location":"in_oracle_creating_db.html","text":"Creating an Oracle database The following steps describe how to manually create an Oracle database for use with Leap. To set up an Oracle database: Log into Oracle SQLPlus using the SYS DBA role. For example, sqlplus / as sysdba. Create three users. Each user is mapped to a schema, where Leap will create tables. ALTER SESSION SET CONTAINER = ; CREATE USER FREEDOM IDENTIFIED BY ; CREATE USER IF\\_CMIS IDENTIFIED BY ; CREATE USER APP\\_DATA IDENTIFIED BY ; Where is an Oracle accepted password you create. Create the administrator role. Leap accesses the Oracle database through a data source. An administrator is required to establish the connection to the database. CREATE USER IDENTIFIED BY ; Where is an administrator's user name, and is the administrator's password you create. Set the permissions for the administrative user. The following commands grant all permissions and privileges so the administrative user can access the database. GRANT ALL PRIVILEGES TO ; GRANT EXECUTE ANY PROCEDURE TO ; Set table space quotas for the three users of the schemas. GRANT UNLIMITED TABLESPACE TO FREEDOM; GRANT UNLIMITED TABLESPACE TO IF\\_CMIS; GRANT UNLIMITED TABLESPACE TO APP\\_DATA; GRANT UNLIMITED TABLESPACE TO ; The Oracle database is created. Parent topic: Create a Database","title":"Creating an Oracle database"},{"location":"in_oracle_creating_db.html#Creating_Oracle_db","text":"The following steps describe how to manually create an Oracle database for use with Leap. To set up an Oracle database: Log into Oracle SQLPlus using the SYS DBA role. For example, sqlplus / as sysdba. Create three users. Each user is mapped to a schema, where Leap will create tables. ALTER SESSION SET CONTAINER = ; CREATE USER FREEDOM IDENTIFIED BY ; CREATE USER IF\\_CMIS IDENTIFIED BY ; CREATE USER APP\\_DATA IDENTIFIED BY ; Where is an Oracle accepted password you create. Create the administrator role. Leap accesses the Oracle database through a data source. An administrator is required to establish the connection to the database. CREATE USER IDENTIFIED BY ; Where is an administrator's user name, and is the administrator's password you create. Set the permissions for the administrative user. The following commands grant all permissions and privileges so the administrative user can access the database. GRANT ALL PRIVILEGES TO ; GRANT EXECUTE ANY PROCEDURE TO ; Set table space quotas for the three users of the schemas. GRANT UNLIMITED TABLESPACE TO FREEDOM; GRANT UNLIMITED TABLESPACE TO IF\\_CMIS; GRANT UNLIMITED TABLESPACE TO APP\\_DATA; GRANT UNLIMITED TABLESPACE TO ; The Oracle database is created. Parent topic: Create a Database","title":"Creating an Oracle database"},{"location":"in_overview.html","text":"Deploying Leap This section describes the steps required to upgrade HCL Leap, and the Leap Portlet for use with WebSphere\u00ae Portal. Preparing to deploy This section describes how to prepare to deploy Leap. Kubernetes Helm deployment The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Deploying to a traditional platform The following topics describe how to deploy Leap to a traditional platform. Completing the post-deployment tasks After you run the HCL Leap installer for WebSphere Application Server, you must complete the deployment by setting up the Leap environment. Upgrading The following topics describe how to upgrade Leap. Migrating from IBM Forms Experience Builder The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap.","title":"Deploying"},{"location":"in_overview.html#installingoverview","text":"This section describes the steps required to upgrade HCL Leap, and the Leap Portlet for use with WebSphere\u00ae Portal. Preparing to deploy This section describes how to prepare to deploy Leap. Kubernetes Helm deployment The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Deploying to a traditional platform The following topics describe how to deploy Leap to a traditional platform. Completing the post-deployment tasks After you run the HCL Leap installer for WebSphere Application Server, you must complete the deployment by setting up the Leap environment. Upgrading The following topics describe how to upgrade Leap. Migrating from IBM Forms Experience Builder The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap.","title":"Deploying Leap"},{"location":"in_portlet_selecting_application_using_edit_shared_setting.html","text":"Selecting an application using Edit Shared Setting You can add an HCL Leap application to a WebSphere\u00ae Portal page with the Edit Shared Settings menu option. To permanently set which application is displayed in the Leap Portlet, use the following instructions. To dynamically set the application displayed at run time, see Leap Portlet parameters . To select an application for a WebSphere Portal page, you must have Edit privileges for both the WebSphere Portal page, and the Leap Portlet. Ensure the WebSphere Portal page is in Edit mode. Click the menu icon for the portlet name, and select Edit Shared Settings . The Shared Settings page opens. Update the values on the Edit Shared Settings page: Application URL : Enter the full URL to the application either by typing in the URL, or by clicking Browse and selecting the URL from a list of deployed applications. Preferred Security Mode : The preferred authentication mode to use for applications that support both anonymous and authenticated users. Anonymous only or Authenticated only applications are not affected, and use the authentication mechanism that is supported by the application. The default is to open the application anonymously. The page shows a selected check box for \u201cUse anonymous access when supported by the application\u201d. To open an application with the authentication credential of the current WebSphere Portal user, clear the check box for \u201cUse anonymous access when supported by the application\u201d. Page refesh setting : This setting determines whether the portal page is refreshed when the form is submitted. If your portal page depends on portlet wires, then you must have the page refresh upon form submission. The default is to not refresh the portal page when the form is submitted. Click OK to save your changes.","title":"Selecting an application using Edit Shared Setting {#selectingapplicationsharedsetting .task}"},{"location":"in_portlet_selecting_application_using_edit_shared_setting.html#selectingapplicationsharedsetting","text":"You can add an HCL Leap application to a WebSphere\u00ae Portal page with the Edit Shared Settings menu option. To permanently set which application is displayed in the Leap Portlet, use the following instructions. To dynamically set the application displayed at run time, see Leap Portlet parameters . To select an application for a WebSphere Portal page, you must have Edit privileges for both the WebSphere Portal page, and the Leap Portlet. Ensure the WebSphere Portal page is in Edit mode. Click the menu icon for the portlet name, and select Edit Shared Settings . The Shared Settings page opens. Update the values on the Edit Shared Settings page: Application URL : Enter the full URL to the application either by typing in the URL, or by clicking Browse and selecting the URL from a list of deployed applications. Preferred Security Mode : The preferred authentication mode to use for applications that support both anonymous and authenticated users. Anonymous only or Authenticated only applications are not affected, and use the authentication mechanism that is supported by the application. The default is to open the application anonymously. The page shows a selected check box for \u201cUse anonymous access when supported by the application\u201d. To open an application with the authentication credential of the current WebSphere Portal user, clear the check box for \u201cUse anonymous access when supported by the application\u201d. Page refesh setting : This setting determines whether the portal page is refreshed when the form is submitted. If your portal page depends on portlet wires, then you must have the page refresh upon form submission. The default is to not refresh the portal page when the form is submitted. Click OK to save your changes.","title":"Selecting an application using Edit Shared Setting"},{"location":"in_prep.html","text":"Preparing to deploy This section describes how to prepare to deploy Leap. A database will have to be created and connected to Leap for data storage. Create a Database This section describes how to prepare a database for Leap. Parent topic: Deploying Leap","title":"Preparing to deploy"},{"location":"in_prep.html#installprep","text":"This section describes how to prepare to deploy Leap. A database will have to be created and connected to Leap for data storage. Create a Database This section describes how to prepare a database for Leap. Parent topic: Deploying Leap","title":"Preparing to deploy"},{"location":"in_setting_up_environment.html","text":"Completing the post-deployment tasks After you run the HCL Leap installer for WebSphere\u00ae Application Server, you must complete the deployment by setting up the Leap environment. Ensure that you have the Administrative user ID and password for deployment. WebSphere Application Server installations: The Administrative user ID and Password of your WebSphere Application Server. When you attempt to log in to Leap for the first time, you are shown a setup screen. Following the steps on the setup screen completes the Leap installation. There are two phases to set up the Leap environment: Phase 1 - Basic Environment Setup Phase 2 - Secured Environment Setup Note: To disable this setup page and required admin interaction, add the following property to the Leap_config.properties: ibm.nitro.SetupAll.setupStatus = start Go to the location of your Leap installation. Open a web browser and enter http://hostname:port/apps/ The web browser shows the following message: \u201c HCL Leap is not set up. Until that occurs, all normal requests are disabled. Click Setup to start the setup process.\u201d Click Setup . The Leap setup window opens and automatically runs Phase 1: Basic Environment Setup. To begin Phase 2- Secured Environment Setup, click Continue to Secured Setup . You are shown the Leap log in screen. Log in using the Administrative user ID and Password for WebSphere Application Server After you log in, you are returned to the Leap setup page, and the Secured Setup continues automatically. When the Secured Setup is complete, click Continue to Manager . Leap is now ready to use. If there are any upgrades that must be done, a Fix button is shown. Click Fix to run the required upgrades. Once the upgrades have started, read the on-screen instructions and click Continue to Manager to begin working with Leap. After you have verified that Leap is working, create the these extra table spaces to minimize the database size as applications are created. Connect to the Leap DB2\u00ae as a DB2 administrator. Enter the following commands: CREATE BUFFERPOOL FEB4KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 4 K CREATE LARGE TABLESPACE USERSPACE4K PAGESIZE 4 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB4KBP CREATE BUFFERPOOL FEB8KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 8 K CREATE LARGE TABLESPACE USERSPACE8K PAGESIZE 8 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB8KBP CREATE BUFFERPOOL FEB16KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 16 K CREATE LARGE TABLESPACE USERSPACE16K PAGESIZE 16 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB16KBP Note: This is for DB2 databases only. Parent topic: Deploying Leap Related information Configuring the properties file","title":"Completing the post-deployment tasks"},{"location":"in_setting_up_environment.html#settingupthefebenvironment","text":"After you run the HCL Leap installer for WebSphere\u00ae Application Server, you must complete the deployment by setting up the Leap environment. Ensure that you have the Administrative user ID and password for deployment. WebSphere Application Server installations: The Administrative user ID and Password of your WebSphere Application Server. When you attempt to log in to Leap for the first time, you are shown a setup screen. Following the steps on the setup screen completes the Leap installation. There are two phases to set up the Leap environment: Phase 1 - Basic Environment Setup Phase 2 - Secured Environment Setup Note: To disable this setup page and required admin interaction, add the following property to the Leap_config.properties: ibm.nitro.SetupAll.setupStatus = start Go to the location of your Leap installation. Open a web browser and enter http://hostname:port/apps/ The web browser shows the following message: \u201c HCL Leap is not set up. Until that occurs, all normal requests are disabled. Click Setup to start the setup process.\u201d Click Setup . The Leap setup window opens and automatically runs Phase 1: Basic Environment Setup. To begin Phase 2- Secured Environment Setup, click Continue to Secured Setup . You are shown the Leap log in screen. Log in using the Administrative user ID and Password for WebSphere Application Server After you log in, you are returned to the Leap setup page, and the Secured Setup continues automatically. When the Secured Setup is complete, click Continue to Manager . Leap is now ready to use. If there are any upgrades that must be done, a Fix button is shown. Click Fix to run the required upgrades. Once the upgrades have started, read the on-screen instructions and click Continue to Manager to begin working with Leap. After you have verified that Leap is working, create the these extra table spaces to minimize the database size as applications are created. Connect to the Leap DB2\u00ae as a DB2 administrator. Enter the following commands: CREATE BUFFERPOOL FEB4KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 4 K CREATE LARGE TABLESPACE USERSPACE4K PAGESIZE 4 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB4KBP CREATE BUFFERPOOL FEB8KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 8 K CREATE LARGE TABLESPACE USERSPACE8K PAGESIZE 8 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB8KBP CREATE BUFFERPOOL FEB16KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 16 K CREATE LARGE TABLESPACE USERSPACE16K PAGESIZE 16 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB16KBP Note: This is for DB2 databases only. Parent topic: Deploying Leap Related information Configuring the properties file","title":"Completing the post-deployment tasks"},{"location":"in_upgrading.html","text":"Upgrading Leap on a traditional platform The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Download the upgrade package from HCL License Portal. Back up your existing installation prior to installing the update. Back up your DB2\u00ae or Oracle database before you install the update. To back up your current Leap installation: Export the Leap EAR file. Open the WebSphere Application Server Administrative console. Go to Applications > Application Types > WebSphere enterprise applications . Select Leap. Click Export . Click Leap.ear to download the installation file as a backup. After the backup is complete, use the following instructions to install the upgrade file. Stop the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap, and click Stop . Check the version of your currently installed Leap. You need the version number in step 4c. Go to Modules > Display module build Ids . Check the version for the HCL Leap WAR. An example module version is \u201cLeap 9.0.0.0 GA\u201d. Update the Leap installation. Return to Applications > Application Types > WebSphere enterprise applications > Leap , and click Update . In the Application update options , select Replace the entire application . In Specify the path to the replacement ear file , select Local file system , and provide the location of the EAR file you downloaded from HCL License Portal. Click Next . In Preparing for the application update , click Next . Do not change the default settings on the page. On the Install New Application page, go to Step 3: Map resource references to resources . In the javax.mail.Session table, set the Target Resource JDMI Name . Click Browse and select . In the javax.sql.DataSource table, set the Target Resource JDMI Name . Click Browse and select . Click Next . Go to Step 4: Map virtual hosts for Web modules to validate that both Virtual host names are identical and correct, then click Next . Click Finish to save the update. If Leap is running on nodes that are managed by Deployment Manager, you must synchronize all nodes where Leap is installed. Open the WebSphere Application Server Administrative console. Go to System Administration > Nodes . Select all nodes where Leap is installed. Click Synchronize . When the upgrade is complete, restart the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap. Click Start . If you use Leap with WebSphere Portal, you must update the Leap Portlet. Log in to WebSphere Portal as an administrative user. Go to Portlet Management > Web Modules and locate LeapPortlet.war. Click the Update Web module icon. The Update Web module icon is located to the right of the Web module properties icon. Click Browse to select the updated version of the Leap Portlet, and click Next . Review your changes and click Finish . Parent topic: Upgrading","title":"Upgrading Leap on a traditional platform"},{"location":"in_upgrading.html#upgradingformsexperiencebuilder","text":"The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Download the upgrade package from HCL License Portal. Back up your existing installation prior to installing the update. Back up your DB2\u00ae or Oracle database before you install the update. To back up your current Leap installation: Export the Leap EAR file. Open the WebSphere Application Server Administrative console. Go to Applications > Application Types > WebSphere enterprise applications . Select Leap. Click Export . Click Leap.ear to download the installation file as a backup. After the backup is complete, use the following instructions to install the upgrade file. Stop the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap, and click Stop . Check the version of your currently installed Leap. You need the version number in step 4c. Go to Modules > Display module build Ids . Check the version for the HCL Leap WAR. An example module version is \u201cLeap 9.0.0.0 GA\u201d. Update the Leap installation. Return to Applications > Application Types > WebSphere enterprise applications > Leap , and click Update . In the Application update options , select Replace the entire application . In Specify the path to the replacement ear file , select Local file system , and provide the location of the EAR file you downloaded from HCL License Portal. Click Next . In Preparing for the application update , click Next . Do not change the default settings on the page. On the Install New Application page, go to Step 3: Map resource references to resources . In the javax.mail.Session table, set the Target Resource JDMI Name . Click Browse and select . In the javax.sql.DataSource table, set the Target Resource JDMI Name . Click Browse and select . Click Next . Go to Step 4: Map virtual hosts for Web modules to validate that both Virtual host names are identical and correct, then click Next . Click Finish to save the update. If Leap is running on nodes that are managed by Deployment Manager, you must synchronize all nodes where Leap is installed. Open the WebSphere Application Server Administrative console. Go to System Administration > Nodes . Select all nodes where Leap is installed. Click Synchronize . When the upgrade is complete, restart the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap. Click Start . If you use Leap with WebSphere Portal, you must update the Leap Portlet. Log in to WebSphere Portal as an administrative user. Go to Portlet Management > Web Modules and locate LeapPortlet.war. Click the Update Web module icon. The Update Web module icon is located to the right of the Web module properties icon. Click Browse to select the updated version of the Leap Portlet, and click Next . Review your changes and click Finish . Parent topic: Upgrading","title":"Upgrading Leap on a traditional platform"},{"location":"kubernetes_helm_deployment.html","text":"Kubernetes Helm deployment The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Learn how to deploy HCL Leap to a Kubernetes-friendly container platform using Helm. This section provides administrators with all Helm-based deployment tasks to deploy HCL Leap and later releases to supported Kubernetes platforms. This includes preparation, installation, and uninstallation of the deployments using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported. Originally designed by Google, now governed by the Cloud Native Computing Foundation (CNCF) and developed by Google, Red Hat, and many others, Kubernetes is now widely used by organizations of various sizes to run containers in a cloud environment. Preparation This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Install commads to deploy This topic details install commands that are used to deploy HCL Leap Helm Charts. Uninstall Helm deployment To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall. Update the settings of an existing installation This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. Configuring Leap with OIDC This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider. Migrating From WebSphere to Liberty It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. Parent topic: Deploying Leap","title":"Kubernetes Helm deployment"},{"location":"kubernetes_helm_deployment.html#kubernetes_helm_deployment","text":"The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Learn how to deploy HCL Leap to a Kubernetes-friendly container platform using Helm. This section provides administrators with all Helm-based deployment tasks to deploy HCL Leap and later releases to supported Kubernetes platforms. This includes preparation, installation, and uninstallation of the deployments using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported. Originally designed by Google, now governed by the Cloud Native Computing Foundation (CNCF) and developed by Google, Red Hat, and many others, Kubernetes is now widely used by organizations of various sizes to run containers in a cloud environment. Preparation This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Install commads to deploy This topic details install commands that are used to deploy HCL Leap Helm Charts. Uninstall Helm deployment To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall. Update the settings of an existing installation This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. Configuring Leap with OIDC This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider. Migrating From WebSphere to Liberty It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. Parent topic: Deploying Leap","title":"Kubernetes Helm deployment"},{"location":"leap_strict_csp.html","text":"Strict CSP HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Strict CSP mode can be enabled using the ibm.nitro.NitroConfig.runtimeCSP configuration parameter. For example: ibm.nitro.NitroConfig.runtimeCSP=script-src 'self' https://trusted.example.com 'nonce-{nonce}'; object-src 'none'; base-uri 'none'; style-src 'self' https://trusted.example.com 'nonce-{nonce}'; The {nonce} token is replaced with a generated, cryptographically strong random nonce when serving up the Leap form\u2019s HTML page. The nonce is applied as an attribute to all Limitations Strict CSP only covers the rendering of Leap Forms. This includes fill and submit of a new record, and the update of existing records: As a stand-alone HTML page Embedded within an IFRAME Embedded with the non-IFRAME Embedding API Strict CSP is not applied to any other runtime pages or scenarios, such as App Pages, View Data, or Summary Charts. Strict CSP is not applied to any aspects of Leap\u2019s authoring environment. When using the Embedding API, if you want a callback function to be called after the form has been launched, it cannot be specified in the data-leap-config attribute. It must be supplied by providing as a parameter to Leap.launch() function. JavaScript (.js) files contained in the application will no longer be evaluated in context, therefore the app variable will not be available. The global NitroApplication variable should be used instead. All existing applications must be redeployed if the ibm.nitro.NitroConfig.runtimeCSP config value contains the {nonce} token. In rare cases, some forms may fail to render when Strict CSP is enabled and JavaScript security is enabled (ie. when ibm.nitro.ApplicationCompilerService.secureJS=false is enabled or unset). This depends on the exact product features being used. Errors regarding inline styles will appear in the browser console, however effort has to been made to ensure there are no noticeable side-effects for end-users, with the following exceptions: Styles applied to the content of the Text widget might not be preserved - these would be inline-styles and therefore not allowed by the browser in Strict CSP mode. The Rich Text Entry and Data Grid items will not render with Strict CSP enabled, because of limitations in 3rd-party libraries. Known risks As mentioned above, the non-IFRAME Embedding API does not have control of the page, and therefore needs to be informed of the nonce token by the hosting page. The Embedding API will nullify the cspNonce value once the form launch is complete; however, there will be a short period of time where the nonce is available to other scripts running on the page. It is the responsibility of the customer to ensure that this temporary exposure of the nonce cannot be exploited. As mentioned above, Strict CSP only applies to the rendering of Leap Forms. It is the responsibility of the customer to ensure other product pages (ex. App Pages) are not exposed to an audience that is meant to be protected by Strict CSP. Not all browsers may support CSP equally. It is the responsibility of the customer to ensure the CSP header is configured with suitable fallbacks, if necessary for their user-base. Parent topic: Administering Leap","title":"Strict CSP"},{"location":"leap_strict_csp.html#leap_strict_csp","text":"HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Strict CSP mode can be enabled using the ibm.nitro.NitroConfig.runtimeCSP configuration parameter. For example: ibm.nitro.NitroConfig.runtimeCSP=script-src 'self' https://trusted.example.com 'nonce-{nonce}'; object-src 'none'; base-uri 'none'; style-src 'self' https://trusted.example.com 'nonce-{nonce}'; The {nonce} token is replaced with a generated, cryptographically strong random nonce when serving up the Leap form\u2019s HTML page. The nonce is applied as an attribute to all ","title":"Strict CSP"},{"location":"leap_strict_csp.html#section_gb5_qp3_rvb","text":"Strict CSP only covers the rendering of Leap Forms. This includes fill and submit of a new record, and the update of existing records: As a stand-alone HTML page Embedded within an IFRAME Embedded with the non-IFRAME Embedding API Strict CSP is not applied to any other runtime pages or scenarios, such as App Pages, View Data, or Summary Charts. Strict CSP is not applied to any aspects of Leap\u2019s authoring environment. When using the Embedding API, if you want a callback function to be called after the form has been launched, it cannot be specified in the data-leap-config attribute. It must be supplied by providing as a parameter to Leap.launch() function. JavaScript (.js) files contained in the application will no longer be evaluated in context, therefore the app variable will not be available. The global NitroApplication variable should be used instead. All existing applications must be redeployed if the ibm.nitro.NitroConfig.runtimeCSP config value contains the {nonce} token. In rare cases, some forms may fail to render when Strict CSP is enabled and JavaScript security is enabled (ie. when ibm.nitro.ApplicationCompilerService.secureJS=false is enabled or unset). This depends on the exact product features being used. Errors regarding inline styles will appear in the browser console, however effort has to been made to ensure there are no noticeable side-effects for end-users, with the following exceptions: Styles applied to the content of the Text widget might not be preserved - these would be inline-styles and therefore not allowed by the browser in Strict CSP mode. The Rich Text Entry and Data Grid items will not render with Strict CSP enabled, because of limitations in 3rd-party libraries.","title":"Limitations"},{"location":"leap_strict_csp.html#section_zbc_jq3_rvb","text":"As mentioned above, the non-IFRAME Embedding API does not have control of the page, and therefore needs to be informed of the nonce token by the hosting page. The Embedding API will nullify the cspNonce value once the form launch is complete; however, there will be a short period of time where the nonce is available to other scripts running on the page. It is the responsibility of the customer to ensure that this temporary exposure of the nonce cannot be exploited. As mentioned above, Strict CSP only applies to the rendering of Leap Forms. It is the responsibility of the customer to ensure other product pages (ex. App Pages) are not exposed to an audience that is meant to be protected by Strict CSP. Not all browsers may support CSP equally. It is the responsibility of the customer to ensure the CSP header is configured with suitable fallbacks, if necessary for their user-base. Parent topic: Administering Leap","title":"Known risks"},{"location":"migrating_websphere_liberty.html","text":"Migrating From WebSphere to Liberty It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. The most common parts of a Leap deployment are the following: Database LDAP Mail server Each of these three parts are external to Leap and will be configured in the deploy-values.yaml file as described in Customized deployment . Since the database contains all the Leap applications, once it is connected to Leap 9.3.2 on Open Liberty they will be accessible. Note: Once the database has been connected to version 9.3.2, it will no longer work for Leap 9.3.1. Leap on Open Liberty works best if the login attribute is set to the 'mail' attribute. If your existing WebSphere deployment is using a different login attribute then some additional steps will need to be taken. All of the Leap users are identified by their login id, if the attribute for that login id changes then when a user authenticates with Leap on Open Liberty for the first time (using their mail attribute) they would be seen as a new user and not automatically associated with their previous account. In this case you will need to manually update all the users in the FREEDOM.USERS table (before allowing them to access the system), changing their LOGIN_ID value to the value of their email address. The SQL statement looks like the following: UPDATE FREEDOM.USERS SET LOGIN_ID = '' WHERE LOGIN_ID = ''; The new Open Liberty image and associated Helm charts for Leap 9.3.2 are not backward-compatible with Leap 9.3.1. Do not use the same values.yaml file for Helm that you may have used with Leap 9.3.1. Customizations applied through the WebSphere Application Server admin console, may need to be reapplied using snippets of XML according to Open Liberty's configuration technique (see https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html .)). This additional configuration can be supplied as \"overrides\" in Leap 9.3.2's Helm charts. For more information, see Customized deployment . The persistent volumes defined for use with the Leap 9.3.1 container are not the same for Leap 9.3.2. When upgrading to Leap 9.3.2, create new persistent volumes. For more information, see Prerequisite - Specifying persistant volumes . Parent topic: Kubernetes Helm deployment","title":"Migrating From WebSphere to Liberty"},{"location":"migrating_websphere_liberty.html#migrating_websphere_liberty","text":"It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. The most common parts of a Leap deployment are the following: Database LDAP Mail server Each of these three parts are external to Leap and will be configured in the deploy-values.yaml file as described in Customized deployment . Since the database contains all the Leap applications, once it is connected to Leap 9.3.2 on Open Liberty they will be accessible. Note: Once the database has been connected to version 9.3.2, it will no longer work for Leap 9.3.1. Leap on Open Liberty works best if the login attribute is set to the 'mail' attribute. If your existing WebSphere deployment is using a different login attribute then some additional steps will need to be taken. All of the Leap users are identified by their login id, if the attribute for that login id changes then when a user authenticates with Leap on Open Liberty for the first time (using their mail attribute) they would be seen as a new user and not automatically associated with their previous account. In this case you will need to manually update all the users in the FREEDOM.USERS table (before allowing them to access the system), changing their LOGIN_ID value to the value of their email address. The SQL statement looks like the following: UPDATE FREEDOM.USERS SET LOGIN_ID = '' WHERE LOGIN_ID = ''; The new Open Liberty image and associated Helm charts for Leap 9.3.2 are not backward-compatible with Leap 9.3.1. Do not use the same values.yaml file for Helm that you may have used with Leap 9.3.1. Customizations applied through the WebSphere Application Server admin console, may need to be reapplied using snippets of XML according to Open Liberty's configuration technique (see https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html .)). This additional configuration can be supplied as \"overrides\" in Leap 9.3.2's Helm charts. For more information, see Customized deployment . The persistent volumes defined for use with the Leap 9.3.1 container are not the same for Leap 9.3.2. When upgrading to Leap 9.3.2, create new persistent volumes. For more information, see Prerequisite - Specifying persistant volumes . Parent topic: Kubernetes Helm deployment","title":"Migrating From WebSphere to Liberty"},{"location":"openliberty_customized_deploy.html","text":"Customized deployment The following are the most common changes needed for a production deployment: Specify persistent volumes Change admin credentials Configure a database Configure an SMTP server Configure an LDAP Define Custom Service Configurations Modify Leap properties Encoding passwords All passwords passed in the .yaml file should be encoded. You can encode a password using a utility provided by Open Liberty. To access this utility in your kubernetes environment use the command: kubectl -n dxns exec -it leap-deployment-leap-0 -- /opt/openliberty/wlp/bin/securityUtility encode The result of the command will be a string value like {xor}Kzc6Dz4sLCgwLTs= . Use this encoded value when specifying a password. Change server Admin credentials This is optional. The credentials supplied below are used in the container startup to run configuration tasks and setup Leap. The default credentials are set to leapadmin for username and password. To change the default admin, add this snippet to your .yaml file and update the adminUser and adminPassword properties. security: leap: adminUser: \"leapadmin\" adminPassword: \"leapadmin\" SAML configuration The Leap Helm chart and container offer a basic SAML configuration through the Helm values. This can be used to enable SAML, deploy the WebSphereSamlSP.ear, configure the ACS URL, pass the IdP Metadata of the identity provider and add trusted realms. Note: Please note that this configuration can currently only be used to enable the SAML TAI SSO. To disable it, please set the enabled flag to false and remove the Trust Association manually in WebSphere. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. The ssoId9999 is used to create the SAML TAI SSO.Example configuration: security: leap: saml: enabled: true acsUrl: \"https://native-kube-kevin.team-q-dev.com:9443/samlsps/acs\" idpMetadata: | samltest.id SAMLtest IdP A free and basic IdP for testing SAML deployments https://samltest.id/saml/logo.png ... Certificates The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore. Open Liberty server customizations The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details. Connecting to a DB2 Instance The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | Connecting to an Oracle Instance The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | Connecting to a PostgreSQL database The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | Connecting to an STMP Server Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | Connecting to an LDAP Server Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | inetOrgPerson ou=People,dc=Acme groupOfUniqueNames ou=Groups,dc=Acme Configure SSL behavior The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | Service Catalog The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | sample-service-description en HTTPServiceTransport Sample service Description . . . Leap Properties The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo =
Welcome to HCL Leap 9.3.2 in Kubernetes!
ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties . JVM options JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\" Changing the log level Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest Assigning User's to Leap Roles Leap has several application-level roles that control who can access different features. You must map Administrative users and Edit Application users to an appropriate realm. SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers, and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers, and EditApplicationUsers roles. Otherwise, leave this role unmapped. configuration: leap: roleMapping: SuperAdminUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] EditApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] AdministrativeUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] UseApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: [] MappedGroups: [] AllAuthenticatedInTrustedRealms: true MappedUsersAccessIDs: [] MappedGroupsAccessIDs: []","title":"Customized deployment {#openliberty_customized_deploy .concept}"},{"location":"openliberty_customized_deploy.html#openliberty_customized_deploy","text":"The following are the most common changes needed for a production deployment: Specify persistent volumes Change admin credentials Configure a database Configure an SMTP server Configure an LDAP Define Custom Service Configurations Modify Leap properties","title":"Customized deployment"},{"location":"openliberty_customized_deploy.html#section_ev2_553_hxb","text":"All passwords passed in the .yaml file should be encoded. You can encode a password using a utility provided by Open Liberty. To access this utility in your kubernetes environment use the command: kubectl -n dxns exec -it leap-deployment-leap-0 -- /opt/openliberty/wlp/bin/securityUtility encode The result of the command will be a string value like {xor}Kzc6Dz4sLCgwLTs= . Use this encoded value when specifying a password.","title":"Encoding passwords"},{"location":"openliberty_customized_deploy.html#section_edb_2js_gxb","text":"This is optional. The credentials supplied below are used in the container startup to run configuration tasks and setup Leap. The default credentials are set to leapadmin for username and password. To change the default admin, add this snippet to your .yaml file and update the adminUser and adminPassword properties. security: leap: adminUser: \"leapadmin\" adminPassword: \"leapadmin\"","title":"Change server Admin credentials"},{"location":"openliberty_customized_deploy.html#section_g5g_x5s_gxb","text":"The Leap Helm chart and container offer a basic SAML configuration through the Helm values. This can be used to enable SAML, deploy the WebSphereSamlSP.ear, configure the ACS URL, pass the IdP Metadata of the identity provider and add trusted realms. Note: Please note that this configuration can currently only be used to enable the SAML TAI SSO. To disable it, please set the enabled flag to false and remove the Trust Association manually in WebSphere. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. The ssoId9999 is used to create the SAML TAI SSO.Example configuration: security: leap: saml: enabled: true acsUrl: \"https://native-kube-kevin.team-q-dev.com:9443/samlsps/acs\" idpMetadata: | samltest.id SAMLtest IdP A free and basic IdP for testing SAML deployments https://samltest.id/saml/logo.png ... ","title":"SAML configuration"},{"location":"openliberty_customized_deploy.html#section_x5j_x5s_gxb","text":"The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore.","title":"Certificates"},{"location":"openliberty_customized_deploy.html#section_pqj_3ts_gxb","text":"The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details. Connecting to a DB2 Instance The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | Connecting to an Oracle Instance The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | Connecting to a PostgreSQL database The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | Connecting to an STMP Server Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | Connecting to an LDAP Server Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | inetOrgPerson ou=People,dc=Acme groupOfUniqueNames ou=Groups,dc=Acme Configure SSL behavior The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | ","title":"Open Liberty server customizations"},{"location":"openliberty_customized_deploy.html#section_jbb_r5s_gxb","text":"The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | sample-service-description en HTTPServiceTransport Sample service Description . . . ","title":"Service Catalog"},{"location":"openliberty_customized_deploy.html#section_ynm_t5s_gxb","text":"The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo =
Welcome to HCL Leap 9.3.2 in Kubernetes!
ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties .","title":"Leap Properties"},{"location":"openliberty_customized_deploy.html#section_dc2_rjz_gxb","text":"JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\"","title":"JVM options"},{"location":"openliberty_customized_deploy.html#section_nfl_hhh_hxb","text":"Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest","title":"Changing the log level"},{"location":"openliberty_customized_deploy.html#section_tm4_n53_hxb","text":"Leap has several application-level roles that control who can access different features. You must map Administrative users and Edit Application users to an appropriate realm. SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers, and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers, and EditApplicationUsers roles. Otherwise, leave this role unmapped. configuration: leap: roleMapping: SuperAdminUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] EditApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] AdministrativeUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] UseApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: [] MappedGroups: [] AllAuthenticatedInTrustedRealms: true MappedUsersAccessIDs: [] MappedGroupsAccessIDs: []","title":"Assigning User's to Leap Roles"},{"location":"ovr_overview.html","text":"Overview HCL Leap builds dynamic forms and applications with a web-based interface. From a single interface, you can design a form, define access privileges, create workflow stages, deploy the application, and review submitted results. Leap makes creating forms easier than before by dramatically reducing the time and effort that is required to deliver compelling, interactive applications. The simple web-based user interface allows a web designer to quickly assemble a series of application screens for web forms. You can also capture data into a relational database and orchestrate notifications with an integrated workflow. Data that is captured in Leap is easily integrated into existing line-of-business systems with a drag-and-drop web service interface. When users submit forms, you can view summary charts, inspect collected responses, or export data records to a spreadsheet program for detailed analysis.","title":"Overview"},{"location":"ovr_overview.html#overview","text":"HCL Leap builds dynamic forms and applications with a web-based interface. From a single interface, you can design a form, define access privileges, create workflow stages, deploy the application, and review submitted results. Leap makes creating forms easier than before by dramatically reducing the time and effort that is required to deliver compelling, interactive applications. The simple web-based user interface allows a web designer to quickly assemble a series of application screens for web forms. You can also capture data into a relational database and orchestrate notifications with an integrated workflow. Data that is captured in Leap is easily integrated into existing line-of-business systems with a drag-and-drop web service interface. When users submit forms, you can view summary charts, inspect collected responses, or export data records to a spreadsheet program for detailed analysis.","title":"Overview"},{"location":"ovr_release_notes.html","text":"Leap release notes These release notes provide a summary of new features, installation information, and descriptions of known limitations, problems, and workarounds. Category Description Link About this release New features What's New System requirements System requirements Leap system requirements Installation, migration, upgrade, and configuration information Installation instructions Deploying Leap Known limitations, problems, and workarounds Troubleshooting, Limitations, problems, and workarounds Troubleshooting Contacting customer support Customer support Leap flashes, alerts, and bulletins","title":"Release Notes"},{"location":"ovr_release_notes.html#releasenotes","text":"These release notes provide a summary of new features, installation information, and descriptions of known limitations, problems, and workarounds. Category Description Link About this release New features What's New System requirements System requirements Leap system requirements Installation, migration, upgrade, and configuration information Installation instructions Deploying Leap Known limitations, problems, and workarounds Troubleshooting, Limitations, problems, and workarounds Troubleshooting Contacting customer support Customer support Leap flashes, alerts, and bulletins","title":"Leap release notes"},{"location":"prepare_config_helm.html","text":"Prepare configuration Create a configuration file that fits the needs of your target HCL Leap Container deployment. The configuration file is the heart of your deployment using Helm. It defines how HCL Leap is deployed to supported platforms, and how it behaves during runtime operations. This section explains how to create your own configuration file and how to leverage the existing values.yaml inside the Helm Chart. It also explains how to optionally overwrite settings in case the default set may not be sufficient. Note: Modification to any files (chart.yaml, templates) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported. The configuration flow Helm provides multiple ways to define values that can be processed to run an installation. Processing involves a three-step approach, that is ordered sequentially within a hierarchy. Helm Chart values.yaml Every Helm Chart contains a values.yaml file. It defines all configurable parameters that a Helm Chart accepts and the default values that are used during an installation. If you do not provide any other configuration during an installation, Helm extracts all deployment information from the values.yaml file inside the Helm Chart. All parameters that were not overwritten using any other configuration methods return to their default values from the values.yaml file inside the Helm Chart. Custom value file Helm provides you with a way to maintain your own custom values files. You can specify a custom values file you want to use when running an installation. This custom values file only needs to contain the parameters that you want to overwrite with your preferred settings. Note: There is no need to have the same complete set of parameters inside your custom values file, as there are available by default in the Helm Chart values.yaml. As outlined previously in this section, everything that is not defined in your custom values file are applied using the defaults from values.yaml inside the Helm Charts. Be aware that the parameters you can configure using your custom values file need to exactly align with those provided by the Helm Charts own values.yaml. You cannot configure anything that is not exposed in the values.yaml definition. Override parameters It is possible to define values using a --set parameter in the Helm CLI during the installation of a Helm Chart. Since there are many values that can be configured in the HCL Leap deployment, we do not recommend this technique, since it makes installation commands very large and confusing. The default HCL Leap Container values.yaml file HCL Leap Helm Chart provides a default values.yaml, which contains all possible configuration parameters. To access this file, you may use the following command when you have the HCL Leap or later Helm Chart tar.gz file on hand: # Command to show values from Helm Chart helm show values hcl-leap-deployment.tar.gz What appears in the console is all the configurable parameters and their default values. A custom configuration file Helm allows you to provide a custom configuration file during the installation or upgrade process. That file only overwrites settings that are defined within it. For parts of the configuration that are not defined in your custom configuration file, Helm returns to the default values in the values.yaml file inside the Leap Helm Chart. This allows you to keep the overall size of your configuration file small and the maintainability high. This documentation refers to the custom configuration file as custom-values.yaml. You may name your custom configuration file as preferred. Note: Including all of the parameters from the values.yaml is not necessary and may bloat your configuration file with values that are already present in the Leap Helm Chart. Only specify what you want to change from its default value. Parent topic: Preparation","title":"Prepare configuration"},{"location":"prepare_config_helm.html#prepare_config_helm","text":"Create a configuration file that fits the needs of your target HCL Leap Container deployment. The configuration file is the heart of your deployment using Helm. It defines how HCL Leap is deployed to supported platforms, and how it behaves during runtime operations. This section explains how to create your own configuration file and how to leverage the existing values.yaml inside the Helm Chart. It also explains how to optionally overwrite settings in case the default set may not be sufficient. Note: Modification to any files (chart.yaml, templates) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported.","title":"Prepare configuration"},{"location":"prepare_config_helm.html#section_imf_zh4_hzb","text":"Helm provides multiple ways to define values that can be processed to run an installation. Processing involves a three-step approach, that is ordered sequentially within a hierarchy.","title":"The configuration flow"},{"location":"prepare_config_helm.html#section_mkj_134_hzb","text":"Every Helm Chart contains a values.yaml file. It defines all configurable parameters that a Helm Chart accepts and the default values that are used during an installation. If you do not provide any other configuration during an installation, Helm extracts all deployment information from the values.yaml file inside the Helm Chart. All parameters that were not overwritten using any other configuration methods return to their default values from the values.yaml file inside the Helm Chart.","title":"Helm Chart values.yaml"},{"location":"prepare_config_helm.html#section_rmd_d34_hzb","text":"Helm provides you with a way to maintain your own custom values files. You can specify a custom values file you want to use when running an installation. This custom values file only needs to contain the parameters that you want to overwrite with your preferred settings. Note: There is no need to have the same complete set of parameters inside your custom values file, as there are available by default in the Helm Chart values.yaml. As outlined previously in this section, everything that is not defined in your custom values file are applied using the defaults from values.yaml inside the Helm Charts. Be aware that the parameters you can configure using your custom values file need to exactly align with those provided by the Helm Charts own values.yaml. You cannot configure anything that is not exposed in the values.yaml definition.","title":"Custom value file"},{"location":"prepare_config_helm.html#section_e5x_h34_hzb","text":"It is possible to define values using a --set parameter in the Helm CLI during the installation of a Helm Chart. Since there are many values that can be configured in the HCL Leap deployment, we do not recommend this technique, since it makes installation commands very large and confusing.","title":"Override parameters"},{"location":"prepare_config_helm.html#section_ftl_k34_hzb","text":"HCL Leap Helm Chart provides a default values.yaml, which contains all possible configuration parameters. To access this file, you may use the following command when you have the HCL Leap or later Helm Chart tar.gz file on hand: # Command to show values from Helm Chart helm show values hcl-leap-deployment.tar.gz What appears in the console is all the configurable parameters and their default values.","title":"The default HCL Leap Container values.yaml file"},{"location":"prepare_config_helm.html#section_z5g_434_hzb","text":"Helm allows you to provide a custom configuration file during the installation or upgrade process. That file only overwrites settings that are defined within it. For parts of the configuration that are not defined in your custom configuration file, Helm returns to the default values in the values.yaml file inside the Leap Helm Chart. This allows you to keep the overall size of your configuration file small and the maintainability high. This documentation refers to the custom configuration file as custom-values.yaml. You may name your custom configuration file as preferred. Note: Including all of the parameters from the values.yaml is not necessary and may bloat your configuration file with values that are already present in the Leap Helm Chart. Only specify what you want to change from its default value. Parent topic: Preparation","title":"A custom configuration file"},{"location":"ref_application_object.html","text":"Application objects Table 1. Application Object (app) The Leap application object provides access to information relevant to the whole application. Object Description Example app.getAppPage\\(appPageId\\) Returns the user interface app page object for the provided var myAppPage = app.getAppPage(\u201cAP_Welcome\u201d); app.getAppPageURL(appPageId, appUid) Returns the URL for navigating directly to the app page for the provided app page id and application uid. Note: The appUid parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. app.getAppURL\\(\\) Returns the URL for navigating directly to the application. Note: The application will load the form or app page defined in the \u201cHome Page\u201d field on the Settings tab. app.getChartsURL\\(formId, appUid\\) Returns the URL for navigating directly to the charts page of the form for the provided form uid and application uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getChartsURL(form.getId(), app.getUID()); app.getCurrentUser\\(\\) Returns the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. To populate the current user's login name into a field in the form, place the following statement in the onLoad event of the form: Note: The following code must be entered as a single line. //change F_SingleLine to the ID of the desired field BO.F_SingleLine.setValue(app.getCurrentUser()); app.getCurrentUserId\\(\\) Returns the user's \"identifier\" - the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. app.getCurrentUserEmail\\(\\) Returns the user's email. app.getCurrentUserDisplayName\\(\\) |Returns the user's full display name. Ex. \"Eduardo Ram\u00edrez L\u00f3pez\". app.getCurrentUserInfo\\(\\) Returns the object containing the attributes of the current user. For example: {id: \"pflorez123\", email: \"Pedro.Flores@example.com\", displayName: \"Pedro Flores\", userType: \"owner\"} Note: Not all attributes are available in all deployments. In that case, some of these values will be null. userType ** \u2013 possible values: \"owner\" \u2013 if current user is the app owner \"guest\" \u2013 if the current user is anonymous \"\" \\(empty string\\) \u2013 in all other cases app.getCurrentUserRoles Returns a comma-separated list of all the roles for which the current user is a member. For example: item.setValue(app.getCurrentUserRoles()); app.getFileBaseURL\\(\\) Returns the relative URL to the current browser page where all files that are uploaded into the application at design time are stored. This does not include images and CSS files. All files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/files/ app.getForm\\(formID\\) Returns the user interface form object for the provided formID. If used to return a form that is not shown or loaded, then the object that is returned is not fully operational and should be used for hooking up dynamic event handlers only. Register an event listener to a service in order to do something when it returns: var form = app.getForm('F_Form1'); var service = form.getServiceConfiguration('SC_ServiceConfig0'); service.connectEvent('onCallFinished', function(pSuccess) { alert('call finished'); }); app.getFormLaunchURL\\(formId, appUid\\) Returns the URL for navigating directly to the form for the provided application uid and form uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getFormLaunchURL(); var url = app.getFormLaunchURL(form.getId()); var url = app.getFormLaunchURL(form.getId(), app.getUID()); app.getImageBaseURL\\(\\) Returns the relative URL to the current browser page where all images that are uploaded into the application at design time are stored. All images are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/image/ app.getLocale\\(\\) Returns the current locale of the application, according to the application's settings or the current user's preferences. The returned value is a locale code, in accordance with [Tags for the Identification of Languages \\(RFC 3066\\)](https://www.ietf.org/rfc/rfc3066.txt). app.getLocation\\(callbackFunction, highAccuracy\\) Allows the form designer to get the current user's location. callbackFunction - the callback that occurs after the location request finishes. The designer must define the function to have one argument which will be assigned a Position object if the location request was successful, or null if the request was unsuccessful. Inside the function the designer can assign location attributes to different fields. Five values can be accessed: position.coords.latitude position.coords.longitude position.coords.accuracy position.coords.altitude position.coords.altitudeAccuracy More information in [https://developer.mozilla.org/en-US/docs/Web/API/Position/](https://developer.mozilla.org/en-US/docs/Web/API/Position/). highAccuracy - a boolean value that requests a high accuracy location from the browser if true. See [https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy). Set the value of F\\_SingleLine1 to the current location: ``` var highAccuracy = true; var myCallbackFunction = function (position) { if (position !== null) { BO.F_SingleLine1.setValue(position.coords.latitude+\", \"+position.coords.longitude); } else { alert(\"Location request failed\"); } }; app.getLocation(myCallbackFunction,highAccuracy); app.getProductBaseURL\\(\\) Returns the host and context of the Leap server. var url = app.getProductBaseURL(); app.getRecordURL\\(recordUid, formId, appUid\\) Returns the URL for navigating directly to the record. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId()); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId(), app.getUID()); |app.getSharedData\\(\\)|Returns a JavaScript\u2122 object that can be easily accessed from all custom JavaScript code on the form, and is the suggested location to share data, or create reusable functions.|Create some data and functions to be used later:``` app.getSharedData().titleToShow = 'Welcome Form'; app.getSharedData().addTwoValues = function(v1,v2) { return v1 + v2; }; Example of referencing the established variable and function:``` BO.F_SingleLine.setValue(app.getSharedData().titleToShow); BO.F_Number.setValue(app.getSharedData().addTwoValues(5, 5)); | |app.getStyleBaseURL\\(\\)|Returns the relative URL to the current browser page where all CSS style files that are uploaded into the application at design time are stored. All css files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/styles/| | |app.getSuppressWarning\\(\\)|Gets the current set value for suppressing the warning. See setSuppressWarning for information.|``` var suppressWarning = app.getSuppressWarning(); if(suppressWarning === false) app.setSuppressWarning(true); | |app.getUID\\(\\)|The UID of the application|Can be used to create a link to another form ``` page.F_StaticWebLink.setLinkValue(BO.F_ServerURL.getValue() + '/apps/secure/1/app/' + app.getUID() + '/launch/index.html?form=F_Form2')); | |app.getUrlParameter\\(parm\\)|Looks up a single parameter.|``` var param= app.getUrlParameter('debug') if(param === 'true') alert('Shown only when debug param is present'); | |app.getUrlParameters\\(\\)|Returns an object with all URL parameters.|``` var params = app.getUrlParameters(); if(params.CustomWarning) alert(params.CustomWarning); | |app.getViewDataURL\\(appUid\\)|Returns the URL for navigating directly to the View Data page. **Note:** The parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. |``` var url = app.getViewDataURL(); var url = app.getViewDataURL(app.getUID()); | |app.isCurrentUserInRole\\(roleName\\)|Returns true if the current user is a member of the provided role, otherwise false.**Note:** The function does not validate the role with the provided roleName, therefore if the role does not exist false is returned. |For example:``` item.setValue(app.isCurrentUserInRole(\"Manager\")); | |app.isSingleFormView\\(\\)|Returns true if the form is shown by itself in the browser and false if it is shown in view data.| | |app.openApp\\(appUid, newTab\\)|Opens the home page of an application. The current app is used if you do not supply an app id. If \u201cnewTab\u201d is \u201ctrue\u201d, the app is presented in a new browser tab. The default behavior is for the application to be opened in a new tab. |``` app.openApp(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); app.openApp (\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, true); app.openApp (app.getUID(), false); | |app.openAppPage\\(appPageId, appUid, newTab\\)|Opens the app page of an application that matches the provided *appPageid*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openAppPage(\u2018AP_Page1\u2019); app.openAppPage (\u2018AP_Page1\u2019, true); app.openAppPage (\u2018AP_Page1\u2019, false); | |app.openForm\\(formId, appUid, newTab\\)|Opens the form of an application that matches the provided *formId*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openForm(\u2018F_Form1\u2019); app.openForm(\u2018F_Form1\u2019, true); app.openForm (\u2018F_Form1\u2019, false); | |openRecord\\(recordUid, formId, appUid, newTab\\)|Opens the record of a form that matches the provided *recordId* and *formId*. **Note:** formId, appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, true); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, \u2018zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz\u2019, false); | |app.setSuppressWarning\\(pSuppress\\)|If a user interacts with a form, or JavaScript, they are prompted with a warning message whenever the current browser page tries to navigate to a different URL. This function allows the suppression of that warning. When set to true the message is suppressed until it is set to false again|Can be used at any scope, for example in the application onStart, form onLoad, onItemChange, etc.``` app.setSuppressWarning(true); | |app.showMessage\\(title, message, type, subtitle\\) |Allow usage of a built-in dialog for end-user messages. title: The title to display in the dialog title bar. message: The message text to display. type \\(optional\\): can be one of \"info\", \"success\", \"warn\", or \"error\" and results in appropriate icon being displayed. If type is absent or not one of these values, then no icon will be displayed. subtitle \\(optional\\): Heading text for the message. |``` app.showMessage (\"Error found in data\", \"The booking date cannot be after the event.\", \"error\", \"Please change the booking or event date, then re-submit.\"); ``` | **Parent topic: **[Interface objects](ref_jsapi_user_interface_objects.md)","title":"Application objects"},{"location":"ref_application_object.html#application-objects","text":"Table 1. Application Object (app) The Leap application object provides access to information relevant to the whole application. Object Description Example app.getAppPage\\(appPageId\\) Returns the user interface app page object for the provided var myAppPage = app.getAppPage(\u201cAP_Welcome\u201d); app.getAppPageURL(appPageId, appUid) Returns the URL for navigating directly to the app page for the provided app page id and application uid. Note: The appUid parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. app.getAppURL\\(\\) Returns the URL for navigating directly to the application. Note: The application will load the form or app page defined in the \u201cHome Page\u201d field on the Settings tab. app.getChartsURL\\(formId, appUid\\) Returns the URL for navigating directly to the charts page of the form for the provided form uid and application uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getChartsURL(form.getId(), app.getUID()); app.getCurrentUser\\(\\) Returns the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. To populate the current user's login name into a field in the form, place the following statement in the onLoad event of the form: Note: The following code must be entered as a single line. //change F_SingleLine to the ID of the desired field BO.F_SingleLine.setValue(app.getCurrentUser()); app.getCurrentUserId\\(\\) Returns the user's \"identifier\" - the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. app.getCurrentUserEmail\\(\\) Returns the user's email. app.getCurrentUserDisplayName\\(\\) |Returns the user's full display name. Ex. \"Eduardo Ram\u00edrez L\u00f3pez\". app.getCurrentUserInfo\\(\\) Returns the object containing the attributes of the current user. For example: {id: \"pflorez123\", email: \"Pedro.Flores@example.com\", displayName: \"Pedro Flores\", userType: \"owner\"} Note: Not all attributes are available in all deployments. In that case, some of these values will be null. userType ** \u2013 possible values: \"owner\" \u2013 if current user is the app owner \"guest\" \u2013 if the current user is anonymous \"\" \\(empty string\\) \u2013 in all other cases app.getCurrentUserRoles Returns a comma-separated list of all the roles for which the current user is a member. For example: item.setValue(app.getCurrentUserRoles()); app.getFileBaseURL\\(\\) Returns the relative URL to the current browser page where all files that are uploaded into the application at design time are stored. This does not include images and CSS files. All files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/files/ app.getForm\\(formID\\) Returns the user interface form object for the provided formID. If used to return a form that is not shown or loaded, then the object that is returned is not fully operational and should be used for hooking up dynamic event handlers only. Register an event listener to a service in order to do something when it returns: var form = app.getForm('F_Form1'); var service = form.getServiceConfiguration('SC_ServiceConfig0'); service.connectEvent('onCallFinished', function(pSuccess) { alert('call finished'); }); app.getFormLaunchURL\\(formId, appUid\\) Returns the URL for navigating directly to the form for the provided application uid and form uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getFormLaunchURL(); var url = app.getFormLaunchURL(form.getId()); var url = app.getFormLaunchURL(form.getId(), app.getUID()); app.getImageBaseURL\\(\\) Returns the relative URL to the current browser page where all images that are uploaded into the application at design time are stored. All images are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/image/ app.getLocale\\(\\) Returns the current locale of the application, according to the application's settings or the current user's preferences. The returned value is a locale code, in accordance with [Tags for the Identification of Languages \\(RFC 3066\\)](https://www.ietf.org/rfc/rfc3066.txt). app.getLocation\\(callbackFunction, highAccuracy\\) Allows the form designer to get the current user's location. callbackFunction - the callback that occurs after the location request finishes. The designer must define the function to have one argument which will be assigned a Position object if the location request was successful, or null if the request was unsuccessful. Inside the function the designer can assign location attributes to different fields. Five values can be accessed: position.coords.latitude position.coords.longitude position.coords.accuracy position.coords.altitude position.coords.altitudeAccuracy More information in [https://developer.mozilla.org/en-US/docs/Web/API/Position/](https://developer.mozilla.org/en-US/docs/Web/API/Position/). highAccuracy - a boolean value that requests a high accuracy location from the browser if true. See [https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy). Set the value of F\\_SingleLine1 to the current location: ``` var highAccuracy = true; var myCallbackFunction = function (position) { if (position !== null) { BO.F_SingleLine1.setValue(position.coords.latitude+\", \"+position.coords.longitude); } else { alert(\"Location request failed\"); } }; app.getLocation(myCallbackFunction,highAccuracy); app.getProductBaseURL\\(\\) Returns the host and context of the Leap server. var url = app.getProductBaseURL(); app.getRecordURL\\(recordUid, formId, appUid\\) Returns the URL for navigating directly to the record. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId()); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId(), app.getUID()); |app.getSharedData\\(\\)|Returns a JavaScript\u2122 object that can be easily accessed from all custom JavaScript code on the form, and is the suggested location to share data, or create reusable functions.|Create some data and functions to be used later:``` app.getSharedData().titleToShow = 'Welcome Form'; app.getSharedData().addTwoValues = function(v1,v2) { return v1 + v2; }; Example of referencing the established variable and function:``` BO.F_SingleLine.setValue(app.getSharedData().titleToShow); BO.F_Number.setValue(app.getSharedData().addTwoValues(5, 5)); | |app.getStyleBaseURL\\(\\)|Returns the relative URL to the current browser page where all CSS style files that are uploaded into the application at design time are stored. All css files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/styles/| | |app.getSuppressWarning\\(\\)|Gets the current set value for suppressing the warning. See setSuppressWarning for information.|``` var suppressWarning = app.getSuppressWarning(); if(suppressWarning === false) app.setSuppressWarning(true); | |app.getUID\\(\\)|The UID of the application|Can be used to create a link to another form ``` page.F_StaticWebLink.setLinkValue(BO.F_ServerURL.getValue() + '/apps/secure/1/app/' + app.getUID() + '/launch/index.html?form=F_Form2')); | |app.getUrlParameter\\(parm\\)|Looks up a single parameter.|``` var param= app.getUrlParameter('debug') if(param === 'true') alert('Shown only when debug param is present'); | |app.getUrlParameters\\(\\)|Returns an object with all URL parameters.|``` var params = app.getUrlParameters(); if(params.CustomWarning) alert(params.CustomWarning); | |app.getViewDataURL\\(appUid\\)|Returns the URL for navigating directly to the View Data page. **Note:** The parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. |``` var url = app.getViewDataURL(); var url = app.getViewDataURL(app.getUID()); | |app.isCurrentUserInRole\\(roleName\\)|Returns true if the current user is a member of the provided role, otherwise false.**Note:** The function does not validate the role with the provided roleName, therefore if the role does not exist false is returned. |For example:``` item.setValue(app.isCurrentUserInRole(\"Manager\")); | |app.isSingleFormView\\(\\)|Returns true if the form is shown by itself in the browser and false if it is shown in view data.| | |app.openApp\\(appUid, newTab\\)|Opens the home page of an application. The current app is used if you do not supply an app id. If \u201cnewTab\u201d is \u201ctrue\u201d, the app is presented in a new browser tab. The default behavior is for the application to be opened in a new tab. |``` app.openApp(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); app.openApp (\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, true); app.openApp (app.getUID(), false); | |app.openAppPage\\(appPageId, appUid, newTab\\)|Opens the app page of an application that matches the provided *appPageid*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openAppPage(\u2018AP_Page1\u2019); app.openAppPage (\u2018AP_Page1\u2019, true); app.openAppPage (\u2018AP_Page1\u2019, false); | |app.openForm\\(formId, appUid, newTab\\)|Opens the form of an application that matches the provided *formId*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openForm(\u2018F_Form1\u2019); app.openForm(\u2018F_Form1\u2019, true); app.openForm (\u2018F_Form1\u2019, false); | |openRecord\\(recordUid, formId, appUid, newTab\\)|Opens the record of a form that matches the provided *recordId* and *formId*. **Note:** formId, appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, true); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, \u2018zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz\u2019, false); | |app.setSuppressWarning\\(pSuppress\\)|If a user interacts with a form, or JavaScript, they are prompted with a warning message whenever the current browser page tries to navigate to a different URL. This function allows the suppression of that warning. When set to true the message is suppressed until it is set to false again|Can be used at any scope, for example in the application onStart, form onLoad, onItemChange, etc.``` app.setSuppressWarning(true); | |app.showMessage\\(title, message, type, subtitle\\) |Allow usage of a built-in dialog for end-user messages. title: The title to display in the dialog title bar. message: The message text to display. type \\(optional\\): can be one of \"info\", \"success\", \"warn\", or \"error\" and results in appropriate icon being displayed. If type is absent or not one of these values, then no icon will be displayed. subtitle \\(optional\\): Heading text for the message. |``` app.showMessage (\"Error found in data\", \"The booking date cannot be after the event.\", \"error\", \"Please change the booking or event date, then re-submit.\"); ``` | **Parent topic: **[Interface objects](ref_jsapi_user_interface_objects.md)","title":"Application objects"},{"location":"ref_customized_css.html","text":"Creating customized Cascading Style Sheets You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Elements are assigned specific class names, prefaced by lf in the custom theme. The following code is an example of a Leap custom theme. /* Form - centered with a drop shadow*/ .lfMn .lfAppFormArea .lfFormBox { -moz-box-shadow: 5px 5px 12px #AEA4A4; -webkit-box-shadow: 5px 5px 12px #AEA4A4; box-shadow: 5px 5px 12px #AEA4A4; margin-right: auto; margin-left: auto; } /* Text (item titles) - medium blue */ .lfMn .lfFormLabel { color: #094291 !important; } /* Section - title bar red background and white text */ .lfMn .lfFormFieldSectionTitle { background: #cd111f !important; color: white !important; font-size: 13px !important; font-weight: bold !important; } .lfMn .lfFormFieldSectionTitle .lfFormLabel { color: white !important; } /* Tabs - dark-blue background with white text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTab { background:#1556a8; border-top-color:#666; border-right-color:#666; border-left-color:#666; } .lfMn .lfFormFieldTabFolder .lfFormFieldTab * { color: white; } /* Tabs (selected) - white background with black text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedHover, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedError { background: white; border-top-color:#ccc; border-right-color:#ccc; border-left-color:#ccc; } .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked * { color: #222 !important; } /* Button (Submit) - light blue background */ .lfMn .lfFormBtn.lfFormActionSubmitBtn { font-size: 12px; background: #93bef3; border: 1px solid #222; font-weight: bold; } .lfMn .lfFormBtn.lfFormActionSubmitBtn * { font-weight: bold; } /* Button (Page Navigation) - dark blue background with white text*/ .lfMn .lfPageNavigation .lfFormBtn { background: #1556a8 !important; border: 1px solid #222; } .lfMn .lfPageNavigation .lfFormBtn *, .lfMn .lfPageNavigation .lfFormBtn * { color: white !important; font-weight: bold; } Class Names View Data layout Class names for the View Data layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfAppOverviewArea .lfBanner .lfFormTitleBar .lfMn.lfAppArea The following graphic shows where the class names for various parts of the View Data section are located. Single form launch layout Class names for the Single form launch layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfBanner .lfFormBody .lfFormBox .lfFormFooter .lfFormTitleBar .lfMn.lfSingleFormArea The following graphic shows where the class names for various parts of the Single form launch layout are located. Form items - general General class names are: .lfFormField .lfFormFieldError .lfFormFieldHint .lfFormFieldRequiredMarker .lfFormLabel The following graphic shows where the class names for general form items are located. In addition to the general lfFormField class, each form item has a unique class name: Attachment \u2013 lfFormFieldAttachment Button \u2013 lfFormFieldButton Check box \u2013 lfFormFieldCheckBox Choice Slider - lfFormFieldChoiceSlider Currency \u2013 lfFormFieldCurrency Date \u2013 lfFormFieldDate Drop-down \u2013 lfFormFieldDropDown Email \u2013 lfFormFieldEmail HTML fragment \u2013 lfFormFieldHTML Image \u2013 lfFormFieldImage Line \u2013 lfFormFieldHorizontalLine Media \u2013 lfFormFieldMedia Multi-line entry \u2013 lfFormFieldParagraph Number \u2013 lfFormFieldNumber Numeric Slider - lfFormFieldHorizontalSlider Page navigator \u2013 lfFormFieldPageNavigator Password \u2013 lfFormFieldPassword Text \u2013 lfFormFieldRichText Section \u2013 lfFormFieldSection Select many \u2013 lfFormFieldSelectMany Select one \u2013 lfFormFieldSelectOne Single-line entry \u2013 lfFormFieldSingleLine Survey \u2013 lfFormFieldSurvey Tabbed folder \u2013 lfFormFieldTabFolder Table \u2013 lfFormFieldTable Time \u2013 lfFormFieldTime Time stamp \u2013 lfFormFieldTimestamp Web link \u2013 lfFormFieldStaticWeblink Website \u2013 lfFormFieldWebSiteAddress Required form items also have an extra lfFormFieldRequired class. The lfFormFieldInvalid class is added to form items that are invalid. Section Class names for Section are: .lfFormFieldSection .lfFormFieldSectionBody .lfFormFieldSectionTitle The following graphic shows where the class names used in creating a Section are located. Survey Class names for Survey are: .lfFormFieldSurvey .lfFormFieldSurveyQuestion .lfFormFieldSurveyQuestionText .lfFormFieldSurveyTable .lfFormFieldSurveyTitle .lfFormRequired The following graphic shows where the class names used in creating a Survey are located. Tabbed Folder Class names for Tabbed Folder are: .lfFormFieldTab .lfFormFieldTabChecked .lfFormFieldTabContent .lfFormFieldTabFolder The following graphic shows where the class names used in creating a Tabbed Folder are located. Buttons Class names for Buttons are: .lfFormBtn .lfFormActionBtn .lfFormActionCancelBtn .lfFormActionSubmitBtn .lfFormBackBtn .lfFormFieldButton .lfFormNextBtn .lfPageNavigation The following graphic shows where the class names for creating buttons on a form are located. Dialogs Class names for Dialogs are: .lfDialog .lfDialogContent .lfDialogFooter .lfDialogTitle The following graphic shows where the class names for creating dialog windows are located. Usage details Your custom CSS is the last style sheet that is applied in an application. However, you must ensure that your CSS rules are more specific (higher weighted) than the ones already specified in the base CSS rules. In some cases, you must append the !important declaration to your rules to override the Leap base rules. For example, to change the font color of all item titles use .lfMn .lfFormLabel {color: #094291 !important}. In some cases you must add the universal, \u201c*\u201d, selector to your rules. For example, to change the font color of all buttons use .lfMn .lfFormBtn * {color: white} To reference image files that are contained within the same application, use a relative URL of ../image/.... For example, to reference the image named background.jpg contained within your application, use url('../image/background.jpg'). For more information about referencing image files within an application, see Managing the files associated with your application Note: Pop-up menus and dialogs are direct childs of the main body, even when they appear to be otherwise. These child menus and dialogs must be styled to match the main body. Best Practices There are no technical limitations to the CSS rules that can be applied to a form; however there are the following best practices: All CSS rules must begin with the .lfMn class selector. This is important for forms that might be shown within the context of another web page, such as in the IBM\u00ae WebSphere\u00ae Portal environment. Base your CSS rules around class names that are prefixed with \u201clf\u201d. For example: lfFormFieldSingleLine. These class names that are likely to remain consistent between Leap releases. Your custom styles are not restricted, so you must be specific with your selectors. Selectors that are too broad affect all aspects of theLeap interface, including all dialogs and all elements within the View Data interface. Your CSS must target the browsers that are supported by Leap. If possible, avoid CSS rules that affect the size and positioning of elements. You might want to specify some custom padding and margins, but it is your responsibility to ensure that no erroneous cropping or extra scroll-bars are displayed. We recommend that you limit your theme to the following properties: background color background image \u2013 typically for background gradients color font font size border \u2013 typically none or one pixel width Styling individual form items Each item on the form is assigned a unique class name. The syntax for this class name is
--. For example, a class name of F_Form1-P_Page1-F_EmailAddress is applied to the item with an ID of F_EmailAddress , on the page with an ID of P_Page1 , on the form with an ID of F_Form1 . You can use these unique class names to style specific items in your application. Note: It is possible that two separate applications each have an item with the same unique class name. Using custom CSS class names You can assign a custom CSS class name to any form, page, item, or stage action button in your application. You can then use the custom CSS class names in your custom theme. Setting custom CSS class names is done in the Properties side panel. Specify the custom class names, which are separated by spaces, in the Custom CSS class names field. Custom class names can also be added to, or removed from, items dynamically with the JavaScript\u2122 API. Testing your custom CSS changes Use a CSS development tool to test your custom CSS changes. Most web browsers contain such a tool, which you can use to discover the wanted styling class. You can even make CSS rule modifications online, so you immediately see how a change affects the form visually. After the rules are determined, copy them to your custom CSS file for uploading into your Leap application. If you do not have access to a CSS development tool, an alternative approach is to place the CSS file on a web server. Reference the web location when you add the CSS file to your Leap application. You can modify the CSS file on the web server, then refresh the Leap application to pick up the changes. This approach quickly tests style changes without requiring you to repeatedly upload a new CSS file into your application, save the application, and then redeploy. Parent topic: Reference","title":"Creating customized Cascading Style Sheets"},{"location":"ref_customized_css.html#customizedcascadingstylesheets","text":"You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Elements are assigned specific class names, prefaced by lf in the custom theme. The following code is an example of a Leap custom theme. /* Form - centered with a drop shadow*/ .lfMn .lfAppFormArea .lfFormBox { -moz-box-shadow: 5px 5px 12px #AEA4A4; -webkit-box-shadow: 5px 5px 12px #AEA4A4; box-shadow: 5px 5px 12px #AEA4A4; margin-right: auto; margin-left: auto; } /* Text (item titles) - medium blue */ .lfMn .lfFormLabel { color: #094291 !important; } /* Section - title bar red background and white text */ .lfMn .lfFormFieldSectionTitle { background: #cd111f !important; color: white !important; font-size: 13px !important; font-weight: bold !important; } .lfMn .lfFormFieldSectionTitle .lfFormLabel { color: white !important; } /* Tabs - dark-blue background with white text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTab { background:#1556a8; border-top-color:#666; border-right-color:#666; border-left-color:#666; } .lfMn .lfFormFieldTabFolder .lfFormFieldTab * { color: white; } /* Tabs (selected) - white background with black text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedHover, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedError { background: white; border-top-color:#ccc; border-right-color:#ccc; border-left-color:#ccc; } .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked * { color: #222 !important; } /* Button (Submit) - light blue background */ .lfMn .lfFormBtn.lfFormActionSubmitBtn { font-size: 12px; background: #93bef3; border: 1px solid #222; font-weight: bold; } .lfMn .lfFormBtn.lfFormActionSubmitBtn * { font-weight: bold; } /* Button (Page Navigation) - dark blue background with white text*/ .lfMn .lfPageNavigation .lfFormBtn { background: #1556a8 !important; border: 1px solid #222; } .lfMn .lfPageNavigation .lfFormBtn *, .lfMn .lfPageNavigation .lfFormBtn * { color: white !important; font-weight: bold; }","title":"Creating customized Cascading Style Sheets"},{"location":"ref_customized_css.html#class-names","text":"View Data layout Class names for the View Data layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfAppOverviewArea .lfBanner .lfFormTitleBar .lfMn.lfAppArea The following graphic shows where the class names for various parts of the View Data section are located. Single form launch layout Class names for the Single form launch layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfBanner .lfFormBody .lfFormBox .lfFormFooter .lfFormTitleBar .lfMn.lfSingleFormArea The following graphic shows where the class names for various parts of the Single form launch layout are located. Form items - general General class names are: .lfFormField .lfFormFieldError .lfFormFieldHint .lfFormFieldRequiredMarker .lfFormLabel The following graphic shows where the class names for general form items are located. In addition to the general lfFormField class, each form item has a unique class name: Attachment \u2013 lfFormFieldAttachment Button \u2013 lfFormFieldButton Check box \u2013 lfFormFieldCheckBox Choice Slider - lfFormFieldChoiceSlider Currency \u2013 lfFormFieldCurrency Date \u2013 lfFormFieldDate Drop-down \u2013 lfFormFieldDropDown Email \u2013 lfFormFieldEmail HTML fragment \u2013 lfFormFieldHTML Image \u2013 lfFormFieldImage Line \u2013 lfFormFieldHorizontalLine Media \u2013 lfFormFieldMedia Multi-line entry \u2013 lfFormFieldParagraph Number \u2013 lfFormFieldNumber Numeric Slider - lfFormFieldHorizontalSlider Page navigator \u2013 lfFormFieldPageNavigator Password \u2013 lfFormFieldPassword Text \u2013 lfFormFieldRichText Section \u2013 lfFormFieldSection Select many \u2013 lfFormFieldSelectMany Select one \u2013 lfFormFieldSelectOne Single-line entry \u2013 lfFormFieldSingleLine Survey \u2013 lfFormFieldSurvey Tabbed folder \u2013 lfFormFieldTabFolder Table \u2013 lfFormFieldTable Time \u2013 lfFormFieldTime Time stamp \u2013 lfFormFieldTimestamp Web link \u2013 lfFormFieldStaticWeblink Website \u2013 lfFormFieldWebSiteAddress Required form items also have an extra lfFormFieldRequired class. The lfFormFieldInvalid class is added to form items that are invalid. Section Class names for Section are: .lfFormFieldSection .lfFormFieldSectionBody .lfFormFieldSectionTitle The following graphic shows where the class names used in creating a Section are located. Survey Class names for Survey are: .lfFormFieldSurvey .lfFormFieldSurveyQuestion .lfFormFieldSurveyQuestionText .lfFormFieldSurveyTable .lfFormFieldSurveyTitle .lfFormRequired The following graphic shows where the class names used in creating a Survey are located. Tabbed Folder Class names for Tabbed Folder are: .lfFormFieldTab .lfFormFieldTabChecked .lfFormFieldTabContent .lfFormFieldTabFolder The following graphic shows where the class names used in creating a Tabbed Folder are located. Buttons Class names for Buttons are: .lfFormBtn .lfFormActionBtn .lfFormActionCancelBtn .lfFormActionSubmitBtn .lfFormBackBtn .lfFormFieldButton .lfFormNextBtn .lfPageNavigation The following graphic shows where the class names for creating buttons on a form are located. Dialogs Class names for Dialogs are: .lfDialog .lfDialogContent .lfDialogFooter .lfDialogTitle The following graphic shows where the class names for creating dialog windows are located.","title":"Class Names"},{"location":"ref_customized_css.html#usage-details","text":"Your custom CSS is the last style sheet that is applied in an application. However, you must ensure that your CSS rules are more specific (higher weighted) than the ones already specified in the base CSS rules. In some cases, you must append the !important declaration to your rules to override the Leap base rules. For example, to change the font color of all item titles use .lfMn .lfFormLabel {color: #094291 !important}. In some cases you must add the universal, \u201c*\u201d, selector to your rules. For example, to change the font color of all buttons use .lfMn .lfFormBtn * {color: white} To reference image files that are contained within the same application, use a relative URL of ../image/.... For example, to reference the image named background.jpg contained within your application, use url('../image/background.jpg'). For more information about referencing image files within an application, see Managing the files associated with your application Note: Pop-up menus and dialogs are direct childs of the main body, even when they appear to be otherwise. These child menus and dialogs must be styled to match the main body.","title":"Usage details"},{"location":"ref_customized_css.html#best-practices","text":"There are no technical limitations to the CSS rules that can be applied to a form; however there are the following best practices: All CSS rules must begin with the .lfMn class selector. This is important for forms that might be shown within the context of another web page, such as in the IBM\u00ae WebSphere\u00ae Portal environment. Base your CSS rules around class names that are prefixed with \u201clf\u201d. For example: lfFormFieldSingleLine. These class names that are likely to remain consistent between Leap releases. Your custom styles are not restricted, so you must be specific with your selectors. Selectors that are too broad affect all aspects of theLeap interface, including all dialogs and all elements within the View Data interface. Your CSS must target the browsers that are supported by Leap. If possible, avoid CSS rules that affect the size and positioning of elements. You might want to specify some custom padding and margins, but it is your responsibility to ensure that no erroneous cropping or extra scroll-bars are displayed. We recommend that you limit your theme to the following properties: background color background image \u2013 typically for background gradients color font font size border \u2013 typically none or one pixel width","title":"Best Practices"},{"location":"ref_customized_css.html#styling-individual-form-items","text":"Each item on the form is assigned a unique class name. The syntax for this class name is --. For example, a class name of F_Form1-P_Page1-F_EmailAddress is applied to the item with an ID of F_EmailAddress , on the page with an ID of P_Page1 , on the form with an ID of F_Form1 . You can use these unique class names to style specific items in your application. Note: It is possible that two separate applications each have an item with the same unique class name.","title":"Styling individual form items"},{"location":"ref_customized_css.html#using-custom-css-class-names","text":"You can assign a custom CSS class name to any form, page, item, or stage action button in your application. You can then use the custom CSS class names in your custom theme. Setting custom CSS class names is done in the Properties side panel. Specify the custom class names, which are separated by spaces, in the Custom CSS class names field. Custom class names can also be added to, or removed from, items dynamically with the JavaScript\u2122 API.","title":"Using custom CSS class names"},{"location":"ref_customized_css.html#testing-your-custom-css-changes","text":"Use a CSS development tool to test your custom CSS changes. Most web browsers contain such a tool, which you can use to discover the wanted styling class. You can even make CSS rule modifications online, so you immediately see how a change affects the form visually. After the rules are determined, copy them to your custom CSS file for uploading into your Leap application. If you do not have access to a CSS development tool, an alternative approach is to place the CSS file on a web server. Reference the web location when you add the CSS file to your Leap application. You can modify the CSS file on the web server, then refresh the Leap application to pick up the changes. This approach quickly tests style changes without requiring you to repeatedly upload a new CSS file into your application, save the application, and then redeploy. Parent topic: Reference","title":"Testing your custom CSS changes"},{"location":"ref_data_access_rest_api.html","text":"Data access REST API The data access REST API exposes operations on application submitted data, also known as records. The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis and reports. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. All examples in this documentation use the program curl, which is available on most Linux\u2122 systems, and can be downloaded for Windows\u2122. However, you can use any tool or library for calling the REST API. For example, the Poster add-on for FireFox is useful for experimenting with the REST API. To get the Swagger definition for the entire Data Access REST API, use /apps-basic/anon|secure/org/data/swagger.json. To get the Swagger definition for a given application and form, use /apps-basic/anon|secure/org/data/{app_uid}/{form_id}/swagger.json. URL HTTP Verb Header Action Name /apps-basic/secure|anon/org/data/{app-uid}/{form-id} GET List /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid} GET Retrieve /apps-basic/secure|anon/org/data/{app-uid}/{form-id}?freedomIdentifyKey={x} POST Create /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} PUT Update /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} DELETE Delete /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/metadata GET Metadata /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/{attachment-uid} GET Retrieve Attachment /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/ POST Create Attachment app-uid : is the UID of the application form-id : is the ID of the form record-uid : is the UID of the record attachment-uid : is the UID of the attachment x : is a randomly generated, difficult to guess single-use numerical value The context for the REST API (/apps-basic/) is different from accessing Leap in the browser (/apps/). The /apps-basic/ context uses basic authentication rather than form-based authentication. The credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Each form and stage can have different permissions set for each REST API action. Use /anon if your applications allow anonymous access. All dates, times, and timestamps must be listed in ISO 8601 format. List This action retrieves a list of records. Retrieve This action retrieves a single record. Create This action creates new records. Update This action updates an existing record. Delete This action deletes an existing record. Metadata This JSON-only action retrieves a description of the items in your form. Retrieve Attachment This action retrieves a single attachment. Create Attachment This action creates a single attachment. Parent topic: REST API reference","title":"Data access REST API"},{"location":"ref_data_access_rest_api.html#ref_rest_public_REST_API","text":"The data access REST API exposes operations on application submitted data, also known as records. The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis and reports. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. All examples in this documentation use the program curl, which is available on most Linux\u2122 systems, and can be downloaded for Windows\u2122. However, you can use any tool or library for calling the REST API. For example, the Poster add-on for FireFox is useful for experimenting with the REST API. To get the Swagger definition for the entire Data Access REST API, use /apps-basic/anon|secure/org/data/swagger.json. To get the Swagger definition for a given application and form, use /apps-basic/anon|secure/org/data/{app_uid}/{form_id}/swagger.json. URL HTTP Verb Header Action Name /apps-basic/secure|anon/org/data/{app-uid}/{form-id} GET List /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid} GET Retrieve /apps-basic/secure|anon/org/data/{app-uid}/{form-id}?freedomIdentifyKey={x} POST Create /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} PUT Update /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} DELETE Delete /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/metadata GET Metadata /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/{attachment-uid} GET Retrieve Attachment /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/ POST Create Attachment app-uid : is the UID of the application form-id : is the ID of the form record-uid : is the UID of the record attachment-uid : is the UID of the attachment x : is a randomly generated, difficult to guess single-use numerical value The context for the REST API (/apps-basic/) is different from accessing Leap in the browser (/apps/). The /apps-basic/ context uses basic authentication rather than form-based authentication. The credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Each form and stage can have different permissions set for each REST API action. Use /anon if your applications allow anonymous access. All dates, times, and timestamps must be listed in ISO 8601 format. List This action retrieves a list of records. Retrieve This action retrieves a single record. Create This action creates new records. Update This action updates an existing record. Delete This action deletes an existing record. Metadata This JSON-only action retrieves a description of the items in your form. Retrieve Attachment This action retrieves a single attachment. Create Attachment This action creates a single attachment. Parent topic: REST API reference","title":"Data access REST API"},{"location":"ref_data_rest_api_create.html","text":"Create This action creates new records. Note: The curl command must be entered as a single line. curl --user : --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @post.xml \"http://:/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 ?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted: ATOM Feed: application/atom+xml JSON: application/json Accept Indicates the type of accepted response. ATOM Feed: application/atom+xml JSON: application/json --data-binary Provides the actual data that is POSTed to the URL. In this case, it is a file on the local system, post.xml, that contains the data to send. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. ATOM Feed One type of data to POST when doing a creation is a full ATOM Feed. The data starts with a element and contains one or more elements. Each element represents a single record to add to the application. F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 ... ... It is also possible to POST a single stand alone element such as: {#codeblock_yyr_v3l_nzb} F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 The ID of the form to which this record is being submitted. <updated> Mandatory, but its value is replaced with a new timestamp by the server. A value of 1970-01-01T00:00:00Z can always be used. <content> Contains the submitted data. The structure of the data within the element is different for each application, and is based on the list of form items that were used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data. The root element of the submitted data, which in this example is the <F_Form1> element, must be in the null namespace, which is xmlns=\"\" The root element must have the pressedButton and flowState attributes. The flowState is the ID of the current stage of the record. For all Create REST calls, this is always ST_Start , which is the ID of the Start stage. The pressedButton indicates the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. Upon creation, the new record is assigned a generated unique record UID. This UID can be found in the response data, which is similar to the data returned from a Retrieve action. Response data is only returned when a stand alone is POSTed rather than multiple entries in a . JSON You can also POST a JSON payload, for example: { \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"pressedButton\" : \"S_Submit\", \"flowState\": \"ST_Start\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 } Note: The uid is optional. If supplied, it must be unique and use the format displayed in the JSON example. If not supplied, a unique uid is generated. Parent topic: Data access REST API","title":"Create"},{"location":"ref_data_rest_api_create.html#create","text":"This action creates new records. Note: The curl command must be entered as a single line. curl --user <loginId>:<passwd> --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @post.xml \"http://<host>:<port>/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 ?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted: ATOM Feed: application/atom+xml JSON: application/json Accept Indicates the type of accepted response. ATOM Feed: application/atom+xml JSON: application/json --data-binary Provides the actual data that is POSTed to the URL. In this case, it is a file on the local system, post.xml, that contains the data to send. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities.","title":"Create"},{"location":"ref_data_rest_api_create.html#section_ng4_v3l_nzb","text":"One type of data to POST when doing a creation is a full ATOM Feed. The data starts with a element and contains one or more elements. Each element represents a single record to add to the application. <feed xmlns=\"http://www.w3.org/2005/Atom\"> <entry> <title type=\"text\">F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 ... ... It is also possible to POST a single stand alone element such as: {#codeblock_yyr_v3l_nzb} F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 ","title":"ATOM Feed"},{"location":"ref_data_rest_api_create.html#title","text":"The ID of the form to which this record is being submitted.","title":"<title>"},{"location":"ref_data_rest_api_create.html#updated","text":"Mandatory, but its value is replaced with a new timestamp by the server. A value of 1970-01-01T00:00:00Z can always be used.","title":"<updated>"},{"location":"ref_data_rest_api_create.html#content","text":"Contains the submitted data. The structure of the data within the element is different for each application, and is based on the list of form items that were used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data.","title":"<content>"},{"location":"ref_data_rest_api_create.html#the-root-element-of-the-submitted-data-which-in-this-example-is-the-f_form1-element-must-be-in-the-null-namespace-which-is-xmlns","text":"The root element must have the pressedButton and flowState attributes. The flowState is the ID of the current stage of the record. For all Create REST calls, this is always ST_Start , which is the ID of the Start stage. The pressedButton indicates the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. Upon creation, the new record is assigned a generated unique record UID. This UID can be found in the response data, which is similar to the data returned from a Retrieve action. Response data is only returned when a stand alone is POSTed rather than multiple entries in a .","title":"The root element of the submitted data, which in this example is the <F_Form1> element, must be in the null namespace, which is xmlns=\"\""},{"location":"ref_data_rest_api_create.html#section_y4x_w3l_nzb","text":"You can also POST a JSON payload, for example: { \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"pressedButton\" : \"S_Submit\", \"flowState\": \"ST_Start\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 } Note: The uid is optional. If supplied, it must be unique and use the format displayed in the JSON example. If not supplied, a unique uid is generated. Parent topic: Data access REST API","title":"JSON"},{"location":"ref_data_rest_api_create_attachment.html","text":"Create Attachment This action creates a single attachment. curl --user : -F filename=@c:\\new file.doc --header \"Accept:application/json\" \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/\" Accept Indicates the type of accepted response. ATOM: application/atom+xml JSON: application/json The attachment that is created must be uploaded to the server as multipart/form-data in the body of a POST. The response from this call contains the UID, ID, and filename of the newly created attachment. For example: {\"id\" : 178, \"fileName\" : \"new file.doc\", \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } The UID value that is returned here can be later used with the Retrieve Attachment REST operation. For the attachment to be associated with a form record, a form record must be created or updated that refers to that attachment. Use the Data access REST API , passing the UID, ID, and filename of the attachment. Example JSON payload: { \"pressedButton\":\"S_Submit\", \"F_SingleLine1\" : \"22\", \"F_Number2\" : 1, \"F_Number3\" : 2, \"F_Number4\" : 3, \"F_Attachment1\" : { \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\", \"fileName\" : \"new file.doc\", \"id\" : 178 } } If an attachment is not associated with a form record within a certain time period (48 hours by default), the attachment is deleted automatically. Deleting the record that is associated with an attachment also deletes the attachment. Parent topic: Data access REST API","title":"Create Attachment"},{"location":"ref_data_rest_api_create_attachment.html#create-attachment","text":"This action creates a single attachment. curl --user : -F filename=@c:\\new file.doc --header \"Accept:application/json\" \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/\" Accept Indicates the type of accepted response. ATOM: application/atom+xml JSON: application/json The attachment that is created must be uploaded to the server as multipart/form-data in the body of a POST. The response from this call contains the UID, ID, and filename of the newly created attachment. For example: {\"id\" : 178, \"fileName\" : \"new file.doc\", \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } The UID value that is returned here can be later used with the Retrieve Attachment REST operation. For the attachment to be associated with a form record, a form record must be created or updated that refers to that attachment. Use the Data access REST API , passing the UID, ID, and filename of the attachment. Example JSON payload: { \"pressedButton\":\"S_Submit\", \"F_SingleLine1\" : \"22\", \"F_Number2\" : 1, \"F_Number3\" : 2, \"F_Number4\" : 3, \"F_Attachment1\" : { \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\", \"fileName\" : \"new file.doc\", \"id\" : 178 } } If an attachment is not associated with a form record within a certain time period (48 hours by default), the attachment is deleted automatically. Deleting the record that is associated with an attachment also deletes the attachment. Parent topic: Data access REST API","title":"Create Attachment"},{"location":"ref_data_rest_api_delete.html","text":"Delete This action deletes an existing record. Note: The curl command must be entered as a single line. curl --user : --request DELETE http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=1 --header \"Cookie: freedomIdentifyKey=1\" --request DELETE Specifies the correct HTTP method verb for this action. --header \"Cookie: freedomIdentifyKey=1\" Includes a required cookie as part of the request. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter value avoids XSS vulnerabilities. Parent topic: Data access REST API","title":"Delete"},{"location":"ref_data_rest_api_delete.html#delete","text":"This action deletes an existing record. Note: The curl command must be entered as a single line. curl --user : --request DELETE http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=1 --header \"Cookie: freedomIdentifyKey=1\" --request DELETE Specifies the correct HTTP method verb for this action. --header \"Cookie: freedomIdentifyKey=1\" Includes a required cookie as part of the request. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter value avoids XSS vulnerabilities. Parent topic: Data access REST API","title":"Delete"},{"location":"ref_data_rest_api_list.html","text":"List This action retrieves a list of records. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/ F_Form1?format=application%2Fatom%2Bxml&sortBy=lastUpdated&order=DESC&from=10&to=20 format or Accept header The format in which the data must be returned. You can use either format or Accept header. application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml application/x-msexcel returns data as an Excel document application/vnd.oasis.opendocument.spreadsheet returns data as an OpenDocument spreadsheet application/json returns data in JavaScript\u2122 Object Notation format sortBy The order in which the data must be returned. The default sort order is indeterminate. lastUpdated uses the last updated date as the sort attribute. itemAuthor uses the display name of the author as the sort attribute. flowState uses the stage name as the sort attribute. < item ID > uses the values of a particular form item, for example, F_SingleLine , as the sort attribute. Several widgets cannot be used as the sort attribute due to their storage representation in the database. This includes the Multi-Line Entry , Select Many , Table , and Attachment widgets . order The direction of the sort. ASC uses an ascending sort order. This is the default value. DESC uses a descending sort order. from The starting offset of a range of results. The default value is 0. to The ending offset of a range of results. The default value is the end of the list. If you set a value for to , the result is not inclusive of the to value. For example, there are 100 submitted records. You want to view the results 5 per page. You set the from value to 6, and the to value to 11. Records 6 - 10 are displayed. metadata Set to true to display extra information about items in the form. This parameter is only valid for JSON. The result of this request is a list of records. An example result represented as an ATOM feed: :/apps-basic/landing/1/app/ dd34da19-15c4-4267-8f1e-9f12ece743d7/viewdata/index.html\"> http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 Collection of Form 1 2011-11-22T19:37:09.060Z -1 Freedom :/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1\" rel=\"self\"/> f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 9c1f4a5b-c6b2-482d-874f-804c44bdd91e ... 86352d79-b52e-48e6-84a2-24174d9d5481 ... ... It is important to note: Each submission record is represented by an within the feed. Each entry has an that represents the person who initially created the record. Each entry has a that represents the person who last updated the record. Each entry has a with rel=\"edit\" ** that represents the URL to use to Retrieve and Update just this record. Each entry has a with rel=\"print\" ** that represents the URL that, when displayed in a browser, is the print version of the record. Each entry has a with rel=\"form\" ** that represents the URL that, when displayed in a browser, allows the editing of this record. Each entry has a that contains the actual data for this record. The root element of the actual data, which in this example is , has a generated uid attribute. This attribute is the unique ID for the record and can be used for subsequent calls to Retrieve, Update, or Delete for that particular record. An example result represented as a JSON feed: { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] }, \"items\": [{ \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 0, \"uid\": \"8cca2f81-207c-4780-875f-ee1c2bee4df1\", \"F_SingleLine1\": \"Joe\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 }, { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.75 }] } The following information describes how to filter Data REST API results. Filtering Data REST API results Parent topic: Data access REST API","title":"List"},{"location":"ref_data_rest_api_list.html#list","text":"This action retrieves a list of records. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/ F_Form1?format=application%2Fatom%2Bxml&sortBy=lastUpdated&order=DESC&from=10&to=20 format or Accept header The format in which the data must be returned. You can use either format or Accept header. application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml application/x-msexcel returns data as an Excel document application/vnd.oasis.opendocument.spreadsheet returns data as an OpenDocument spreadsheet application/json returns data in JavaScript\u2122 Object Notation format sortBy The order in which the data must be returned. The default sort order is indeterminate. lastUpdated uses the last updated date as the sort attribute. itemAuthor uses the display name of the author as the sort attribute. flowState uses the stage name as the sort attribute. < item ID > uses the values of a particular form item, for example, F_SingleLine , as the sort attribute. Several widgets cannot be used as the sort attribute due to their storage representation in the database. This includes the Multi-Line Entry , Select Many , Table , and Attachment widgets . order The direction of the sort. ASC uses an ascending sort order. This is the default value. DESC uses a descending sort order. from The starting offset of a range of results. The default value is 0. to The ending offset of a range of results. The default value is the end of the list. If you set a value for to , the result is not inclusive of the to value. For example, there are 100 submitted records. You want to view the results 5 per page. You set the from value to 6, and the to value to 11. Records 6 - 10 are displayed. metadata Set to true to display extra information about items in the form. This parameter is only valid for JSON. The result of this request is a list of records. An example result represented as an ATOM feed: :/apps-basic/landing/1/app/ dd34da19-15c4-4267-8f1e-9f12ece743d7/viewdata/index.html\"> http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 Collection of Form 1 2011-11-22T19:37:09.060Z -1 Freedom :/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1\" rel=\"self\"/> f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 9c1f4a5b-c6b2-482d-874f-804c44bdd91e ... 86352d79-b52e-48e6-84a2-24174d9d5481 ... ... It is important to note: Each submission record is represented by an within the feed. Each entry has an that represents the person who initially created the record. Each entry has a that represents the person who last updated the record. Each entry has a with rel=\"edit\" ** that represents the URL to use to Retrieve and Update just this record. Each entry has a with rel=\"print\" ** that represents the URL that, when displayed in a browser, is the print version of the record. Each entry has a with rel=\"form\" ** that represents the URL that, when displayed in a browser, allows the editing of this record. Each entry has a that contains the actual data for this record. The root element of the actual data, which in this example is , has a generated uid attribute. This attribute is the unique ID for the record and can be used for subsequent calls to Retrieve, Update, or Delete for that particular record. An example result represented as a JSON feed: { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] }, \"items\": [{ \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 0, \"uid\": \"8cca2f81-207c-4780-875f-ee1c2bee4df1\", \"F_SingleLine1\": \"Joe\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 }, { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.75 }] } The following information describes how to filter Data REST API results. Filtering Data REST API results Parent topic: Data access REST API","title":"List"},{"location":"ref_data_rest_api_list_filter.html","text":"Filtering Data REST API results The following information describes how to filter Data REST API results. You can filter the results of the List action by providing extra URL parameters. For example: /apps-basic/secure/org/data/{app-uid}/{form-id}?F_Amount__lt=1000 This sample query would limit results to records whose F_Amount currency field value is less than 1000. The syntax of a single filter parameter is {element}__{operator}={value}, where {element} is the ID of an item in the form, or one of the record metadata properties. For example, the author_name is used to filter by the name of the initial submitter of a record. Note: All filter parameters must be properly URL encoded. Common encoding characters are described as follows: %3A - a colon %20 - a space %2B - the plus sign (+) For example, the colon in a time value of \u201c09:40\u201d would need to be encoded as %3A resulting in an encoded value of 09%3A40 . Two simple examples of single filter parameters are: F_Age__equals=5 author_name__equals=James%20Smith Multiple Filters Multiple filter parameters can be included in a single URL along with a searchOperator parameter. OR In an OR relationship, any one of the filters is true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=OR ``` AND In an AND relationship, all of the filters must be true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=AND ``` Note: Only a single searchOperator parameter is supported in a request. You cannot use both AND and OR in a single request. If no searchOperator parameter is present, the default is AND. Metadata properties Each record can use the following properties for filtering. Table 1. Metadata filtering properties Element Operator Type Description author_name See the table of String Operators The name of the user that initially created the record. updater_name See the table of String Operators The name of the user that last updated the record. creation_time See the table of Time Stamp Operators The time stamp of when the record was initially created. updated See the table of Time Stamp Operators The time stamp of when the record was last updated flow_state See the table of Stage Operators The ID of the stage that the record is in. For example, \u201cST_End\u201d String Operators String operators are used on the values of the following form items: Single-Line Entry , Multi-Line Entry , Email , Drop Down , Select One , Select Many , Survey question, Choice Slider , and Website . String operators are also used on the following metadata properties: author_nameand updater_name. Table 2. String operators Operator Description equals The value of the element is tested for equality against the specified value. startswith Checks to see whether the value of the element starts with the specified value. endswith Checks to see whether the value of the element ends with the specified value. contains Checks to see whether the value of the element contains the specified value. Number operators Number operators are used on the values of the following form items: Number , Currency , and Numeric Slider . Table 3. Number operators Operator Description equals The value of the element is tested for equality against the specified value. notequals The value of the element is tested for non-equality against the specified value. gt Checks to see whether the value of the element is greater than the specified value. lt Checks to see whether the value of the element is less than the specified value. gte Checks to see whether the value of the element is greater than or equal to the specified value. lte Checks to see whether the value of the element is less than or equal to the specified value. Boolean operator This operator is only used on the value of the Checkbox form item. Table 4. Boolean operator Operator Description equals The value of the element is tested for equality against the specified value. Valid values to compare against are true and false . Time, Date, and Time Stamp operators Time values are valid against Time form items only. Date values are valid against Date form items only. Time stamp values are valid against Time Stamp form items, or the creation_time and updated metadata properties. Time, date, and time stamp values must be provided in ISO 8601 extended format. For example, a time stamp for 21 Dec 2015 10:00 AM Pacific Standard Time must be given as: 2015-12-21T10:00:00-08:00 or 2015-12-21T18:00:00Z. Note: Remember to take daylight savings into account based on the time zone and the date of a time stamp value. For example, 21 June 2015 10:00 AM Pacific Daylight Time must be given as 2015-06-21T10:00:00- 07:00 or 2015-06-21T 17:00 :00Z Dates must be passed in the format yyyy-mm-dd Times must be passed in the format hh:mm:ss Remember that all values must be properly URL encoded. For example, a value of 2015-06-21T17:00:00Z +8:00 must be encoded as 2015-06-21T17%3A00%3A00 %2B8%3A00 . Table 5. Time, Date, and Time Stamp operators Operator Description after Filters so that the results provided come after the specified time and date. before Filters so that the results provided come before the specified time and date. between Filters so that the results provided fit on or within the specified times and dates. The between operator takes a value in the following format: {start moment}**A\\*N\\*D**{end moment} For example, to search between the start of day 1 June 2015 and the start of day 8 June 2015 (in Pacific Daylight Time) the value is: 2015-06-01T07:00:01Z**A\\*N\\*D**2015-06-08T07:00:01Z Additional Date and Time Stamp operators To adjust for different time zones, use the tzOffset URL parameter. The value is the number of seconds of offset from Coordinated Universal Time. For example, for Pacific Standard Time use tzOffset=-28000 Table 6. Additional Date and Time Stamp operators Operator Description year Filters the results so that the year matches the specified numerical value. month Filters the results so that the month matches the specified numerical value. The value must use the numbers 1-12, where 1 is January and 12 is December. day Filters the results so that the day matches the specified numerical value. The value must use the numbers 1-31, where each numeral matches a day of the month. Stage ID operators Stage operators are used with the value of the flow_state metadata property. Table 7. Stage ID operators Operator Description equals The value of the flow_state is tested for equality against the specified value. notequals The value of the flow_state is tested for non-equality against the specified value. Examples The following parameters are examples of filtering. Each example contains the search parameter and a description of the returned result. This filter returns the first 20 records where the value of the F_Number field is greater than or equal to 5. ?F_Number__gte=5&to=20 This filter returns the first 30 records of where the record was last updated between the start of day June 1, 2015 and the start of day Aug 31, 2015, China Standard Time. ?updated__between=2015-06-01T00%3A00%3A01%2B8%3A00A*N*D2015-08-31T00%3A00%3A01%2B8%3A00&to=30 This filter returns first five records where the value of the F_Currency field is less than 1000 AND the value of the F_Number field is greater than 10. ?F_Currency__lt=1000&F_Number__gt=10&searchOperator=AND&to=5 This filter returns the first 20 records where the value of the F_Number field is less than 5 OR greater than 10. ?F_Number__lt=5&F_Number__gt=10&searchOperator=OR&to=20 Parent topic: List","title":"Filtering Data REST API results"},{"location":"ref_data_rest_api_list_filter.html#filtering-data-rest-api-results","text":"The following information describes how to filter Data REST API results. You can filter the results of the List action by providing extra URL parameters. For example: /apps-basic/secure/org/data/{app-uid}/{form-id}?F_Amount__lt=1000 This sample query would limit results to records whose F_Amount currency field value is less than 1000. The syntax of a single filter parameter is {element}__{operator}={value}, where {element} is the ID of an item in the form, or one of the record metadata properties. For example, the author_name is used to filter by the name of the initial submitter of a record. Note: All filter parameters must be properly URL encoded. Common encoding characters are described as follows: %3A - a colon %20 - a space %2B - the plus sign (+) For example, the colon in a time value of \u201c09:40\u201d would need to be encoded as %3A resulting in an encoded value of 09%3A40 . Two simple examples of single filter parameters are: F_Age__equals=5 author_name__equals=James%20Smith","title":"Filtering Data REST API results"},{"location":"ref_data_rest_api_list_filter.html#multiple-filters","text":"Multiple filter parameters can be included in a single URL along with a searchOperator parameter. OR In an OR relationship, any one of the filters is true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=OR ``` AND In an AND relationship, all of the filters must be true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=AND ``` Note: Only a single searchOperator parameter is supported in a request. You cannot use both AND and OR in a single request. If no searchOperator parameter is present, the default is AND.","title":"Multiple Filters"},{"location":"ref_data_rest_api_list_filter.html#metadata-properties","text":"Each record can use the following properties for filtering. Table 1. Metadata filtering properties Element Operator Type Description author_name See the table of String Operators The name of the user that initially created the record. updater_name See the table of String Operators The name of the user that last updated the record. creation_time See the table of Time Stamp Operators The time stamp of when the record was initially created. updated See the table of Time Stamp Operators The time stamp of when the record was last updated flow_state See the table of Stage Operators The ID of the stage that the record is in. For example, \u201cST_End\u201d","title":"Metadata properties"},{"location":"ref_data_rest_api_list_filter.html#string-operators","text":"String operators are used on the values of the following form items: Single-Line Entry , Multi-Line Entry , Email , Drop Down , Select One , Select Many , Survey question, Choice Slider , and Website . String operators are also used on the following metadata properties: author_nameand updater_name. Table 2. String operators Operator Description equals The value of the element is tested for equality against the specified value. startswith Checks to see whether the value of the element starts with the specified value. endswith Checks to see whether the value of the element ends with the specified value. contains Checks to see whether the value of the element contains the specified value.","title":"String Operators"},{"location":"ref_data_rest_api_list_filter.html#number-operators","text":"Number operators are used on the values of the following form items: Number , Currency , and Numeric Slider . Table 3. Number operators Operator Description equals The value of the element is tested for equality against the specified value. notequals The value of the element is tested for non-equality against the specified value. gt Checks to see whether the value of the element is greater than the specified value. lt Checks to see whether the value of the element is less than the specified value. gte Checks to see whether the value of the element is greater than or equal to the specified value. lte Checks to see whether the value of the element is less than or equal to the specified value.","title":"Number operators"},{"location":"ref_data_rest_api_list_filter.html#boolean-operator","text":"This operator is only used on the value of the Checkbox form item. Table 4. Boolean operator Operator Description equals The value of the element is tested for equality against the specified value. Valid values to compare against are true and false .","title":"Boolean operator"},{"location":"ref_data_rest_api_list_filter.html#time-date-and-time-stamp-operators","text":"Time values are valid against Time form items only. Date values are valid against Date form items only. Time stamp values are valid against Time Stamp form items, or the creation_time and updated metadata properties. Time, date, and time stamp values must be provided in ISO 8601 extended format. For example, a time stamp for 21 Dec 2015 10:00 AM Pacific Standard Time must be given as: 2015-12-21T10:00:00-08:00 or 2015-12-21T18:00:00Z. Note: Remember to take daylight savings into account based on the time zone and the date of a time stamp value. For example, 21 June 2015 10:00 AM Pacific Daylight Time must be given as 2015-06-21T10:00:00- 07:00 or 2015-06-21T 17:00 :00Z Dates must be passed in the format yyyy-mm-dd Times must be passed in the format hh:mm:ss Remember that all values must be properly URL encoded. For example, a value of 2015-06-21T17:00:00Z +8:00 must be encoded as 2015-06-21T17%3A00%3A00 %2B8%3A00 . Table 5. Time, Date, and Time Stamp operators Operator Description after Filters so that the results provided come after the specified time and date. before Filters so that the results provided come before the specified time and date. between Filters so that the results provided fit on or within the specified times and dates. The between operator takes a value in the following format: {start moment}**A\\*N\\*D**{end moment} For example, to search between the start of day 1 June 2015 and the start of day 8 June 2015 (in Pacific Daylight Time) the value is: 2015-06-01T07:00:01Z**A\\*N\\*D**2015-06-08T07:00:01Z","title":"Time, Date, and Time Stamp operators"},{"location":"ref_data_rest_api_list_filter.html#additional-date-and-time-stamp-operators","text":"To adjust for different time zones, use the tzOffset URL parameter. The value is the number of seconds of offset from Coordinated Universal Time. For example, for Pacific Standard Time use tzOffset=-28000 Table 6. Additional Date and Time Stamp operators Operator Description year Filters the results so that the year matches the specified numerical value. month Filters the results so that the month matches the specified numerical value. The value must use the numbers 1-12, where 1 is January and 12 is December. day Filters the results so that the day matches the specified numerical value. The value must use the numbers 1-31, where each numeral matches a day of the month.","title":"Additional Date and Time Stamp operators"},{"location":"ref_data_rest_api_list_filter.html#stage-id-operators","text":"Stage operators are used with the value of the flow_state metadata property. Table 7. Stage ID operators Operator Description equals The value of the flow_state is tested for equality against the specified value. notequals The value of the flow_state is tested for non-equality against the specified value.","title":"Stage ID operators"},{"location":"ref_data_rest_api_list_filter.html#examples","text":"The following parameters are examples of filtering. Each example contains the search parameter and a description of the returned result. This filter returns the first 20 records where the value of the F_Number field is greater than or equal to 5. ?F_Number__gte=5&to=20 This filter returns the first 30 records of where the record was last updated between the start of day June 1, 2015 and the start of day Aug 31, 2015, China Standard Time. ?updated__between=2015-06-01T00%3A00%3A01%2B8%3A00A*N*D2015-08-31T00%3A00%3A01%2B8%3A00&to=30 This filter returns first five records where the value of the F_Currency field is less than 1000 AND the value of the F_Number field is greater than 10. ?F_Currency__lt=1000&F_Number__gt=10&searchOperator=AND&to=5 This filter returns the first 20 records where the value of the F_Number field is less than 5 OR greater than 10. ?F_Number__lt=5&F_Number__gt=10&searchOperator=OR&to=20 Parent topic: List","title":"Examples"},{"location":"ref_data_rest_api_metadata.html","text":"Metadata This JSON-only action retrieves a description of the items in your form. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/metadata { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] } } Parent topic: Data access REST API","title":"Metadata"},{"location":"ref_data_rest_api_metadata.html#reference_adn_qqt_nv","text":"This JSON-only action retrieves a description of the items in your form. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/metadata { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] } } Parent topic: Data access REST API","title":"Metadata"},{"location":"ref_data_rest_api_retrieve.html","text":"Retrieve This action retrieves a single record. Note: The curl command must be entered as a single line. curl --user : --header \"Accept:application/atom+xml\" \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d\" curl --user : \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d ?itemOnly=true&format=application%2fjson\" format or Accept header The format in which the data must be returned. You can use either format or Accept header . application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml . application/json returns data in JavaScript\u2122 Object Notation format Set itemOnly to true if you want to receive a simplified response. itemOnly is only available for JSON. The result of this request is an ATOM Entry XML document: f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 The result of this request as a JSON document: { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.0 } Refer to the List action for a detailed description of the returned entry. Parent topic: Data access REST API","title":"Retrieve"},{"location":"ref_data_rest_api_retrieve.html#retrieve","text":"This action retrieves a single record. Note: The curl command must be entered as a single line. curl --user : --header \"Accept:application/atom+xml\" \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d\" curl --user : \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d ?itemOnly=true&format=application%2fjson\" format or Accept header The format in which the data must be returned. You can use either format or Accept header . application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml . application/json returns data in JavaScript\u2122 Object Notation format Set itemOnly to true if you want to receive a simplified response. itemOnly is only available for JSON. The result of this request is an ATOM Entry XML document: f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 The result of this request as a JSON document: { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.0 } Refer to the List action for a detailed description of the returned entry. Parent topic: Data access REST API","title":"Retrieve"},{"location":"ref_data_rest_api_retrieve_attachment.html","text":"Retrieve Attachment This action retrieves a single attachment. curl --user : \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/ccb92c12-d435-4288-baff-878d8d3c2923\" Replace dd34da19-15c4-4267-8f1e-9f12ece743d7 with the app ID of the desired attachment. Replace F_Form1 with the form ID of the desired attachment. Replace ccb92c12-d435-4288-baff-878d8d3c2923 with the UID of the desired attachment. To determine the UID of an attachment, you can use the Data access REST API to retrieve the data for a given record. If the form contains an attachment item, the data for that record will contain the UID, ID, and filename of the attachment. This information is also available in the response when you upload a file using the Create Attachment REST operation. For example: \"F_Attachment1\" : { \"fileName\" : \"some file.doc\", \"id\" : 123, \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } When retrieving an attachment, the credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Parent topic: Data access REST API","title":"Retrieve Attachment"},{"location":"ref_data_rest_api_retrieve_attachment.html#reference_swb_lsf_2z","text":"This action retrieves a single attachment. curl --user : \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/ccb92c12-d435-4288-baff-878d8d3c2923\" Replace dd34da19-15c4-4267-8f1e-9f12ece743d7 with the app ID of the desired attachment. Replace F_Form1 with the form ID of the desired attachment. Replace ccb92c12-d435-4288-baff-878d8d3c2923 with the UID of the desired attachment. To determine the UID of an attachment, you can use the Data access REST API to retrieve the data for a given record. If the form contains an attachment item, the data for that record will contain the UID, ID, and filename of the attachment. This information is also available in the response when you upload a file using the Create Attachment REST operation. For example: \"F_Attachment1\" : { \"fileName\" : \"some file.doc\", \"id\" : 123, \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } When retrieving an attachment, the credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Parent topic: Data access REST API","title":"Retrieve Attachment"},{"location":"ref_data_rest_api_update.html","text":"Update This action updates an existing record. Note: The curl command must be entered as a single line. curl --user : --request PUT --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @put.xml \"http://:/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f- cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** Accept Indicates the type of accepted response. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** --data-binary Provides the actual data that is PUT to the URL. In this case, it is pointing to a file, put.xml, on the local system that contains the data to send. --request PUT Specifies the correct HTTP method verb for the action. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. ATOM Feed Example PUT data: F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 The ID of the form to which this record is being submitted. <updated> This must be included, but its value is replaced by the server with a new timestamp. A value of 1970-01-01T00:00:00Z can always be used. <content> Contains the submitted data. The structure of the data within the content element is different for each application, and is based on the list of form items used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data. The root element of the submitted data, in this example the <F_Form1> element, is always in the null namespace, xmlns=\"\" The root element must have the application_uid, pressedButton, flowState, uid, and id attributes. The application_uid is the UID of the application. The flowState is the ID of the current stage of the record. The pressedButton is the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. The uid is the unique ID for the record being updated. The id must be an integer, although the actual value is meaningless. A value of 0 can always be used. Note: A PUT REST command updates an existing record with new values. All data fields in the old record will be replaced by the data fields provided in the payload. If the new submission does not include a field, the field will be updated to have an empty value even if it previously had a value (i.e. the two records are NOT merged). JSON Example JSON payload: { \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"flowState\": \"ST_ReviewStage\", \"pressedButton\" : \"S_Approve\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 26.75 } Note: The uid is optional. If supplied, it must match the record uid. For example: f82e576f- cb67-4008-8219-f49a1b369f7d. Parent topic: Data access REST API","title":"Update"},{"location":"ref_data_rest_api_update.html#update","text":"This action updates an existing record. Note: The curl command must be entered as a single line. curl --user <loginId>:<passwd> --request PUT --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @put.xml \"http://<host>:<port>/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f- cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** Accept Indicates the type of accepted response. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** --data-binary Provides the actual data that is PUT to the URL. In this case, it is pointing to a file, put.xml, on the local system that contains the data to send. --request PUT Specifies the correct HTTP method verb for the action. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities.","title":"Update"},{"location":"ref_data_rest_api_update.html#section_afj_djl_nzb","text":"Example PUT data: <entry xmlns=\"http://www.w3.org/2005/Atom\"> <title type=\"text\">F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 The ID of the form to which this record is being submitted. <updated> This must be included, but its value is replaced by the server with a new timestamp. A value of 1970-01-01T00:00:00Z can always be used. <content> Contains the submitted data. The structure of the data within the content element is different for each application, and is based on the list of form items used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data. The root element of the submitted data, in this example the <F_Form1> element, is always in the null namespace, xmlns=\"\" The root element must have the application_uid, pressedButton, flowState, uid, and id attributes. The application_uid is the UID of the application. The flowState is the ID of the current stage of the record. The pressedButton is the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. The uid is the unique ID for the record being updated. The id must be an integer, although the actual value is meaningless. A value of 0 can always be used. Note: A PUT REST command updates an existing record with new values. All data fields in the old record will be replaced by the data fields provided in the payload. If the new submission does not include a field, the field will be updated to have an empty value even if it previously had a value (i.e. the two records are NOT merged).","title":"ATOM Feed"},{"location":"ref_data_rest_api_update.html#section_wwg_2jl_nzb","text":"Example JSON payload: { \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"flowState\": \"ST_ReviewStage\", \"pressedButton\" : \"S_Approve\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 26.75 } Note: The uid is optional. If supplied, it must match the record uid. For example: f82e576f- cb67-4008-8219-f49a1b369f7d. Parent topic: Data access REST API","title":"JSON"},{"location":"ref_embed_iframe.html","text":"Embedding items in an iframe You can use iFrames to embed charts and applications in a web page. Embedded Chart Rendering To embed the summary charts in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe src=\"http://host:port/apps/secure/org/app/app\\_uid/results/index.html?form=form\\_id&narrow=true&hideLabels=true&legend=true\"></iframe> The parameters in this URL are: hideLabels=true : Hides labels on pie charts. narrow=true : Renders charts in narrow mode, which is suitable for charts embedded in narrow spaces. In narrow mode, pie charts render at a size to fit the available space and bar charts are hidden. Narrow mode works best in combination with hideLabels=true and legend=true. **Note:** Narrow mode is automatically engaged when the available space for charts is less than 500 pixels wide regardless of the narrow URL parameter. legend=true : Displays a legend with the pie chart. Use in combination with narrow=true and hideLabels=true. When the charts are embedded, the banner is hidden and there are simple messages when no charts are available. Embedded Form Rendering To embed a form in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe style=\"width:600px;height:600px\" src=\"http://host:port/apps/secure/org/app/app\\_uid/launch/index.html?form=form\\_id&width=600px\"> </iframe> The parameters in this URL are: width=value : Value can be a percentage or a fixed number of pixels. **Note:** URL encoding is required for the `%` character. It should be represented as `%25`. For example `99%` would become `&width=99%25` When the forms are embedded, the banner is hidden and when form is shown, the first item does not initially grab focus Parent topic: Reference","title":"Embedding items in an iframe"},{"location":"ref_embed_iframe.html#embeddingitemsinaniframe","text":"You can use iFrames to embed charts and applications in a web page.","title":"Embedding items in an iframe"},{"location":"ref_embed_iframe.html#embedded-chart-rendering","text":"To embed the summary charts in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe src=\"http://host:port/apps/secure/org/app/app\\_uid/results/index.html?form=form\\_id&narrow=true&hideLabels=true&legend=true\"></iframe> The parameters in this URL are: hideLabels=true : Hides labels on pie charts. narrow=true : Renders charts in narrow mode, which is suitable for charts embedded in narrow spaces. In narrow mode, pie charts render at a size to fit the available space and bar charts are hidden. Narrow mode works best in combination with hideLabels=true and legend=true. **Note:** Narrow mode is automatically engaged when the available space for charts is less than 500 pixels wide regardless of the narrow URL parameter. legend=true : Displays a legend with the pie chart. Use in combination with narrow=true and hideLabels=true. When the charts are embedded, the banner is hidden and there are simple messages when no charts are available.","title":"Embedded Chart Rendering"},{"location":"ref_embed_iframe.html#embedded-form-rendering","text":"To embed a form in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe style=\"width:600px;height:600px\" src=\"http://host:port/apps/secure/org/app/app\\_uid/launch/index.html?form=form\\_id&width=600px\"> </iframe> The parameters in this URL are: width=value : Value can be a percentage or a fixed number of pixels. **Note:** URL encoding is required for the `%` character. It should be represented as `%25`. For example `99%` would become `&width=99%25` When the forms are embedded, the banner is hidden and when form is shown, the first item does not initially grab focus Parent topic: Reference","title":"Embedded Form Rendering"},{"location":"ref_embedding_api.html","text":"Embedding API The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page. Example 1 - Declarative <html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"{launch: {appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', targetId: 'myLeapDiv'}}\"> </script> </body> </html> Example 2 - Programmatic <html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\"></script> <script> function onLeapFormSubmitted (BO) { alert (\"submitted record id: \" + submittedBO.getDataId()); } function onLeapFormLoaded (app, launchParams) { app.getForm(launchParams.formId).connectEvent(\"afterSave\", onLeapFormSubmitted); } Leap.onReady = function() { var launchParams = { appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', target: document.getElementById(\"myLeapDiv\"), locale: 'fr-FR' callback: onLeapFormLoaded }; Leap.launch(launchParams); }; </script> </body> </html> Loading the Leap Embedding UI <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"[leap configuration]\" id=\"leapJS'\"></script> id (optional) - fallback for older browsers; the value should always be \"leapJS\" data-leap-config (optional) - JSON or the name of an existing JavaScript object. Properties: locale (optional) - indicates the preferred locale to the Leap API. For example, \"fr-FR\" launch (optional) - equivalent to calling Leap.launch ({\u2026}) function with respective parameters (see below for more details) overwriteExistingDojoConfig (optional) - In some environments, such as HCL Digital Experience or IBM WebSphere Portal, the djConfig or dojoConfig object may be defined on a page and not used. Set the value of this property to true to override it. Loading the Leap API will result in the creation of global object named Leap. After initial load of the leap.js, you can define a Leap.onReady () function which will be called when the necessary Leap resources have been loaded into the page and the API is ready to be used. Embedding a form programmatically To embed a Leap form programmatically, call Leap.launch({launch_params}); { launch_params } properties: Property Required? Description appId Yes The Leap application UUID. For example, 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55' formId Yes The Leap form ID. For example, 'F_Form1' targetId Either target or targetId must be provided. The id of the HTML DOM element to embed the Leap form within. For example, 'myLeapFormDiv' target Either target or targetId must be provided. The HTML DOM element to place the Leap form within. mode No Determines the mode for embedding. Possible values: - ' iframe ': embeds the form in an <iframe> element. For complete isolation of the form, if necessary - ' embed ' (default): embeds the form into the hosting page in a <div> locale No Indicates the preferred locale for the embedded form. For example, 'fr-FR' prefSecMode No If the form supports both anonymous and authenticated usage, this property can be used to automatically choose the preferred security mode. Possible values: - ' anon ': for anonymous usage - ' secure ': for authenticated usage callback No A callback function which will be called when the application launch completes successfully and the form is ready to be interacted with. The callback function will be passed the following parameters: - app : the Leap JavaScript API application object. For more details, see Interface objects - launchParams : the original launch parameters object, for convenience Known Limitations Only one Leap form can be embedded on the page at a time. Once the Leap form is embedded, it cannot be changed to a different form or reloaded. The hosting page cannot contain any version of the Dojo JavaScript library. The Leap Embedding API will load its own copy of the Dojo JavaScript library into the hosting page. For authentication, it is expected that the hosting page and the Leap server are configured with single sign-on (SSO). Leap\u2019s login UI will not display properly within the hosting page. Cross-Domain Usage If Leap and the hosting page are in different domains, the Leap front-end must be configured to return appropriate CORS headers. Parent topic: Reference","title":"Embedding API"},{"location":"ref_embedding_api.html#embedding-api","text":"The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page.","title":"Embedding API"},{"location":"ref_embedding_api.html#example-1-declarative","text":"<html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"{launch: {appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', targetId: 'myLeapDiv'}}\"> </script> </body> </html>","title":"Example 1 - Declarative"},{"location":"ref_embedding_api.html#example-2-programmatic","text":"<html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\"></script> <script> function onLeapFormSubmitted (BO) { alert (\"submitted record id: \" + submittedBO.getDataId()); } function onLeapFormLoaded (app, launchParams) { app.getForm(launchParams.formId).connectEvent(\"afterSave\", onLeapFormSubmitted); } Leap.onReady = function() { var launchParams = { appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', target: document.getElementById(\"myLeapDiv\"), locale: 'fr-FR' callback: onLeapFormLoaded }; Leap.launch(launchParams); }; </script> </body> </html>","title":"Example 2 - Programmatic"},{"location":"ref_embedding_api.html#loading-the-leap-embedding-ui","text":"<script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"[leap configuration]\" id=\"leapJS'\"></script> id (optional) - fallback for older browsers; the value should always be \"leapJS\" data-leap-config (optional) - JSON or the name of an existing JavaScript object. Properties: locale (optional) - indicates the preferred locale to the Leap API. For example, \"fr-FR\" launch (optional) - equivalent to calling Leap.launch ({\u2026}) function with respective parameters (see below for more details) overwriteExistingDojoConfig (optional) - In some environments, such as HCL Digital Experience or IBM WebSphere Portal, the djConfig or dojoConfig object may be defined on a page and not used. Set the value of this property to true to override it. Loading the Leap API will result in the creation of global object named Leap. After initial load of the leap.js, you can define a Leap.onReady () function which will be called when the necessary Leap resources have been loaded into the page and the API is ready to be used.","title":"Loading the Leap Embedding UI"},{"location":"ref_embedding_api.html#embedding-a-form-programmatically","text":"To embed a Leap form programmatically, call Leap.launch({launch_params}); { launch_params } properties: Property Required? Description appId Yes The Leap application UUID. For example, 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55' formId Yes The Leap form ID. For example, 'F_Form1' targetId Either target or targetId must be provided. The id of the HTML DOM element to embed the Leap form within. For example, 'myLeapFormDiv' target Either target or targetId must be provided. The HTML DOM element to place the Leap form within. mode No Determines the mode for embedding. Possible values: - ' iframe ': embeds the form in an <iframe> element. For complete isolation of the form, if necessary - ' embed ' (default): embeds the form into the hosting page in a <div> locale No Indicates the preferred locale for the embedded form. For example, 'fr-FR' prefSecMode No If the form supports both anonymous and authenticated usage, this property can be used to automatically choose the preferred security mode. Possible values: - ' anon ': for anonymous usage - ' secure ': for authenticated usage callback No A callback function which will be called when the application launch completes successfully and the form is ready to be interacted with. The callback function will be passed the following parameters: - app : the Leap JavaScript API application object. For more details, see Interface objects - launchParams : the original launch parameters object, for convenience","title":"Embedding a form programmatically"},{"location":"ref_embedding_api.html#known-limitations","text":"Only one Leap form can be embedded on the page at a time. Once the Leap form is embedded, it cannot be changed to a different form or reloaded. The hosting page cannot contain any version of the Dojo JavaScript library. The Leap Embedding API will load its own copy of the Dojo JavaScript library into the hosting page. For authentication, it is expected that the hosting page and the Leap server are configured with single sign-on (SSO). Leap\u2019s login UI will not display properly within the hosting page.","title":"Known Limitations"},{"location":"ref_embedding_api.html#cross-domain-usage","text":"If Leap and the hosting page are in different domains, the Leap front-end must be configured to return appropriate CORS headers. Parent topic: Reference","title":"Cross-Domain Usage"},{"location":"ref_form_objects.html","text":"Form objects Table 1. Form Object (form) The form object provides access to a number of functions that affect the entire form. Object Description Example form.addClasses(classes) Adds a list of custom class names to the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. form.addClasses(\u201cemphasized error\u201d); form.backwardPage() Return the form to the previous page in navigation order. If the first page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.backwardPage(); form.connectEvent(eventName, callbackFunction) Connects a function to an event on the form. This is useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the form dynamically. Returns a handle object that represents the connection of the function to that event name. The handle can be used to disconnect this same event using form.disconnectEvent . If there is a F_CurrentUser field, then populate the currentUser: var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } }); form.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a form.connectEvent call. To avoid duplicate event handlers being connected, connect to events from within the application onStart or form onLoad events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the disconnectEvent method. var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } form.disconnectEvent(hndl); }); form.forwardPage() Advance the form to the next page in navigation order. If the last page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.forwardPage(); |form.getApp() Returns the application object: app. Not a commonly used function, because within the form scope the app variable is also available. form.getBO() Returns the object that contains the Business Object data for the entire form. This is commonly used in the application onStart , since at this scope the form variable is not defined. var myForm = app.getForm('F_Form1'); var formBO = myForm.getBO(); formBO.F_SingleLine.setValue('setting the value using code!'); | |form.getClasses()|Returns an Array of custom class names currently applied to the form.| | |form.getCurrentPage()|Gets the currently shown page. If there is no page shown, then null is returned. It is possible, though rarely desirable, to have all pages hidden.|``` var pageShown = form.getCurrentPage(); if(pageShown === 'F_Page1') pageShown.F_Text.setContent('Changing the text of this text item when this page is shown.'); | |form.getId\\(\\)|Returns the unique ID within the application of this form. For example, F\\_Form1.| | |form.getPageIds\\(\\)|Returns an array of the page IDs for the pages in this form.| | |form.getPage\\(pageId\\)|Returns the page object, page, for the page specified. Returns null if the pageId is invalid.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then, navigate to that page:``` if(thePage !== null) form.selectPage('thePage') | |form.getServiceConfigurationIds\\(\\)|Returns an array of all the IDs for services mapped in this form.|``` var serviceConfigs = form.getServiceConfigurationIds(); | |form.getServiceConfiguration(serviceId)|Gets the service object for a particular service ID.|Lookup and execute a service from JavaScript:``` var service = form.getServiceConfiguration('SC_ServiceConfig'); service.callService(); | |form.getStageActions\\(\\)|Returns an array of all the action buttons for the current stage. This includes any hidden action buttons as well.|Trigger a specific action using JavaScript:``` var actions = form.getStageActions(): for(var i=0; i<actions.length; i++) { if(get(actions,i).getId() === 'S_Submit') { get(actions,i).activate(); break; } } | |form.getType()|Returns a string identifying the object type. For example, form.| | |form.removeClasses(classes)|Removes a list of custom class names from the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` form.removeClasses(\u201cemphasized\u201d); | |form.removePageFromNavigation\\(pageId\\)|Removes the specified page from the navigation list for the form. The page navigation item no longer visits that page when **next**, or **previous** is selected, nor can you switch to that page programmatically.|If the check is selected, remove page 2 from the navigation:``` if(BO.F_Check.getValue) form.removePageFromNavigation('P_Page2'); | |form.restorePageNavigation(pageId)|Restores a previously removed page back into the navigation list for the form.|If the check is not selected, restore page 2 into the navigation:``` if(!BO.F_Check.getValue) form.restorePageNavigation('P_Page2'); | |form.selectPage\\(pageId\\)|Switches to the specified page. If the page is removed from navigation by Stages, Rules, or JavaScript, then you cannot select it.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then navigate to that page:``` if(thePage !== null) form.selectPage(thePage); | |form.sendData\\(data\\)|For IBM\u00ae WebSphere\u00ae Portal only. When hosted in a portlet, calling this method sends the string to any subscribers to the portlet. The content of this string depends on the portlet that consumes it.|Send a URL to be processed by the wire connected to the portlet: ``` form.sendData(BO.F_ServerURL.getValue() + \"/apps/secure/org/app/b5806ef1-b784-4c85-8844-653cd4064201/launch/index.html?form=F_FormA\"); | Parent topic: Interface objects","title":"Form objects"},{"location":"ref_form_objects.html#form-objects","text":"Table 1. Form Object (form) The form object provides access to a number of functions that affect the entire form. Object Description Example form.addClasses(classes) Adds a list of custom class names to the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. form.addClasses(\u201cemphasized error\u201d); form.backwardPage() Return the form to the previous page in navigation order. If the first page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.backwardPage(); form.connectEvent(eventName, callbackFunction) Connects a function to an event on the form. This is useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the form dynamically. Returns a handle object that represents the connection of the function to that event name. The handle can be used to disconnect this same event using form.disconnectEvent . If there is a F_CurrentUser field, then populate the currentUser: var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } }); form.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a form.connectEvent call. To avoid duplicate event handlers being connected, connect to events from within the application onStart or form onLoad events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the disconnectEvent method. var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } form.disconnectEvent(hndl); }); form.forwardPage() Advance the form to the next page in navigation order. If the last page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.forwardPage(); |form.getApp() Returns the application object: app. Not a commonly used function, because within the form scope the app variable is also available. form.getBO() Returns the object that contains the Business Object data for the entire form. This is commonly used in the application onStart , since at this scope the form variable is not defined. var myForm = app.getForm('F_Form1'); var formBO = myForm.getBO(); formBO.F_SingleLine.setValue('setting the value using code!'); | |form.getClasses()|Returns an Array of custom class names currently applied to the form.| | |form.getCurrentPage()|Gets the currently shown page. If there is no page shown, then null is returned. It is possible, though rarely desirable, to have all pages hidden.|``` var pageShown = form.getCurrentPage(); if(pageShown === 'F_Page1') pageShown.F_Text.setContent('Changing the text of this text item when this page is shown.'); | |form.getId\\(\\)|Returns the unique ID within the application of this form. For example, F\\_Form1.| | |form.getPageIds\\(\\)|Returns an array of the page IDs for the pages in this form.| | |form.getPage\\(pageId\\)|Returns the page object, page, for the page specified. Returns null if the pageId is invalid.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then, navigate to that page:``` if(thePage !== null) form.selectPage('thePage') | |form.getServiceConfigurationIds\\(\\)|Returns an array of all the IDs for services mapped in this form.|``` var serviceConfigs = form.getServiceConfigurationIds(); | |form.getServiceConfiguration(serviceId)|Gets the service object for a particular service ID.|Lookup and execute a service from JavaScript:``` var service = form.getServiceConfiguration('SC_ServiceConfig'); service.callService(); | |form.getStageActions\\(\\)|Returns an array of all the action buttons for the current stage. This includes any hidden action buttons as well.|Trigger a specific action using JavaScript:``` var actions = form.getStageActions(): for(var i=0; i<actions.length; i++) { if(get(actions,i).getId() === 'S_Submit') { get(actions,i).activate(); break; } } | |form.getType()|Returns a string identifying the object type. For example, form.| | |form.removeClasses(classes)|Removes a list of custom class names from the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` form.removeClasses(\u201cemphasized\u201d); | |form.removePageFromNavigation\\(pageId\\)|Removes the specified page from the navigation list for the form. The page navigation item no longer visits that page when **next**, or **previous** is selected, nor can you switch to that page programmatically.|If the check is selected, remove page 2 from the navigation:``` if(BO.F_Check.getValue) form.removePageFromNavigation('P_Page2'); | |form.restorePageNavigation(pageId)|Restores a previously removed page back into the navigation list for the form.|If the check is not selected, restore page 2 into the navigation:``` if(!BO.F_Check.getValue) form.restorePageNavigation('P_Page2'); | |form.selectPage\\(pageId\\)|Switches to the specified page. If the page is removed from navigation by Stages, Rules, or JavaScript, then you cannot select it.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then navigate to that page:``` if(thePage !== null) form.selectPage(thePage); | |form.sendData\\(data\\)|For IBM\u00ae WebSphere\u00ae Portal only. When hosted in a portlet, calling this method sends the string to any subscribers to the portlet. The content of this string depends on the portlet that consumes it.|Send a URL to be processed by the wire connected to the portlet: ``` form.sendData(BO.F_ServerURL.getValue() + \"/apps/secure/org/app/b5806ef1-b784-4c85-8844-653cd4064201/launch/index.html?form=F_FormA\"); | Parent topic: Interface objects","title":"Form objects"},{"location":"ref_item_objects.html","text":"Item objects Note: The item.setTitle parameter is not applicable to Tabbed Folder form items. Object Description Example item.addClasses(classes)apItem.addClasses(classes) |Adds a list of custom class names to an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned.|``` item.addClasses(\"emphasized error\"); | |item.clearRequiredMessage\\(\\)apItem.clearRequiredMessage\\(\\) |Validates the item data, but prevents the required error message from displaying.| | |item.connectEvent\\(eventName,callbackFunction\\)apItem.connectEvent\\(eventName,callbackFunction\\) |Connects a function to an event on the item. Useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the item dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using item.disconnectEvent.|Connect a listener to the **onItemChange** event to make a section visible. This could be placed in the form **onLoad** event: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } }); | |item.disconnectEvent(eventHandle)apItem.disconnectEvent(eventHandle) |Disconnects the event handler specified by the passed-in event handle object that was returned by an item.connectEvent call.If you connect an item event, you must also disconnect it in the same event. Otherwise, multiple versions of the connected code are attached every time the event is triggered. |If the connect event is placed in the item onShow then the listener needs to be disconnected: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } item.disconnectEvent(hndl); }); | |item.getActive\\(\\)apItem.getActive\\(\\) |Returns true if this item is active, or false if it is made read only by a rule, stage, or JavaScript.| | |apItem.getAppPage\\(\\)|Returns the page object to which this item belongs.| | |item.getBO\\(\\)|Returns the Business Object for the entire form.| | |item.getBOAttr\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.|Get data for an item and set its value:``` item.getBOAttr().setValue(45); | |item.getChildren()|If this item contains children, for example Section, or Tab Folder, it returns a list object that provides access to all direct children items. The list object has the getLength() function and get(index) function for accessing the objects in the list.|Rest all numbers inside a section to 0:``` var list = item.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'number') list.get(i).getBOAttr().setValue(0); } | |item.getClasses\\(\\)apItem.getClasses\\(\\) |Returns an Array of custom class names currently applied to an item.| | |item.getDisplayValue\\(\\)apItem.getDisplayValue\\(\\) |Returns the current value that is being displayed. It can be used in onItemLiveChange to get current, but not yet committed value.| | |item.getHoverText\\(\\)apItem.getHoverText\\(\\) |Returns the current value set as hover text.| | |item.getHintText\\(\\)apItem.getHintText\\(\\) |Returns the value set as **Hint** text.| | |item.getId\\(\\)apItem.getId\\(\\) |Returns the unique ID, within the application, of this item. For example, F\\_FirstName.| | |apItem.getInvalidMessage\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.| | |item.getPage\\(\\)|Returns the page object to which this item belongs.|Get the form object:``` var form = item.getPage().getForm(); | |item.getParent()apItem.getParent() |Returns the object that is the direct parent of the item, which can be a page, section, or tab folder.| | |item.getPlaceholderText()apItem.getPlaceholderText() |Returns the current value set as place holder text.| | |apItem.getRequired()|Gets a value set previously using setRequired().| | |item.getRows()|Returns the current value set as the number of rows displayed. This method gets the number of rows the text area displayed. Note: This parameter works only on multi-line input areas. | | |item.getStartLabel()|This method gets the value of the label displayed at the start of a numeric or choice slider.| | |item.getStopLabel()|This method gets the value of the label displayed at the end of a numeric or choice slider.| | |item.getStyle()|Returns the current value set for display style. Note: This parameter works only on Date and Time input fields. | | |item.getTitle()apItem.getTitle() |Returns the current value used as the field title.| | |item.getType()apItem.getType() |Returns a string identifying the object type.||Palette item|Type|Palette item|Type| |------------|----|------------|----| |Attachment|attachment|Paragraph Text|textArea| |Button|button|Password|password| |Check Box|checkBox|Section|section| |Currency|currency|Select Many|checkGroup| |Date|date|Select One|radioGroup| |Dropdown|comboBox|Single Line|text| |Email Address|emailAddress|Survey|survey| |Folder Tab|tabFolderTab|Survey Question|surveyQuestion| |HTML Fragment|htmlArea|Tabbed folder|tabFolder| |Image|image|Table|aggregationListContainer| |Line|horizontalLine|Text|richText| |Media|media|Time|time| |Number|number|Timestamp|timeStamp| |Numeric Slider|horizontalSlider|Web Link|staticWebLink| |Page|page|Website|weblink| |Page Navigation|pageNavigator|Name Picker|name| |Rich text|richTextArea|Data Grid|dataGrid| | |apItem.getValid()|Gets a value set previously using setValid().| | |item.getValue()apItem.getValue() |Returns the current value. Its type depends on the data type. For example, String [check and radio list objects return a delimited list with _#_ as the delimiter], Number [number, currency], Boolean , Date [date, timestamp, time], or Object [attachment]. | | |item.getVisible()apItem.getVisible() |Returns true if this item is visible (does not take into account which page is being shown) or false if it is hidden by a rule, stage, or JavaScript, or if its parent is hidden.| | |apItem.isMissing()|Returns true if this item is required and it has no value.| | |apItem.isRequired()|Returns true if the item is required, otherwise false.| | |apItem.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |item.removeClasses(classes)apItem.removeClasses(classes) |Removes a list of custom class names from an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` item.removeClasses(\"emphasized\"); | |item.setActive\\(active\\)apItem.setActive\\(active\\) |Sets whether this item is inactive, or read only. **Note:** If this item is made inactive by a rule or stage, then you cannot make it active with JavaScript. | | |item.setDisplayValue\\(pValue\\)apItem.setDisplayValue\\(pValue\\) |Takes a string or number in pValue. This method sets the value being displayed. If the user is editing, then it will update the value they are trying to enter. If the user is not editing, then it will be the same as setValue\\(\\). This method works on direct input items such as single line, multi line, number, currency, email and website.| | |item.setFocus\\(\\)apItem.setFocus\\(\\) |Causes this item to receive focus. This option has no effect on items that cannot have focus, are invisible, or are read-only.| | |item.setHintText\\(pValue\\)apItem.setHintText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for hover text on input items. If an empty value is provided, the hint text area is removed.| | |item.setHoverText\\(pValue\\)apItem.setHoverText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for **Hint** text on input items. If an empty value is provided, no hover help is displayed.| | |apItem.setRequired\\(required\\)|You can override non-required data to be required with this method. Passing true causes its data to be required and prevents submission if it is not set. Setting the valid to false clears any previously overridden value.| | |item.setRows\\(pValue\\)|Takes a pValue number. This method sets the number of rows the text area displays.**Note:** Whenever possible, do not exceed 40 rows. | | |item.setPlaceholderText\\(pValue\\)apItem.setPlaceholderText\\(pValue\\) |Takes a pValue string. This method sets the text used as placeholder text on input items.| | |item.setStartLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the start of a numeric or choice slider.| | |item.setStopLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the end of a numeric or choice slider.| | |item.setStyle\\(pValue\\)|Takes a pValue string. This method sets the style used to display time and dates. Valid values are numeric, short, medium, long, and full. Valid values for time are numeric, short and medium.| | |item.setTitle\\(pValue\\)apItem.setTitle\\(pValue\\) |Takes a pValue string. This method sets the text used for a field titles on input items. If an empty value is provided, the title is removed.| | |apItem.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. Passing false causes the data to be invalid, and prevents submission. You can optionally provide a custom error message. Setting the valid to true clears any previously overridden valid value.| | |item.setValue\\(pValue\\)apItem.setValue\\(pValue\\) |Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. **Note:** The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. | | |item.setVisible\\(visible\\)apItem.setVisible\\(visible\\) |Sets whether this item is visible. **Note:** If this item is made invisible by a rule or stage, or because a parent is hidden, then you cannot unhide it by calling this function. | | |apItem.validate\\(\\)|Triggers the validation of the data item.| | |item.getColumnHeaders\\(\\) |Returns a JSON object that contains the id, title and width of each header displayed for the table. Sample JSON output: [{id:\"F_Currency1\",title:\"La Currency\",width:20}, {id:\"F_Date1\",title:\"La Date\"}] |``` var headers = page.F_Table1.getColumnHeaders(); for(var h in headers) { alert(\"ID=\" + get(headers,h).id + \", title=\" + get(headers,h).title + \", width=\" + get(headers,h).width); } | |item.setColumnHeaders(headers) |Function accepts a JSON object that can be used to set the id, title and width of each column in the table. This is helpful, for example, to change the language of the column header displayed. |``` {#codeblock_hpl_rqh_hwb} var headers = new Array(); set(headers, 0, {id: \"F_Currency1\", title: \"La Currency\", width: 20}); set(headers, 1, {id: \"F_Date1\", title: \"La Date\"}); page.F_Table1.setColumnHeaders(headers); | |Object|Description|Example| |------|-----------|-------| |item.getOptions\\(\\)|Returns the array of options currently shown in the drop-down. Each object in the array has a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Get the title of a specific dropdown value:``` var displayedValue = \"\"; var savedValue = BO.F_DropDown1.getValue(); var opts = page.F_DropDown1.getOptions(); for(var i=0; i<opts.length; i++) { var opt = get(opts, i); if(opt.value === savedValue) { displayedValue = opt.title; break; } } | |item.setOptions(options)|Changes the list of options to show in the drop-down. It must be an array of objects. Each object must have a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Provide custom list for the drop-down:``` var options = new Array(); options.push({title:'Banana',value:'BA'}); options.push({title:'Apple',value:'AP'}); options.push({title:'Orange',value:'OR'}); item.setOptions(options); | |Object|Description| |------|-----------| |item.setDisplayValue\\(display\\)|Sets the display value that the user sees as the link in the browser.| |item.setLinkValue\\(link\\)|Sets the URL to which the link navigates when this item is clicked.| |Object|Description| |------|-----------| |item.getContent\\(\\)|Gets the currently shown content for this interface item.| |item.setContent\\(content\\)|Shows content in this interface only item. The content is evaluated as HTML code.| |Object|Description| |------|-----------| |item.setContent\\(content\\)|Shows content in this interface-only item. In Text, it is the raw text to show, no special formatting is supported.| |Object|Description| |------|-----------| |item.setAlternativeText\\(pText\\)|Sets the alt text of the image assigned to the button.| |item.setContent\\(content\\)|Sets the label that is shown on the button.| |item.setDisabledImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the button is disabled.| |item.setImageHeight\\(pHeight\\)|Sets explicit height in pixels for the image.| |item.setImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL.| |item.setImageWidth\\(pWidth\\)|Sets explicit width in pixels for the image.| |item.setMouseDownImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse down event is triggered.| |item.setMouseOverImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse over event is triggered.| |Object|Description| |------|-----------| |item.getHeight\\(\\)|Returns the current image height. Can be zero or blank.| |item.getURL\\(\\)|Gets the current URL shown by this image item.| |item.getWidth\\(\\)|Returns the current image width. Can be zero or blank.| |item.setHeight\\(height\\)|Sets explicit height in pixels for the image. Setting \u201c0\u201d removes the explicit height.| |item.setURL\\(newURL\\)|Sets the URL shown by this image item.| |item.setWidth\\(width\\)|Sets explicit width in pixels for the image. Setting \u201c0\u201d removes the explicit width.| |Object|Description| |------|-----------| |item.getExpanded\\(\\)|Returns true if the section is expanded and false if it is collapsed.| |item.setExpanded\\(expanded\\)|Sets the expanded state of the section. If true, the section is expanded. If false, then it is collapsed.| |Object|Description|Example| |------|-----------|-------| |item.getSelectionIndex\\(\\)|Returns the index of the currently selected tab.|Set 12 into the first item in the currently shown tab:``` var sel = item.getSelectionIndex(); var tabs = item.getChildren(); var selTab = tabs.get(sel); var tabChildren = selTab.getChildren(); tabChildren.get(0).getBOAttr().setValue(12); | |item.getTabTitleList()|Returns an array of all the tab titles in this folder.| | |item.setSelectedTab(tabTitle)|Takes a tabTable string. Selects the Tab that matches the tabTable string.| | |item.setTabTitle(tabIndex,pTitle)|Updates the title of a tab within a Tabbed Folder by using a tabIndex integer and pTitle string value. tabIndex denotes the location of the tab within the list of available tabs from left-to-right. For bidirectional languages, the order is right-to-left.|On the form, a Tabbed folder contains 5 tabs: Red, Orange, Yellow, Green, Blue. The default start number of the tabIndex is 0. In our example tabbed folder, the tabIndex number 0 is the Red tab which is furthest left, while 4 is the tab furthest to the right. In a bidirectional language, the order is reversed. Tab 0 is assigned to Blue, which is the tab furthest to the right. | |item.setTabTitleList(pTitleArray)|Updates the titles of tabs within a Tabbed Folder from a list of strings by using a pTitleArray array of string values. The list of tabs is updated respective to the order of strings that are defined in the array. If there are more array values than tabs in the form, the additional values are ignored.|``` item.setTabTitleList(['Monday','Tuesday','Wednesday','Thursday','Friday']); | |Object|Description|Example| |------|-----------|-------| |item.getSelection\\(\\)|Returns the Business Object of the selected row or null if there is no selection.| | |item.setSelection\\(BO\\)|Selects the last Business Object in the table.|Select that last row in the table:``` var lastIndex = item.getBOAttr().getLength()-1; var lastRow = item.getBOAttr().get(lastIndex); item.setSelection(lastRow); | |item.showAdd(show)|If show is true, then the Add button is made visible.If false, then the Add button is hidden. | | |item.showEdit(show)|If show is true, then the Edit button is made visible. If false, then the Edit button is hidden. | | |item.showRemove(show)|If show is true, then the Remove button is made visible. If false, then the Remove button is hidden. | | Object Description item.getOptions() Returns an array of all the options for the survey questions. Each option has a value property, that gets saved in the data, and a display property, the title of at the beginning of the survey. Object Description Example item.getDisplayedData() - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - uid : The identifier of the attachment. - filename : the file name of the attachment. - viewUrl : The url to view the attachment. - downloadUrl : The url to download the attachment. - Object: Name Picker - Object: Select Many - savedValues : An array of all the saved values. - displayValues : An array of all the display values. - displayString : All the list values provided as a comma-separated string. - String: All other items |Render all the row data displayed in the data grid as JSON: ``` {#codeblock_fzz_2dq_5qb} appPage.F_Text2.setContent(toJson(appPage.F_DataGrid1.getDisplayedData(), true)); Calculate the sum of a column from displayed data: ``` {#codeblock_znv_gdq_5qb} var data = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in data) { var dObj = get(data, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); | |item.isAllDataDisplayed()|Returns true if all the submitted data for the form connected to the data grid is rendered on screen in a single page.|If all the known data is being displayed, then do something with that data. In this example the sum of a column is calculated: if(appPage.F_DataGrid1.isAllDataDisplayed()) { var allData = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in allData) { var dObj = get(allData, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); } | |item.isColumnVisible(columnId)|Returns true if the specified column is visible in the data grid.|``` {#codeblock_zyh_s3q_5qb} appPage.F_DataGrid1.isColumnVisble(\u201cF_SingleLine1\u201d); | |item.refresh\\(\\)|Forces the data grid to reload. For example, a submission with \u201capps as a service\u201d may have been triggered and the content in the data grid is stale.|Refresh the data grid after calling a service that changes \\(i.e. adds to, removes from, or updates\\) the data to which the data grid is connected: ``` {#codeblock_csc_x3q_5qb} var srv = form.getServiceConfiguration('SC_theService'); srv.connectEvent(\"onCallFinished\", function(success) { if(success) { try { appPage.F_DataGrid1.refresh(); } catch (err) { alert(\"SC_theService: \" + err); } } }); | |item.selectFirstRow()|Selects the first row in the data grid.| | |item.setColumnHeader(columnId, pHeaderValue)|Sets the header identified by columnId, to the value provided in pHeaderValue.|See above for columnId values. Set the header of a column to another language: ``` {#codeblock_rt3_djq_5qb} appPage.F_DataGrid1.setColumnHeader(\"createdBy\", \"Cr\u00e9\u00e9 par\"); | |item.setColumnVisible\\(columnId, boolVal\\)|Controls the visibility of the column identified by columnId. If boolVal is true, the column is shown. If boolVal is false, the column is hidden.|See above for columnId values. Hide a column from the data grid if user is not part of a specific role: ``` {#codeblock_dz3_3jq_5qb} var isAdmin = app.getCurrentUserRoles().contains(\"Administrator\"); item.setColumnVisible(\"F_AdminOnly1\", isAdmin); | |item.resetFilters()|Returns the filters to what was specified in the data grid configuration.| | |item.setFilters([filter], filterOp)|Set filters for the data grid, this will override any filters specified in the data grid configuration. [filter] is an array of filter objects. filterOp is either \u201cand\u201d or \u201cor\u201d and is required if there is more than one filter. A filter is made up of the following: name: the id of a meta-data attribute or a field of the form configured to the data grid. Note: The field id does not have to be displayed in the data grid. operator: as documented in Filtering Data REST API results . value: the value to search |Set a filter to show records that are older than one week and in the \u201cST_Triage\u201d stage: ``` {#codeblock_ls3_yjq_5qb} var now = new Date(); var aWeekAgo = new Date (now.getTime() - (7 24 60 60 1000)); var filters = [ {name : \"created\", operator: \"before\", value: aWeekAgo}, {name: \"stageId\", operator: \"equals\", value: \"ST_Triage\"} ]; page.F_DataGrid1.setFilters(filters, \"and\"); Set a filter to show records between two dates, from fields on the same app page as the data grid: ``` {#codeblock_kp5_5ls_lsb} var filters = [ {name: \"F_BirthDate\", operator: \"between\", value: [appPage.F_StartDate.getValue(), appPage.F_EndDate.getValue()]} ]; appPage.F_DataGrid2.setFilters(filters, \"and\"); Remove all filters: {#codeblock_nyv_zjq_5qb} appPage.F_DataGrid1.setFilters(null); | Parent topic: Interface objects","title":"Item objects"},{"location":"ref_item_objects.html#ref_item_objects","text":"Note: The item.setTitle parameter is not applicable to Tabbed Folder form items. Object Description Example item.addClasses(classes)apItem.addClasses(classes) |Adds a list of custom class names to an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned.|``` item.addClasses(\"emphasized error\"); | |item.clearRequiredMessage\\(\\)apItem.clearRequiredMessage\\(\\) |Validates the item data, but prevents the required error message from displaying.| | |item.connectEvent\\(eventName,callbackFunction\\)apItem.connectEvent\\(eventName,callbackFunction\\) |Connects a function to an event on the item. Useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the item dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using item.disconnectEvent.|Connect a listener to the **onItemChange** event to make a section visible. This could be placed in the form **onLoad** event: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } }); | |item.disconnectEvent(eventHandle)apItem.disconnectEvent(eventHandle) |Disconnects the event handler specified by the passed-in event handle object that was returned by an item.connectEvent call.If you connect an item event, you must also disconnect it in the same event. Otherwise, multiple versions of the connected code are attached every time the event is triggered. |If the connect event is placed in the item onShow then the listener needs to be disconnected: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } item.disconnectEvent(hndl); }); | |item.getActive\\(\\)apItem.getActive\\(\\) |Returns true if this item is active, or false if it is made read only by a rule, stage, or JavaScript.| | |apItem.getAppPage\\(\\)|Returns the page object to which this item belongs.| | |item.getBO\\(\\)|Returns the Business Object for the entire form.| | |item.getBOAttr\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.|Get data for an item and set its value:``` item.getBOAttr().setValue(45); | |item.getChildren()|If this item contains children, for example Section, or Tab Folder, it returns a list object that provides access to all direct children items. The list object has the getLength() function and get(index) function for accessing the objects in the list.|Rest all numbers inside a section to 0:``` var list = item.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'number') list.get(i).getBOAttr().setValue(0); } | |item.getClasses\\(\\)apItem.getClasses\\(\\) |Returns an Array of custom class names currently applied to an item.| | |item.getDisplayValue\\(\\)apItem.getDisplayValue\\(\\) |Returns the current value that is being displayed. It can be used in onItemLiveChange to get current, but not yet committed value.| | |item.getHoverText\\(\\)apItem.getHoverText\\(\\) |Returns the current value set as hover text.| | |item.getHintText\\(\\)apItem.getHintText\\(\\) |Returns the value set as **Hint** text.| | |item.getId\\(\\)apItem.getId\\(\\) |Returns the unique ID, within the application, of this item. For example, F\\_FirstName.| | |apItem.getInvalidMessage\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.| | |item.getPage\\(\\)|Returns the page object to which this item belongs.|Get the form object:``` var form = item.getPage().getForm(); | |item.getParent()apItem.getParent() |Returns the object that is the direct parent of the item, which can be a page, section, or tab folder.| | |item.getPlaceholderText()apItem.getPlaceholderText() |Returns the current value set as place holder text.| | |apItem.getRequired()|Gets a value set previously using setRequired().| | |item.getRows()|Returns the current value set as the number of rows displayed. This method gets the number of rows the text area displayed. Note: This parameter works only on multi-line input areas. | | |item.getStartLabel()|This method gets the value of the label displayed at the start of a numeric or choice slider.| | |item.getStopLabel()|This method gets the value of the label displayed at the end of a numeric or choice slider.| | |item.getStyle()|Returns the current value set for display style. Note: This parameter works only on Date and Time input fields. | | |item.getTitle()apItem.getTitle() |Returns the current value used as the field title.| | |item.getType()apItem.getType() |Returns a string identifying the object type.||Palette item|Type|Palette item|Type| |------------|----|------------|----| |Attachment|attachment|Paragraph Text|textArea| |Button|button|Password|password| |Check Box|checkBox|Section|section| |Currency|currency|Select Many|checkGroup| |Date|date|Select One|radioGroup| |Dropdown|comboBox|Single Line|text| |Email Address|emailAddress|Survey|survey| |Folder Tab|tabFolderTab|Survey Question|surveyQuestion| |HTML Fragment|htmlArea|Tabbed folder|tabFolder| |Image|image|Table|aggregationListContainer| |Line|horizontalLine|Text|richText| |Media|media|Time|time| |Number|number|Timestamp|timeStamp| |Numeric Slider|horizontalSlider|Web Link|staticWebLink| |Page|page|Website|weblink| |Page Navigation|pageNavigator|Name Picker|name| |Rich text|richTextArea|Data Grid|dataGrid| | |apItem.getValid()|Gets a value set previously using setValid().| | |item.getValue()apItem.getValue() |Returns the current value. Its type depends on the data type. For example, String [check and radio list objects return a delimited list with _#_ as the delimiter], Number [number, currency], Boolean , Date [date, timestamp, time], or Object [attachment]. | | |item.getVisible()apItem.getVisible() |Returns true if this item is visible (does not take into account which page is being shown) or false if it is hidden by a rule, stage, or JavaScript, or if its parent is hidden.| | |apItem.isMissing()|Returns true if this item is required and it has no value.| | |apItem.isRequired()|Returns true if the item is required, otherwise false.| | |apItem.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |item.removeClasses(classes)apItem.removeClasses(classes) |Removes a list of custom class names from an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` item.removeClasses(\"emphasized\"); | |item.setActive\\(active\\)apItem.setActive\\(active\\) |Sets whether this item is inactive, or read only. **Note:** If this item is made inactive by a rule or stage, then you cannot make it active with JavaScript. | | |item.setDisplayValue\\(pValue\\)apItem.setDisplayValue\\(pValue\\) |Takes a string or number in pValue. This method sets the value being displayed. If the user is editing, then it will update the value they are trying to enter. If the user is not editing, then it will be the same as setValue\\(\\). This method works on direct input items such as single line, multi line, number, currency, email and website.| | |item.setFocus\\(\\)apItem.setFocus\\(\\) |Causes this item to receive focus. This option has no effect on items that cannot have focus, are invisible, or are read-only.| | |item.setHintText\\(pValue\\)apItem.setHintText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for hover text on input items. If an empty value is provided, the hint text area is removed.| | |item.setHoverText\\(pValue\\)apItem.setHoverText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for **Hint** text on input items. If an empty value is provided, no hover help is displayed.| | |apItem.setRequired\\(required\\)|You can override non-required data to be required with this method. Passing true causes its data to be required and prevents submission if it is not set. Setting the valid to false clears any previously overridden value.| | |item.setRows\\(pValue\\)|Takes a pValue number. This method sets the number of rows the text area displays.**Note:** Whenever possible, do not exceed 40 rows. | | |item.setPlaceholderText\\(pValue\\)apItem.setPlaceholderText\\(pValue\\) |Takes a pValue string. This method sets the text used as placeholder text on input items.| | |item.setStartLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the start of a numeric or choice slider.| | |item.setStopLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the end of a numeric or choice slider.| | |item.setStyle\\(pValue\\)|Takes a pValue string. This method sets the style used to display time and dates. Valid values are numeric, short, medium, long, and full. Valid values for time are numeric, short and medium.| | |item.setTitle\\(pValue\\)apItem.setTitle\\(pValue\\) |Takes a pValue string. This method sets the text used for a field titles on input items. If an empty value is provided, the title is removed.| | |apItem.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. Passing false causes the data to be invalid, and prevents submission. You can optionally provide a custom error message. Setting the valid to true clears any previously overridden valid value.| | |item.setValue\\(pValue\\)apItem.setValue\\(pValue\\) |Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. **Note:** The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. | | |item.setVisible\\(visible\\)apItem.setVisible\\(visible\\) |Sets whether this item is visible. **Note:** If this item is made invisible by a rule or stage, or because a parent is hidden, then you cannot unhide it by calling this function. | | |apItem.validate\\(\\)|Triggers the validation of the data item.| | |item.getColumnHeaders\\(\\) |Returns a JSON object that contains the id, title and width of each header displayed for the table. Sample JSON output: [{id:\"F_Currency1\",title:\"La Currency\",width:20}, {id:\"F_Date1\",title:\"La Date\"}] |``` var headers = page.F_Table1.getColumnHeaders(); for(var h in headers) { alert(\"ID=\" + get(headers,h).id + \", title=\" + get(headers,h).title + \", width=\" + get(headers,h).width); } | |item.setColumnHeaders(headers) |Function accepts a JSON object that can be used to set the id, title and width of each column in the table. This is helpful, for example, to change the language of the column header displayed. |``` {#codeblock_hpl_rqh_hwb} var headers = new Array(); set(headers, 0, {id: \"F_Currency1\", title: \"La Currency\", width: 20}); set(headers, 1, {id: \"F_Date1\", title: \"La Date\"}); page.F_Table1.setColumnHeaders(headers); | |Object|Description|Example| |------|-----------|-------| |item.getOptions\\(\\)|Returns the array of options currently shown in the drop-down. Each object in the array has a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Get the title of a specific dropdown value:``` var displayedValue = \"\"; var savedValue = BO.F_DropDown1.getValue(); var opts = page.F_DropDown1.getOptions(); for(var i=0; i<opts.length; i++) { var opt = get(opts, i); if(opt.value === savedValue) { displayedValue = opt.title; break; } } | |item.setOptions(options)|Changes the list of options to show in the drop-down. It must be an array of objects. Each object must have a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Provide custom list for the drop-down:``` var options = new Array(); options.push({title:'Banana',value:'BA'}); options.push({title:'Apple',value:'AP'}); options.push({title:'Orange',value:'OR'}); item.setOptions(options); | |Object|Description| |------|-----------| |item.setDisplayValue\\(display\\)|Sets the display value that the user sees as the link in the browser.| |item.setLinkValue\\(link\\)|Sets the URL to which the link navigates when this item is clicked.| |Object|Description| |------|-----------| |item.getContent\\(\\)|Gets the currently shown content for this interface item.| |item.setContent\\(content\\)|Shows content in this interface only item. The content is evaluated as HTML code.| |Object|Description| |------|-----------| |item.setContent\\(content\\)|Shows content in this interface-only item. In Text, it is the raw text to show, no special formatting is supported.| |Object|Description| |------|-----------| |item.setAlternativeText\\(pText\\)|Sets the alt text of the image assigned to the button.| |item.setContent\\(content\\)|Sets the label that is shown on the button.| |item.setDisabledImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the button is disabled.| |item.setImageHeight\\(pHeight\\)|Sets explicit height in pixels for the image.| |item.setImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL.| |item.setImageWidth\\(pWidth\\)|Sets explicit width in pixels for the image.| |item.setMouseDownImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse down event is triggered.| |item.setMouseOverImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse over event is triggered.| |Object|Description| |------|-----------| |item.getHeight\\(\\)|Returns the current image height. Can be zero or blank.| |item.getURL\\(\\)|Gets the current URL shown by this image item.| |item.getWidth\\(\\)|Returns the current image width. Can be zero or blank.| |item.setHeight\\(height\\)|Sets explicit height in pixels for the image. Setting \u201c0\u201d removes the explicit height.| |item.setURL\\(newURL\\)|Sets the URL shown by this image item.| |item.setWidth\\(width\\)|Sets explicit width in pixels for the image. Setting \u201c0\u201d removes the explicit width.| |Object|Description| |------|-----------| |item.getExpanded\\(\\)|Returns true if the section is expanded and false if it is collapsed.| |item.setExpanded\\(expanded\\)|Sets the expanded state of the section. If true, the section is expanded. If false, then it is collapsed.| |Object|Description|Example| |------|-----------|-------| |item.getSelectionIndex\\(\\)|Returns the index of the currently selected tab.|Set 12 into the first item in the currently shown tab:``` var sel = item.getSelectionIndex(); var tabs = item.getChildren(); var selTab = tabs.get(sel); var tabChildren = selTab.getChildren(); tabChildren.get(0).getBOAttr().setValue(12); | |item.getTabTitleList()|Returns an array of all the tab titles in this folder.| | |item.setSelectedTab(tabTitle)|Takes a tabTable string. Selects the Tab that matches the tabTable string.| | |item.setTabTitle(tabIndex,pTitle)|Updates the title of a tab within a Tabbed Folder by using a tabIndex integer and pTitle string value. tabIndex denotes the location of the tab within the list of available tabs from left-to-right. For bidirectional languages, the order is right-to-left.|On the form, a Tabbed folder contains 5 tabs: Red, Orange, Yellow, Green, Blue. The default start number of the tabIndex is 0. In our example tabbed folder, the tabIndex number 0 is the Red tab which is furthest left, while 4 is the tab furthest to the right. In a bidirectional language, the order is reversed. Tab 0 is assigned to Blue, which is the tab furthest to the right. | |item.setTabTitleList(pTitleArray)|Updates the titles of tabs within a Tabbed Folder from a list of strings by using a pTitleArray array of string values. The list of tabs is updated respective to the order of strings that are defined in the array. If there are more array values than tabs in the form, the additional values are ignored.|``` item.setTabTitleList(['Monday','Tuesday','Wednesday','Thursday','Friday']); | |Object|Description|Example| |------|-----------|-------| |item.getSelection\\(\\)|Returns the Business Object of the selected row or null if there is no selection.| | |item.setSelection\\(BO\\)|Selects the last Business Object in the table.|Select that last row in the table:``` var lastIndex = item.getBOAttr().getLength()-1; var lastRow = item.getBOAttr().get(lastIndex); item.setSelection(lastRow); | |item.showAdd(show)|If show is true, then the Add button is made visible.If false, then the Add button is hidden. | | |item.showEdit(show)|If show is true, then the Edit button is made visible. If false, then the Edit button is hidden. | | |item.showRemove(show)|If show is true, then the Remove button is made visible. If false, then the Remove button is hidden. | | Object Description item.getOptions() Returns an array of all the options for the survey questions. Each option has a value property, that gets saved in the data, and a display property, the title of at the beginning of the survey. Object Description Example item.getDisplayedData() - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - uid : The identifier of the attachment. - filename : the file name of the attachment. - viewUrl : The url to view the attachment. - downloadUrl : The url to download the attachment. - Object: Name Picker - Object: Select Many - savedValues : An array of all the saved values. - displayValues : An array of all the display values. - displayString : All the list values provided as a comma-separated string. - String: All other items |Render all the row data displayed in the data grid as JSON: ``` {#codeblock_fzz_2dq_5qb} appPage.F_Text2.setContent(toJson(appPage.F_DataGrid1.getDisplayedData(), true)); Calculate the sum of a column from displayed data: ``` {#codeblock_znv_gdq_5qb} var data = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in data) { var dObj = get(data, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); | |item.isAllDataDisplayed()|Returns true if all the submitted data for the form connected to the data grid is rendered on screen in a single page.|If all the known data is being displayed, then do something with that data. In this example the sum of a column is calculated: if(appPage.F_DataGrid1.isAllDataDisplayed()) { var allData = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in allData) { var dObj = get(allData, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); } | |item.isColumnVisible(columnId)|Returns true if the specified column is visible in the data grid.|``` {#codeblock_zyh_s3q_5qb} appPage.F_DataGrid1.isColumnVisble(\u201cF_SingleLine1\u201d); | |item.refresh\\(\\)|Forces the data grid to reload. For example, a submission with \u201capps as a service\u201d may have been triggered and the content in the data grid is stale.|Refresh the data grid after calling a service that changes \\(i.e. adds to, removes from, or updates\\) the data to which the data grid is connected: ``` {#codeblock_csc_x3q_5qb} var srv = form.getServiceConfiguration('SC_theService'); srv.connectEvent(\"onCallFinished\", function(success) { if(success) { try { appPage.F_DataGrid1.refresh(); } catch (err) { alert(\"SC_theService: \" + err); } } }); | |item.selectFirstRow()|Selects the first row in the data grid.| | |item.setColumnHeader(columnId, pHeaderValue)|Sets the header identified by columnId, to the value provided in pHeaderValue.|See above for columnId values. Set the header of a column to another language: ``` {#codeblock_rt3_djq_5qb} appPage.F_DataGrid1.setColumnHeader(\"createdBy\", \"Cr\u00e9\u00e9 par\"); | |item.setColumnVisible\\(columnId, boolVal\\)|Controls the visibility of the column identified by columnId. If boolVal is true, the column is shown. If boolVal is false, the column is hidden.|See above for columnId values. Hide a column from the data grid if user is not part of a specific role: ``` {#codeblock_dz3_3jq_5qb} var isAdmin = app.getCurrentUserRoles().contains(\"Administrator\"); item.setColumnVisible(\"F_AdminOnly1\", isAdmin); | |item.resetFilters()|Returns the filters to what was specified in the data grid configuration.| | |item.setFilters([filter], filterOp)|Set filters for the data grid, this will override any filters specified in the data grid configuration. [filter] is an array of filter objects. filterOp is either \u201cand\u201d or \u201cor\u201d and is required if there is more than one filter. A filter is made up of the following: name: the id of a meta-data attribute or a field of the form configured to the data grid. Note: The field id does not have to be displayed in the data grid. operator: as documented in Filtering Data REST API results . value: the value to search |Set a filter to show records that are older than one week and in the \u201cST_Triage\u201d stage: ``` {#codeblock_ls3_yjq_5qb} var now = new Date(); var aWeekAgo = new Date (now.getTime() - (7 24 60 60 1000)); var filters = [ {name : \"created\", operator: \"before\", value: aWeekAgo}, {name: \"stageId\", operator: \"equals\", value: \"ST_Triage\"} ]; page.F_DataGrid1.setFilters(filters, \"and\"); Set a filter to show records between two dates, from fields on the same app page as the data grid: ``` {#codeblock_kp5_5ls_lsb} var filters = [ {name: \"F_BirthDate\", operator: \"between\", value: [appPage.F_StartDate.getValue(), appPage.F_EndDate.getValue()]} ]; appPage.F_DataGrid2.setFilters(filters, \"and\"); Remove all filters: {#codeblock_nyv_zjq_5qb} appPage.F_DataGrid1.setFilters(null); | Parent topic: Interface objects","title":"Item objects"},{"location":"ref_javascript_api.html","text":"JavaScript API JavaScript\u2122 API Structure Leap JavaScript API structure. The graphic provides a high-level view of the JavaScript API object structure at run time. The Form interface is created once when the application is loaded into the browser, and is then reused every time form data needs to be displayed. The Form Data Business Object is dynamic and is loaded into the user interface each time a form is loaded or created. Usage Details: This library follows a security protocol as defined in Securing Leap overview . For applications with multiple forms, only the form user interface displayed has a Business Object assigned to it. The other forms are hidden, and do not point to data. Tables point to a data element that is a list of Business Object data instances. These Business Object elements are of the same structure as the Business Objects used for a full form. The sub form that you create for editing the table data works only on one item in this list at a time. When it is not in use, it is hidden and does not point to any data. Interface Model Application : The application is the parent that contains forms. It provides a few useful general functions and can be used to get access to any of the forms. Although you can get access to all the forms, only the form currently being displayed has a data Business Object and can have its user interface modified. Forms : There can be any number of forms in an application. Each form contains one or more pages that contain the items. There is a Business Object for each form that holds the data contained in the form. Pages : Pages contain items that collect and display the information for the form. All items on a page can be accessed as properties directly on the page, for example, page.F_MySingleLineitem.setVisible(false);. Each item is accessed by its ID, which can be found in the composer by opening the item\u2019s Edit Properties dialog and going to the Advanced tab. Items : There are two types of items on a form: those that collect data, for example, Single Line Field and Timestamp, and those that do not, including Image, Text, and Section. Any item that collects data is associated with a Business Object Attribute that contains this data. Data Model Business Object : The Business Object contains all the data for a particular form. This data is contained in a Business Object Attribute for each data item contained in the form. These options can be accessed using the following syntax: ``` BO.F_MySingleLineitem ``` Each Business Object Attribute is accessed by its ID, which is found in the composer by opening the item\u2019s **Edit Properties** dialog and going to the **Advanced** tab. Business Object Attribute : Each item that is mapped to data has its own Business Object Attribute. The Business Object Attribute contains this data. **Note:** Some items do not collect data. These items do not have a corresponding Business Object Attributes in the Business Object. For example: PageNavigation. Running Custom JavaScript \u2013 Events Custom JavaScript is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Running Custom JavaScript Files Custom JavaScript can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Reference Objects and Functions Describes the Functions available on different parts of the HCL Leap object model. Parent topic: Reference","title":"JavaScript API"},{"location":"ref_javascript_api.html#ref_jsapi","text":"","title":"JavaScript API"},{"location":"ref_javascript_api.html#javascripttm-api-structure","text":"Leap JavaScript API structure. The graphic provides a high-level view of the JavaScript API object structure at run time. The Form interface is created once when the application is loaded into the browser, and is then reused every time form data needs to be displayed. The Form Data Business Object is dynamic and is loaded into the user interface each time a form is loaded or created. Usage Details: This library follows a security protocol as defined in Securing Leap overview . For applications with multiple forms, only the form user interface displayed has a Business Object assigned to it. The other forms are hidden, and do not point to data. Tables point to a data element that is a list of Business Object data instances. These Business Object elements are of the same structure as the Business Objects used for a full form. The sub form that you create for editing the table data works only on one item in this list at a time. When it is not in use, it is hidden and does not point to any data.","title":"JavaScript\u2122 API Structure"},{"location":"ref_javascript_api.html#interface-model","text":"Application : The application is the parent that contains forms. It provides a few useful general functions and can be used to get access to any of the forms. Although you can get access to all the forms, only the form currently being displayed has a data Business Object and can have its user interface modified. Forms : There can be any number of forms in an application. Each form contains one or more pages that contain the items. There is a Business Object for each form that holds the data contained in the form. Pages : Pages contain items that collect and display the information for the form. All items on a page can be accessed as properties directly on the page, for example, page.F_MySingleLineitem.setVisible(false);. Each item is accessed by its ID, which can be found in the composer by opening the item\u2019s Edit Properties dialog and going to the Advanced tab. Items : There are two types of items on a form: those that collect data, for example, Single Line Field and Timestamp, and those that do not, including Image, Text, and Section. Any item that collects data is associated with a Business Object Attribute that contains this data.","title":"Interface Model"},{"location":"ref_javascript_api.html#data-model","text":"Business Object : The Business Object contains all the data for a particular form. This data is contained in a Business Object Attribute for each data item contained in the form. These options can be accessed using the following syntax: ``` BO.F_MySingleLineitem ``` Each Business Object Attribute is accessed by its ID, which is found in the composer by opening the item\u2019s **Edit Properties** dialog and going to the **Advanced** tab. Business Object Attribute : Each item that is mapped to data has its own Business Object Attribute. The Business Object Attribute contains this data. **Note:** Some items do not collect data. These items do not have a corresponding Business Object Attributes in the Business Object. For example: PageNavigation. Running Custom JavaScript \u2013 Events Custom JavaScript is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Running Custom JavaScript Files Custom JavaScript can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Reference Objects and Functions Describes the Functions available on different parts of the HCL Leap object model. Parent topic: Reference","title":"Data Model"},{"location":"ref_jsapi_application_events.html","text":"Application Events This topic describes the Application Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There is one event at the application level in Settings > Events that is called from the context of the application, regardless of what form is going to be displayed. Table 1. JavaScript\u2122 objects available in application events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.getCurrentUser(); GUI Table 2. Application Events Event Description Example onStart Called once when the browser is first loaded with your application. You can access the form\u2019s interface model for attaching programmatic events. However, nothing else on the form is modified because the forms have not been displayed to the user, nor have they had any data attached. - Create a global function for later use: app.getSharedData().messageBox = function( { alert(\"Warning: \" +message); }; - Register a function to be called that shows a section when a Service finishes: var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration('SC_ServiceConfig0'); serviceConfig.connectEvent('onCallFinished', function(success) { form.getPage('P_Page1').F_Section1.setVisible(true); }); Parent topic: Running Custom JavaScript \u2013 Events","title":"Application Events"},{"location":"ref_jsapi_application_events.html#application-events","text":"This topic describes the Application Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There is one event at the application level in Settings > Events that is called from the context of the application, regardless of what form is going to be displayed. Table 1. JavaScript\u2122 objects available in application events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.getCurrentUser(); GUI Table 2. Application Events Event Description Example onStart Called once when the browser is first loaded with your application. You can access the form\u2019s interface model for attaching programmatic events. However, nothing else on the form is modified because the forms have not been displayed to the user, nor have they had any data attached. - Create a global function for later use: app.getSharedData().messageBox = function( { alert(\"Warning: \" +message); }; - Register a function to be called that shows a section when a Service finishes: var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration('SC_ServiceConfig0'); serviceConfig.connectEvent('onCallFinished', function(success) { form.getPage('P_Page1').F_Section1.setVisible(true); }); Parent topic: Running Custom JavaScript \u2013 Events","title":"Application Events"},{"location":"ref_jsapi_form_events.html","text":"Form Events This topic describes the Form Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a form that are accessed from the forms Edit Properties dialog. Table 1. JavaScript\u2122 objects available in form events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI BO Business Object object Top level data object for the form. BO.F_Username.getValue(); DATA Table 2. Form Events Event Description Example afterSave Called after the form is submitted or saved to the server. Changes made to the form in this event are lost, as it was already submitted. Custom alert message: alert(\u201cThank you for submitting\u201d + app.getCurrentUser()); beforeSave Called just before the form is about to be submitted to the server. Any changes to data in the form are saved. Make a field lowercase before submission: BO.F_tag.setValue(BO.F_tag.getValue().toLowerCase()); onDataReceived Applicable only when the form is hosted inside IBM\u00ae WebSphere\u00ae Portal. This event is called when the form receives data from another portlet. The data is provided with the pData parameter, which is a string containing arbitrary data passed in by portal. Update Info Message: form.getPage('P_Page1').F_Info.setContent(pData); onHide Called after the form is hidden. onDestruct Same as onHide. Legacy event. onLoad Called after data Business Object is attached to the Form, and its values loaded into the interface, whether it is a new form or an existing form. If the form is new, this event is called after onNew. Update the current Datetime into a Timestamp item: BO.F_Date.setValue(new Date()); onNew Called when a blank form is created, and after the default values are loaded. Ideal location to pre-populate, or do first time setup of data. Populate an item with the current user: BO.F_User.setValue(app.getCurrentUser()); onShow Called after the form is shown. This can occur after onNew and onLoad. onShowActionButtons Called after the stage action buttons are created and shown. validateButtonPressed Called after every stage action button is pressed and the ID of the button is passed in as the pActionId parameter. Returning false in this event cancels the action taken by the button press. Verify the user is cancelling: if(pActionId === 'S_Cancel') { if(confirm('Are you sure you want to cancel?')) return true; return false; } Parent topic: Running Custom JavaScript \u2013 Events","title":"Form Events"},{"location":"ref_jsapi_form_events.html#form-events","text":"This topic describes the Form Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a form that are accessed from the forms Edit Properties dialog. Table 1. JavaScript\u2122 objects available in form events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI BO Business Object object Top level data object for the form. BO.F_Username.getValue(); DATA Table 2. Form Events Event Description Example afterSave Called after the form is submitted or saved to the server. Changes made to the form in this event are lost, as it was already submitted. Custom alert message: alert(\u201cThank you for submitting\u201d + app.getCurrentUser()); beforeSave Called just before the form is about to be submitted to the server. Any changes to data in the form are saved. Make a field lowercase before submission: BO.F_tag.setValue(BO.F_tag.getValue().toLowerCase()); onDataReceived Applicable only when the form is hosted inside IBM\u00ae WebSphere\u00ae Portal. This event is called when the form receives data from another portlet. The data is provided with the pData parameter, which is a string containing arbitrary data passed in by portal. Update Info Message: form.getPage('P_Page1').F_Info.setContent(pData); onHide Called after the form is hidden. onDestruct Same as onHide. Legacy event. onLoad Called after data Business Object is attached to the Form, and its values loaded into the interface, whether it is a new form or an existing form. If the form is new, this event is called after onNew. Update the current Datetime into a Timestamp item: BO.F_Date.setValue(new Date()); onNew Called when a blank form is created, and after the default values are loaded. Ideal location to pre-populate, or do first time setup of data. Populate an item with the current user: BO.F_User.setValue(app.getCurrentUser()); onShow Called after the form is shown. This can occur after onNew and onLoad. onShowActionButtons Called after the stage action buttons are created and shown. validateButtonPressed Called after every stage action button is pressed and the ID of the button is passed in as the pActionId parameter. Returning false in this event cancels the action taken by the button press. Verify the user is cancelling: if(pActionId === 'S_Cancel') { if(confirm('Are you sure you want to cancel?')) return true; return false; } Parent topic: Running Custom JavaScript \u2013 Events","title":"Form Events"},{"location":"ref_jsapi_item_events.html","text":"Item Events This topic describes the Item Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on an item that is accessed from the item Edit Properties dialog. Table 1. JavaScript\u2122 objects available in item events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI item Item object The object representing the current item item.setVisible(true); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA BOA Business Object Attribute object Object representing the Data for the current item. Only present for data items BOA.setValue(\"Please enter your Name\"); DATA Table 2. Item Events Event Description onClick Called every time that the item is selected by the user. onHide Called every time that the item is hidden, whether just itself or the entire page. onInvalid (only data items) Called when a data item goes from being valid to invalid. onItemBlur Called when the item is blurred (focus is lost). onItemChange Called when the item data is changed and saved into the Business Object. For some types of items, it occurs when the user tabs or switches focus, for example, when users select Number, Single Line, Multi-Line, and Currency form items. For other items, it occurs every time they make a change, such as Check Box, Survey, or drop-down. Note: You cannot change the value of an item within this event as its value has changed, and it is locked. onItemFocus Called when focus is received by an item. onItemLiveChange (items which can be incrementally changed) Called every time data is entered but not yet updated to the Business Object, such as Number, Single Line, Multi-Line, and Currency. onMouseOut Called every time the mouse moves out of the item bounding area (not including label). onMouseOver Called every time the mouse moves into the item bounding area (not including label). onShow Called every time the item goes from being hidden to being shown, whether from a page flip or because of a rule or JavaScript change. onValid (only data items) Called when a data item goes from being invalid to valid. Table 3. Item Events - Table only Event Description Example onAdd This event is called after an entry is added to the table. The newly added item data is available from the variable itemBO. Add a value from the new row to a subtotal field: var curValue = BO.F_Total.getValue(); curValue += itemBO.F_Price.getValue(); BO.F_Total.setValue(curValue); onEdit Called after an existing row is edited by the user. The item that was edited is available from the variable itemBO. onRemove Called after a row is deleted from the table by the user. The item that was deleted is available from the variable itemBO. Table 4. Item Events - Tabbed Folder only Event Description onTabSelected Called after a tab is selected. Table 5. Item Events - Section only Event Description onCollapse Called when the section is collapsed. onExpand Called when the section is expanded. Table 6. beforeOptionsUpdate Event Description Example beforeOptionsUpdate This event is called before the options in a drop-down list are updated from a service call or from an API call. The array of options is passed in as pOptions and can be modified by the event code. By default, when a new options list is set into a drop-down list and the current selected item is not in the new list, it is added into the new list automatically. If you return false from this event, it does not copy the missing option into the new list. pOptions.push({title:'Pizza', value:'fooditem3'}); return false; Parent topic: Running Custom JavaScript \u2013 Events","title":"Item Events"},{"location":"ref_jsapi_item_events.html#item-events","text":"This topic describes the Item Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on an item that is accessed from the item Edit Properties dialog. Table 1. JavaScript\u2122 objects available in item events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI item Item object The object representing the current item item.setVisible(true); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA BOA Business Object Attribute object Object representing the Data for the current item. Only present for data items BOA.setValue(\"Please enter your Name\"); DATA Table 2. Item Events Event Description onClick Called every time that the item is selected by the user. onHide Called every time that the item is hidden, whether just itself or the entire page. onInvalid (only data items) Called when a data item goes from being valid to invalid. onItemBlur Called when the item is blurred (focus is lost). onItemChange Called when the item data is changed and saved into the Business Object. For some types of items, it occurs when the user tabs or switches focus, for example, when users select Number, Single Line, Multi-Line, and Currency form items. For other items, it occurs every time they make a change, such as Check Box, Survey, or drop-down. Note: You cannot change the value of an item within this event as its value has changed, and it is locked. onItemFocus Called when focus is received by an item. onItemLiveChange (items which can be incrementally changed) Called every time data is entered but not yet updated to the Business Object, such as Number, Single Line, Multi-Line, and Currency. onMouseOut Called every time the mouse moves out of the item bounding area (not including label). onMouseOver Called every time the mouse moves into the item bounding area (not including label). onShow Called every time the item goes from being hidden to being shown, whether from a page flip or because of a rule or JavaScript change. onValid (only data items) Called when a data item goes from being invalid to valid. Table 3. Item Events - Table only Event Description Example onAdd This event is called after an entry is added to the table. The newly added item data is available from the variable itemBO. Add a value from the new row to a subtotal field: var curValue = BO.F_Total.getValue(); curValue += itemBO.F_Price.getValue(); BO.F_Total.setValue(curValue); onEdit Called after an existing row is edited by the user. The item that was edited is available from the variable itemBO. onRemove Called after a row is deleted from the table by the user. The item that was deleted is available from the variable itemBO. Table 4. Item Events - Tabbed Folder only Event Description onTabSelected Called after a tab is selected. Table 5. Item Events - Section only Event Description onCollapse Called when the section is collapsed. onExpand Called when the section is expanded. Table 6. beforeOptionsUpdate Event Description Example beforeOptionsUpdate This event is called before the options in a drop-down list are updated from a service call or from an API call. The array of options is passed in as pOptions and can be modified by the event code. By default, when a new options list is set into a drop-down list and the current selected item is not in the new list, it is added into the new list automatically. If you return false from this event, it does not copy the missing option into the new list. pOptions.push({title:'Pizza', value:'fooditem3'}); return false; Parent topic: Running Custom JavaScript \u2013 Events","title":"Item Events"},{"location":"ref_jsapi_javascript_security.html","text":"JavaScript Security The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. The JavaScript in the sandbox generally follows rules to limit dangerous operations: Use of eval, with, ==, !=, and the subscript operator [] are not allowed. Instead of == use === Instead of != use !== Instead of the [ ] operator, use the forEach(), get(index), and set() functions provided. Usage of the this keyword is not allowed: For item level events, the keyword item is used in place of the this keyword. For page level events, the keyword page is used in place of the this keyword. For form level events, the keyword form is used in place of the this keyword. Limited access to global variables. Details are provided in the following section. These properties might not be used: apply, arguments, call, callee, caller, constructor, eval, prototype this, unwatch, valueOf, watch, and any property beginning or ending with __. Security The following global variables are accessible: Variable Description element This the root element of the sandbox. Sandboxed elements do not have access to relational properties such as parentNode, firstSibling, nextSibling, etc. You can still use DOM methods and string properties like innerHTML. The style object can also be used, accessed, and modified. document This is a sandboxed document object that provides node creation and basic element searching facilities. The sandboxed document provides the following methods: getElementById, createElement, createTextNode, and write. The following standard JavaScript/DOM functions/constructors, and their child functions when applicable, might be called. They can be used only in call position. They cannot be accessed in any other way. They generally behave as the standard JavaScript function, unless otherwise noted: isNaN isFinite parseInt parseFloat escape unescape encodeURI encodeURIComponent decodeURI decodeURIComponent alert confirm prompt Date RegExp Error Number Math setTimeout - This only accepts a function, not a string. setInterval - This only accepts a function, not a string. clearTimeout clearInterval The following special functions are available to compensate for the JavaScript syntax limitations imposed by the sandbox: Function Description get(obj,prop) This is a special function to handle accessing properties in lieu of the [] operator. Calling get(obj,prop) is equivalent to obj[prop]. set(obj,prop,value) This is a special function to handle modifying properties in lieu of the [] operator. Calling set(obj,prop,value) is equivalent to obj[prop]=value. forEach(obj,func) This is a special function to iterate through all the properties in an object, or items in an array. For each item, the func function is called with the item as the first argument, the index as the second object, and the obj as the third object. The following functions for DOM manipulation and extra language features are provided by the Dojo library. This represents a safe subset of Dojo. All Dojo library functions are provided as top-level functions. Namespacing is unnecessary because scripts do have access to modify the global object and can't define global variables. Thus, you can call Dojo functions directly, for example, you can call mixin(obj,mixinObj). You might also use the traditional syntax (dojox.mixin(...)). Available functions include: mixin require isString isArray isFunction isObject isArrayLike isAlien hitch delegate partial trim connect disconnect subscribe unsubscribe Deferred toJson fromJson style attr query - This only searches within the sandbox. byId body - This returns the root element of the sandbox. Disabling JavaScript Security Under some circumstances, the limitations imposed by the dojox.secure library might be too restrictive. Therefore, the dojox.secure library can be disabled server-wide by editing a Java\u2122 properties file called Leap_config.properties in the FSP extensions directory (C:\\HCL\\Leap\\extensions on Windows\u2122, /opt/HCL/Leap/extensions on Linux\u2122). Set the value of the ibm.nitro.ApplicationCompilerService.secureJS key to false. Once the properties file is changed, the HCL Leap server should be restarted to ensure that the configuration takes effect. For more information, see Configuring the properties file . Changing this configuration setting should only be done if all the Leaps on the server are known trusted users. Disabling JavaScript Security on a deployment of the Leap that allows anonymous users to create applications could pose a serious security risk. It should be noted that this configuration only applies to applications that are deployed after making this configuration change. Applications that are deployed before this configuration change must be redeployed for the configuration to take effect. Parent topic: Reference Objects and Functions","title":"JavaScript Security"},{"location":"ref_jsapi_javascript_security.html#javascriptsecurity","text":"The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. The JavaScript in the sandbox generally follows rules to limit dangerous operations: Use of eval, with, ==, !=, and the subscript operator [] are not allowed. Instead of == use === Instead of != use !== Instead of the [ ] operator, use the forEach(), get(index), and set() functions provided. Usage of the this keyword is not allowed: For item level events, the keyword item is used in place of the this keyword. For page level events, the keyword page is used in place of the this keyword. For form level events, the keyword form is used in place of the this keyword. Limited access to global variables. Details are provided in the following section. These properties might not be used: apply, arguments, call, callee, caller, constructor, eval, prototype this, unwatch, valueOf, watch, and any property beginning or ending with __.","title":"JavaScript Security"},{"location":"ref_jsapi_javascript_security.html#security","text":"The following global variables are accessible: Variable Description element This the root element of the sandbox. Sandboxed elements do not have access to relational properties such as parentNode, firstSibling, nextSibling, etc. You can still use DOM methods and string properties like innerHTML. The style object can also be used, accessed, and modified. document This is a sandboxed document object that provides node creation and basic element searching facilities. The sandboxed document provides the following methods: getElementById, createElement, createTextNode, and write. The following standard JavaScript/DOM functions/constructors, and their child functions when applicable, might be called. They can be used only in call position. They cannot be accessed in any other way. They generally behave as the standard JavaScript function, unless otherwise noted: isNaN isFinite parseInt parseFloat escape unescape encodeURI encodeURIComponent decodeURI decodeURIComponent alert confirm prompt Date RegExp Error Number Math setTimeout - This only accepts a function, not a string. setInterval - This only accepts a function, not a string. clearTimeout clearInterval The following special functions are available to compensate for the JavaScript syntax limitations imposed by the sandbox: Function Description get(obj,prop) This is a special function to handle accessing properties in lieu of the [] operator. Calling get(obj,prop) is equivalent to obj[prop]. set(obj,prop,value) This is a special function to handle modifying properties in lieu of the [] operator. Calling set(obj,prop,value) is equivalent to obj[prop]=value. forEach(obj,func) This is a special function to iterate through all the properties in an object, or items in an array. For each item, the func function is called with the item as the first argument, the index as the second object, and the obj as the third object. The following functions for DOM manipulation and extra language features are provided by the Dojo library. This represents a safe subset of Dojo. All Dojo library functions are provided as top-level functions. Namespacing is unnecessary because scripts do have access to modify the global object and can't define global variables. Thus, you can call Dojo functions directly, for example, you can call mixin(obj,mixinObj). You might also use the traditional syntax (dojox.mixin(...)). Available functions include: mixin require isString isArray isFunction isObject isArrayLike isAlien hitch delegate partial trim connect disconnect subscribe unsubscribe Deferred toJson fromJson style attr query - This only searches within the sandbox. byId body - This returns the root element of the sandbox.","title":"Security"},{"location":"ref_jsapi_javascript_security.html#disabling-javascript-security","text":"Under some circumstances, the limitations imposed by the dojox.secure library might be too restrictive. Therefore, the dojox.secure library can be disabled server-wide by editing a Java\u2122 properties file called Leap_config.properties in the FSP extensions directory (C:\\HCL\\Leap\\extensions on Windows\u2122, /opt/HCL/Leap/extensions on Linux\u2122). Set the value of the ibm.nitro.ApplicationCompilerService.secureJS key to false. Once the properties file is changed, the HCL Leap server should be restarted to ensure that the configuration takes effect. For more information, see Configuring the properties file . Changing this configuration setting should only be done if all the Leaps on the server are known trusted users. Disabling JavaScript Security on a deployment of the Leap that allows anonymous users to create applications could pose a serious security risk. It should be noted that this configuration only applies to applications that are deployed after making this configuration change. Applications that are deployed before this configuration change must be redeployed for the configuration to take effect. Parent topic: Reference Objects and Functions","title":"Disabling JavaScript Security"},{"location":"ref_jsapi_objects_and_functions.html","text":"Reference Objects and Functions Describes the Functions available on different parts of the HCL Leap object model. Interface objects The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Data objects This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. JavaScript Security The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. Parent topic: JavaScript API","title":"Reference Objects and Functions"},{"location":"ref_jsapi_objects_and_functions.html#referenceobjectsandfunctions","text":"Describes the Functions available on different parts of the HCL Leap object model. Interface objects The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Data objects This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. JavaScript Security The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. Parent topic: JavaScript API","title":"Reference Objects and Functions"},{"location":"ref_jsapi_page_events.html","text":"Page Events This topic describes the Page Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a page that are accessed from the page Edit Properties dialog. Table 1. JavaScript\u2122 objects available in page events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA Table 2. Page Events Event Description Example onHide Called when the page is hidden. This is usually a result of page navigation. onNavigateAway Called as the page is about to be switched away from this one. A pAllowSwitch variable is passed to this event that contains one property called allow. Setting this property to false cancels the page switch. Cancel the page switch if a check box is not checked: if(!BO.F_Agree.getValue()) pAllowSwitch.allow = false; onRemoveFromNavigation Called when this page is removed from navigation by calling the form.removePageFromNavigation\\(\\) method for this page. onRestoreFromNavigation Called when a page is restored to navigation by calling the form.restorePageNavigation\\(\\) method for this page. onShow Called every time the page is shown. This includes when the form is first displayed and when the user navigates to the page. A good location to update any display items. Note: When a form is first opened, this event is only called on the current displayed page. Parent topic: Running Custom JavaScript \u2013 Events","title":"Page Events"},{"location":"ref_jsapi_page_events.html#page-events","text":"This topic describes the Page Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a page that are accessed from the page Edit Properties dialog. Table 1. JavaScript\u2122 objects available in page events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA Table 2. Page Events Event Description Example onHide Called when the page is hidden. This is usually a result of page navigation. onNavigateAway Called as the page is about to be switched away from this one. A pAllowSwitch variable is passed to this event that contains one property called allow. Setting this property to false cancels the page switch. Cancel the page switch if a check box is not checked: if(!BO.F_Agree.getValue()) pAllowSwitch.allow = false; onRemoveFromNavigation Called when this page is removed from navigation by calling the form.removePageFromNavigation\\(\\) method for this page. onRestoreFromNavigation Called when a page is restored to navigation by calling the form.restorePageNavigation\\(\\) method for this page. onShow Called every time the page is shown. This includes when the form is first displayed and when the user navigates to the page. A good location to update any display items. Note: When a form is first opened, this event is only called on the current displayed page. Parent topic: Running Custom JavaScript \u2013 Events","title":"Page Events"},{"location":"ref_jsapi_ref_data_objects.html","text":"Data objects This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. Object Description Example BO.<itemId> Accesses the Business Object Attribute data for an individual item on the form. Set the value of a number item on the form:``` BO.F_Age.setValue(12); | |BO.setValid\\(valid, msg\\)|Setting **valid** to \u201cfalse\u201d overrides the validity of the form and prevents submission, showing the user the message provided. Setting **valid** to \u201ctrue\u201d removes any previous override. However, it will not override other ways in which the form might be invalid.|Place this code in the **onItemChange** event of a field to constrain the input to a specific value.``` if(BOA.getValue() < 15 || BOA.getValue() > 35) { BOA.setValid(false, \"The age must be between 16 and 35\"); } | |BO.getValid()|Returns the current value of the overridden valid state of the form as set by BO.setValid() .| | |BO.isValid() |Returns true if every field in the form is valid and false otherwise. This is different from getValid() which returns the overridden valid state of the form as set by BO.setValid(). | | |BO.getInvalidMessages() |This function returns an array of the error messages of any invalid fields in the form. If there are no invalid fields, the function returns an empty array.| | |BO.getCurrentStage()|Returns the current stage of the form.|If the form is in the Submitted stage then show the user a custom message in the onLoad :``` if(BO.getCurrentStage() === 'ST_Submitted') alert('Reminder: This form is complete and cannot be modified'); | |BO.getDataId\\(\\)|Returns the unique ID that represents this data item or will represent it if it has never been submitted.| | |BO.getChildren\\(\\)|Returns a list object that provides access to all the individual Business Object Attribute data. The list object has getLength\\(\\) function, and get\\(index\\) function for accessing the objects in the list.| | |Object|Description|Example| |------|-----------|-------| |BOA.getValue\\(\\)|Returns the current value. The type of the returned value depends on the type of item. - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - Multi-Value String: Select Many, Survey Question \\(when \"Allow selection of multiple values\" checked\\). Values will be delimited with \"\\_\\_\\#\\_\\_\" - String: All other items |``` var s = \"\"; //string s = BO.F_SingleLine1.getValue(); s = BO.F_Paragraph1.getValue(); var n = 0; //number or currency n = BO.F_Number1.getValue(); n = BO.F_Currency1.getValue(); var d = new Date(); //date or timestamp d = BO.F_Date1.getValue(); d = BO.F_TimeStamp1.getValue(); var b = false; //boolean b = BO.F_CheckBox1.getValue(); var o = null; //object o = BO.F_Attachment1.getValue(); alert(\"ID: \" + o.id + \", filename: \" + o.fileName + \", uid: \" + o.uid); | |BOA.setValue(value)|Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. Note: The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. |``` //string BO.F_SingleLine1.setValue(\"Sample String\"); BO.F_Paragraph1.setValue(\"Sample String\"); //number or currency BO.F_Number1.setValue(25); BO.F_Currency1.setValue(123.65); //date or timestamp BO.F_Date1.setValue(new Date()); BO.F_TimeStamp1.setValue(new Date()); //boolean BO.F_CheckBox1.setValue(true); //object BO.F_Attachment1.setValue({uid: 'ccb92c12-d435-4288-baff-878d8d3c2923', id: '25', fileName: 'myfile.txt'}); | |BOA.getId\\(\\)|Returns the ID of this data item that is unique per form.| | |BOA.getBO\\(\\)|Returns the Business Object for the entire form.| | |BOA.getType\\(\\)|Returns a string that indicates the type of data. For example, string, number, boolean, currency, time, date, timeStamp, or attachment.| | |BOA.connectEvent\\(eventName, callbackFunction\\)|Used for connecting an event listener to a Business Object Attribute. You can define code to execute when the listener detects that the event is triggered. The only supported event for a Business Object Attribute is **onChange**.**Note:** If you connect an event, it must be disconnected using BOA.disconnectEvent\\(eventHandle\\). |Place this in the **onShow** event of the field to display a message box when the item changes.``` var hdl = BOA.connectEvent(\"onChange\", function(newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.disconnectEvent(eventHandle)|Disconnects the event handler specified by the passed-in event handle object that was returned by a BOA.connectEvent call. If you create a listener in the event of a form object, you must disconnect it. Otherwise, duplicate listeners are created every time the event is triggered.|``` var hdl = BOA.connectEvent(\"onChange\", function (newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. By passing \u201cfalse\u201d, you cause the data to be invalid, and prevent submission. You can optionally provide a custom error message. Setting the valid to \u201ctrue\u201d clears any previously overridden valid value.**Note:** You cannot set a Business Object Attribute to valid which actually has invalid data, or is set invalid by a rule. |Force the user to enter more than 3 characters for their name by adding this code to the items onItemChange:``` if(BOA.getValue().length < 3) BOA.setValid(false, 'Name must be at least 3 characters'); else BOA.setValid(true); | |BOA.getValid()|Gets a value set previously using setValid().| | |BOA.setRequired(required)|You can override non-required data to be required with this method. By passing \u201ctrue\u201d, you cause its data to be required and prevent submission if it is not set. Setting the valid to \u201cfalse\u201d clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | | |BOA.getRequired()|Gets a value set previously using setRequired().| | |BOA.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |BOA.getInvalidMessage()|Returns the current error messages for this data, or null if the data is valid.| | |BOA.isRequired()|Returns true if this item is required.| | |BOA.isMissing()|Returns true if this item is required and it has no value.| | |BOA.validate()|Triggers the validation of the data item.| | Object Description BOL.getLength() Returns the number of Business Objects in the list. BOL.get(index) Returns the Business Object at the specified index. BOL.createNew() Creates a new empty Business Object ready to be inserted into the list using the add() method. BOL.add(bo) Adds a Business Object of the appropriate type to the list. Can be one created with a call to the createNew() method or removed from the list with a remove() call. BOL.remove(bo) Removes the Business Object from the list. Returns true if successful, false if not. BOL.getId() Returns the ID of this data item that is unique per form. BOL.getType() Returns a string that indicates the type of Business Object List data. BOL.setValid(valid, msg) You can override valid data to be invalid with this method. By passing false, you cause its data to be invalid and prevent submission. You can optionally provide a custom error message. Setting valid to true clears any previously overridden valid value. Note: You cannot set a Business Object List to valid that actually has invalid data, or is set invalid by a rule. | |BOL.getValid()|Gets a value set previously using setValid().| |BOL.setRequired(required)|You can override non-required data to be required with this method. By passing true, you cause its data to be required and prevent submission if it is not set. Setting the valid to false clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | |BOL.getRequired()|Gets a value set previously using setRequired().| Parent topic: Reference Objects and Functions","title":"Data objects"},{"location":"ref_jsapi_ref_data_objects.html#dataobjects","text":"This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. Object Description Example BO.<itemId> Accesses the Business Object Attribute data for an individual item on the form. Set the value of a number item on the form:``` BO.F_Age.setValue(12); | |BO.setValid\\(valid, msg\\)|Setting **valid** to \u201cfalse\u201d overrides the validity of the form and prevents submission, showing the user the message provided. Setting **valid** to \u201ctrue\u201d removes any previous override. However, it will not override other ways in which the form might be invalid.|Place this code in the **onItemChange** event of a field to constrain the input to a specific value.``` if(BOA.getValue() < 15 || BOA.getValue() > 35) { BOA.setValid(false, \"The age must be between 16 and 35\"); } | |BO.getValid()|Returns the current value of the overridden valid state of the form as set by BO.setValid() .| | |BO.isValid() |Returns true if every field in the form is valid and false otherwise. This is different from getValid() which returns the overridden valid state of the form as set by BO.setValid(). | | |BO.getInvalidMessages() |This function returns an array of the error messages of any invalid fields in the form. If there are no invalid fields, the function returns an empty array.| | |BO.getCurrentStage()|Returns the current stage of the form.|If the form is in the Submitted stage then show the user a custom message in the onLoad :``` if(BO.getCurrentStage() === 'ST_Submitted') alert('Reminder: This form is complete and cannot be modified'); | |BO.getDataId\\(\\)|Returns the unique ID that represents this data item or will represent it if it has never been submitted.| | |BO.getChildren\\(\\)|Returns a list object that provides access to all the individual Business Object Attribute data. The list object has getLength\\(\\) function, and get\\(index\\) function for accessing the objects in the list.| | |Object|Description|Example| |------|-----------|-------| |BOA.getValue\\(\\)|Returns the current value. The type of the returned value depends on the type of item. - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - Multi-Value String: Select Many, Survey Question \\(when \"Allow selection of multiple values\" checked\\). Values will be delimited with \"\\_\\_\\#\\_\\_\" - String: All other items |``` var s = \"\"; //string s = BO.F_SingleLine1.getValue(); s = BO.F_Paragraph1.getValue(); var n = 0; //number or currency n = BO.F_Number1.getValue(); n = BO.F_Currency1.getValue(); var d = new Date(); //date or timestamp d = BO.F_Date1.getValue(); d = BO.F_TimeStamp1.getValue(); var b = false; //boolean b = BO.F_CheckBox1.getValue(); var o = null; //object o = BO.F_Attachment1.getValue(); alert(\"ID: \" + o.id + \", filename: \" + o.fileName + \", uid: \" + o.uid); | |BOA.setValue(value)|Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. Note: The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. |``` //string BO.F_SingleLine1.setValue(\"Sample String\"); BO.F_Paragraph1.setValue(\"Sample String\"); //number or currency BO.F_Number1.setValue(25); BO.F_Currency1.setValue(123.65); //date or timestamp BO.F_Date1.setValue(new Date()); BO.F_TimeStamp1.setValue(new Date()); //boolean BO.F_CheckBox1.setValue(true); //object BO.F_Attachment1.setValue({uid: 'ccb92c12-d435-4288-baff-878d8d3c2923', id: '25', fileName: 'myfile.txt'}); | |BOA.getId\\(\\)|Returns the ID of this data item that is unique per form.| | |BOA.getBO\\(\\)|Returns the Business Object for the entire form.| | |BOA.getType\\(\\)|Returns a string that indicates the type of data. For example, string, number, boolean, currency, time, date, timeStamp, or attachment.| | |BOA.connectEvent\\(eventName, callbackFunction\\)|Used for connecting an event listener to a Business Object Attribute. You can define code to execute when the listener detects that the event is triggered. The only supported event for a Business Object Attribute is **onChange**.**Note:** If you connect an event, it must be disconnected using BOA.disconnectEvent\\(eventHandle\\). |Place this in the **onShow** event of the field to display a message box when the item changes.``` var hdl = BOA.connectEvent(\"onChange\", function(newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.disconnectEvent(eventHandle)|Disconnects the event handler specified by the passed-in event handle object that was returned by a BOA.connectEvent call. If you create a listener in the event of a form object, you must disconnect it. Otherwise, duplicate listeners are created every time the event is triggered.|``` var hdl = BOA.connectEvent(\"onChange\", function (newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. By passing \u201cfalse\u201d, you cause the data to be invalid, and prevent submission. You can optionally provide a custom error message. Setting the valid to \u201ctrue\u201d clears any previously overridden valid value.**Note:** You cannot set a Business Object Attribute to valid which actually has invalid data, or is set invalid by a rule. |Force the user to enter more than 3 characters for their name by adding this code to the items onItemChange:``` if(BOA.getValue().length < 3) BOA.setValid(false, 'Name must be at least 3 characters'); else BOA.setValid(true); | |BOA.getValid()|Gets a value set previously using setValid().| | |BOA.setRequired(required)|You can override non-required data to be required with this method. By passing \u201ctrue\u201d, you cause its data to be required and prevent submission if it is not set. Setting the valid to \u201cfalse\u201d clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | | |BOA.getRequired()|Gets a value set previously using setRequired().| | |BOA.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |BOA.getInvalidMessage()|Returns the current error messages for this data, or null if the data is valid.| | |BOA.isRequired()|Returns true if this item is required.| | |BOA.isMissing()|Returns true if this item is required and it has no value.| | |BOA.validate()|Triggers the validation of the data item.| | Object Description BOL.getLength() Returns the number of Business Objects in the list. BOL.get(index) Returns the Business Object at the specified index. BOL.createNew() Creates a new empty Business Object ready to be inserted into the list using the add() method. BOL.add(bo) Adds a Business Object of the appropriate type to the list. Can be one created with a call to the createNew() method or removed from the list with a remove() call. BOL.remove(bo) Removes the Business Object from the list. Returns true if successful, false if not. BOL.getId() Returns the ID of this data item that is unique per form. BOL.getType() Returns a string that indicates the type of Business Object List data. BOL.setValid(valid, msg) You can override valid data to be invalid with this method. By passing false, you cause its data to be invalid and prevent submission. You can optionally provide a custom error message. Setting valid to true clears any previously overridden valid value. Note: You cannot set a Business Object List to valid that actually has invalid data, or is set invalid by a rule. | |BOL.getValid()|Gets a value set previously using setValid().| |BOL.setRequired(required)|You can override non-required data to be required with this method. By passing true, you cause its data to be required and prevent submission if it is not set. Setting the valid to false clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | |BOL.getRequired()|Gets a value set previously using setRequired().| Parent topic: Reference Objects and Functions","title":"Data objects"},{"location":"ref_jsapi_running_custom_js_events.html","text":"Running Custom JavaScript \u2013 Events Custom JavaScript\u2122 is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Application Events This topic describes the Application Events, and their parameters when using JavaScript API in HCL Leap. Form Events This topic describes the Form Events, and their parameters when using JavaScript API in HCL Leap. Page Events This topic describes the Page Events, and their parameters when using JavaScript API in HCL Leap. Item Events This topic describes the Item Events, and their parameters when using JavaScript API in HCL Leap. Parent topic: JavaScript API","title":"Running Custom JavaScript -\u2013 Events"},{"location":"ref_jsapi_running_custom_js_events.html#runningcustomjavascriptevents","text":"Custom JavaScript\u2122 is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Application Events This topic describes the Application Events, and their parameters when using JavaScript API in HCL Leap. Form Events This topic describes the Form Events, and their parameters when using JavaScript API in HCL Leap. Page Events This topic describes the Page Events, and their parameters when using JavaScript API in HCL Leap. Item Events This topic describes the Item Events, and their parameters when using JavaScript API in HCL Leap. Parent topic: JavaScript API","title":"Running Custom JavaScript \u2013 Events"},{"location":"ref_jsapi_running_external_js_files.html","text":"Running Custom JavaScript Files Custom JavaScript\u2122 can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Table 1. JavaScript\u2122 objects available in attached JavaScript\u2122 files Variable Full name Description Example Type app Application object Contains functions for accessing global general information - app.getCurrentUser(); - A common use case for external .js files is utility methods to be executed later in events by custom JavaScript. One example is a function to sum up all Number values in a section: ``` app.getSharedData().sumNumbers = function(section) { var total = 0; var children = section.getChildren(); for(var i=0; i Then from an event where you want to sum all numbers in a section: var sub = app.getSharedData().sumNumbers(page.F_Expense); GUI Note: When JavaScript security is enabled: For added security, external JavaScript files that are referenced by URL do not load into the running application. Uploaded JavaScript files are evaluated in a safe sandbox and all content must adhere to the restrictions of the sandbox. See JavaScript Security for more details. For example, functions must be defined by using the following format: app.getSharedData().blat = function (...) { ... } When JavaScript security is disabled: External JavaScript files that are referenced by URL are loaded by using a <script> tag and does not have access to the app variable. These scripts must use window.NitroApplication to access the Leap API functions. JavaScript files that are uploaded to the application are evaluated by using the eval() function. Parent topic: JavaScript API","title":"Interface objects"},{"location":"ref_jsapi_running_external_js_files.html#running-custom-javascript-files","text":"Custom JavaScript\u2122 can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Table 1. JavaScript\u2122 objects available in attached JavaScript\u2122 files Variable Full name Description Example Type app Application object Contains functions for accessing global general information - app.getCurrentUser(); - A common use case for external .js files is utility methods to be executed later in events by custom JavaScript. One example is a function to sum up all Number values in a section: ``` app.getSharedData().sumNumbers = function(section) { var total = 0; var children = section.getChildren(); for(var i=0; i Then from an event where you want to sum all numbers in a section: var sub = app.getSharedData().sumNumbers(page.F_Expense); GUI Note: When JavaScript security is enabled: For added security, external JavaScript files that are referenced by URL do not load into the running application. Uploaded JavaScript files are evaluated in a safe sandbox and all content must adhere to the restrictions of the sandbox. See JavaScript Security for more details. For example, functions must be defined by using the following format: app.getSharedData().blat = function (...) { ... } When JavaScript security is disabled: External JavaScript files that are referenced by URL are loaded by using a <script> tag and does not have access to the app variable. These scripts must use window.NitroApplication to access the Leap API functions. JavaScript files that are uploaded to the application are evaluated by using the eval() function. Parent topic: JavaScript API","title":"Running Custom JavaScript Files"},{"location":"ref_jsapi_user_interface_objects.html","text":"Interface objects The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Note: When you use JavaScript to modify form items, the change appears only in the user interface, it does not persist to the submitted data. The user completing the form sees the modifications that are made by your JavaScript, however a user reviewing submitted data sees the original form items. If you want the changes to appear in the form any time it is viewed, the JavaScript must be attached to events that run each time that the form is opened. Application objects Form objects Page and App Page objects Item objects Other objects Parent topic: Reference Objects and Functions","title":"Interface objects {#userinterfaceobjects .reference}"},{"location":"ref_jsapi_user_interface_objects.html#userinterfaceobjects","text":"The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Note: When you use JavaScript to modify form items, the change appears only in the user interface, it does not persist to the submitted data. The user completing the form sees the modifications that are made by your JavaScript, however a user reviewing submitted data sees the original form items. If you want the changes to appear in the form any time it is viewed, the JavaScript must be attached to events that run each time that the form is opened. Application objects Form objects Page and App Page objects Item objects Other objects Parent topic: Reference Objects and Functions","title":"Interface objects"},{"location":"ref_other_objects.html","text":"Other objects Table 1. Service Configuration Object This object represents a mapped service in the form and is retrieved using form.getServiceConfiguration(). Object Description Example service.callService\\(\\) Executes the service. service.connectEvent\\(eventName, callbackFunction\\) The only supported event is **onCallFinished**, which is called every time after the service mapping is executed. It is passed two parameters: pSuccess, which indicates whether the service call succeeded. pErrorObj, which is a JSON object \\(\\{code: '', message: '', handled: ''\\}\\) that contains details about the error \\(if thrown\\). If the error is being handled by javascript, setting `pErrorObj.handled = true` will suppress the error dialog. Resister these events in the Applications onStart event so that they are only registered once. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } else { //do something with the error form.getBO().F_Error.setValue(pErrorObj.code + \u201c: \u201d + pErrorObj.message); pErrorObj.handled = true; //suppress error dialog } }); service.disconnectEvent\\(eventHandle\\) Disconnects the event handler specified by the passed-in event handle object that was returned by a service.connectEvent call.To avoid duplicate event handlers being connected, connect to events from within the application **onStart** or form **onLoad** events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the **disconnectEvent** method. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); var serviceHdl = serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } serviceConfig.disconnectEvent(serviceHdl); }); Table 2. Stage Action Button Object Represents an action button that is retrieved by calling form.getStageActions(). Object Description action.activate\\(\\) Triggers this button, which cancels, submit or save the form. Note: If a button is hidden by a Rule, you can try and fire it. However, the server rejects the submission. var actionButtons = form.getStageActions(); for(var i=0; i<actionButtons.length; i++){ if(get(actionButtons, i).getId() === 'S_Cancel') get(actionButtons, i).activate(); } action.addClasses\\(classes\\) Adds a list of custom class names to an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. action.addClasses(\u201cemphasized error\u201d); action.getActionType\\(\\) Returns a string that identifies the type of the button. Values are **Cancel**, **Submit**, and **Save**. action.getActive\\(\\) Returns true if this button is active, and false if it is disabled. action.getClasses\\(\\) Returns an Array of custom class names currently applied to an action. action.getId\\(\\) Returns the unique ID \\(within the application\\) of this action button \u201cS\\_Submit\u201d. action.getTitle\\(\\) Returns the user-defined title of this button. action.getVisible\\(\\) Returns true if this button is visible, or false if it is hidden by a rule or JavaScript\u2122. action.removeClasses\\(classes\\) Removes a list of custom class names from an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. action.removeClasses(\u201cemphasized\u201d); action.setActive\\(active\\) If active is true, then the button is made active. If false, the button is disabled. action.setFocus\\(\\) Causes this button to receive focus, if possible. action.setTitle\\(title\\) Sets the title for the button. action.setVisible\\(visible\\) Sets whether this action is visible. Note: If this item is made invisible by a rule, then you cannot unhide it by calling this function. Parent topic: Interface objects","title":"Other objects"},{"location":"ref_other_objects.html#other-objects","text":"Table 1. Service Configuration Object This object represents a mapped service in the form and is retrieved using form.getServiceConfiguration(). Object Description Example service.callService\\(\\) Executes the service. service.connectEvent\\(eventName, callbackFunction\\) The only supported event is **onCallFinished**, which is called every time after the service mapping is executed. It is passed two parameters: pSuccess, which indicates whether the service call succeeded. pErrorObj, which is a JSON object \\(\\{code: '', message: '', handled: ''\\}\\) that contains details about the error \\(if thrown\\). If the error is being handled by javascript, setting `pErrorObj.handled = true` will suppress the error dialog. Resister these events in the Applications onStart event so that they are only registered once. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } else { //do something with the error form.getBO().F_Error.setValue(pErrorObj.code + \u201c: \u201d + pErrorObj.message); pErrorObj.handled = true; //suppress error dialog } }); service.disconnectEvent\\(eventHandle\\) Disconnects the event handler specified by the passed-in event handle object that was returned by a service.connectEvent call.To avoid duplicate event handlers being connected, connect to events from within the application **onStart** or form **onLoad** events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the **disconnectEvent** method. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); var serviceHdl = serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } serviceConfig.disconnectEvent(serviceHdl); }); Table 2. Stage Action Button Object Represents an action button that is retrieved by calling form.getStageActions(). Object Description action.activate\\(\\) Triggers this button, which cancels, submit or save the form. Note: If a button is hidden by a Rule, you can try and fire it. However, the server rejects the submission. var actionButtons = form.getStageActions(); for(var i=0; i<actionButtons.length; i++){ if(get(actionButtons, i).getId() === 'S_Cancel') get(actionButtons, i).activate(); } action.addClasses\\(classes\\) Adds a list of custom class names to an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. action.addClasses(\u201cemphasized error\u201d); action.getActionType\\(\\) Returns a string that identifies the type of the button. Values are **Cancel**, **Submit**, and **Save**. action.getActive\\(\\) Returns true if this button is active, and false if it is disabled. action.getClasses\\(\\) Returns an Array of custom class names currently applied to an action. action.getId\\(\\) Returns the unique ID \\(within the application\\) of this action button \u201cS\\_Submit\u201d. action.getTitle\\(\\) Returns the user-defined title of this button. action.getVisible\\(\\) Returns true if this button is visible, or false if it is hidden by a rule or JavaScript\u2122. action.removeClasses\\(classes\\) Removes a list of custom class names from an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. action.removeClasses(\u201cemphasized\u201d); action.setActive\\(active\\) If active is true, then the button is made active. If false, the button is disabled. action.setFocus\\(\\) Causes this button to receive focus, if possible. action.setTitle\\(title\\) Sets the title for the button. action.setVisible\\(visible\\) Sets whether this action is visible. Note: If this item is made invisible by a rule, then you cannot unhide it by calling this function. Parent topic: Interface objects","title":"Other objects"},{"location":"ref_page_app_page_objects.html","text":"Page and App Page objects Object Description Example page. appPage. Provides convenient direct access to all items on the page, including those inside Sections and Tab Folders. Hide a specific button on the page: page.F_NextButton.setVisible(false); page.addClasses(classes) appPage.addClasses(classes) Adds a list of custom class names to the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. page.addClasses(\u201cemphasized error\u201d); page.connectEvent(eventName, callbackFunction) appPage.connectEvent(eventName, callbackFunction) Connects a function to an event on the page. The list of events is the same as for the page in the Design interface. Useful for utility functions defined in JavaScript\u2122 files to hook behavior into the page dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using page.disconnectEvent or appPage.disconnectEvent. page.disconnectEvent(eventHandle) appPage.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a page.connectEvent or appPage.connectEvent call. To avoid duplicate event handlers being connected to pages, connect to page events from within the application onStart or form onLoad events. If you connect to a page event outside of these two events you should explicitly disconnect from the page event using the disconnectEvent method. var eventHdl = page.connectEvent(\"<some event>\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } page.disconnectEvent(eventHndl); }); page.getBO() Returns the object that contains the Business Object data for the entire form. var theBO = page.getBO(); theBO.F_SingleLine.setValue('new Value'); page.getChildren() appPage.getChildren() Returns the list object that provides access to all direct children items for this page. For example, items in a Section on the page are not in the list, however the Section itself is. The list object has the getLength() function and get(index) function for accessing the objects in the list. Hide all button items on a page: var list = page.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'button') list.get(i).setVisible(false); } page.getClasses() appPage.getClasses() Returns an Array of custom class names currently applied to the page. page.getForm() Returns the form object to which this page belongs. page.getId() appPage.getId() Returns the unique ID, within the application, of this page. For example, P_Page1 . appPage.getServiceConfigurationIds() Returns an array of all the IDs for services mapped in this app page. var serviceConfigs = appPage.getServiceConfigurationIds(); appPage.getServiceConfiguration(serviceId) Gets the service object for a particular service ID. Lookup and execute a service from JavaScript\u2122: var service = appPage.getServiceConfiguration('SC_ServiceConfig'); service.callService(); page.getType() appPage.getType() Returns a string identifying the object type. For example,\u201cpage\u201d. page.getVisibility() Returns true if the page is being shown, and false if it is hidden. page.removeClasses(classes) appPage.removeClasses(classes) Removes a list of custom class names from the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. page.removeClasses(\u201cemphasized\u201d); Parent topic: Interface objects","title":"Page and App Page objects"},{"location":"ref_page_app_page_objects.html#page-and-app-page-objects","text":"Object Description Example page. appPage. Provides convenient direct access to all items on the page, including those inside Sections and Tab Folders. Hide a specific button on the page: page.F_NextButton.setVisible(false); page.addClasses(classes) appPage.addClasses(classes) Adds a list of custom class names to the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. page.addClasses(\u201cemphasized error\u201d); page.connectEvent(eventName, callbackFunction) appPage.connectEvent(eventName, callbackFunction) Connects a function to an event on the page. The list of events is the same as for the page in the Design interface. Useful for utility functions defined in JavaScript\u2122 files to hook behavior into the page dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using page.disconnectEvent or appPage.disconnectEvent. page.disconnectEvent(eventHandle) appPage.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a page.connectEvent or appPage.connectEvent call. To avoid duplicate event handlers being connected to pages, connect to page events from within the application onStart or form onLoad events. If you connect to a page event outside of these two events you should explicitly disconnect from the page event using the disconnectEvent method. var eventHdl = page.connectEvent(\"<some event>\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } page.disconnectEvent(eventHndl); }); page.getBO() Returns the object that contains the Business Object data for the entire form. var theBO = page.getBO(); theBO.F_SingleLine.setValue('new Value'); page.getChildren() appPage.getChildren() Returns the list object that provides access to all direct children items for this page. For example, items in a Section on the page are not in the list, however the Section itself is. The list object has the getLength() function and get(index) function for accessing the objects in the list. Hide all button items on a page: var list = page.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'button') list.get(i).setVisible(false); } page.getClasses() appPage.getClasses() Returns an Array of custom class names currently applied to the page. page.getForm() Returns the form object to which this page belongs. page.getId() appPage.getId() Returns the unique ID, within the application, of this page. For example, P_Page1 . appPage.getServiceConfigurationIds() Returns an array of all the IDs for services mapped in this app page. var serviceConfigs = appPage.getServiceConfigurationIds(); appPage.getServiceConfiguration(serviceId) Gets the service object for a particular service ID. Lookup and execute a service from JavaScript\u2122: var service = appPage.getServiceConfiguration('SC_ServiceConfig'); service.callService(); page.getType() appPage.getType() Returns a string identifying the object type. For example,\u201cpage\u201d. page.getVisibility() Returns true if the page is being shown, and false if it is hidden. page.removeClasses(classes) appPage.removeClasses(classes) Removes a list of custom class names from the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. page.removeClasses(\u201cemphasized\u201d); Parent topic: Interface objects","title":"Page and App Page objects"},{"location":"ref_portlet_parameters.html","text":"Leap Portlet parameters You can dynamically or programmatically set the Leap Portlet to load a specific Leap application at run time.","title":"Leap Portlet parameters {#reference_cxs_q4b_pt .reference}"},{"location":"ref_portlet_parameters.html#reference_cxs_q4b_pt","text":"You can dynamically or programmatically set the Leap Portlet to load a specific Leap application at run time.","title":"Leap Portlet parameters"},{"location":"ref_public_render_parameters.html","text":"Public render parameters Public render parameters are leveraged to allow the Leap Portlet to communicate with other portlets. One type of public render parameter instructs the Leap Portlet to load a specific application. Open Given Application The Leap Portlet opens a form when you specify the application URL as the value of the render parameter. Note: The code must be entered as a single line. [Plugin:RenderURL pr1.value=\"\\{Application URL\\}\" pr1.key=\"{http://www.ibm.com/pb/models}openURL\" copyCurrentParams=\"true\" pr1.mode=\"set\" pr1.type=\"public\"] Where Application URL is a URL pointing to the Leap application. The format of the Application URL to launch a blank form is: /landing/org/app/<app id>/launch/index.html?form=<form id>. The format of the Application URL to launch the form for a specific record is: /landing/org/app/<app id>/launch/index.html?form=<form id>&id=<rec id> For more information on the app id , form id , and rec id , see the developerWorks\u00ae Leap wiki . Send data When data is pushed into the Leap portlet, the onDataReceived event fires. The event handler shares the contents of the string as a pData parameter, however it is up to the event to understand the contents of the string. [Plugin:RenderURL pr1.value=\"<your data>\" copyCurrentParams=\"true\" pr1.key=\"{http://www.ibm.com/pb/models}payload\" pr1.mode=\"set\" pr1.type=\"public\"] Where your data is the string you want sent to the Leap application. For more information on render parameters, see WebSphere\u00ae Portal Render Parameters Usage Details If you have multiple Leap Portlets in your Portal site, you can control which Forms Experience Portlet responds to the public render parameters by setting the param.sharing.scope parameter for your portal page. For more information, see How to control parameter sharing in the portal . Once a FEB Portlet responds to these actions, it will continue to do so until directed to perform another action.","title":"Public render parameters {#publicrenderparameters .reference}"},{"location":"ref_public_render_parameters.html#publicrenderparameters","text":"Public render parameters are leveraged to allow the Leap Portlet to communicate with other portlets. One type of public render parameter instructs the Leap Portlet to load a specific application.","title":"Public render parameters"},{"location":"ref_public_render_parameters.html#open-given-application","text":"The Leap Portlet opens a form when you specify the application URL as the value of the render parameter. Note: The code must be entered as a single line. [Plugin:RenderURL pr1.value=\"\\{Application URL\\}\" pr1.key=\"{http://www.ibm.com/pb/models}openURL\" copyCurrentParams=\"true\" pr1.mode=\"set\" pr1.type=\"public\"] Where Application URL is a URL pointing to the Leap application. The format of the Application URL to launch a blank form is: /landing/org/app/<app id>/launch/index.html?form=<form id>. The format of the Application URL to launch the form for a specific record is: /landing/org/app/<app id>/launch/index.html?form=<form id>&id=<rec id> For more information on the app id , form id , and rec id , see the developerWorks\u00ae Leap wiki .","title":"Open Given Application"},{"location":"ref_public_render_parameters.html#send-data","text":"When data is pushed into the Leap portlet, the onDataReceived event fires. The event handler shares the contents of the string as a pData parameter, however it is up to the event to understand the contents of the string. [Plugin:RenderURL pr1.value=\"<your data>\" copyCurrentParams=\"true\" pr1.key=\"{http://www.ibm.com/pb/models}payload\" pr1.mode=\"set\" pr1.type=\"public\"] Where your data is the string you want sent to the Leap application. For more information on render parameters, see WebSphere\u00ae Portal Render Parameters Usage Details If you have multiple Leap Portlets in your Portal site, you can control which Forms Experience Portlet responds to the public render parameters by setting the param.sharing.scope parameter for your portal page. For more information, see How to control parameter sharing in the portal . Once a FEB Portlet responds to these actions, it will continue to do so until directed to perform another action.","title":"Send data"},{"location":"ref_rest_api_auto_deploy.html","text":"Application management REST API The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications. Authentication To get the Swagger definition for the Application management REST API, use /apps-basic/anon|secure/org/app/swagger.json All REST API calls must be made as an authenticated user. If you want to exercise the API with code, then, you can use basic authentication. The authenticated user must be a valid user of Leap and must have the appropriate permission. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string. REST actions The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb Header Action Name /apps-basic/secure/org/app/app-uid/archive?mode=source&submitted=true GET Export /apps-basic/secure/org/app/app-uid/archive?replaceEmbeddedData=on&runDatabaseUpgradeNow=on&replaceSubmittedData=on&freedomIdentifyKey=x POST Upgrade /apps-basic/secure/org/app?deploy=false&importData=false&freedomIdentifyKey=x POST Import /apps-basic/secure/org/app/app-uid?freedomIdentifyKey=x DELETE Delete Export Exports the defined application as a .nitro_s file. You can use the following parameters to export the application: submitted=true : Can be set to true or false . true returns the application and all submission data that exists in the application. **Note:** If no value is passed, then the default is **true**. Upgrade Allows the user to upgrade the content of an application to match the application that is contained in the POST request. You can use the following parameters to upgrade the application: replaceSubmittedData=off : Can be on or off . on replaces the existing submission data with the submission data contained in the application being uploaded. **Note:** The default for replaceSubmittedData is **off**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The upgraded application must be uploaded to the server as multipart/form-data in the body of the POST. Import Imports the specified application into the Leap server. The user that performs the import is automatically added as an administrator. You can use the following parameters to import the application: deploy=false : Can be set to true or false . true automatically deploys the application as part of the import. **Note:** The default is **false**. importData=false : Can be set to true or false . true imports the submission data, or submitted records, if they were included when the application was exported. **Note:** The default is **false**. cleanIds=false : Can be set to true or false . true removes all groups and users from roles within the imported application ensuring that only the current authenticated user has access to the application. **Note:** The default is **false**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The application to be imported must be uploaded to the server as multipart/form-data. Delete Deletes the specified application from the server. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. Basic Application Flow This is the basic flow of an application communicating with the Leap REST API: Establish a URLConnection with the URL that matches the action you want. Set the basic authentication credentials into the URLConnection. Set extra headers or body content if required for the action. Process the response. Parent topic: REST API reference","title":"Application management REST API"},{"location":"ref_rest_api_auto_deploy.html#ref_rest_api_auto_deploy","text":"The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications.","title":"Application management REST API"},{"location":"ref_rest_api_auto_deploy.html#authentication","text":"To get the Swagger definition for the Application management REST API, use /apps-basic/anon|secure/org/app/swagger.json All REST API calls must be made as an authenticated user. If you want to exercise the API with code, then, you can use basic authentication. The authenticated user must be a valid user of Leap and must have the appropriate permission. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string.","title":"Authentication"},{"location":"ref_rest_api_auto_deploy.html#rest-actions","text":"The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb Header Action Name /apps-basic/secure/org/app/app-uid/archive?mode=source&submitted=true GET Export /apps-basic/secure/org/app/app-uid/archive?replaceEmbeddedData=on&runDatabaseUpgradeNow=on&replaceSubmittedData=on&freedomIdentifyKey=x POST Upgrade /apps-basic/secure/org/app?deploy=false&importData=false&freedomIdentifyKey=x POST Import /apps-basic/secure/org/app/app-uid?freedomIdentifyKey=x DELETE Delete","title":"REST actions"},{"location":"ref_rest_api_auto_deploy.html#export","text":"Exports the defined application as a .nitro_s file. You can use the following parameters to export the application: submitted=true : Can be set to true or false . true returns the application and all submission data that exists in the application. **Note:** If no value is passed, then the default is **true**.","title":"Export"},{"location":"ref_rest_api_auto_deploy.html#upgrade","text":"Allows the user to upgrade the content of an application to match the application that is contained in the POST request. You can use the following parameters to upgrade the application: replaceSubmittedData=off : Can be on or off . on replaces the existing submission data with the submission data contained in the application being uploaded. **Note:** The default for replaceSubmittedData is **off**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The upgraded application must be uploaded to the server as multipart/form-data in the body of the POST.","title":"Upgrade"},{"location":"ref_rest_api_auto_deploy.html#import","text":"Imports the specified application into the Leap server. The user that performs the import is automatically added as an administrator. You can use the following parameters to import the application: deploy=false : Can be set to true or false . true automatically deploys the application as part of the import. **Note:** The default is **false**. importData=false : Can be set to true or false . true imports the submission data, or submitted records, if they were included when the application was exported. **Note:** The default is **false**. cleanIds=false : Can be set to true or false . true removes all groups and users from roles within the imported application ensuring that only the current authenticated user has access to the application. **Note:** The default is **false**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The application to be imported must be uploaded to the server as multipart/form-data.","title":"Import"},{"location":"ref_rest_api_auto_deploy.html#delete","text":"Deletes the specified application from the server. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information.","title":"Delete"},{"location":"ref_rest_api_auto_deploy.html#basic-application-flow","text":"This is the basic flow of an application communicating with the Leap REST API: Establish a URLConnection with the URL that matches the action you want. Set the basic authentication credentials into the URLConnection. Set extra headers or body content if required for the action. Process the response. Parent topic: REST API reference","title":"Basic Application Flow"},{"location":"ref_rest_api_ref.html","text":"REST API reference The REST API can be used by other programs to communicate with Leap. To get the Swagger definition for all REST APIs, use /apps-basic/anon/org/api/swagger.json. Data access REST API The data access REST API exposes operations on application submitted data, also known as records. Application management REST API The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications. Application statistics REST API Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Parent topic: Reference","title":"REST API reference"},{"location":"ref_rest_api_ref.html#restapireference","text":"The REST API can be used by other programs to communicate with Leap. To get the Swagger definition for all REST APIs, use /apps-basic/anon/org/api/swagger.json. Data access REST API The data access REST API exposes operations on application submitted data, also known as records. Application management REST API The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications. Application statistics REST API Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Parent topic: Reference","title":"REST API reference"},{"location":"ref_send_email.html","text":"Send Email service This topic provides reference information on the Send Email service in HCL Leap. Purpose The Send Email service provides a mechanism to send an email from a Leap application. The service enables an application author to bind fields from their form to the parameters of the service and it can be executed at any time, which is what distinguishes it from the submit activity email functionality (which can only be sent as part of a submit event). This feature is disabled by default and must be enabled by the administrator. To enable this service, add (or modify) the following property in the Leap_config.properties: ibm.nitro.NitroConfig.enableEmailService=true Leap does not need to be restarted, but it may take a few minutes for the service to appear in the authoring environment. Service parameters Parameter Definition To One or more addresses to be used as the primary email target. CC One or more addresses to which the email will be sent as cc. BCC One or more addresses to which the email will be sent as bcc. Reply To The email address to be shown as the reply to address. Subject The text to be used for the email subject. Text Content Plain text content to be used for the email body. HTML Content HTML content to be used for the email body. Note: Both the plain text and html content are sent as part of the email if specified. It is up to the rendering email client to decide how and when to use the content provided. Advanced service parameters To access the advanced service parameters, select Advanced from the drop-down labelled View on the Inputs tab. Parameter Definition To List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018To\u2019 field. CC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018CC\u2019 field. BCC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018BCC\u2019 field. How to use To use this service, complete the following steps while editing an application: Select Settings . Create a service configuration. Select the General service catalog. From the list of services, select Send Email . Map form items to the email service parameters On the Details tab, define a meaningful service id.. Click OK . The service is then listed on the services page for that form. This service can be connected to a button click event or triggered from any item\u2019s javaScript event. You can also setup an \u2018onCallFinished\u2019 handler to run custom javaScript code after the service completes. Possible response values The service does not return any parameters. The service could throw the following errors: Error message *Definition * CLFNI1803E: Email must define at least one address ('to', 'cc' or 'bcc'). If the to, cc and bcc are empty CLFNI1804E: Email body may not be empty. If the text content and the html content are empty CLFNI1805E: Failed to send email. If an error is received from the mail server configured with Leap. Parent topic: Services","title":"Send Email service"},{"location":"ref_send_email.html#send-email-service","text":"This topic provides reference information on the Send Email service in HCL Leap.","title":"Send Email service"},{"location":"ref_send_email.html#section_jkm_qck_d1c","text":"The Send Email service provides a mechanism to send an email from a Leap application. The service enables an application author to bind fields from their form to the parameters of the service and it can be executed at any time, which is what distinguishes it from the submit activity email functionality (which can only be sent as part of a submit event). This feature is disabled by default and must be enabled by the administrator. To enable this service, add (or modify) the following property in the Leap_config.properties: ibm.nitro.NitroConfig.enableEmailService=true Leap does not need to be restarted, but it may take a few minutes for the service to appear in the authoring environment.","title":"Purpose"},{"location":"ref_send_email.html#section_qgm_tck_d1c","text":"Parameter Definition To One or more addresses to be used as the primary email target. CC One or more addresses to which the email will be sent as cc. BCC One or more addresses to which the email will be sent as bcc. Reply To The email address to be shown as the reply to address. Subject The text to be used for the email subject. Text Content Plain text content to be used for the email body. HTML Content HTML content to be used for the email body. Note: Both the plain text and html content are sent as part of the email if specified. It is up to the rendering email client to decide how and when to use the content provided.","title":"Service parameters"},{"location":"ref_send_email.html#section_hwm_zck_d1c","text":"To access the advanced service parameters, select Advanced from the drop-down labelled View on the Inputs tab. Parameter Definition To List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018To\u2019 field. CC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018CC\u2019 field. BCC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018BCC\u2019 field.","title":"Advanced service parameters"},{"location":"ref_send_email.html#section_zvw_cdk_d1c","text":"To use this service, complete the following steps while editing an application: Select Settings . Create a service configuration. Select the General service catalog. From the list of services, select Send Email . Map form items to the email service parameters On the Details tab, define a meaningful service id.. Click OK . The service is then listed on the services page for that form. This service can be connected to a button click event or triggered from any item\u2019s javaScript event. You can also setup an \u2018onCallFinished\u2019 handler to run custom javaScript code after the service completes.","title":"How to use"},{"location":"ref_send_email.html#section_gx3_ndk_d1c","text":"The service does not return any parameters. The service could throw the following errors: Error message *Definition * CLFNI1803E: Email must define at least one address ('to', 'cc' or 'bcc'). If the to, cc and bcc are empty CLFNI1804E: Email body may not be empty. If the text content and the html content are empty CLFNI1805E: Failed to send email. If an error is received from the mail server configured with Leap. Parent topic: Services","title":"Possible response values"},{"location":"ref_service_basic_credentials_provider.html","text":"Basic Credentials Provider This topic describes Basic Credentials Providers used within a Service Description. Purpose of the Basic Credentials Provider The Basic Credentials Provider provides a mechanism that allows user name and password credentials to be gathered, and provided to a Service Transport. The credentials that are gathered are specific to a single user session with HCL Leap. These credentials are not shared between multiple sessions and are not accessible to other users or administrators of Leap. When to use the Basic Credentials Provider When a Service Description needs a set of credentials and the credentials vary based on the user invoking the service call, use the Basic Credentials Provider. How to Configure the Basic Credentials Provider In general, the Basic Credentials Provider does not need any custom configuration to work. By configuring the Service Description to use the Basic Credentials Provider, Leap collects credentials, and makes them available to the Service Transport configured in the Service Description. Sharing Credentials Between Service Descriptions In some cases, several Service Descriptions might need to share a set of user credentials. Instead of having the user enter their credentials once per service, the Basic Credentials Provider can be configured to allow multiple Service Descriptions to share user-entered credentials using a realm. The realm is a property of the Basic Credentials Provider. Its value is the name of the realm to which entered credentials are associated. When multiple Service Descriptions share the realm value, they share the set of credentials. Using the Basic Credentials Provider in a Service Description The provider ID for the Basic Credentials Provider to enter in a Service Description is: basic Credentials Provider Parameters Name Description Mandatory Default realm The name of the realm to use to associate entered credentials so that they can be shared between multiple Service Descriptions. No N/A Sample Service Description <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <credentials providerId=\"basic\"\\> <property name=\"realm\" value=\"myRealm\"/\\> </credentials\\> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#ref_service_basic_credentials_provider","text":"This topic describes Basic Credentials Providers used within a Service Description.","title":"Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#purpose-of-the-basic-credentials-provider","text":"The Basic Credentials Provider provides a mechanism that allows user name and password credentials to be gathered, and provided to a Service Transport. The credentials that are gathered are specific to a single user session with HCL Leap. These credentials are not shared between multiple sessions and are not accessible to other users or administrators of Leap.","title":"Purpose of the Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#when-to-use-the-basic-credentials-provider","text":"When a Service Description needs a set of credentials and the credentials vary based on the user invoking the service call, use the Basic Credentials Provider.","title":"When to use the Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#how-to-configure-the-basic-credentials-provider","text":"In general, the Basic Credentials Provider does not need any custom configuration to work. By configuring the Service Description to use the Basic Credentials Provider, Leap collects credentials, and makes them available to the Service Transport configured in the Service Description.","title":"How to Configure the Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#sharing-credentials-between-service-descriptions","text":"In some cases, several Service Descriptions might need to share a set of user credentials. Instead of having the user enter their credentials once per service, the Basic Credentials Provider can be configured to allow multiple Service Descriptions to share user-entered credentials using a realm. The realm is a property of the Basic Credentials Provider. Its value is the name of the realm to which entered credentials are associated. When multiple Service Descriptions share the realm value, they share the set of credentials.","title":"Sharing Credentials Between Service Descriptions"},{"location":"ref_service_basic_credentials_provider.html#using-the-basic-credentials-provider-in-a-service-description","text":"The provider ID for the Basic Credentials Provider to enter in a Service Description is: basic","title":"Using the Basic Credentials Provider in a Service Description"},{"location":"ref_service_basic_credentials_provider.html#credentials-provider-parameters","text":"Name Description Mandatory Default realm The name of the realm to use to associate entered credentials so that they can be shared between multiple Service Descriptions. No N/A","title":"Credentials Provider Parameters"},{"location":"ref_service_basic_credentials_provider.html#sample-service-description","text":"<serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <credentials providerId=\"basic\"\\> <property name=\"realm\" value=\"myRealm\"/\\> </credentials\\> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_cookie_credentials_provider.html","text":"Cookie Credentials Provider This topic describes Cookie Credentials Provider used within a Service Description. Purpose of the Cookie Credentials Provider The Cookie Credentials Provider provides a mechanism through which cookies between the Leap and the web browser can be made available to a Service Transport. When to use the Cookie Credentials Provider The Cookie Credentials Provider is used when Leap and the endpoint of a Service share common Single Sign-On (SSO) credentials. For example, Leap and a service application are installed into the same SSO domain configured using Lightweight Third-Party Authentication (LTPA). The Cookie Credentials Provider is used to pass the LTPA tokens that were generated at login by Leap to the service application when a service call is made. How to Configure the Cookie Credentials Provider By default, the Cookie Credentials Provider does not make any cookies available to the Service Transport. In order to make cookies available to a Service Transport, the Cookie Credentials Provider must be configured. The value of the cookie\u2019s property is a comma-separated list of cookie names. Any request cookies that have the same name, based on a case insensitive comparison, as the names in the cookies property are made available to the Service Transport. Using the Cookie Credentials Provider in a Service Description The provider ID for the Cookie Credentials Provider to enter in a Service Description is: cookie Credentials Provider Parameters Name Description Mandatory Default cookies A comma-separated list of cookie names available to the Service Transport No N/A Sample Service Description <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> **<credentials providerId=\"cookie\"\\> <property name=\"cookies\" value=\"LtpaToken,LtpaToken2\"/\\> </credentials\\>** <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#ref_service_cookie_credentials_provider","text":"This topic describes Cookie Credentials Provider used within a Service Description.","title":"Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#purpose-of-the-cookie-credentials-provider","text":"The Cookie Credentials Provider provides a mechanism through which cookies between the Leap and the web browser can be made available to a Service Transport.","title":"Purpose of the Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#when-to-use-the-cookie-credentials-provider","text":"The Cookie Credentials Provider is used when Leap and the endpoint of a Service share common Single Sign-On (SSO) credentials. For example, Leap and a service application are installed into the same SSO domain configured using Lightweight Third-Party Authentication (LTPA). The Cookie Credentials Provider is used to pass the LTPA tokens that were generated at login by Leap to the service application when a service call is made.","title":"When to use the Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#how-to-configure-the-cookie-credentials-provider","text":"By default, the Cookie Credentials Provider does not make any cookies available to the Service Transport. In order to make cookies available to a Service Transport, the Cookie Credentials Provider must be configured. The value of the cookie\u2019s property is a comma-separated list of cookie names. Any request cookies that have the same name, based on a case insensitive comparison, as the names in the cookies property are made available to the Service Transport.","title":"How to Configure the Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#using-the-cookie-credentials-provider-in-a-service-description","text":"The provider ID for the Cookie Credentials Provider to enter in a Service Description is: cookie","title":"Using the Cookie Credentials Provider in a Service Description"},{"location":"ref_service_cookie_credentials_provider.html#credentials-provider-parameters","text":"Name Description Mandatory Default cookies A comma-separated list of cookie names available to the Service Transport No N/A","title":"Credentials Provider Parameters"},{"location":"ref_service_cookie_credentials_provider.html#sample-service-description","text":"<serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> **<credentials providerId=\"cookie\"\\> <property name=\"cookies\" value=\"LtpaToken,LtpaToken2\"/\\> </credentials\\>** <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_deploying_service_description.html","text":"Deploying a Service Description This topic contains information about how to deploy an HCL Leap Service Description. To deploy a Service Description, place the XML document in one of the following directories, or in a subdirectory of one of the following directories: Windows\u2122: any drive\\HCL\\Leap\\ServiceCatalog\\1\\ Linux\u2122, or AIX\u00ae: /opt/HCL/Leap/ServiceCatalog/1/ Important notes on directories: There must be an extensions directory in the same parent directory as the ServiceCatalog directory. Otherwise, the ServiceCatalog directory is not found. For example, /opt/HCL/Leap/extensions/. If the extensions directory or ServiceCatalog/1 directory does not exist, then the Leap server must be restarted after the directories are created. /opt/HCL/Leap/ is not case-sensitive. When the Leap server starts, the ServiceCatalog directory and its subdirectories are scanned for new, deleted, and changed Service Descriptions. New and changed Service Descriptions are loaded and registered with the Leap server, and become available immediately. Service Descriptions that fail to load, or do not have an appropriate Service Transport registered, are not available. Access to a service description may be given to a specific user, group, or special assignment (i.e. Authenticated, Anonymous, etc). The access control is made up of two parts: who may discover and work with the service while designing an application, and who may run the service. Users or Groups provided must be in the proper format - it is recommended to use the dialog (by clicking the button with the down arrow) when adding permissions. Adding or removing users does not require a server restart, but there will be a short delay before the changes take effect. Deleting Service Descriptions and changing Service Descriptions must be done with care. Applications might depend on any or all of the parameters for the Service Description, as well as data returned within the Service Description. Therefore, modifying the structure or ID of parameters, or how data is mapped into the parameters, can potentially cause failures within deployed applications. Deleted Service Descriptions are unregistered and immediately become unavailable to any applications, deployed or otherwise. It is critical that before deregistering a Service Description, a check is performed to ensure that there are no applications that are using the Service Description. In general, adding new parameters or mappings and changing names and descriptions does not cause failures. However, removing existing parameters, changing parameter mapping, or modifying IDs for Service Description, Service Transport, or a parameter, are likely to cause failures. A list of potentially safe and unsafe operations are summarized in Table 2. Table 1. Summary of potentially safe and unsafe changes Potentially Safe Changes Potentially Unsafe Changes Adding new parameters Changing the name of a parameter Changing the description of a parameter Changing the name of the Service Description Changing the description of the Service Description Adding support for an additional language within the Service Description Changing the Service Description default locale Removing existing parameters Changing the ID of an existing parameter Changing the ID of the Service Description Changing the Transport ID of the Service Description Changing the mapping of existing parameters. If significant changes must be made to a Service Description that is in use by deployed applications, a new Service Description must be created and the existing Service Description that remains intact. The new Service Description must be given a unique ID, and given a distinct name with a version number to indicate that this new Service Description is different from similarly named ones. Parent topic: Service Description","title":"Deploying a Service Description"},{"location":"ref_service_deploying_service_description.html#deploying-a-service-description","text":"This topic contains information about how to deploy an HCL Leap Service Description. To deploy a Service Description, place the XML document in one of the following directories, or in a subdirectory of one of the following directories: Windows\u2122: any drive\\HCL\\Leap\\ServiceCatalog\\1\\ Linux\u2122, or AIX\u00ae: /opt/HCL/Leap/ServiceCatalog/1/ Important notes on directories: There must be an extensions directory in the same parent directory as the ServiceCatalog directory. Otherwise, the ServiceCatalog directory is not found. For example, /opt/HCL/Leap/extensions/. If the extensions directory or ServiceCatalog/1 directory does not exist, then the Leap server must be restarted after the directories are created. /opt/HCL/Leap/ is not case-sensitive. When the Leap server starts, the ServiceCatalog directory and its subdirectories are scanned for new, deleted, and changed Service Descriptions. New and changed Service Descriptions are loaded and registered with the Leap server, and become available immediately. Service Descriptions that fail to load, or do not have an appropriate Service Transport registered, are not available. Access to a service description may be given to a specific user, group, or special assignment (i.e. Authenticated, Anonymous, etc). The access control is made up of two parts: who may discover and work with the service while designing an application, and who may run the service. Users or Groups provided must be in the proper format - it is recommended to use the dialog (by clicking the button with the down arrow) when adding permissions. Adding or removing users does not require a server restart, but there will be a short delay before the changes take effect. Deleting Service Descriptions and changing Service Descriptions must be done with care. Applications might depend on any or all of the parameters for the Service Description, as well as data returned within the Service Description. Therefore, modifying the structure or ID of parameters, or how data is mapped into the parameters, can potentially cause failures within deployed applications. Deleted Service Descriptions are unregistered and immediately become unavailable to any applications, deployed or otherwise. It is critical that before deregistering a Service Description, a check is performed to ensure that there are no applications that are using the Service Description. In general, adding new parameters or mappings and changing names and descriptions does not cause failures. However, removing existing parameters, changing parameter mapping, or modifying IDs for Service Description, Service Transport, or a parameter, are likely to cause failures. A list of potentially safe and unsafe operations are summarized in Table 2. Table 1. Summary of potentially safe and unsafe changes Potentially Safe Changes Potentially Unsafe Changes Adding new parameters Changing the name of a parameter Changing the description of a parameter Changing the name of the Service Description Changing the description of the Service Description Adding support for an additional language within the Service Description Changing the Service Description default locale Removing existing parameters Changing the ID of an existing parameter Changing the ID of the Service Description Changing the Transport ID of the Service Description Changing the mapping of existing parameters. If significant changes must be made to a Service Description that is in use by deployed applications, a new Service Description must be created and the existing Service Description that remains intact. The new Service Description must be given a unique ID, and given a distinct name with a version number to indicate that this new Service Description is different from similarly named ones. Parent topic: Service Description","title":"Deploying a Service Description"},{"location":"ref_service_http_service_transport.html","text":"HTTP Service Transport This topic provides reference information on HTTP Service Transports used in HCL Leap. Purpose of the HTTP Service Transport The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the Leap service mapping engine, the HTTP Service Transport extracts data from an HTTP response and makes it available to your application. When to use the HTTP Service Transport The HTTP Service Transport can be used to communicate with any standard HTTP server. There are some limits on what the HTTP Service Transport can provide, but in most cases, the HTTP Service Transport is all that is required to communicate with a basic HTTP server, or RESTful service. How to use the HTTP Service Transport The HTTP Service Transport has numerous parameters to configure it to talk to many HTTP Servers. In many cases, only a subset of the available parameters is needed. However, all the parameters can be used for any Service Description. The following sections provide a high-level outline of the parameters needed to configure specific parts of your HTTP request. Configuring the Request Method All HTTP requests require a request method, which tells the receiving HTTP server what to do with the request. The HTTP Service Transport supports all the basic HTTP request methods, including: GET, PUT, POST, and DELETE. The HTTP Service Transport supports configuring the HTTP request method with the request-method parameter. If this parameter is missing, or does not contain a valid HTTP request method, then the default, GET is used. Configuring the Request URL A URL is required to make an HTTP request. There is no default for this parameter, so it must be provided to the HTTP Service Transport. There are several parameters that affect how the request URL is built: request-url, request-url-postfix, request-url-postfix-encoded, and two dynamic parameters: request-url-postfix-N and request-url-postfix-N-encoded. The HTTP Service Transport constructs the URL by starting with the value of request-url and appending postfixes. If request-url-postfix is present, its value is appended to the value of request-url. Before appending, the HTTP Service Transport URL encodes the value of request-url-postfix if the request-url-postfix-encoded flag is not present or if its value is anything other than true. Encoding allows values containing characters that are not valid to be placed into the URL without any harm. Choosing to not encode a value allows it to be appended without modification to the URL. For example, consider a Service Description that requires the path to a file as input. Since the path might contain slash (/) characters that must be preserved, then request-url-postfix-encoded is set to true. This instructs the HTTP Service Transport to leave the value alone. However, another Service Description might need to include a text string as a path component. In this case, the slash (/) or any other characters are encoded such that they do not interfere with the path. In this second case, the request-url-postfix-encoded parameter is set to false or omitted from the Service Description. In some cases, having a single postfix does not provide enough flexibility. Therefore, the dynamic parameters request-url-postfix-Nand request-url-postfix-N-encoded are used. The N in each of these parameters refers to its order. During processing, the HTTP Service Transport appends the value of these parameters starting with 0 until it finds a missing parameter. As with the single postfix, encoding is optionally performed on each of the parameters before it is added if the value of the request-url-postfix-N-encoded flag is not present or contains any value other than true. For example, if the Service Description contains parameters called request-url-postfix-0, request-url-postfix-1, and request-url-postfix-3, only request-url-postfix-0 and request-url-postfix-1 are appended to the URL. While building the request URL if a parameter called request-url-postfix is found, the dynamic parameters are ignored. The Service Description developer must make a conscious choice to use these dynamic parameters. Configuring Request Parameters Query parameters are configured using parameters with the prefix request-query-. Text after the prefix is considered to be the name of the query parameter to pass. The value of the query parameter comes from the value of the transport parameter, and is encoded to prevent the URL from being disrupted. All parameters with the request-query- prefix are added to the URL. No guarantees are made as to the order in which the query parameters are added. For example, consider a search service that requires the search criteria term to be passed as a query parameter. In order to communicate with this service, the Service Description must have a parameter called request-query-term. Configuring Request Headers The HTTP Service Transport allows HTTP request headers to be configured using parameters with the prefix request-header-. Text after the prefix is considered to be the name of the header. The value of the request header is the value of the parameter. No escaping or encoding is performed on either the name or value of request headers. Therefore, header configuration must include only characters that are permissible. Configuring the Request Body HTTP allows a body, or entity, to be sent with PUT and POST requests. In order to allow a Service Description to include a request entity, the HTTP Service Transport sends the contents of the request-entity parameter with the request. The contents of this parameter are ignored if the content of request-method is not PUT or POST. Configuring HTTP Authentication The HTTP Service Transport supports HTTP Basic and HTTP Digest authentication schemes. There arethreetwo mechanisms through which the credentials can be configured: hard coded in the Service Description, provided through the Java 2 Connector (J2C) Authentication Credentials provider, or provided at run time through the Basic Credentials Provider. To hard code the credentials that the HTTP Service Transport uses to authenticate, the request-http-auth-username and request-http-auth-password parameters must be available. The values of these parameters are used during any HTTP authentication challenge for either HTTP Basic or HTTP Digest authentication. The HTTP Service Transport performs any hashing required. Therefore, the values of these parameters must be the plain text version of both the user name and password. Credentials can be provided at run time using the Basic Credentials Provider. Refer to the Service Description and Basic Credentials Provider help topic for more information. The HTTP Service Transport only uses credentials provided by the Basic Credentials Provider if the request-http-auth-username and request-http-auth-password parameters are empty. Credentials can be provided using the J2C Authentication Credentials Provider. Refer to the Java 2 Connector (J2C) Authentication Credentials Provider help topic for more information. Note: The HTTP Service transport can only use credentials provided by the Basic Credentials provideror the J2C Authentication Credentials Provider if the request-HTTP-auth-username and request-HTTP-auth-password parameters are empty. In addition to HTTP Basic and HTTP Digest authentication, the HTTP Service Transport supports Single Sign on (SSO) authentication using the Cookie Credentials Provider. In the case where the request made through the HTTP Service Transports needs to passLeap authentication cookies, the Cookie Credentials Provider can be used. In general, the Cookie Credentials Provider is configured to pass the LtpaToken and LtpaToken2 cookies. Consult the Service Description and Cookie Credentials Provider help topics for information. Receiving Response Status Information The HTTP Service Transport ensures that the HTTP status code and message are available for consumption. The HTTP status code, for example, 200, 404, or 500, is available in the outbound response-code parameter. Similarly, the outbound response-message parameter contains the status message returned, for example, OK, Not Found, or Server Error. Receiving Response Headers All the headers that are returned in the HTTP response are made available to the Service Description via dynamic parameters. Each header name is converted to lowercase and appended with response-header-. For example, the content-type header would be available as an outbound parameter called response-header-content-type. The parameter contains the value of the header. In the case where a header contains more than one value, the header values are collapsed into a single comma-separated list. Receiving the Response Body The entire response body, or entity, is made available via the outbound response-entity parameter. Specifying the HTTP Service Transport in a Service Description The HTTP Service Transport can be used by specifying its unique ID as the value of the transportId element of the Service Description. The unique ID of the HTTP Service Transport is: HTTPServiceTransport Supported Credentials Providers The HTTP Service Transport supports the following Credentials Providers: Basic Cookie J2C Transport Parameters Inbound Inbound parameters are provided to the HTTP Service Transport. Table 1. Available Inbound Parameters Name Description Mandatory Type Default request-url Base URL to request. Yes String request-method HTTP verb to use when making the request. Acceptable values are GET, PUT, POST, or DELETE. No String GET request-url-postfix Postfix to append to the value of request-url. No String N/A request-url-postfix-encoded Flag indicating whether the value of request-postfix is encoded. If this parameter is missing or is set to false, the value is URL encoded. Yes Boolean FALSE request-url-postfix-N The N postfix to append to the value of request-url. This parameter is only considered if request-postfix is not present. No String N/A request-url-postfix-N-encoded Flag indicating whether the value of the corresponding request-postfix-N is encoded. If this parameter is missing or set to false, the value is URL encoded. No Boolean FALSE request-header-x The value for the request header x. For example, request-header-accept creates a request header called accept. No String N/A request-query-x The value for the query parameter called x. For example, request-query-term creates a query parameter called term. No String N/A request-entity The body of the request to send. The UTF-8 character set is used. No String N/A Outbound Outbound parameters are returned from the transport as a result of the service invocation. Table 2. Available Outbound Parameters Name Description Type response-code HTTP status code returned by the server. This could be any of the standard values, for example, 200, 400, and 500, or a non-standard code returned by the server. Integer response-message HTTP status message associated with the HTTP status code. The value of this parameter is determined by the server. Generally, this message is a standard status message, for example, OK, Not Found, or Server Error. String response-header-x The value of the response header named x in lowercase. For example, if the response contains the response header Content-Type: text/html then response-header-content-type contains the value text/html. String response-entity The entire response body from the HTTP request. It is assumed that the response uses the UTF-8, or ASCII character set. String Sample Service Description For more examples using the HTTP Service Transport, see Service Description . <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#http-service-transport","text":"This topic provides reference information on HTTP Service Transports used in HCL Leap.","title":"HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#purpose-of-the-http-service-transport","text":"The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the Leap service mapping engine, the HTTP Service Transport extracts data from an HTTP response and makes it available to your application.","title":"Purpose of the HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#when-to-use-the-http-service-transport","text":"The HTTP Service Transport can be used to communicate with any standard HTTP server. There are some limits on what the HTTP Service Transport can provide, but in most cases, the HTTP Service Transport is all that is required to communicate with a basic HTTP server, or RESTful service.","title":"When to use the HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#how-to-use-the-http-service-transport","text":"The HTTP Service Transport has numerous parameters to configure it to talk to many HTTP Servers. In many cases, only a subset of the available parameters is needed. However, all the parameters can be used for any Service Description. The following sections provide a high-level outline of the parameters needed to configure specific parts of your HTTP request. Configuring the Request Method All HTTP requests require a request method, which tells the receiving HTTP server what to do with the request. The HTTP Service Transport supports all the basic HTTP request methods, including: GET, PUT, POST, and DELETE. The HTTP Service Transport supports configuring the HTTP request method with the request-method parameter. If this parameter is missing, or does not contain a valid HTTP request method, then the default, GET is used. Configuring the Request URL A URL is required to make an HTTP request. There is no default for this parameter, so it must be provided to the HTTP Service Transport. There are several parameters that affect how the request URL is built: request-url, request-url-postfix, request-url-postfix-encoded, and two dynamic parameters: request-url-postfix-N and request-url-postfix-N-encoded. The HTTP Service Transport constructs the URL by starting with the value of request-url and appending postfixes. If request-url-postfix is present, its value is appended to the value of request-url. Before appending, the HTTP Service Transport URL encodes the value of request-url-postfix if the request-url-postfix-encoded flag is not present or if its value is anything other than true. Encoding allows values containing characters that are not valid to be placed into the URL without any harm. Choosing to not encode a value allows it to be appended without modification to the URL. For example, consider a Service Description that requires the path to a file as input. Since the path might contain slash (/) characters that must be preserved, then request-url-postfix-encoded is set to true. This instructs the HTTP Service Transport to leave the value alone. However, another Service Description might need to include a text string as a path component. In this case, the slash (/) or any other characters are encoded such that they do not interfere with the path. In this second case, the request-url-postfix-encoded parameter is set to false or omitted from the Service Description. In some cases, having a single postfix does not provide enough flexibility. Therefore, the dynamic parameters request-url-postfix-Nand request-url-postfix-N-encoded are used. The N in each of these parameters refers to its order. During processing, the HTTP Service Transport appends the value of these parameters starting with 0 until it finds a missing parameter. As with the single postfix, encoding is optionally performed on each of the parameters before it is added if the value of the request-url-postfix-N-encoded flag is not present or contains any value other than true. For example, if the Service Description contains parameters called request-url-postfix-0, request-url-postfix-1, and request-url-postfix-3, only request-url-postfix-0 and request-url-postfix-1 are appended to the URL. While building the request URL if a parameter called request-url-postfix is found, the dynamic parameters are ignored. The Service Description developer must make a conscious choice to use these dynamic parameters. Configuring Request Parameters Query parameters are configured using parameters with the prefix request-query-. Text after the prefix is considered to be the name of the query parameter to pass. The value of the query parameter comes from the value of the transport parameter, and is encoded to prevent the URL from being disrupted. All parameters with the request-query- prefix are added to the URL. No guarantees are made as to the order in which the query parameters are added. For example, consider a search service that requires the search criteria term to be passed as a query parameter. In order to communicate with this service, the Service Description must have a parameter called request-query-term. Configuring Request Headers The HTTP Service Transport allows HTTP request headers to be configured using parameters with the prefix request-header-. Text after the prefix is considered to be the name of the header. The value of the request header is the value of the parameter. No escaping or encoding is performed on either the name or value of request headers. Therefore, header configuration must include only characters that are permissible. Configuring the Request Body HTTP allows a body, or entity, to be sent with PUT and POST requests. In order to allow a Service Description to include a request entity, the HTTP Service Transport sends the contents of the request-entity parameter with the request. The contents of this parameter are ignored if the content of request-method is not PUT or POST. Configuring HTTP Authentication The HTTP Service Transport supports HTTP Basic and HTTP Digest authentication schemes. There arethreetwo mechanisms through which the credentials can be configured: hard coded in the Service Description, provided through the Java 2 Connector (J2C) Authentication Credentials provider, or provided at run time through the Basic Credentials Provider. To hard code the credentials that the HTTP Service Transport uses to authenticate, the request-http-auth-username and request-http-auth-password parameters must be available. The values of these parameters are used during any HTTP authentication challenge for either HTTP Basic or HTTP Digest authentication. The HTTP Service Transport performs any hashing required. Therefore, the values of these parameters must be the plain text version of both the user name and password. Credentials can be provided at run time using the Basic Credentials Provider. Refer to the Service Description and Basic Credentials Provider help topic for more information. The HTTP Service Transport only uses credentials provided by the Basic Credentials Provider if the request-http-auth-username and request-http-auth-password parameters are empty. Credentials can be provided using the J2C Authentication Credentials Provider. Refer to the Java 2 Connector (J2C) Authentication Credentials Provider help topic for more information. Note: The HTTP Service transport can only use credentials provided by the Basic Credentials provideror the J2C Authentication Credentials Provider if the request-HTTP-auth-username and request-HTTP-auth-password parameters are empty. In addition to HTTP Basic and HTTP Digest authentication, the HTTP Service Transport supports Single Sign on (SSO) authentication using the Cookie Credentials Provider. In the case where the request made through the HTTP Service Transports needs to passLeap authentication cookies, the Cookie Credentials Provider can be used. In general, the Cookie Credentials Provider is configured to pass the LtpaToken and LtpaToken2 cookies. Consult the Service Description and Cookie Credentials Provider help topics for information. Receiving Response Status Information The HTTP Service Transport ensures that the HTTP status code and message are available for consumption. The HTTP status code, for example, 200, 404, or 500, is available in the outbound response-code parameter. Similarly, the outbound response-message parameter contains the status message returned, for example, OK, Not Found, or Server Error. Receiving Response Headers All the headers that are returned in the HTTP response are made available to the Service Description via dynamic parameters. Each header name is converted to lowercase and appended with response-header-. For example, the content-type header would be available as an outbound parameter called response-header-content-type. The parameter contains the value of the header. In the case where a header contains more than one value, the header values are collapsed into a single comma-separated list. Receiving the Response Body The entire response body, or entity, is made available via the outbound response-entity parameter.","title":"How to use the HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#specifying-the-http-service-transport-in-a-service-description","text":"The HTTP Service Transport can be used by specifying its unique ID as the value of the transportId element of the Service Description. The unique ID of the HTTP Service Transport is: HTTPServiceTransport","title":"Specifying the HTTP Service Transport in a Service Description"},{"location":"ref_service_http_service_transport.html#supported-credentials-providers","text":"The HTTP Service Transport supports the following Credentials Providers: Basic Cookie J2C","title":"Supported Credentials Providers"},{"location":"ref_service_http_service_transport.html#transport-parameters","text":"Inbound Inbound parameters are provided to the HTTP Service Transport. Table 1. Available Inbound Parameters Name Description Mandatory Type Default request-url Base URL to request. Yes String request-method HTTP verb to use when making the request. Acceptable values are GET, PUT, POST, or DELETE. No String GET request-url-postfix Postfix to append to the value of request-url. No String N/A request-url-postfix-encoded Flag indicating whether the value of request-postfix is encoded. If this parameter is missing or is set to false, the value is URL encoded. Yes Boolean FALSE request-url-postfix-N The N postfix to append to the value of request-url. This parameter is only considered if request-postfix is not present. No String N/A request-url-postfix-N-encoded Flag indicating whether the value of the corresponding request-postfix-N is encoded. If this parameter is missing or set to false, the value is URL encoded. No Boolean FALSE request-header-x The value for the request header x. For example, request-header-accept creates a request header called accept. No String N/A request-query-x The value for the query parameter called x. For example, request-query-term creates a query parameter called term. No String N/A request-entity The body of the request to send. The UTF-8 character set is used. No String N/A Outbound Outbound parameters are returned from the transport as a result of the service invocation. Table 2. Available Outbound Parameters Name Description Type response-code HTTP status code returned by the server. This could be any of the standard values, for example, 200, 400, and 500, or a non-standard code returned by the server. Integer response-message HTTP status message associated with the HTTP status code. The value of this parameter is determined by the server. Generally, this message is a standard status message, for example, OK, Not Found, or Server Error. String response-header-x The value of the response header named x in lowercase. For example, if the response contains the response header Content-Type: text/html then response-header-content-type contains the value text/html. String response-entity The entire response body from the HTTP request. It is assumed that the response uses the UTF-8, or ASCII character set. String","title":"Transport Parameters"},{"location":"ref_service_http_service_transport.html#sample-service-description","text":"For more examples using the HTTP Service Transport, see Service Description . <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_j2c_credentials_provider.html","text":"Java 2 Connector (J2C) Authentication Credentials Provider This topic describes J2C Authentication Credentials Providers that are used within a Service Description. Purpose of the J2C Credentials Provider The J2C Authentication Credentials Provider provides a mechanism that allows user name and password credentials to be provided to a Service Transport without being hardcoded within the Service Description. The credentials are defined by the WebSphere\u00ae Application Server administrator and associated with an alias that is then used within the Service Description. When to use the J2C Credentials Provider Use the J2C Authentication Credentials Provider when a Service Description needs to define a static set of credentials, typically used to access a backend resource or service, and not specific to a particular user starting the service. How to Configure the J2C Credentials Provider To use the J2C Authentication Credential Provider, the WebSphere Application Server administrator must first define a user identity (User ID, Password, and Alias name) within the JAAS \u2013 J2C authentication data section of the WebSphere Application Server administrative console. For an example of the WebSphere Application Server Network Deployment 8.5.5, see the WebSphere Application Server documentation . Using the J2C Credentials Provider in a Service Description The provider ID for the J2C Credentials Provider to enter in a Service Description is: j2cAlias Credentials Provider Parameters Name Description Mandatory Default alias The Alias name of a user identity that contains the credentials that are required for the Service Description. Yes N/A Sample Service Description <serviceDescription> <id>watsonTranslateJ2C</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Watson Translator J2C</name> <description xml:lang=\"en\"> Translate text using the bluemix Watson Service </description> <credentials providerId=\"j2cAlias\"> <property name=\"alias\" value=\"someNode01/BlueMixTranslateService\"/> </credentials> <inbound> <parameters> <parameter> <id>text</id> <type>STRING</type> <name xml:lang=\"en\">Text</name> <description xml:lang=\"en\">Text to be translated</description> <mandatory>true</mandatory> </parameter> <parameter> <id>model_id</id> <type>STRING</type> <name xml:lang=\"en\">Model ID</name> <description xml:lang=\"en\">Translation to be performed (ex. 'en-fr' to translate from English to French)</description> <mandatory>true</mandatory> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>request-url</id> <value>https://gateway.watsonplatform.net/language-translation/api/v2/translate</value> </constant> <constant> <id>request-method</id> <value>GET</value> </constant> </constants> <mapping xmlns=\"\"> <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> <mapping target=\"transport:request-query-txt\" source=\"parameter:text\"/> <mapping target=\"transport:request-query-model_id\" source=\"parameter:model_id\"/> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <type>STRING</type> <name xml:lang=\"en\">Translated Text</name> <description xml:lang=\"en\">Text containing new translation.</description> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Java 2 Connector (J2C) Authentication Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#ref_service_j2c_credentials_provider","text":"This topic describes J2C Authentication Credentials Providers that are used within a Service Description.","title":"Java 2 Connector (J2C) Authentication Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#purpose-of-the-j2c-credentials-provider","text":"The J2C Authentication Credentials Provider provides a mechanism that allows user name and password credentials to be provided to a Service Transport without being hardcoded within the Service Description. The credentials are defined by the WebSphere\u00ae Application Server administrator and associated with an alias that is then used within the Service Description.","title":"Purpose of the J2C Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#when-to-use-the-j2c-credentials-provider","text":"Use the J2C Authentication Credentials Provider when a Service Description needs to define a static set of credentials, typically used to access a backend resource or service, and not specific to a particular user starting the service.","title":"When to use the J2C Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#how-to-configure-the-j2c-credentials-provider","text":"To use the J2C Authentication Credential Provider, the WebSphere Application Server administrator must first define a user identity (User ID, Password, and Alias name) within the JAAS \u2013 J2C authentication data section of the WebSphere Application Server administrative console. For an example of the WebSphere Application Server Network Deployment 8.5.5, see the WebSphere Application Server documentation .","title":"How to Configure the J2C Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#using-the-j2c-credentials-provider-in-a-service-description","text":"The provider ID for the J2C Credentials Provider to enter in a Service Description is: j2cAlias","title":"Using the J2C Credentials Provider in a Service Description"},{"location":"ref_service_j2c_credentials_provider.html#credentials-provider-parameters","text":"Name Description Mandatory Default alias The Alias name of a user identity that contains the credentials that are required for the Service Description. Yes N/A","title":"Credentials Provider Parameters"},{"location":"ref_service_j2c_credentials_provider.html#sample-service-description","text":"<serviceDescription> <id>watsonTranslateJ2C</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Watson Translator J2C</name> <description xml:lang=\"en\"> Translate text using the bluemix Watson Service </description> <credentials providerId=\"j2cAlias\"> <property name=\"alias\" value=\"someNode01/BlueMixTranslateService\"/> </credentials> <inbound> <parameters> <parameter> <id>text</id> <type>STRING</type> <name xml:lang=\"en\">Text</name> <description xml:lang=\"en\">Text to be translated</description> <mandatory>true</mandatory> </parameter> <parameter> <id>model_id</id> <type>STRING</type> <name xml:lang=\"en\">Model ID</name> <description xml:lang=\"en\">Translation to be performed (ex. 'en-fr' to translate from English to French)</description> <mandatory>true</mandatory> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>request-url</id> <value>https://gateway.watsonplatform.net/language-translation/api/v2/translate</value> </constant> <constant> <id>request-method</id> <value>GET</value> </constant> </constants> <mapping xmlns=\"\"> <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> <mapping target=\"transport:request-query-txt\" source=\"parameter:text\"/> <mapping target=\"transport:request-query-model_id\" source=\"parameter:model_id\"/> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <type>STRING</type> <name xml:lang=\"en\">Translated Text</name> <description xml:lang=\"en\">Text containing new translation.</description> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_localizing_service_description.html","text":"Localizing Service Descriptions The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Service Descriptions can be localized in two ways: using the xml:lang attribute, or providing translations in a separate .properties file. However, these approaches can be cumbersome if the Service Description is to be localized into many languages. An alternative is to use the key attribute on the name, and description elements. The value of the key attribute denotes the key in a Java\u2122 style .properties file that maps the key to the value to display for the name or description element. When the Service Description is loaded, Leap loads the associated .properties files, and uses their contents as the messages to display for the name and description elements. When a Service Description uses this approach, the .properties files and Service Description must be placed in the same deployment directory. Changes to the .properties files are not automatically reloaded if they are changed. In order to refresh with new strings, the Service Description XML file must be changed or its modification date changed. Naming the .properties files is important because the Leap looks for .properties files with specific names. The name of the .properties file that contains the default strings, if none are specified for a specific locale, is the same as the base name of the Service Description XML file, but with a .properties extension. For the locale-specific .properties files, the name is similar but includes an underscore followed by a locale specifier after the base name but before the .properties extension. For example, if the Service Description XML file is CurrencyConvService.xml, then the default .properties file is CurrencyConvService.properties and the French messages are in a file named CurrencyConvService_fr.properties. For details on locale specifier formats, refer to the documentation of java.util.Locale. Parent topic: Service Description","title":"Localizing Service Descriptions"},{"location":"ref_service_localizing_service_description.html#ref_service_localizing_service_description","text":"The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Service Descriptions can be localized in two ways: using the xml:lang attribute, or providing translations in a separate .properties file. However, these approaches can be cumbersome if the Service Description is to be localized into many languages. An alternative is to use the key attribute on the name, and description elements. The value of the key attribute denotes the key in a Java\u2122 style .properties file that maps the key to the value to display for the name or description element. When the Service Description is loaded, Leap loads the associated .properties files, and uses their contents as the messages to display for the name and description elements. When a Service Description uses this approach, the .properties files and Service Description must be placed in the same deployment directory. Changes to the .properties files are not automatically reloaded if they are changed. In order to refresh with new strings, the Service Description XML file must be changed or its modification date changed. Naming the .properties files is important because the Leap looks for .properties files with specific names. The name of the .properties file that contains the default strings, if none are specified for a specific locale, is the same as the base name of the Service Description XML file, but with a .properties extension. For the locale-specific .properties files, the name is similar but includes an underscore followed by a locale specifier after the base name but before the .properties extension. For example, if the Service Description XML file is CurrencyConvService.xml, then the default .properties file is CurrencyConvService.properties and the French messages are in a file named CurrencyConvService_fr.properties. For details on locale specifier formats, refer to the documentation of java.util.Locale. Parent topic: Service Description","title":"Localizing Service Descriptions"},{"location":"ref_service_mapping_service_description.html","text":"Mapping Data for a Service Description The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport Mapping Data Each serviceMapping consists of two elements: constants, and mapping. The constants element, defines constant values that can be mapped into the output structure. The mapping element and its child mapping elements allow mapping of the Service Description parameters to the Service Transport, or the Service Transport data to the Service Description parameters. All the named constants available during mapping must be declared within the optional constants element. If no constants are required during mapping, the constants element can be omitted. If the constants element is present, it can contain one or more constant elements. Each constant element contains two elements: id and value, which specify the ID of the constant and its value. The id of a constant must contain characters that are allowed in a URL path, which are [A-Z], [a-z], [0-9], hyphen (-), and underscore (_). The text of the value element is used as the value of the constant. Any XML or JSON markup that exists inside the value element is not present at run time. Literal XML values can be produced by either wrapping the contents of the element in a CDATA section, or escaping any angle brackets. Mapping Service Description parameters to Service Transport parameters, and vice versa, is defined using mapping elements. A root mapping element must be placed as a child of serviceDescription. This root mapping contains other mapping elements that describe how data is to be mapped. The source and target of a mapping are declared using attributes on the mapping element. These attributes are: source, sourceType, sourceRef, target, targetType, and targetRef. Each mapping element can also have child mapping elements that allow repeating structures and large XML or JSON documents to be produced. Mapping Structure The input and output of both Service Descriptions and Service Transports is a simple map of key value pairs. A value can be either a string, or a list of maps of key value pairs. Leap does not support a map as a value. A value of a key in one map cannot be another map, it must be either a string or a list of maps. The mapping elements within a Service Description instruct Leap on how to produce one such structure from another, potentially extracting values from strings treated as XML or JSON. Mapping Definition Each mapping element within a Service Description describes how Leap must map data from a source to a destination. Each mapping is made up of a source, and a target. The value of the source and target attributes is a colon separated value containing the scheme of the value and its name. Valid values for the scheme depend on the binding in which the mapping is located, and whether the scheme refers to the source or target of the mapping. For inbound mapping, the source scheme must be parameter or constant, and the target must be transport. For outbound mapping, the source scheme must be transport or constant, and the target must be parameter. A summary of the valid schemes and their contexts are listed in Table 1. The name component of a scheme identifies the key to use when looking up a value or where to place the result. Table 1. Summary of valid schemes and their contexts Scheme Inbound Inbound Outbound Outbound Type Source Target Source Target constant Yes No Yes No parameter Yes No No Yes transport No Yes Yes No Both the source and target have a type which instructs Leap how to work with the value. Both ends of a mapping can contain a reference, which allows a subset of the source to be placed at a specific location within the target. Valid values for type are string, xml, jsonand list, with string being the default. If the type is xml or json, the reference represents an XPath expression that determines which nodes are affected by the mapping. A source reference is used to extract a subset of the value identified by the source scheme. A target reference is used to construct the path where the value extracted from the source is placed. If there are no nodes that match a target reference, the node and its missing parent nodes are created. For this reason, only simple XPath predicates, those that use only the and operator, are permitted. In all other cases, the value of the reference is not used and is omitted. Each mapping element can also contain sub-mappings, which allow repeating structures to be iterated over and built. At run time, Leap server processes the mapping elements in top-down order. Nested mappings evaluate their source and target in the context of their parent source or target mapping. Run time Mapping At runtime, Leap server performs the following operations for each mapping element. Each mapping element is evaluated in the order in which it occurs within the root mapping element. Look up the source. Convert the source value if required (parse as XML or JSON). Resolve the source reference. Look up the target, if present. Convert the target value if required (parent as XML or JSON). Resolve the target reference. Map the source value to the target value. Evaluate child mapping elements. To look up the source, the Leap server first needs to determine the scheme. If the scheme is constant, the identified constant is looked up and returned. If there is no constant with the given name, an empty string is used. If the scheme is parameter or transport, then the current context is searched for the named item. For top-level mapping elements, this is the root of the parameter structure. For child mapping elements, this is the result of the lookup, conversion, and resolve operation on its parent. If the named value cannot be found in the current context, the parent context is checked until there are no more parent contexts. If the value does not exist in any context, an empty string is used. The value returned by the lookup operation is then converted into the type specified for the source or target. If the conversion produced an XML or JSON value, the reference is resolved, which returns a subset of the original value. The same lookup, conversion, and resolve operations are then performed on the target of the mapping. Once both the source and target are resolved, the mapping operation begins. Generally, the cardinality of the target matches the source. For example, if a list is the source, then the target must be a list. Similarly, if a single value is the source, then the target must be a single value. When the source is a single value, that value is assigned directly to the target value. When the source is a list, a new list is created to contain the results. For each item in the source list, the child mappings of the current mapping element are evaluated. The results of these mappings are added to the list being constructed. When all the source items are evaluated, the list is assigned to the target value. For more information on creating a Service Description that returns JSON, see the developerWorks\u00ae Leap wiki . Parent topic: Service Description","title":"Mapping Data for a Service Description"},{"location":"ref_service_mapping_service_description.html#mapping-data-for-a-service-description","text":"The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport","title":"Mapping Data for a Service Description"},{"location":"ref_service_mapping_service_description.html#mapping-data","text":"Each serviceMapping consists of two elements: constants, and mapping. The constants element, defines constant values that can be mapped into the output structure. The mapping element and its child mapping elements allow mapping of the Service Description parameters to the Service Transport, or the Service Transport data to the Service Description parameters. All the named constants available during mapping must be declared within the optional constants element. If no constants are required during mapping, the constants element can be omitted. If the constants element is present, it can contain one or more constant elements. Each constant element contains two elements: id and value, which specify the ID of the constant and its value. The id of a constant must contain characters that are allowed in a URL path, which are [A-Z], [a-z], [0-9], hyphen (-), and underscore (_). The text of the value element is used as the value of the constant. Any XML or JSON markup that exists inside the value element is not present at run time. Literal XML values can be produced by either wrapping the contents of the element in a CDATA section, or escaping any angle brackets. Mapping Service Description parameters to Service Transport parameters, and vice versa, is defined using mapping elements. A root mapping element must be placed as a child of serviceDescription. This root mapping contains other mapping elements that describe how data is to be mapped. The source and target of a mapping are declared using attributes on the mapping element. These attributes are: source, sourceType, sourceRef, target, targetType, and targetRef. Each mapping element can also have child mapping elements that allow repeating structures and large XML or JSON documents to be produced. Mapping Structure The input and output of both Service Descriptions and Service Transports is a simple map of key value pairs. A value can be either a string, or a list of maps of key value pairs. Leap does not support a map as a value. A value of a key in one map cannot be another map, it must be either a string or a list of maps. The mapping elements within a Service Description instruct Leap on how to produce one such structure from another, potentially extracting values from strings treated as XML or JSON. Mapping Definition Each mapping element within a Service Description describes how Leap must map data from a source to a destination. Each mapping is made up of a source, and a target. The value of the source and target attributes is a colon separated value containing the scheme of the value and its name. Valid values for the scheme depend on the binding in which the mapping is located, and whether the scheme refers to the source or target of the mapping. For inbound mapping, the source scheme must be parameter or constant, and the target must be transport. For outbound mapping, the source scheme must be transport or constant, and the target must be parameter. A summary of the valid schemes and their contexts are listed in Table 1. The name component of a scheme identifies the key to use when looking up a value or where to place the result. Table 1. Summary of valid schemes and their contexts Scheme Inbound Inbound Outbound Outbound Type Source Target Source Target constant Yes No Yes No parameter Yes No No Yes transport No Yes Yes No Both the source and target have a type which instructs Leap how to work with the value. Both ends of a mapping can contain a reference, which allows a subset of the source to be placed at a specific location within the target. Valid values for type are string, xml, jsonand list, with string being the default. If the type is xml or json, the reference represents an XPath expression that determines which nodes are affected by the mapping. A source reference is used to extract a subset of the value identified by the source scheme. A target reference is used to construct the path where the value extracted from the source is placed. If there are no nodes that match a target reference, the node and its missing parent nodes are created. For this reason, only simple XPath predicates, those that use only the and operator, are permitted. In all other cases, the value of the reference is not used and is omitted. Each mapping element can also contain sub-mappings, which allow repeating structures to be iterated over and built. At run time, Leap server processes the mapping elements in top-down order. Nested mappings evaluate their source and target in the context of their parent source or target mapping.","title":"Mapping Data"},{"location":"ref_service_mapping_service_description.html#run-time-mapping","text":"At runtime, Leap server performs the following operations for each mapping element. Each mapping element is evaluated in the order in which it occurs within the root mapping element. Look up the source. Convert the source value if required (parse as XML or JSON). Resolve the source reference. Look up the target, if present. Convert the target value if required (parent as XML or JSON). Resolve the target reference. Map the source value to the target value. Evaluate child mapping elements. To look up the source, the Leap server first needs to determine the scheme. If the scheme is constant, the identified constant is looked up and returned. If there is no constant with the given name, an empty string is used. If the scheme is parameter or transport, then the current context is searched for the named item. For top-level mapping elements, this is the root of the parameter structure. For child mapping elements, this is the result of the lookup, conversion, and resolve operation on its parent. If the named value cannot be found in the current context, the parent context is checked until there are no more parent contexts. If the value does not exist in any context, an empty string is used. The value returned by the lookup operation is then converted into the type specified for the source or target. If the conversion produced an XML or JSON value, the reference is resolved, which returns a subset of the original value. The same lookup, conversion, and resolve operations are then performed on the target of the mapping. Once both the source and target are resolved, the mapping operation begins. Generally, the cardinality of the target matches the source. For example, if a list is the source, then the target must be a list. Similarly, if a single value is the source, then the target must be a single value. When the source is a single value, that value is assigned directly to the target value. When the source is a list, a new list is created to contain the results. For each item in the source list, the child mappings of the current mapping element are evaluated. The results of these mappings are added to the list being constructed. When all the source items are evaluated, the list is assigned to the target value. For more information on creating a Service Description that returns JSON, see the developerWorks\u00ae Leap wiki . Parent topic: Service Description","title":"Run time Mapping"},{"location":"ref_service_service_description.html","text":"Service Description A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface. Elements of a Service Description A Service Description is represented as an XML document that follows an XML schema. This single XML document contains all the information for a single Service Description: name, description, input and output parameters, and input and output mapping. For a full listing of the XML schema, refer to Appendix A - Service Description schema . The top-level element in a Service Description is the serviceDescription element. This element, and all of its childs, must be in the XML namespace with a URI of http://www.ibm.com/xmlns/prod/forms/services/serviceDescription/1.0. ID Each Service Description must contain a unique id that identifies it to the Leap server. The id can contain any characters that are valid as a component of a URL path. These characters include: Alphabetical letters \u2013 [A-Z], and [a-z] Numerals \u2013 [0-9] Hyphens \u2013 [-] Underscore \u2013 [_] Because a Service Description ID is a surrogate for the Service Description itself, this ID does not must be descriptive. Any UUID is a valid choice for a Service Description ID because it guarantees uniqueness and contains only characters that are valid in a URL path component. Transport ID A Service Description must reference a Service Transport to perform its underlying operation. Each Service Transport has its own unique transportId that uniquely identifies it to the Leap server. The ID for a Service Transport must be made available by its developer. Name and Description To help users build Leap applications with services, each Service Description contains both a name, and a description. The name and description elements allow you to localize a Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents.See Localizing Service Descriptions for information about how to provide names and descriptions in multiple languages. Default Locale If the Service Description is not localized in the language of a particular user, the defaultLocale contains the locale in which the name and description must be presented. For example, if a user asks for the Service Description in French, but the Service Description has only English and Spanish strings, the English is returned if en is set as the defaultLocale. Credentials The credentials contains the configuration for a Credentials Provider. The ID of the credentials provider is specified in the providerId attribute. The credentials element can contain zero or more property elements to configure the properties of the specified Credentials Provider. Each property element must contain a name attribute whose value is the name of the property being configured, and a value attribute that contains the value of the property. Not all Credentials Providers are applicable to all Service Transports. Therefore, the documentation for each Service Transport must be consulted before you configure the credentials element. If the configured Service Transport does not understand the provider that is specified by providerId , the Service Description is not available. Bindings Every Service Description must specify its input and output structures. These structures outline the ID, name, description, and type of each parameter and any subparameters . In addition to the parameter structure, bindings might also contain a section that declares how data going into the Service Transport is mapped from the input structure and how data coming from the Service Transport is mapped to the output structure. There are two top-level elements for bindings: inbound, and outbound. Inbound defines the binding for data coming into the Service Description from the Builder Application. Outbound defines the data going to the Leap application from the Service Description. Only one of each of these elements can be present within a single Service Description, and each must be placed as a child of the serviceDescription element. Directly underneath inbound and outbound are two elements that define the main components of a binding: parameters and serviceMapping . The parameters element contains all the information that is related to the parameters. The contents of the serviceMapping element instructs Leap how to map data coming from the parameters into data for the transport and vice versa. Parameters The parameters element contains zero or more parameter elements. Each parameter element defines a single parameter coming into or being returned from the Service Description. Each parameter element must have an id , type , name , and description . The id element uniquely identifies the parameter within the binding. The type element specifies the type of data that is expected to be contained within the parameter. The following data types are supported: STRING, BOOLEAN, DECIMAL, FLOAT, DOUBLE, INTEGER, DATETIME, TIME, DATE, and LIST As with the name and description child elements of the serviceDescription element, these childs of parameter specify the name and description of the parameter that is used in Leap. These elements can also be localized using the xml:lang attribute. Optionally, the mandatory element can be included for inbound bindings to specify whether the parameter must be bound before starting the Service Description. Valid values for this element are true and false, with the latter being the default. Each parameter element can have a child element that is called parameters which is a container for child parameters. The contents of the parameters element is one or more parameter elements. If a parameter contains subparameters , its type is set to LIST. At run time, the parameter contains a list of structures with each of the subparameters . Service Mapping The serviceMapping element contains all the information that is needed for the Leap server to map data between the Service Description parameters, and the Service Transport. For more information, see Mapping Data for a Service Description . XML Namespaces XML namespace declarations must be defined on the serviceMapping element or higher. Sample Service Descriptions Each example in this section includes a list of the Service Descriptions and a discussion of how each Service Description operates. The Service Descriptions in this section rely solely on the Service Transports that are shipped with the Leap server. Where applicable, sample and setup instructions are included. Example 1: Simple Mapping The following Service Description uses the HTTP Service Transport to make a request to a web server and return the content type of the response. In this example, the URL to which the request is made comes as an inbound parameter from the Builder application. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type</name> 7: <description xml:lang=\"en-us\"> 8: Retrieves the content type of the response from an HTTP server for the configured URL. 9: </description> 10: <inbound> 11: <parameters> 12: <parameter> 13: <id>request-url</id> 14: <type>STRING</type> 15: <name xml:lang=\"en-us\">URL</name> 16: <description xml:lang=\"en-us\">URL to request.</description> 17: <mandatory>true</mandatory> 18: </parameter> 19: </parameters> 20: </inbound> 21: <outbound> 22: <parameters> 23: <parameter> 24: <id>response-header-content-type</id> 25: <type>STRING</type> 26: <name xml:lang=\"en-us\">Content Type</name> 27: <description xml:lang=\"en-us\">Content Type of the response.</description> 28: </parameter> 29: </parameters> 30: </outbound> 31: </serviceDescription> ``` All Service Descriptions begin with a serviceDescription element, and in this example, it is defined in line 2. The serviceDescription element contains all the information that is needed for the Leap server to work with the Service Description. The unique ID of this Service Description is get-content-type as defined in line 3. The unique ID is not exposed to a user, but it must be unique. Line 5 declares the ID of the Service Transport to use, which is HTTPServiceTransport , and this is the unique ID of the HTTP Service Transport. Lines 7 and 8 define the name and description of the Service Description, which are presented to the user when designing applications. Lines 10-20 define the inbound bindings, and lines 21-30 define the outbound bindings. As mentioned previously, the inbound bindings refer to the parameters that are flowing from the application to the Service Transport. The outbound bindings refer to the parameters that are flowing in the opposite direction. Lines 11-19 contain all the inbound parameters, of which there is only one. The parameter that is defined in lines 12-18 represents the URL to which a request is made. According to the HTTP Service Transport documentation, the parameter that contains the URL to which the request is made must be called request-url . Line 13 defines the id of the parameter so that it matches the expectations of the HTTP Service Transport. The name and description are defined in lines 15 and 16, and line 17 specifies that this parameter must be supplied in order for this Service Description to operate. Lines 21-30 define the outbound parameters for the Service Description. In this case, there is only one output parameter: the content type of the response. The HTTP Service Transport dynamically creates new parameters that are based on the information that is returned in the HTTP response. In particular, response headers are converted to lowercase and are prefixed with response-header- . Since this Service Description is interested in the Content-Type header, the outbound parameter response-header-content-type is created in lines 23-28 to contain this data. Example 2: Augmenting Parameters with Constants The following Service Description returns the same information as Example 1. However, in this case, we do not want the Leap application to supply the URL. Instead, the URL is declared using a constant, and mapped into the inbound parameters for the Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type-with-constant</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type with Constant</name> 7: <description xml:lang=\"en-us\"> 8: Retreives the content type of the response from an HTTP server. 9: </description> 10: <inbound> 11: <serviceMapping> 12: <constants> 13: <constant> 14: <id>url-to-request</id> 15: <value>http://www.ibm.com</value> 16: </constant> 17: </constants> 18: <mapping> 19: <mapping source=\"constant:url-to-request\" sourceType=\"string\" target=\"transport:request-url\" targetType=\"string\"/> 20: </mapping> 21: </serviceMapping> 22: </inbound> 23: <outbound> 24: <parameters> 25: <parameter> 26: <id>response-header-content-type</id> 27: <type>STRING</type> 28: <name xml:lang=\"en-us\">Content Type</name> 29: <description xml:lang=\"en-us\">Content Type of the response.</description> 30: </parameter> 31: </parameters> 32: </outbound> 33: </serviceDescription> ``` Like Example 1, the Service Description makes a request to an HTTP server and returns the content type of the response. However, this Service Description differs from the Example 1 because there are no input parameters to this service. The request-url HTTP Service Transport parameter is mapped into the transport via a constant. Lines 12-17 define the constants section. There is a single constant that is defined in lines 13-16. This constant has an id of url-to-request specified in line 14, and a value of http://www.ibm.com, specified in line 15. The id of the constant is used when creating the parameter structure that is passed to the Service Transport. This constant is referenced in line 19 within the mapping section. Lines 18-20 contain the mapping information. Since there is only one parameter to be sent, there is only one mapping, which is defined in line 19. This mapping specifies that the value of the Service Transport parameter named request-url is specified by the value of the constant named url-to-request . Example 3: Lists of Data The following Service Description demonstrates the use of nested parameters. This example is the same as the Service Description used for the Countries by Region service that is shipped with Leap. This example describes how to specify a region and return a list of the names of countries within that region. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>countries-by-region</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>4647b8cf-093f-11e0-89dd-001e4cf83606</transportId> 6: <name xml:lang=\"en-us\"> 7: Countries by Region using Service Description 8: </name> 9: <description xml:lang=\"en-us\"> 10: Given a region, return a list of country information in that region. 11: </description> 12: <inbound> 13: <parameters> 14: <parameter> 15: <id>region</id> 16: <type>STRING</type> 17: <name xml:lang=\"en-us\">Region</name> 18: <description xml:lang=\"en-us\"> 19: One of \"Africa\", \"America, North\", \"America, South\", \"Asia\", \"Europe\", or \"Oceania\" 20: </description> 21: <mandatory>true</mandatory> 22: </parameter> 23: </parameters> 24: </inbound> 25: <outbound> 26: <parameters> 27: <parameter> 28: <id>countries</id> 29: <type>LIST</type> 30: <name xml:lang=\"en-us\">Countries\"</name> 31: <description xml:lang=\"en-us\">List of country information</description> 32: <parameters> 33: <parameter> 34: <id>name</id> 35: <type>STRING</type> 36: <name xml:lang=\"en-us\">Name</name> 37: <description xml:lang=\"en-us\">Name of Country</description> 38: </parameter> 39: </parameters> 40: </parameter> 41: </parameters> 42: </outbound> 43: </serviceDescription> ``` As with the other Service Description examples, this Service Description has its own unique ID, defined in line 3, a name, which is defined in lines 6-8, and a description, which is defined in lines 9-11. This Service Description uses the sample Countries by Region Service Transport, which is shipped with the Leap , and is identified by its id in line 5. Because this Service Description has a single inbound parameter, the parameters element, in lines 13-23, of the inbound bindings in lines 12-24. parameters contains only a single parameter, which is defined in lines 14-22. The id of this parameter is region, which is what is expected by the Countries by Region Service Transport. Since there can be multiple countries within a region, the outbound bindings, which are defined in lines 25-42, must contain a list parameter to contain all the information for each country. The outbound structure for this Service Description consists of a parameter that is called countries that contains a list of maps. Each of the maps that are contained within the countries list consists of a single name key that contains the name of a country. This structure is defined within the parameters element, which is defined in lines 26-41, of the outbound bindings section. The top-level parameter, countries, is defined between lines 27 and 40. Since the countries parameter contains other parameters, its type is set as LIST in line 29. All the parameters of the list entries are defined within the parameters element inside the countries parameter that is defined in lines 32-39. The single name subparameter is defined in lines 33-38. Since the inbound and outbound bindings directly match what is returned by the Countries by Region Service Transport, there is no need for any mapping information. This service can be set up such that the name subparameter is mapped to list-like items such as drop-down options or an item in a table. Example 4: Mapping XML into Parameters The following Service Description extracts data from an XML document that is returned from an HTTP request using the HTTP Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>address-lookup</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Address Lookup</name> 7: <description xml:lang=\"en-us\">Returns information related to a postal code or address.</description> 8: <inbound> 9: <parameters> 10: <parameter> 11: <id>address</id> 12: <type>STRING</type> 13: <name xml:lang=\"en-us\">Address or Postal Code</name> 14: <description xml:lang=\"en-us\"></description> 15: <mandatory>true</mandatory> 16: </parameter> 17: </parameters> 18: <serviceMapping> 19: <constants> 20: <constant> 21: <id>request-url</id> 22: <value>http://maps.googleapis.com/maps/api/geocode/xml</value> 23: </constant> 24: <constant> 25: <id>false-constant</id> 26: <value>false</value> 27: </constant> 28: <constant> 29: <id>request-method</id> 30: <value>GET</value> 31: </constant> 32: </constants> 33: <mapping> 34: <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> 35: <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> 36: <mapping target=\"transport:request-query-address\" source=\"parameter:address\"/> 37: <mapping target=\"transport:request-query-sensor\" source=\"constant:false-constant\"/> 38: </mapping> 39: </serviceMapping> 40: </inbound> 41: <outbound> 42: <parameters> 43: <parameter> 44: <id>latitude</id> 45: <type>STRING</type> 46: <name xml:lang=\"en-us\">Latitude</name> 47: <description xml:lang=\"en-us\"></description> 48: </parameter> 49: <parameter> 50: <id>longitude</id> 51: <type>STRING</type> 52: <name xml:lang=\"en-us\">Longitude</name> 53: <description xml:lang=\"en-us\"></description> 54: </parameter> 55: <parameter> 56: <id>address-information</id> 57: <type>LIST</type> 58: <name xml:lang=\"en-us\">Address Information</name> 59: <description xml:lang=\"en-us\"></description> 60: <parameters> 61: <parameter> 62: <id>long-name</id> 63: <type>STRING</type> 64: <name xml:lang=\"en-us\">Long Name</name> 65: <description xml:lang=\"en-us\"></description> 66: </parameter> 67: <parameter> 68: <id>short-name</id> 69: <type>STRING</type> 70: <name xml:lang=\"en-us\">Short Name</name> 71: <description xml:lang=\"en-us\"></description> 72: </parameter> 73: <parameter> 74: <id>type-1</id> 75: <type>STRING</type> 76: <name xml:lang=\"en-us\">Type</name> 77: <description xml:lang=\"en-us\"></description> 78: </parameter> 79: <parameter> 80: <id>type-2</id> 81: <type>STRING</type> 82: <name xml:lang=\"en-us\">Type(2)</name> 83: <description xml:lang=\"en-us\"></description> 84: </parameter> 85: </parameters> 86: </parameter> 87: </parameters> 88: <serviceMapping> 89: <mapping> 90: <mapping source=\"transport:response-entity\" 91: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lat\" 92: sourceType=\"xml\" 93: target=\"parameter:latitude\"/> 94: <mapping source=\"transport:response-entity\" 95: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lng\" 96: sourceType=\"xml\" 97: target=\"parameter:longitude\"/> 98: <mapping source=\"transport:response-entity\" 99: sourceRef=\"GeocodeResponse/result[1]/address_component\" 100: sourceType=\"xml\" 101: target=\"parameter:address-information\"> 102: <mapping sourceRef=\"long_name\" target=\"parameter:long-name\"/> 103: <mapping sourceRef=\"short_name\" target=\"parameter:short-name\"/> 104: <mapping sourceRef=\"type[1]\" target=\"parameter:type-1\"/> 105: <mapping sourceRef=\"type[2]\" target=\"parameter:type-2\"/> 106: </mapping> 107: </mapping> 108: </serviceMapping> 109: </outbound> 110: </serviceDescription> ``` This Service Description performs a reverse address lookup using a free Google web service. As with the other Service Description examples, the standard prologue of id, transportId , name, and description is specified in lines 3-7. This service has a single parameter, address, that can be assigned by an application, as specified in lines 10-16. Since this parameter is required to perform the address look-up, it is marked as mandatory in line 15. Since this Service Description uses the HTTP Service Transport, a request-url must be specified. The URL used in this request takes the form http://maps.googleapis.com/maps/api/geocode/xml?address=[address]&sensor=[true|false]. Because there are query parameters that must be sent, this Service Description uses the HTTP Service Transport support for query parameters by prefixing the name of the parameter with request-query-. However, because some of these query parameters are not exposed to the user, you must create a mapping section to map some constant values. The inbound binding constant section, in lines 19-32, defines the three constants that are used: request-url , lines 20-23, false-constant, lines 24-27, and request-method , lines 28-31. These constants contain the URL to which to request is made, a constant string value false for the sensor query parameter, and the request method. While some of these constants, including request-url and request-method, match the name of the parameter to which they are applied, there is no requirement that they match. Parameter names that match do not automatically get a constant value if it has the same name. All mapping must be explicitly defined. In lines 33-38, the mapping section of the inbound binding maps the constants and Service Description parameters to the Service Transport parameters. Each of the mapping elements is fairly self-explanatory: the request-url constant is mapped to the request-url transport parameter; the request-method constant is mapped to the request-method transport parameter; the address parameter is mapped to the request-query-address transport parameter; and the constant false-constant is mapped to the sensor transport parameter. The HTTP Service Transport then builds a URL out of the request-url , request-query-address , and request-query-sensor parameters, and makes a request to that URL using the HTTP method given in the request-method parameter. The response body that is returned by this request is placed in the response-entity transport parameter, which is then taken apart by the mapping section of the outbound bindings. This service expects the response-entity to be similar to the following: ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <GeocodeResponse> 3: <status>OK</status> 4: <result> 5: <type>street_address</type> 6: <formatted_address>1 New Orchard Rd, Armonk, NY, USA</formatted_address> 7: <address_component> 8: <long_name>1</long_name> 9: <short_name>1</short_name> 10: <type>street_number</type> 11: </address_component> 12: <address_component> 13: <long_name>New Orchard Rd</long_name> 14: <short_name>New Orchard Rd</short_name> 15: <type>route</type> 16: </address_component> 17: <address_component> 18: <long_name>Armonk</long_name> 19: <short_name>Armonk</short_name> 20: <type>locality</type> 21: <type>political</type> 22: </address_component> 23: <address_component> 24: <long_name>Westchester</long_name> 25: <short_name>Westchester</short_name> 26: <type>administrative_area_level_2</type> 27: <type>political</type> 28: </address_component> 29: <address_component> 30: <long_name>New York</long_name> 31: <short_name>NY</short_name> 32: <type>administrative_area_level_1</type> 33: <type>political</type> 34: </address_component> 35: <address_component> 36: <long_name>United States</long_name> 37: <short_name>US</short_name> 38: <type>country</type> 39: <type>political</type> 40: </address_component> 41: <geometry> 42: <location> 43: <lat>41.1083018</lat> 44: <lng>-73.7204677</lng> 45: </location> 46: <location_type>ROOFTOP</location_type> 47: <viewport> 48: <southwest> 49: <lat>41.1051542</lat> 50: <lng>-73.7236153</lng> 51: </southwest> 52: <northeast> 53: <lat>41.1114494</lat> 54: <lng>-73.7173201</lng> 55: </northeast> 56: </viewport> 57: </geometry> 58: </result> 59: </GeocodeResponse> ``` There is much data in this response, but only some of it is needed for this Service Description. The latitude, longitude, and a list of the address information from the first result is required. To get only the required information, the Service Description outlines the parameters that it expects to return in the parameters section, in lines 42-87. The Service Description then uses the mapping section, in lines 88-108, to extract the required data from the response-entity transport parameter. Each of the parameters in the parameters section is self-explanatory. Latitude and longitude are top-level parameters because there is only one of each of them in a single result. However, there are several address_component elements, each of which are returned. Therefore, the address-information parameter is a list parameter that contains subparameters, one for each of the pieces of information in an address_component that the Service Description wants to make available. In lines 88-108, the service mapping section defines all the mapping that must be performed to extract the data from the XML response. Latitude, which is specified in lines 90-93, and longitude, which is specified in lines 94-97, each extract the data using a single XPath expression. The source type for each is set to XML. Mapping of a repeating structure is accomplished in a similar fashion. Lines 98-101 define the mapping for the address-information parameter. The XPath expression for address-information returns a nodeset as there are several nodes that match the expression GeocodeResponse/result/address_component. For each node that is returned, a new structure is created to contain the result of each of the submappings. Each of the submappings places its target into the newly created structure. Since the source of each of the submappings is one of the matched nodes, the mapping elements do not specify a source. It is assumed to be the inherited context. Similarly, the reference is evaluated within the context of the source, which is inherited. After each of the submappings is evaluated for a single source, the structure is added to a running list and the submappings are evaluated again for the next result in the source list. When all the sources are processed, the list that was collecting the results of the map is assigned to the address-information parameter. Appendix A - Service Description schema Localizing Service Descriptions The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Mapping Data for a Service Description The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport Deploying a Service Description This topic contains information about how to deploy an HCL Leap Service Description. Parent topic: Services","title":"Service Description"},{"location":"ref_service_service_description.html#service-description","text":"A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface.","title":"Service Description"},{"location":"ref_service_service_description.html#elements-of-a-service-description","text":"A Service Description is represented as an XML document that follows an XML schema. This single XML document contains all the information for a single Service Description: name, description, input and output parameters, and input and output mapping. For a full listing of the XML schema, refer to Appendix A - Service Description schema . The top-level element in a Service Description is the serviceDescription element. This element, and all of its childs, must be in the XML namespace with a URI of http://www.ibm.com/xmlns/prod/forms/services/serviceDescription/1.0. ID Each Service Description must contain a unique id that identifies it to the Leap server. The id can contain any characters that are valid as a component of a URL path. These characters include: Alphabetical letters \u2013 [A-Z], and [a-z] Numerals \u2013 [0-9] Hyphens \u2013 [-] Underscore \u2013 [_] Because a Service Description ID is a surrogate for the Service Description itself, this ID does not must be descriptive. Any UUID is a valid choice for a Service Description ID because it guarantees uniqueness and contains only characters that are valid in a URL path component. Transport ID A Service Description must reference a Service Transport to perform its underlying operation. Each Service Transport has its own unique transportId that uniquely identifies it to the Leap server. The ID for a Service Transport must be made available by its developer. Name and Description To help users build Leap applications with services, each Service Description contains both a name, and a description. The name and description elements allow you to localize a Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents.See Localizing Service Descriptions for information about how to provide names and descriptions in multiple languages. Default Locale If the Service Description is not localized in the language of a particular user, the defaultLocale contains the locale in which the name and description must be presented. For example, if a user asks for the Service Description in French, but the Service Description has only English and Spanish strings, the English is returned if en is set as the defaultLocale. Credentials The credentials contains the configuration for a Credentials Provider. The ID of the credentials provider is specified in the providerId attribute. The credentials element can contain zero or more property elements to configure the properties of the specified Credentials Provider. Each property element must contain a name attribute whose value is the name of the property being configured, and a value attribute that contains the value of the property. Not all Credentials Providers are applicable to all Service Transports. Therefore, the documentation for each Service Transport must be consulted before you configure the credentials element. If the configured Service Transport does not understand the provider that is specified by providerId , the Service Description is not available. Bindings Every Service Description must specify its input and output structures. These structures outline the ID, name, description, and type of each parameter and any subparameters . In addition to the parameter structure, bindings might also contain a section that declares how data going into the Service Transport is mapped from the input structure and how data coming from the Service Transport is mapped to the output structure. There are two top-level elements for bindings: inbound, and outbound. Inbound defines the binding for data coming into the Service Description from the Builder Application. Outbound defines the data going to the Leap application from the Service Description. Only one of each of these elements can be present within a single Service Description, and each must be placed as a child of the serviceDescription element. Directly underneath inbound and outbound are two elements that define the main components of a binding: parameters and serviceMapping . The parameters element contains all the information that is related to the parameters. The contents of the serviceMapping element instructs Leap how to map data coming from the parameters into data for the transport and vice versa. Parameters The parameters element contains zero or more parameter elements. Each parameter element defines a single parameter coming into or being returned from the Service Description. Each parameter element must have an id , type , name , and description . The id element uniquely identifies the parameter within the binding. The type element specifies the type of data that is expected to be contained within the parameter. The following data types are supported: STRING, BOOLEAN, DECIMAL, FLOAT, DOUBLE, INTEGER, DATETIME, TIME, DATE, and LIST As with the name and description child elements of the serviceDescription element, these childs of parameter specify the name and description of the parameter that is used in Leap. These elements can also be localized using the xml:lang attribute. Optionally, the mandatory element can be included for inbound bindings to specify whether the parameter must be bound before starting the Service Description. Valid values for this element are true and false, with the latter being the default. Each parameter element can have a child element that is called parameters which is a container for child parameters. The contents of the parameters element is one or more parameter elements. If a parameter contains subparameters , its type is set to LIST. At run time, the parameter contains a list of structures with each of the subparameters . Service Mapping The serviceMapping element contains all the information that is needed for the Leap server to map data between the Service Description parameters, and the Service Transport. For more information, see Mapping Data for a Service Description .","title":"Elements of a Service Description"},{"location":"ref_service_service_description.html#xml-namespaces","text":"XML namespace declarations must be defined on the serviceMapping element or higher.","title":"XML Namespaces"},{"location":"ref_service_service_description.html#sample-service-descriptions","text":"Each example in this section includes a list of the Service Descriptions and a discussion of how each Service Description operates. The Service Descriptions in this section rely solely on the Service Transports that are shipped with the Leap server. Where applicable, sample and setup instructions are included. Example 1: Simple Mapping The following Service Description uses the HTTP Service Transport to make a request to a web server and return the content type of the response. In this example, the URL to which the request is made comes as an inbound parameter from the Builder application. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type</name> 7: <description xml:lang=\"en-us\"> 8: Retrieves the content type of the response from an HTTP server for the configured URL. 9: </description> 10: <inbound> 11: <parameters> 12: <parameter> 13: <id>request-url</id> 14: <type>STRING</type> 15: <name xml:lang=\"en-us\">URL</name> 16: <description xml:lang=\"en-us\">URL to request.</description> 17: <mandatory>true</mandatory> 18: </parameter> 19: </parameters> 20: </inbound> 21: <outbound> 22: <parameters> 23: <parameter> 24: <id>response-header-content-type</id> 25: <type>STRING</type> 26: <name xml:lang=\"en-us\">Content Type</name> 27: <description xml:lang=\"en-us\">Content Type of the response.</description> 28: </parameter> 29: </parameters> 30: </outbound> 31: </serviceDescription> ``` All Service Descriptions begin with a serviceDescription element, and in this example, it is defined in line 2. The serviceDescription element contains all the information that is needed for the Leap server to work with the Service Description. The unique ID of this Service Description is get-content-type as defined in line 3. The unique ID is not exposed to a user, but it must be unique. Line 5 declares the ID of the Service Transport to use, which is HTTPServiceTransport , and this is the unique ID of the HTTP Service Transport. Lines 7 and 8 define the name and description of the Service Description, which are presented to the user when designing applications. Lines 10-20 define the inbound bindings, and lines 21-30 define the outbound bindings. As mentioned previously, the inbound bindings refer to the parameters that are flowing from the application to the Service Transport. The outbound bindings refer to the parameters that are flowing in the opposite direction. Lines 11-19 contain all the inbound parameters, of which there is only one. The parameter that is defined in lines 12-18 represents the URL to which a request is made. According to the HTTP Service Transport documentation, the parameter that contains the URL to which the request is made must be called request-url . Line 13 defines the id of the parameter so that it matches the expectations of the HTTP Service Transport. The name and description are defined in lines 15 and 16, and line 17 specifies that this parameter must be supplied in order for this Service Description to operate. Lines 21-30 define the outbound parameters for the Service Description. In this case, there is only one output parameter: the content type of the response. The HTTP Service Transport dynamically creates new parameters that are based on the information that is returned in the HTTP response. In particular, response headers are converted to lowercase and are prefixed with response-header- . Since this Service Description is interested in the Content-Type header, the outbound parameter response-header-content-type is created in lines 23-28 to contain this data. Example 2: Augmenting Parameters with Constants The following Service Description returns the same information as Example 1. However, in this case, we do not want the Leap application to supply the URL. Instead, the URL is declared using a constant, and mapped into the inbound parameters for the Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type-with-constant</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type with Constant</name> 7: <description xml:lang=\"en-us\"> 8: Retreives the content type of the response from an HTTP server. 9: </description> 10: <inbound> 11: <serviceMapping> 12: <constants> 13: <constant> 14: <id>url-to-request</id> 15: <value>http://www.ibm.com</value> 16: </constant> 17: </constants> 18: <mapping> 19: <mapping source=\"constant:url-to-request\" sourceType=\"string\" target=\"transport:request-url\" targetType=\"string\"/> 20: </mapping> 21: </serviceMapping> 22: </inbound> 23: <outbound> 24: <parameters> 25: <parameter> 26: <id>response-header-content-type</id> 27: <type>STRING</type> 28: <name xml:lang=\"en-us\">Content Type</name> 29: <description xml:lang=\"en-us\">Content Type of the response.</description> 30: </parameter> 31: </parameters> 32: </outbound> 33: </serviceDescription> ``` Like Example 1, the Service Description makes a request to an HTTP server and returns the content type of the response. However, this Service Description differs from the Example 1 because there are no input parameters to this service. The request-url HTTP Service Transport parameter is mapped into the transport via a constant. Lines 12-17 define the constants section. There is a single constant that is defined in lines 13-16. This constant has an id of url-to-request specified in line 14, and a value of http://www.ibm.com, specified in line 15. The id of the constant is used when creating the parameter structure that is passed to the Service Transport. This constant is referenced in line 19 within the mapping section. Lines 18-20 contain the mapping information. Since there is only one parameter to be sent, there is only one mapping, which is defined in line 19. This mapping specifies that the value of the Service Transport parameter named request-url is specified by the value of the constant named url-to-request . Example 3: Lists of Data The following Service Description demonstrates the use of nested parameters. This example is the same as the Service Description used for the Countries by Region service that is shipped with Leap. This example describes how to specify a region and return a list of the names of countries within that region. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>countries-by-region</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>4647b8cf-093f-11e0-89dd-001e4cf83606</transportId> 6: <name xml:lang=\"en-us\"> 7: Countries by Region using Service Description 8: </name> 9: <description xml:lang=\"en-us\"> 10: Given a region, return a list of country information in that region. 11: </description> 12: <inbound> 13: <parameters> 14: <parameter> 15: <id>region</id> 16: <type>STRING</type> 17: <name xml:lang=\"en-us\">Region</name> 18: <description xml:lang=\"en-us\"> 19: One of \"Africa\", \"America, North\", \"America, South\", \"Asia\", \"Europe\", or \"Oceania\" 20: </description> 21: <mandatory>true</mandatory> 22: </parameter> 23: </parameters> 24: </inbound> 25: <outbound> 26: <parameters> 27: <parameter> 28: <id>countries</id> 29: <type>LIST</type> 30: <name xml:lang=\"en-us\">Countries\"</name> 31: <description xml:lang=\"en-us\">List of country information</description> 32: <parameters> 33: <parameter> 34: <id>name</id> 35: <type>STRING</type> 36: <name xml:lang=\"en-us\">Name</name> 37: <description xml:lang=\"en-us\">Name of Country</description> 38: </parameter> 39: </parameters> 40: </parameter> 41: </parameters> 42: </outbound> 43: </serviceDescription> ``` As with the other Service Description examples, this Service Description has its own unique ID, defined in line 3, a name, which is defined in lines 6-8, and a description, which is defined in lines 9-11. This Service Description uses the sample Countries by Region Service Transport, which is shipped with the Leap , and is identified by its id in line 5. Because this Service Description has a single inbound parameter, the parameters element, in lines 13-23, of the inbound bindings in lines 12-24. parameters contains only a single parameter, which is defined in lines 14-22. The id of this parameter is region, which is what is expected by the Countries by Region Service Transport. Since there can be multiple countries within a region, the outbound bindings, which are defined in lines 25-42, must contain a list parameter to contain all the information for each country. The outbound structure for this Service Description consists of a parameter that is called countries that contains a list of maps. Each of the maps that are contained within the countries list consists of a single name key that contains the name of a country. This structure is defined within the parameters element, which is defined in lines 26-41, of the outbound bindings section. The top-level parameter, countries, is defined between lines 27 and 40. Since the countries parameter contains other parameters, its type is set as LIST in line 29. All the parameters of the list entries are defined within the parameters element inside the countries parameter that is defined in lines 32-39. The single name subparameter is defined in lines 33-38. Since the inbound and outbound bindings directly match what is returned by the Countries by Region Service Transport, there is no need for any mapping information. This service can be set up such that the name subparameter is mapped to list-like items such as drop-down options or an item in a table. Example 4: Mapping XML into Parameters The following Service Description extracts data from an XML document that is returned from an HTTP request using the HTTP Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>address-lookup</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Address Lookup</name> 7: <description xml:lang=\"en-us\">Returns information related to a postal code or address.</description> 8: <inbound> 9: <parameters> 10: <parameter> 11: <id>address</id> 12: <type>STRING</type> 13: <name xml:lang=\"en-us\">Address or Postal Code</name> 14: <description xml:lang=\"en-us\"></description> 15: <mandatory>true</mandatory> 16: </parameter> 17: </parameters> 18: <serviceMapping> 19: <constants> 20: <constant> 21: <id>request-url</id> 22: <value>http://maps.googleapis.com/maps/api/geocode/xml</value> 23: </constant> 24: <constant> 25: <id>false-constant</id> 26: <value>false</value> 27: </constant> 28: <constant> 29: <id>request-method</id> 30: <value>GET</value> 31: </constant> 32: </constants> 33: <mapping> 34: <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> 35: <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> 36: <mapping target=\"transport:request-query-address\" source=\"parameter:address\"/> 37: <mapping target=\"transport:request-query-sensor\" source=\"constant:false-constant\"/> 38: </mapping> 39: </serviceMapping> 40: </inbound> 41: <outbound> 42: <parameters> 43: <parameter> 44: <id>latitude</id> 45: <type>STRING</type> 46: <name xml:lang=\"en-us\">Latitude</name> 47: <description xml:lang=\"en-us\"></description> 48: </parameter> 49: <parameter> 50: <id>longitude</id> 51: <type>STRING</type> 52: <name xml:lang=\"en-us\">Longitude</name> 53: <description xml:lang=\"en-us\"></description> 54: </parameter> 55: <parameter> 56: <id>address-information</id> 57: <type>LIST</type> 58: <name xml:lang=\"en-us\">Address Information</name> 59: <description xml:lang=\"en-us\"></description> 60: <parameters> 61: <parameter> 62: <id>long-name</id> 63: <type>STRING</type> 64: <name xml:lang=\"en-us\">Long Name</name> 65: <description xml:lang=\"en-us\"></description> 66: </parameter> 67: <parameter> 68: <id>short-name</id> 69: <type>STRING</type> 70: <name xml:lang=\"en-us\">Short Name</name> 71: <description xml:lang=\"en-us\"></description> 72: </parameter> 73: <parameter> 74: <id>type-1</id> 75: <type>STRING</type> 76: <name xml:lang=\"en-us\">Type</name> 77: <description xml:lang=\"en-us\"></description> 78: </parameter> 79: <parameter> 80: <id>type-2</id> 81: <type>STRING</type> 82: <name xml:lang=\"en-us\">Type(2)</name> 83: <description xml:lang=\"en-us\"></description> 84: </parameter> 85: </parameters> 86: </parameter> 87: </parameters> 88: <serviceMapping> 89: <mapping> 90: <mapping source=\"transport:response-entity\" 91: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lat\" 92: sourceType=\"xml\" 93: target=\"parameter:latitude\"/> 94: <mapping source=\"transport:response-entity\" 95: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lng\" 96: sourceType=\"xml\" 97: target=\"parameter:longitude\"/> 98: <mapping source=\"transport:response-entity\" 99: sourceRef=\"GeocodeResponse/result[1]/address_component\" 100: sourceType=\"xml\" 101: target=\"parameter:address-information\"> 102: <mapping sourceRef=\"long_name\" target=\"parameter:long-name\"/> 103: <mapping sourceRef=\"short_name\" target=\"parameter:short-name\"/> 104: <mapping sourceRef=\"type[1]\" target=\"parameter:type-1\"/> 105: <mapping sourceRef=\"type[2]\" target=\"parameter:type-2\"/> 106: </mapping> 107: </mapping> 108: </serviceMapping> 109: </outbound> 110: </serviceDescription> ``` This Service Description performs a reverse address lookup using a free Google web service. As with the other Service Description examples, the standard prologue of id, transportId , name, and description is specified in lines 3-7. This service has a single parameter, address, that can be assigned by an application, as specified in lines 10-16. Since this parameter is required to perform the address look-up, it is marked as mandatory in line 15. Since this Service Description uses the HTTP Service Transport, a request-url must be specified. The URL used in this request takes the form http://maps.googleapis.com/maps/api/geocode/xml?address=[address]&sensor=[true|false]. Because there are query parameters that must be sent, this Service Description uses the HTTP Service Transport support for query parameters by prefixing the name of the parameter with request-query-. However, because some of these query parameters are not exposed to the user, you must create a mapping section to map some constant values. The inbound binding constant section, in lines 19-32, defines the three constants that are used: request-url , lines 20-23, false-constant, lines 24-27, and request-method , lines 28-31. These constants contain the URL to which to request is made, a constant string value false for the sensor query parameter, and the request method. While some of these constants, including request-url and request-method, match the name of the parameter to which they are applied, there is no requirement that they match. Parameter names that match do not automatically get a constant value if it has the same name. All mapping must be explicitly defined. In lines 33-38, the mapping section of the inbound binding maps the constants and Service Description parameters to the Service Transport parameters. Each of the mapping elements is fairly self-explanatory: the request-url constant is mapped to the request-url transport parameter; the request-method constant is mapped to the request-method transport parameter; the address parameter is mapped to the request-query-address transport parameter; and the constant false-constant is mapped to the sensor transport parameter. The HTTP Service Transport then builds a URL out of the request-url , request-query-address , and request-query-sensor parameters, and makes a request to that URL using the HTTP method given in the request-method parameter. The response body that is returned by this request is placed in the response-entity transport parameter, which is then taken apart by the mapping section of the outbound bindings. This service expects the response-entity to be similar to the following: ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <GeocodeResponse> 3: <status>OK</status> 4: <result> 5: <type>street_address</type> 6: <formatted_address>1 New Orchard Rd, Armonk, NY, USA</formatted_address> 7: <address_component> 8: <long_name>1</long_name> 9: <short_name>1</short_name> 10: <type>street_number</type> 11: </address_component> 12: <address_component> 13: <long_name>New Orchard Rd</long_name> 14: <short_name>New Orchard Rd</short_name> 15: <type>route</type> 16: </address_component> 17: <address_component> 18: <long_name>Armonk</long_name> 19: <short_name>Armonk</short_name> 20: <type>locality</type> 21: <type>political</type> 22: </address_component> 23: <address_component> 24: <long_name>Westchester</long_name> 25: <short_name>Westchester</short_name> 26: <type>administrative_area_level_2</type> 27: <type>political</type> 28: </address_component> 29: <address_component> 30: <long_name>New York</long_name> 31: <short_name>NY</short_name> 32: <type>administrative_area_level_1</type> 33: <type>political</type> 34: </address_component> 35: <address_component> 36: <long_name>United States</long_name> 37: <short_name>US</short_name> 38: <type>country</type> 39: <type>political</type> 40: </address_component> 41: <geometry> 42: <location> 43: <lat>41.1083018</lat> 44: <lng>-73.7204677</lng> 45: </location> 46: <location_type>ROOFTOP</location_type> 47: <viewport> 48: <southwest> 49: <lat>41.1051542</lat> 50: <lng>-73.7236153</lng> 51: </southwest> 52: <northeast> 53: <lat>41.1114494</lat> 54: <lng>-73.7173201</lng> 55: </northeast> 56: </viewport> 57: </geometry> 58: </result> 59: </GeocodeResponse> ``` There is much data in this response, but only some of it is needed for this Service Description. The latitude, longitude, and a list of the address information from the first result is required. To get only the required information, the Service Description outlines the parameters that it expects to return in the parameters section, in lines 42-87. The Service Description then uses the mapping section, in lines 88-108, to extract the required data from the response-entity transport parameter. Each of the parameters in the parameters section is self-explanatory. Latitude and longitude are top-level parameters because there is only one of each of them in a single result. However, there are several address_component elements, each of which are returned. Therefore, the address-information parameter is a list parameter that contains subparameters, one for each of the pieces of information in an address_component that the Service Description wants to make available. In lines 88-108, the service mapping section defines all the mapping that must be performed to extract the data from the XML response. Latitude, which is specified in lines 90-93, and longitude, which is specified in lines 94-97, each extract the data using a single XPath expression. The source type for each is set to XML. Mapping of a repeating structure is accomplished in a similar fashion. Lines 98-101 define the mapping for the address-information parameter. The XPath expression for address-information returns a nodeset as there are several nodes that match the expression GeocodeResponse/result/address_component. For each node that is returned, a new structure is created to contain the result of each of the submappings. Each of the submappings places its target into the newly created structure. Since the source of each of the submappings is one of the matched nodes, the mapping elements do not specify a source. It is assumed to be the inherited context. Similarly, the reference is evaluated within the context of the source, which is inherited. After each of the submappings is evaluated for a single source, the structure is added to a running list and the submappings are evaluated again for the next result in the source list. When all the sources are processed, the list that was collecting the results of the map is assigned to the address-information parameter.","title":"Sample Service Descriptions"},{"location":"ref_service_service_description.html#ServDescAppendixA","text":"Localizing Service Descriptions The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Mapping Data for a Service Description The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport Deploying a Service Description This topic contains information about how to deploy an HCL Leap Service Description. Parent topic: Services","title":"Appendix A - Service Description schema"},{"location":"ref_service_wsdl_ovr.html","text":"Using the service description tool for WSDL web service This tool is used to build a service description to expose services for WSDL based web service. Overview This tool is built specifically for users who have a WSDL that defines the web service. The user can supply the WSDL file and the tool generates the service descriptions for each operation defined in the WSDL. The tool generates a service description for each operation for each binding for each service port. It is a command line tool. Requirements You must have a valid WSDL file to use this tool. You can point to the file on the web with a URL or on a local machine with a file path. The binding style for your WSDL must be RPC/Encoded or Document/Literal and must be declared in the file. The tool reads the binding style with the following attributes on its XPath values: wsdl:binding/soap:binding/@style=[document|rpc] wsdl:binding/wsdl:operation/wsdl:input/@use= [literal|encoded]. You can use a WSDL file that declares the schema within the file, or you can use an external schema that is included or imported using a file path or URL. The tool scans for a schema file mySchema.xsd base on the relative path you specify. WSDL service description tool parameters Build a command to expose services for a WSDL based web device. Troubleshooting the WSDL service description generator - FAQ Use the following information to help you troubleshoot your WSDL service description generator. Parent topic: Services","title":"Using the service description tool for WSDL web service"},{"location":"ref_service_wsdl_ovr.html#usingtheservicedescriptionfromwsdltool","text":"This tool is used to build a service description to expose services for WSDL based web service.","title":"Using the service description tool for WSDL web service"},{"location":"ref_service_wsdl_ovr.html#overview","text":"This tool is built specifically for users who have a WSDL that defines the web service. The user can supply the WSDL file and the tool generates the service descriptions for each operation defined in the WSDL. The tool generates a service description for each operation for each binding for each service port. It is a command line tool.","title":"Overview"},{"location":"ref_service_wsdl_ovr.html#requirements","text":"You must have a valid WSDL file to use this tool. You can point to the file on the web with a URL or on a local machine with a file path. The binding style for your WSDL must be RPC/Encoded or Document/Literal and must be declared in the file. The tool reads the binding style with the following attributes on its XPath values: wsdl:binding/soap:binding/@style=[document|rpc] wsdl:binding/wsdl:operation/wsdl:input/@use= [literal|encoded]. You can use a WSDL file that declares the schema within the file, or you can use an external schema that is included or imported using a file path or URL. The tool scans for a schema file mySchema.xsd base on the relative path you specify. WSDL service description tool parameters Build a command to expose services for a WSDL based web device. Troubleshooting the WSDL service description generator - FAQ Use the following information to help you troubleshoot your WSDL service description generator. Parent topic: Services","title":"Requirements"},{"location":"ref_service_wsdl_param.html","text":"WSDL service description tool parameters Build a command to expose services for a WSDL based web device. Running the WSDL service description tool At the command line prompt, type the following command to activate the tool: java -jar serviceDescriptionGenerator.jar -wsdlFile=webService.wsdl In this command, serviceDescriptionGenerator.jar : is the name of the executable .jar file. -wsdlFile : the command you use if the WSDL file is local. webService.wsdl is the file name of the WSDL file. Use the following options to customize the commands for your file: Table 1. WSDL command optionsSummary of the support commands Command Description Note -wsdlFile Specifies the file location of the WSDL file You must use either this option or the -wsdlUri option in the command you enter -wsdlUri Specifies the URI of the WSDL file You must use either this option or the -wsdlFile option in the command you enter. -saveTo You can specify a location where the generated service descriptions will be created with this command. The default is the current working directory. Optional -defaultLocale You can specify the locale used to generate the service description. Optional The default is English. -transformNames You can convert the service description parameter names to a more readable format. It supports camelCase, underscores and dashes. Optional The default is false. The possible values are true or false. -credentialProvider Adds a credential provider to all generated service description. The values are basic and cookie. -realm Use when the credential provider is set to basic. Optional -cookies Use when the credential provider is set to cookie. Optional -log Set the logging level of messages displayed to the user. The default is WARNING. The possible values are ALL, CONFIG, FINE, FINER, FINEST, INFO, OFF, SEVERE, and WARNING. -help Displays a quick reference of the commands for the tool. Optional Schema Data Type Interpretation In cases where an element or attribute type is a union of two or more schema data types, the parameter type will be set to string. The schema data type xsd:anyType is valid schema data type. However, there is no equivalent parameter type for it. Therefore, the tool is unable to create the equivalent parameter for any elements and attributes with this type. A parameter type depends on its schema data type. The following table lists the equivalent schema data types for a given parameter type. Table 2. Schema data types and its equivalent service parameter data type Service Description Parameter Type Schema Data Type String string> gYearMonth gMonthDay gYear gDay gMonth hexBinary base64Binary anyURI QName NOTATION normalizedString token language Name NMTOKEN NCName NMTOKENS ID IDREF ENTITY Integer integer nonPositiveInteger long nonNegativeInteger negativeInteger int short byte unsignedLong postiveInteger unsignedInt unsignedShort unsignedByte Boolean Boolean Decimal Decimal Float |Float Double Double Duration Duration DateTime DateTime Time Time Date Date The parameter description contains any restrictions of an element or attribute. The description contains the schema data type, all restrictions and all values of each restriction. Parent topic: Using the service description tool for WSDL web service","title":"WSDL service description tool parameters"},{"location":"ref_service_wsdl_param.html#wsdl-service-description-tool-parameters","text":"Build a command to expose services for a WSDL based web device.","title":"WSDL service description tool parameters"},{"location":"ref_service_wsdl_param.html#running-the-wsdl-service-description-tool","text":"At the command line prompt, type the following command to activate the tool: java -jar serviceDescriptionGenerator.jar -wsdlFile=webService.wsdl In this command, serviceDescriptionGenerator.jar : is the name of the executable .jar file. -wsdlFile : the command you use if the WSDL file is local. webService.wsdl is the file name of the WSDL file. Use the following options to customize the commands for your file: Table 1. WSDL command optionsSummary of the support commands Command Description Note -wsdlFile Specifies the file location of the WSDL file You must use either this option or the -wsdlUri option in the command you enter -wsdlUri Specifies the URI of the WSDL file You must use either this option or the -wsdlFile option in the command you enter. -saveTo You can specify a location where the generated service descriptions will be created with this command. The default is the current working directory. Optional -defaultLocale You can specify the locale used to generate the service description. Optional The default is English. -transformNames You can convert the service description parameter names to a more readable format. It supports camelCase, underscores and dashes. Optional The default is false. The possible values are true or false. -credentialProvider Adds a credential provider to all generated service description. The values are basic and cookie. -realm Use when the credential provider is set to basic. Optional -cookies Use when the credential provider is set to cookie. Optional -log Set the logging level of messages displayed to the user. The default is WARNING. The possible values are ALL, CONFIG, FINE, FINER, FINEST, INFO, OFF, SEVERE, and WARNING. -help Displays a quick reference of the commands for the tool. Optional","title":"Running the WSDL service description tool"},{"location":"ref_service_wsdl_param.html#schema-data-type-interpretation","text":"In cases where an element or attribute type is a union of two or more schema data types, the parameter type will be set to string. The schema data type xsd:anyType is valid schema data type. However, there is no equivalent parameter type for it. Therefore, the tool is unable to create the equivalent parameter for any elements and attributes with this type. A parameter type depends on its schema data type. The following table lists the equivalent schema data types for a given parameter type. Table 2. Schema data types and its equivalent service parameter data type Service Description Parameter Type Schema Data Type String string> gYearMonth gMonthDay gYear gDay gMonth hexBinary base64Binary anyURI QName NOTATION normalizedString token language Name NMTOKEN NCName NMTOKENS ID IDREF ENTITY Integer integer nonPositiveInteger long nonNegativeInteger negativeInteger int short byte unsignedLong postiveInteger unsignedInt unsignedShort unsignedByte Boolean Boolean Decimal Decimal Float |Float Double Double Duration Duration DateTime DateTime Time Time Date Date The parameter description contains any restrictions of an element or attribute. The description contains the schema data type, all restrictions and all values of each restriction. Parent topic: Using the service description tool for WSDL web service","title":"Schema Data Type Interpretation"},{"location":"ref_services_toc.html","text":"Services The following topics provide reference information about adding services to HCL Leap. Basic Credentials Provider This topic describes Basic Credentials Providers used within a Service Description. Cookie Credentials Provider This topic describes Cookie Credentials Provider used within a Service Description. Java 2 Connector (J2C) Authentication Credentials Provider This topic describes J2C Authentication Credentials Providers that are used within a Service Description. Service Description A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface. Using the service description tool for WSDL web service This tool is used to build a service description to expose services for WSDL based web service. HTTP Service Transport This topic provides reference information on HTTP Service Transports used in HCL Leap. Send Email service This topic provides reference information on the Send Email service in HCL Leap. Parent topic: Reference","title":"Services"},{"location":"ref_services_toc.html#servicesoverview","text":"The following topics provide reference information about adding services to HCL Leap. Basic Credentials Provider This topic describes Basic Credentials Providers used within a Service Description. Cookie Credentials Provider This topic describes Cookie Credentials Provider used within a Service Description. Java 2 Connector (J2C) Authentication Credentials Provider This topic describes J2C Authentication Credentials Providers that are used within a Service Description. Service Description A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface. Using the service description tool for WSDL web service This tool is used to build a service description to expose services for WSDL based web service. HTTP Service Transport This topic provides reference information on HTTP Service Transports used in HCL Leap. Send Email service This topic provides reference information on the Send Email service in HCL Leap. Parent topic: Reference","title":"Services"},{"location":"reference_toc.html","text":"Reference The documents in this section provide reference material and samples for HCL Leap. REST API reference The REST API can be used by other programs to communicate with Leap. JavaScript API Services The following topics provide reference information about adding services to HCL Leap. Embedding items in an iframe You can use iFrames to embed charts and applications in a web page. Embedding API The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page. Creating customized Cascading Style Sheets You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Custom Widget API This API provides a mechanism to incorporate custom widgets into the HCL Leap product.","title":"References"},{"location":"reference_toc.html#reference","text":"The documents in this section provide reference material and samples for HCL Leap. REST API reference The REST API can be used by other programs to communicate with Leap. JavaScript API Services The following topics provide reference information about adding services to HCL Leap. Embedding items in an iframe You can use iFrames to embed charts and applications in a web page. Embedding API The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page. Creating customized Cascading Style Sheets You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Custom Widget API This API provides a mechanism to incorporate custom widgets into the HCL Leap product.","title":"Reference"},{"location":"ru_creating_rules_in_your_form.html","text":"Creating rules in your application Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. With the Rules feature, you can create a dynamic user experience that ensures accurate data capture, and enforcement of business rules. Rules allow you to guide the user through the form by hiding questions, or pages, that are not relevant. Rules also allow you to enforce your business validation rules within the form to ensure that data is valid before the form is submitted. The following steps describe how to set rules that require users to enter more information depending on how the first question is answered. Rules can be set for the following conditions: Show or Hide You can set data entry items, buttons, and containers to be hidden, or visible. Enable or Disable You can set buttons and data entry items as enabled or disabled. Valid or Not Valid In a data entry item, such as a Single Line Entry field, you can set conditions on what type of information is acceptable. For example, in a timesheet application, you can set a rule that the check-out time cannot occur before a check in time. Required or Not required You can choose whether you want data entry items to be mandatory, or optional. Additional general information on Rules You can add multiple Boolean operators, such as AND, and OR, for each rule. However, you cannot mix the two conditions in a rule. You can name and rename rules. It is useful to give each rule a unique and descriptive name. If you have several rules with similar operations, a descriptive name lets you quickly find the specific rule without having to open each one to view the details. You can search rules based on form item. To set a new rule, use the Edit rules icon in each form item. You can also create rules for pages and buttons. You can use the icon to open a rule and edit it. After a rule is set, a checkmark appears on the Rule icon for the form item, as well as any form item involved in the rule. This makes it easy to see which form items are used in rules. HCL Leap warns you if you attempt to delete a form item that is used in a rule. If you agree, you delete the rule. If you duplicate a field, the rule is duplicated with it. Note: When you set rules for Number or Currency form items, you must set the default value of the form item to zero in the Properties side panel. In the Properties side panel, set the minimum value to zero. If the Number or Currency form item is blank, it does not default to zero, and any rule you set does not work properly. Setting rules on form items You can set rules that govern how form items appear in a form. Setting rules on pages in an application You can set rules that govern how pages are shown or hidden in a form. Setting rules on Stages You can direct the workflow of an application by setting rules on buttons within Stages. Parent topic: Creating and managing applications","title":"Creating rules in your application"},{"location":"ru_creating_rules_in_your_form.html#creating-rules-in-your-application","text":"Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. With the Rules feature, you can create a dynamic user experience that ensures accurate data capture, and enforcement of business rules. Rules allow you to guide the user through the form by hiding questions, or pages, that are not relevant. Rules also allow you to enforce your business validation rules within the form to ensure that data is valid before the form is submitted. The following steps describe how to set rules that require users to enter more information depending on how the first question is answered. Rules can be set for the following conditions:","title":"Creating rules in your application"},{"location":"ru_creating_rules_in_your_form.html#show-or-hide","text":"You can set data entry items, buttons, and containers to be hidden, or visible.","title":"Show or Hide"},{"location":"ru_creating_rules_in_your_form.html#enable-or-disable","text":"You can set buttons and data entry items as enabled or disabled.","title":"Enable or Disable"},{"location":"ru_creating_rules_in_your_form.html#valid-or-not-valid","text":"In a data entry item, such as a Single Line Entry field, you can set conditions on what type of information is acceptable. For example, in a timesheet application, you can set a rule that the check-out time cannot occur before a check in time.","title":"Valid or Not Valid"},{"location":"ru_creating_rules_in_your_form.html#required-or-not-required","text":"You can choose whether you want data entry items to be mandatory, or optional.","title":"Required or Not required"},{"location":"ru_creating_rules_in_your_form.html#additional-general-information-on-rules","text":"You can add multiple Boolean operators, such as AND, and OR, for each rule. However, you cannot mix the two conditions in a rule. You can name and rename rules. It is useful to give each rule a unique and descriptive name. If you have several rules with similar operations, a descriptive name lets you quickly find the specific rule without having to open each one to view the details. You can search rules based on form item. To set a new rule, use the Edit rules icon in each form item. You can also create rules for pages and buttons. You can use the icon to open a rule and edit it. After a rule is set, a checkmark appears on the Rule icon for the form item, as well as any form item involved in the rule. This makes it easy to see which form items are used in rules. HCL Leap warns you if you attempt to delete a form item that is used in a rule. If you agree, you delete the rule. If you duplicate a field, the rule is duplicated with it. Note: When you set rules for Number or Currency form items, you must set the default value of the form item to zero in the Properties side panel. In the Properties side panel, set the minimum value to zero. If the Number or Currency form item is blank, it does not default to zero, and any rule you set does not work properly. Setting rules on form items You can set rules that govern how form items appear in a form. Setting rules on pages in an application You can set rules that govern how pages are shown or hidden in a form. Setting rules on Stages You can direct the workflow of an application by setting rules on buttons within Stages. Parent topic: Creating and managing applications","title":"Additional general information on Rules"},{"location":"ru_set_rule_on_form_items.html","text":"Setting rules on form items You can set rules that govern how form items appear in a form. The following steps describe how to add form items to your application and to create a sample rule on a form item. The rule will show a field if a user selects a specific input. For example, if the employee is full-time, fields appear requesting additional information. If the employee is not full-time, the fields remain hidden. Add a Select One item to your form. Click the item\u2019s title to change it to \u201cAre you a full-time worker?\u201d. Click the check box beside Required to indicate that the user must fill in this form item to submit the form. In the properties side panel, under Options : Change the Displayed Value of the first row to Yes . Click the Add option button to insert a second option row. Change the Displayed Value of the second row to No . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhere is your work site located?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . If you intend to have several rules on a form, you should give each rule a unique name so it is easy to find. For this example, leave the name as Rule 1 In the Perform this action: section, the name of the form item is automatically inserted as the item on which you want to set the rule. Select Show from the action menu. In the When the following condition is true: section, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhat is your job title?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . Note that this rule is named Rule 2. In the Perform this action: section, the name of the form item is automatically inserted. Select Show from the action menu. In the When the following condition is true: menu, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close The rule is set so that if the user states they are a full-time worker, the additional fields appear and request information on the work location and job title. Parent topic: Creating rules in your application","title":"Setting rules on form items"},{"location":"ru_set_rule_on_form_items.html#makingawidgetconditionalinanapplication","text":"You can set rules that govern how form items appear in a form. The following steps describe how to add form items to your application and to create a sample rule on a form item. The rule will show a field if a user selects a specific input. For example, if the employee is full-time, fields appear requesting additional information. If the employee is not full-time, the fields remain hidden. Add a Select One item to your form. Click the item\u2019s title to change it to \u201cAre you a full-time worker?\u201d. Click the check box beside Required to indicate that the user must fill in this form item to submit the form. In the properties side panel, under Options : Change the Displayed Value of the first row to Yes . Click the Add option button to insert a second option row. Change the Displayed Value of the second row to No . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhere is your work site located?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . If you intend to have several rules on a form, you should give each rule a unique name so it is easy to find. For this example, leave the name as Rule 1 In the Perform this action: section, the name of the form item is automatically inserted as the item on which you want to set the rule. Select Show from the action menu. In the When the following condition is true: section, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhat is your job title?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . Note that this rule is named Rule 2. In the Perform this action: section, the name of the form item is automatically inserted. Select Show from the action menu. In the When the following condition is true: menu, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close The rule is set so that if the user states they are a full-time worker, the additional fields appear and request information on the work location and job title. Parent topic: Creating rules in your application","title":"Setting rules on form items"},{"location":"ru_setting_rules_on_pages_in_an_application.html","text":"Setting rules on pages in an application You can set rules that govern how pages are shown or hidden in a form. Before using the following steps, create an application with two pages. Rules in the HCL Leap can help you administer a form so different groups of users are asked for different information. You can add multiple Boolean conditions, such as AND, or OR, for each rule. The following example hides form pages from users whose salary does not meet the rule qualification of $30,000. To use the following steps, you must have multiple pages in your form. On Page 1 of your form, add a Currency item to your form and title it Salary . Click the Rules button on Page 2 of your form. Click Add Rule . In Perform this action: make no changes. The default value is \u201chide\u201d. In When the following condition is true , select Show items on all pages , and select Salary . Select Less than from the menu. Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user enters less than $30,000, they are not shown the second page of the form. Parent topic: Creating rules in your application","title":"Setting rules on pages in an application"},{"location":"ru_setting_rules_on_pages_in_an_application.html#settingrulesonpagesinanapplication","text":"You can set rules that govern how pages are shown or hidden in a form. Before using the following steps, create an application with two pages. Rules in the HCL Leap can help you administer a form so different groups of users are asked for different information. You can add multiple Boolean conditions, such as AND, or OR, for each rule. The following example hides form pages from users whose salary does not meet the rule qualification of $30,000. To use the following steps, you must have multiple pages in your form. On Page 1 of your form, add a Currency item to your form and title it Salary . Click the Rules button on Page 2 of your form. Click Add Rule . In Perform this action: make no changes. The default value is \u201chide\u201d. In When the following condition is true , select Show items on all pages , and select Salary . Select Less than from the menu. Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user enters less than $30,000, they are not shown the second page of the form. Parent topic: Creating rules in your application","title":"Setting rules on pages in an application"},{"location":"ru_setting_rules_on_stage_actions.html","text":"Setting rules on Stages You can direct the workflow of an application by setting rules on buttons within Stages. In a stage, you can build two approval buttons that appear identical, but send the user to a different page or stage. Which button appears to the user is determined by information the user enters, and the rules set on the form. To use the following instructions you must have stages created for your form. The instructions describe how to use rules and stages to create a button that provides multiple functionality for form designers away from the visual display to a user. The Submit button requests different information from users based on whether they make more or less than $30,000. Click the Workflow tab. Click the Visibility button at the top of the screen, select the desired stage (i.e. Start), and click anywhere in the section at the bottom of the page where the submit buttons are shown. Click the Edit Rules icon for the desired submit button. Open the Rules window for the Submit button of the Start stage. Click Add Rule . In the Perform this action section, leave the defaults of Start - Submit in the first menu, and Hide in the second menu. In When the following condition is true, select Show items on all pages , then select Salary . Set the operation to Less than . Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so users will not see the Submit button if they makes less that $30,000. Click the Add Action icon to add another Submit button. A duplicate Submit button appears. Follow steps 2 through 9, but set the operation to Greater than or equals . The form developer sees two different buttons that perform two different actions. When you preview the form, only one Submit button appears. You can now create stages and form pages specific to the user\u2019s salary. Parent topic: Creating rules in your application","title":"Setting rules on Stages"},{"location":"ru_setting_rules_on_stage_actions.html#settingrulesonstageactions","text":"You can direct the workflow of an application by setting rules on buttons within Stages. In a stage, you can build two approval buttons that appear identical, but send the user to a different page or stage. Which button appears to the user is determined by information the user enters, and the rules set on the form. To use the following instructions you must have stages created for your form. The instructions describe how to use rules and stages to create a button that provides multiple functionality for form designers away from the visual display to a user. The Submit button requests different information from users based on whether they make more or less than $30,000. Click the Workflow tab. Click the Visibility button at the top of the screen, select the desired stage (i.e. Start), and click anywhere in the section at the bottom of the page where the submit buttons are shown. Click the Edit Rules icon for the desired submit button. Open the Rules window for the Submit button of the Start stage. Click Add Rule . In the Perform this action section, leave the defaults of Start - Submit in the first menu, and Hide in the second menu. In When the following condition is true, select Show items on all pages , then select Salary . Set the operation to Less than . Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so users will not see the Submit button if they makes less that $30,000. Click the Add Action icon to add another Submit button. A duplicate Submit button appears. Follow steps 2 through 9, but set the operation to Greater than or equals . The form developer sees two different buttons that perform two different actions. When you preview the form, only one Submit button appears. You can now create stages and form pages specific to the user\u2019s salary. Parent topic: Creating rules in your application","title":"Setting rules on Stages"},{"location":"rules_widgets.html","text":"Rules App authors will be able to incorporate custom widgets in rules. Display Widgets Actions: Show Hide Data Widgets Actions: Show Hide Enable Disable Valid Not Valid Required Not Required Condition Operators: Based on widget's datatype. Parent topic: Custom Widget API","title":"Rules"},{"location":"rules_widgets.html#rules_widgets","text":"App authors will be able to incorporate custom widgets in rules.","title":"Rules"},{"location":"rules_widgets.html#section_yp4_scn_jyb","text":"Actions: Show Hide","title":"Display Widgets"},{"location":"rules_widgets.html#section_pwd_w2n_jyb","text":"Actions: Show Hide Enable Disable Valid Not Valid Required Not Required Condition Operators: Based on widget's datatype. Parent topic: Custom Widget API","title":"Data Widgets"},{"location":"sad_allowing_users_to_save.html","text":"Saving work as a draft Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. In any stage, you can enable authenticated users to save their work as a draft. When a user returns to a saved draft in a form, a message asks whether to start a new form, or continue working on the draft. You can add an option for users to email themselves a link to their own draft. A user can save one draft on any stage at any time. The draft is also reflected in View Data. Click the Workflow tab. Click Add a save draft button . A Save Draft button appears with the Submit button. Click on the Save Draft button. In the Properties side panel, click the Include email option in display message check box to ask users if they want to be sent an email with a URL of their draft. Note: The Save Draft button must be added manually to each stage of the form. Parent topic: Adding Stages to an application","title":"Saving work as a draft"},{"location":"sad_allowing_users_to_save.html#allowinguserstosavetheirworkasadraft","text":"Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. In any stage, you can enable authenticated users to save their work as a draft. When a user returns to a saved draft in a form, a message asks whether to start a new form, or continue working on the draft. You can add an option for users to email themselves a link to their own draft. A user can save one draft on any stage at any time. The draft is also reflected in View Data. Click the Workflow tab. Click Add a save draft button . A Save Draft button appears with the Submit button. Click on the Save Draft button. In the Properties side panel, click the Include email option in display message check box to ask users if they want to be sent an email with a URL of their draft. Note: The Save Draft button must be added manually to each stage of the form. Parent topic: Adding Stages to an application","title":"Saving work as a draft"},{"location":"se_permission_for_sharing_data_with_other_apps.html","text":"Defining permissions to share data with other applications HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. When setting permissions, you are defining access to the data based on the application, and user, that calls the service. For example, you create an application called \u201cProduct Names\u201d. You want your \u201cPurchase Order\u201d application to read the data stored in the \u201cProduct Names\u201d application, and use the data to populate a drop-down list. In the \u201cProduct Names\u201d application, create a \u201cPurchase Order\u201d user group in Roles, then give that Read access. You can also allow other applications to write data to the \u201cProduct Names\u201d application. For another application to write data, it must have Write access. For more information about creating roles, see Defining basic security roles for users . For more information on using other Leap applications as services, see Integrating your application with existing Leap applications . Go to the Access tab. Select Design Settings . For a specific role, click the Read , Write , or both check boxes. Parent topic: Securing","title":"Defining permissions to share data with other applications"},{"location":"se_permission_for_sharing_data_with_other_apps.html#definingpermissionstosharedatawithotherapplications","text":"HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. When setting permissions, you are defining access to the data based on the application, and user, that calls the service. For example, you create an application called \u201cProduct Names\u201d. You want your \u201cPurchase Order\u201d application to read the data stored in the \u201cProduct Names\u201d application, and use the data to populate a drop-down list. In the \u201cProduct Names\u201d application, create a \u201cPurchase Order\u201d user group in Roles, then give that Read access. You can also allow other applications to write data to the \u201cProduct Names\u201d application. For another application to write data, it must have Write access. For more information about creating roles, see Defining basic security roles for users . For more information on using other Leap applications as services, see Integrating your application with existing Leap applications . Go to the Access tab. Select Design Settings . For a specific role, click the Read , Write , or both check boxes. Parent topic: Securing","title":"Defining permissions to share data with other applications"},{"location":"se_security_toc.html","text":"Securing When building applications, user roles require various levels of security access. A manager is able to review submitted forms, but an administrator can delete them. The following topics describe how to set security levels for all levels of users. Leap allows application designers to compose applications that combine user interfaces, data records, and a stages-based lifecycle. The Leap security settings govern access to applications and data by defining who can edit, maintain, deploy applications, and access data for submitted forms. You can define your security rules using the Access tab from within the Design environment. These topics describe the Leap security concepts and how to use the Access tab to grant access to users in your organization. Defining basic security roles for users Create roles for users in your organization so they can work with data that is relevant to them. Assigning users or groups to roles Give the users in your organization permission to work with the data relevant to them by assigning them roles. Setting Stage permissions Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. Defining permissions to share data with other applications HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. Assigning users to maintain the application To define who can edit an HCL Leap application, use the design settings in the Access tab. Setting up security for anonymous access Using the correct permissions, you can allow anonymous users to access a form.","title":"Securing"},{"location":"se_security_toc.html#securitytoc","text":"When building applications, user roles require various levels of security access. A manager is able to review submitted forms, but an administrator can delete them. The following topics describe how to set security levels for all levels of users. Leap allows application designers to compose applications that combine user interfaces, data records, and a stages-based lifecycle. The Leap security settings govern access to applications and data by defining who can edit, maintain, deploy applications, and access data for submitted forms. You can define your security rules using the Access tab from within the Design environment. These topics describe the Leap security concepts and how to use the Access tab to grant access to users in your organization. Defining basic security roles for users Create roles for users in your organization so they can work with data that is relevant to them. Assigning users or groups to roles Give the users in your organization permission to work with the data relevant to them by assigning them roles. Setting Stage permissions Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. Defining permissions to share data with other applications HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. Assigning users to maintain the application To define who can edit an HCL Leap application, use the design settings in the Access tab. Setting up security for anonymous access Using the correct permissions, you can allow anonymous users to access a form.","title":"Securing"},{"location":"se_triggering_a_web_service_from_a_button.html","text":"Triggering a service from a button You can use a service to add information to a form automatically after a user clicks a button. To use a service call when the user clicks a button: Add a Button to your form from the Palette if your form does not yet have one. Select the newly added button. The Properties side panel opens. Select Call a service when clicked . A menu opens where you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 8. Create a service call by clicking Add/Edit Service Configuration . To configure a service, go to step 5. When you click Add/Edit Service Configuration , the Service Configuration window opens. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Triggering a service from a button"},{"location":"se_triggering_a_web_service_from_a_button.html#triggeringawebservicefromabutton","text":"You can use a service to add information to a form automatically after a user clicks a button. To use a service call when the user clicks a button: Add a Button to your form from the Palette if your form does not yet have one. Select the newly added button. The Properties side panel opens. Select Call a service when clicked . A menu opens where you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 8. Create a service call by clicking Add/Edit Service Configuration . To configure a service, go to step 5. When you click Add/Edit Service Configuration , the Service Configuration window opens. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Triggering a service from a button"},{"location":"se_using_a_service_to_populate_a_drop_down.html","text":"Using a service to populate form items You can use a web service to populate to a Drop Down, Select One, and Select Many form item. The following instructions describe how to populate a Drop Down, however the same instructions apply for populating the Select One and Select Many form items. Select Drop Down from the Palette and drop it onto your form. Select the newly added dropdown. The Properties side panel opens. Click the Events tab. From the Client Side: list, select an action to associate with the service. A window for the web service opens. From this window, you can: Select a predefined action, such as Run a Formula , Call a Service , or both. Insert your own custom code in the Custom Actions area. Select Call a Service . From this menu, you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 9. Create a web service call by clicking Add/Edit Service Configuration . To configure a web service, go to step 6. Cick Add/Edit Service Configuration , to open the Service Configuration window. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Outputs section of the page. Click OK to exit the Service Configuration . All form item data is stored in database columns. For Drop Down, Select One, Select Many, and Survey items, the data column must be large enough to accommodate the largest value a user can select. The amount of space that is allocated to a database column is based on the larger of either the Storage Size parameter (50 characters), or the largest defined static value. As it is possible to pull information from a web service or from JavaScript\u2122 into the previously listed form items, Leap cannot calculate the largest size needed. To set larger database columns, modify the Saved Value character limit field to ensure that it is large enough to hold the largest value expected. Change the size of the Saved Value character limit field to the required number of characters. Parent topic: Incorporating web services into your applications","title":"Using a service to populate form items"},{"location":"se_using_a_service_to_populate_a_drop_down.html#callingaservicefromadropdownmenu","text":"You can use a web service to populate to a Drop Down, Select One, and Select Many form item. The following instructions describe how to populate a Drop Down, however the same instructions apply for populating the Select One and Select Many form items. Select Drop Down from the Palette and drop it onto your form. Select the newly added dropdown. The Properties side panel opens. Click the Events tab. From the Client Side: list, select an action to associate with the service. A window for the web service opens. From this window, you can: Select a predefined action, such as Run a Formula , Call a Service , or both. Insert your own custom code in the Custom Actions area. Select Call a Service . From this menu, you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 9. Create a web service call by clicking Add/Edit Service Configuration . To configure a web service, go to step 6. Cick Add/Edit Service Configuration , to open the Service Configuration window. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Outputs section of the page. Click OK to exit the Service Configuration . All form item data is stored in database columns. For Drop Down, Select One, Select Many, and Survey items, the data column must be large enough to accommodate the largest value a user can select. The amount of space that is allocated to a database column is based on the larger of either the Storage Size parameter (50 characters), or the largest defined static value. As it is possible to pull information from a web service or from JavaScript\u2122 into the previously listed form items, Leap cannot calculate the largest size needed. To set larger database columns, modify the Saved Value character limit field to ensure that it is large enough to hold the largest value expected. Change the size of the Saved Value character limit field to the required number of characters. Parent topic: Incorporating web services into your applications","title":"Using a service to populate form items"},{"location":"ser_add_service_catalog.html","text":"Adding a Service Catalog A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. A Service Catalog is implemented in much the same manner as a Service Catalog Group. You first create an implementation of the IServiceCatalog interface. The recommended approach is to extend the AbstractServiceCatalog class. Your implementation and supporting files are then packaged into an OSGi bundle and deployed to the extensions directory on the Leap server. Refer to Setting up your development environment before using the following instructions. Create a Java class The following example of a custom Service Catalog provides the description of a single sample service called Hello Service. This service has one input parameter and one output parameter. This custom Service Catalog is linked with the sample Service Catalog Group described in the Service Catalog Group help topic by returning the com.mycompany.services.MyServiceCatalogGroup.id from the getGroupId() method. The Hello Service service is started when My Services is selected by the application designer from the Service Catalog dropdown in the Service Configuration dialog. package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.util.*; public class MyServiceCatalog extends AbstractServiceCatalog implements IServiceCatalog { private Collection<IServiceDescription> mServiceDescriptions = null; public String getGroupId() { return \"com.mycompany.services.MyServiceCatalogGroup.id\"; } public void setServiceDescriptionBuilderFactory(IServiceDescriptionBuilderFactory pServiceDescriptionBuilderFactory) { if (this.mServiceDescriptions == null) { this.mServiceDescriptions = new ArrayList<IServiceDescription>(); try { IServiceDescriptionBuilder builder1 = pServiceDescriptionBuilderFactory.newDescriptionBuilder(); builder1.setId(\"com.mycompany.services.Hello\").setDefaultLocale(Locale.ENGLISH); builder1.setName(Locale.ENGLISH, \"Hello Service\"); builder1.setDescription(Locale.ENGLISH, \"This service says 'Hello' to a given person\"); builder1.setTransportId(\"com.mycompany.services.HelloServiceTransport.id\"); // service inputs IServiceBindingBuilder inboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder inParamBuilder1 = inboundBindingBuilder.newParameterBuilder(); inParamBuilder1.setName(Locale.ENGLISH, \"Person\"); inParamBuilder1.setDescription(Locale.ENGLISH, \"The person to say 'Hello' to\"); inParamBuilder1.setId(\"person\").setMandatory(true).setType(ServiceParameterType.STRING); inboundBindingBuilder.addParameter(inParamBuilder1.getServiceParameter()); builder1.setInbound(inboundBindingBuilder.getServiceBinding()); // service outputs IServiceBindingBuilder outboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder outParamBuilder1 = outboundBindingBuilder.newParameterBuilder(); outParamBuilder1.setName(Locale.ENGLISH, \"Greeting\"); outParamBuilder1.setDescription(Locale.ENGLISH, \"The 'Hello' greeting\"); outParamBuilder1.setId(\"greeting\").setType(ServiceParameterType.STRING); outboundBindingBuilder.addParameter(outParamBuilder1.getServiceParameter()); builder1.setOutbound(outboundBindingBuilder.getServiceBinding()); IServiceDescription serviceDescription1 = builder1.getServiceDescription(); this.mServiceDescriptions.add(serviceDescription1); } catch (ServiceException ex) { throw new RuntimeException(ex); } } } public Collection<IServiceDescription> getServiceDescriptions(IServiceManager pManager, IOrg pOrg, IUser pUser, String pFilterCatalog, String pFilterStatus, String pFilterText, boolean pFilterIncludesDesc, Locale pFilterLocale) { this.filterServiceDescriptions(pManager, this.mServiceDescriptions, pFilterStatus, pFilterText, pFilterIncludesDesc, pFilterLocale); return Collections.unmodifiableCollection(this.mServiceDescriptions); } public IServiceDescription getServiceDescription(IServiceManager pManager, IOrg pOrg, IUser pUser, String pServiceDescriptionId) { for (IServiceDescription description : this.mServiceDescriptions) { if (description.getId().equals(pServiceDescriptionId)) return description; } return null; } } In this example, an IserviceDescriptionBuilder is used to build up a Service Description programmatically. However, IserviceDescriptionBuilder also provides methods to parse Service Descriptions from XML files. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalog.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalog.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalog\" /> <reference bind=\"setServiceDescriptionBuilderFactory\" cardinality=\"1..1\" interface=\"com.ibm.form.nitro.service.services.IServiceDescriptionBuilderFactory\" name=\"ServiceDescriptionBuilderFactory\" policy=\"static\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalog\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1 . Notice the inclusion of the <reference> element in this example. This ensures that your custom Service Catalog has access to an IServiceDescriptionBuilderFactory for programmatically building up Service Descriptions. Create a MANIFEST.MF file Create a MANIFEST.MF file similar to Step 3 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Catalog Group and a custom Service Catalog. Deploy the Service Catalog. Deployment of your Service Catalog is similar to Step 4 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle, so the same .jar file can be used for your custom Service Catalog Group and custom Service Catalog. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog"},{"location":"ser_add_service_catalog.html#ser_add_service_catalog","text":"A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. A Service Catalog is implemented in much the same manner as a Service Catalog Group. You first create an implementation of the IServiceCatalog interface. The recommended approach is to extend the AbstractServiceCatalog class. Your implementation and supporting files are then packaged into an OSGi bundle and deployed to the extensions directory on the Leap server. Refer to Setting up your development environment before using the following instructions. Create a Java class The following example of a custom Service Catalog provides the description of a single sample service called Hello Service. This service has one input parameter and one output parameter. This custom Service Catalog is linked with the sample Service Catalog Group described in the Service Catalog Group help topic by returning the com.mycompany.services.MyServiceCatalogGroup.id from the getGroupId() method. The Hello Service service is started when My Services is selected by the application designer from the Service Catalog dropdown in the Service Configuration dialog. package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.util.*; public class MyServiceCatalog extends AbstractServiceCatalog implements IServiceCatalog { private Collection<IServiceDescription> mServiceDescriptions = null; public String getGroupId() { return \"com.mycompany.services.MyServiceCatalogGroup.id\"; } public void setServiceDescriptionBuilderFactory(IServiceDescriptionBuilderFactory pServiceDescriptionBuilderFactory) { if (this.mServiceDescriptions == null) { this.mServiceDescriptions = new ArrayList<IServiceDescription>(); try { IServiceDescriptionBuilder builder1 = pServiceDescriptionBuilderFactory.newDescriptionBuilder(); builder1.setId(\"com.mycompany.services.Hello\").setDefaultLocale(Locale.ENGLISH); builder1.setName(Locale.ENGLISH, \"Hello Service\"); builder1.setDescription(Locale.ENGLISH, \"This service says 'Hello' to a given person\"); builder1.setTransportId(\"com.mycompany.services.HelloServiceTransport.id\"); // service inputs IServiceBindingBuilder inboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder inParamBuilder1 = inboundBindingBuilder.newParameterBuilder(); inParamBuilder1.setName(Locale.ENGLISH, \"Person\"); inParamBuilder1.setDescription(Locale.ENGLISH, \"The person to say 'Hello' to\"); inParamBuilder1.setId(\"person\").setMandatory(true).setType(ServiceParameterType.STRING); inboundBindingBuilder.addParameter(inParamBuilder1.getServiceParameter()); builder1.setInbound(inboundBindingBuilder.getServiceBinding()); // service outputs IServiceBindingBuilder outboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder outParamBuilder1 = outboundBindingBuilder.newParameterBuilder(); outParamBuilder1.setName(Locale.ENGLISH, \"Greeting\"); outParamBuilder1.setDescription(Locale.ENGLISH, \"The 'Hello' greeting\"); outParamBuilder1.setId(\"greeting\").setType(ServiceParameterType.STRING); outboundBindingBuilder.addParameter(outParamBuilder1.getServiceParameter()); builder1.setOutbound(outboundBindingBuilder.getServiceBinding()); IServiceDescription serviceDescription1 = builder1.getServiceDescription(); this.mServiceDescriptions.add(serviceDescription1); } catch (ServiceException ex) { throw new RuntimeException(ex); } } } public Collection<IServiceDescription> getServiceDescriptions(IServiceManager pManager, IOrg pOrg, IUser pUser, String pFilterCatalog, String pFilterStatus, String pFilterText, boolean pFilterIncludesDesc, Locale pFilterLocale) { this.filterServiceDescriptions(pManager, this.mServiceDescriptions, pFilterStatus, pFilterText, pFilterIncludesDesc, pFilterLocale); return Collections.unmodifiableCollection(this.mServiceDescriptions); } public IServiceDescription getServiceDescription(IServiceManager pManager, IOrg pOrg, IUser pUser, String pServiceDescriptionId) { for (IServiceDescription description : this.mServiceDescriptions) { if (description.getId().equals(pServiceDescriptionId)) return description; } return null; } } In this example, an IserviceDescriptionBuilder is used to build up a Service Description programmatically. However, IserviceDescriptionBuilder also provides methods to parse Service Descriptions from XML files. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalog.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalog.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalog\" /> <reference bind=\"setServiceDescriptionBuilderFactory\" cardinality=\"1..1\" interface=\"com.ibm.form.nitro.service.services.IServiceDescriptionBuilderFactory\" name=\"ServiceDescriptionBuilderFactory\" policy=\"static\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalog\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1 . Notice the inclusion of the <reference> element in this example. This ensures that your custom Service Catalog has access to an IServiceDescriptionBuilderFactory for programmatically building up Service Descriptions. Create a MANIFEST.MF file Create a MANIFEST.MF file similar to Step 3 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Catalog Group and a custom Service Catalog. Deploy the Service Catalog. Deployment of your Service Catalog is similar to Step 4 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle, so the same .jar file can be used for your custom Service Catalog Group and custom Service Catalog. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog"},{"location":"ser_add_service_catalog_group.html","text":"Adding a Service Catalog Group A Service Catalog Group provides a way to group web services in HCL Leap. Refer to Setting up your development environment before starting. A new Service Catalog Group can be added toLeap by creating and deploying an appropriate OSGi .jar bundle. To the application designer, Service Catalog Groups are listed in the Service Catalog dropdown in the Leap Service Configuration dialog. This dropdown allows the application designer to filter services by the Service Catalog Group to which they belong. By default, there are two predefined groups: General and HCL Leap Applications. Providing a new implementation of a Service Catalog Group creates a group as an option in the Service Catalog dropdown. Services can be added to a particular Service Catalog Group by implementing a Service Catalog that belongs to that group. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceCatalogGroup interface to return a unique group identifier and a readable group name. The following example adds the My Services group to the Leap. package com.mycompany.services; import com.ibm.form.nitro.service.services.IServiceCatalogGroup; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.Locale; public class MyServiceCatalogGroup implements IServiceCatalogGroup { public String getGroupId() { return \"com.company.services.MyServiceCatalogGroup.id\"; } public String getGroupName() { Locale requestLocale = LocaleUtils.getRequestLocale(); /* use request locale to determine a translated group name */ return \"My Services\"; } } In this example, the locale used by the user can be retrieved by using com.ibm.form.platform.service.framework.i18n.LocaleUtils.getRequestLocale(. If you are using the Eclipse IDE, its Externalize Strings wizard can extract strings for your OSGi bundle. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalogGroup.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalogGroup.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalogGroup\" /> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalogGroup\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Deploy the Service Catalog Group. Create a .jar file that contains all the files listed in the previous steps in an OSGi bundle structure. For example: / META-INF/ MANIFEST.MF OSGI-INF/ MyServiceCatalogGroup.xml com/ mycompany/ services/ MyServiceCatalogGroup.classn On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Note: If the extensions directory does not exist, you must restart the Leap server after the directory is created. /opt/HCL/Leap/ is not case-sensitive. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog Group"},{"location":"ser_add_service_catalog_group.html#ser_provide_groups_of_dynamic_services","text":"A Service Catalog Group provides a way to group web services in HCL Leap. Refer to Setting up your development environment before starting. A new Service Catalog Group can be added toLeap by creating and deploying an appropriate OSGi .jar bundle. To the application designer, Service Catalog Groups are listed in the Service Catalog dropdown in the Leap Service Configuration dialog. This dropdown allows the application designer to filter services by the Service Catalog Group to which they belong. By default, there are two predefined groups: General and HCL Leap Applications. Providing a new implementation of a Service Catalog Group creates a group as an option in the Service Catalog dropdown. Services can be added to a particular Service Catalog Group by implementing a Service Catalog that belongs to that group. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceCatalogGroup interface to return a unique group identifier and a readable group name. The following example adds the My Services group to the Leap. package com.mycompany.services; import com.ibm.form.nitro.service.services.IServiceCatalogGroup; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.Locale; public class MyServiceCatalogGroup implements IServiceCatalogGroup { public String getGroupId() { return \"com.company.services.MyServiceCatalogGroup.id\"; } public String getGroupName() { Locale requestLocale = LocaleUtils.getRequestLocale(); /* use request locale to determine a translated group name */ return \"My Services\"; } } In this example, the locale used by the user can be retrieved by using com.ibm.form.platform.service.framework.i18n.LocaleUtils.getRequestLocale(. If you are using the Eclipse IDE, its Externalize Strings wizard can extract strings for your OSGi bundle. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalogGroup.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalogGroup.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalogGroup\" /> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalogGroup\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Deploy the Service Catalog Group. Create a .jar file that contains all the files listed in the previous steps in an OSGi bundle structure. For example: / META-INF/ MANIFEST.MF OSGI-INF/ MyServiceCatalogGroup.xml com/ mycompany/ services/ MyServiceCatalogGroup.classn On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Note: If the extensions directory does not exist, you must restart the Leap server after the directory is created. /opt/HCL/Leap/ is not case-sensitive. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog Group"},{"location":"ser_create_custom_service_transport.html","text":"Creating your own custom Service Transport By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. If you plan to call an external service using HTTP, consider using the HTTP Service Transport instead. Refer to HTTP Service Transport for more information. A custom Service Transport can be added to the Leap environment by creating and deploying an appropriate OSGi JAR bundle. Refer to Setting up your development environment before starting. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceTransport interface. The following example is a Hello example transport that returns a greeting to a person. This transport expects a single input parameter person and responds with a single output parameter greeting. In this simple example, the transport does not talk to any external system to run the service. The transport implements the service itself. package com.mycompany.services; import com.ibm.form.nitro.service.model.IUser; import com.ibm.form.nitro.service.services.*; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.*; public class HelloServiceTransport implements IServiceTransport { public String getId() { return \"com.mycompany.services.HelloServiceTransport.id\"; } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { String personName = (String) pParameters.get(\"person\"); Locale requestLocale = LocaleUtils.getRequestLocale(); String greeting = \"\"; if (requestLocale.getLanguage().equals(Locale.FRENCH.getLanguage())) greeting = \"Bonjour\" + personName; else greeting = \"Hello \" + personName; pParameters.put(\"greeting\", greeting); ServiceResult result = new ServiceResult(200, \"success\"); return result; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public IServiceTransportMetadata getMetadata() { return new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { return Collections.emptySet(); } }; } } Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a HelloServiceTransport.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" immediate=\"true\" name=\"com.mycompany.services.HelloServiceTransport.service\"> <implementation class=\"com.mycompany.services.HelloServiceTransport\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceTransport\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1. Ensure that the name attribute of the component element is unique. Although not required, you can make it the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. Deploy the Service Transport. Create a .jar file that contains the Java class, OSGi Service Description, and the MANIFEST.MF, created in steps 1 - 3. For example: / META-INF/ MANIFEST.MF OSGI-INF/ HelloServiceTransport.xml com/ mycompany/ services/ HelloServiceTransport.class HelloServiceTransport$1.class Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same .jar file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case-sensitive. Sample LDAP query Service Transport The following example is a more complex Service Transport that demonstrates one possible way to query an LDAP server. The transport itself remains fairly generic so that multiple different service descriptions, each with their own custom parameters and LDAP search properties, can use this same transport. This sample uses the JVM's naming services (javax.naming.directory and javax.naming.ldap) to communicate with the external LDAP server. LDAP search results are converted to XML which can then be pulled apart by the outgoing mapping section of the service description as needed. For example: <searchresults> <searchresult> <telephone>1-555-555-555</telephone> <email>csmith@mycompany.com</email> <cn>Chris Smith</cn> </searchresult> <searchresult> ... </searchresult> ... </searchresults> If necessary, the Basic Credentials Provider is used to collect the credentials needed to query the LDAP server. Sample Java code: package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.io.*; import java.util.*; import javax.naming.*; import javax.naming.directory.*; import javax.naming.ldap.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.*; public class SampleLDAPServiceTransport implements IServiceTransport { private IServiceTransportMetadata metaData; public String getId() { return \"com.mycompany.services.SampleLDAPServiceTransport.id\"; } public IServiceTransportMetadata getMetadata() { if (this.metaData == null) { this.metaData = new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { Set<String> ids = new HashSet<String>(); ids.add(\"basic\"); return ids; } }; } return this.metaData; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { if (pParameters == null) { pParameters = new HashMap<String, Object>(); } String baseDN = (String) pParameters.get(\"basedn\"); String filter = (String) pParameters.get(\"filter\"); List<String> filterArgs = new ArrayList<String>(); int argIndex = 0; while (pParameters.containsKey(\"filter-arg-\" + argIndex)) { String filterArgValue = (String) pParameters.get(\"filter-arg-\" + argIndex); filterArgs.add(filterArgValue == null ? \"\" : filterArgValue); argIndex++; } String[] attributes = null; if (pParameters.containsKey(\"result-attributes\")) { attributes = ((String) pParameters.get(\"result-attributes\")).trim().split(\"[\\\\s]*,[\\\\s]*\"); } int resultCountLimit = 50; if (pParameters.containsKey(\"result-count-limit\")) { resultCountLimit = Integer.parseInt((String) pParameters.get(\"result-count-limit\")); } int resultCount = 0; InitialLdapContext ctx = null; try { ctx = ldapConnect(pServiceCredentialsProvider, pParameters); if (ctx != null) { Document doc = createDocument(); Node rootNode = doc.createElement(\"searchresults\"); doc.appendChild(rootNode); SearchControls sc = new SearchControls(); sc.setSearchScope(SearchControls.SUBTREE_SCOPE); sc.setCountLimit(resultCountLimit); sc.setReturningAttributes(attributes); sc.setReturningObjFlag(false); // fetch results NamingEnumeration<SearchResult> searchResults = ctx.search(baseDN, filter, filterArgs.toArray(new String[0]), sc); while (searchResults.hasMore()) { Node resultNode = doc.createElement(\"searchresult\"); rootNode.appendChild(resultNode); resultCount++; SearchResult result = searchResults.next(); Attributes resultAttrs = result.getAttributes(); NamingEnumeration<String> attrIds = resultAttrs.getIDs(); while (attrIds.hasMore()) { String attrName = attrIds.next(); String attrValue = (String) resultAttrs.get(attrName).get(0); Node attrNode = doc.createElement(attrName); attrNode.setTextContent(attrValue); resultNode.appendChild(attrNode); } } String result = serializeDocument(doc); pParameters.put(\"resultXML\", result); } } catch (AuthenticationException ex) { if (pServiceCredentialsProvider != null) { return new ServiceResult(401); } else { return new ServiceResult(500, ex.getLocalizedMessage()); } } catch (Exception ex) { return new ServiceResult(500, ex.getLocalizedMessage()); } finally { if (ctx != null) { try { ctx.close(); } catch (NamingException ex) { // Ignore } } } // Success return new ServiceResult(200, resultCount + \" LDAP search result(s)\"); } /** * Creates the LDAP Context used to call to the LDAP server. */ private InitialLdapContext ldapConnect(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws NamingException, ServiceException { String url = (String) pParameters.get(\"url\"); Map<String, String> securityInfo = this.getSecurityInfo(pServiceCredentialsProvider, pParameters); String securityAuth = securityInfo.get(\"auth\"); String securityPrincipal = securityInfo.get(\"principal\"); String securityCredentials = securityInfo.get(\"credentials\"); InitialLdapContext ctx = null; Hashtable<String, String> contextConfig = null; // Set up LDAP config settings contextConfig = new Hashtable<String, String>(); contextConfig.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.ldap.LdapCtxFactory\"); contextConfig.put(Context.REFERRAL, \"follow\"); contextConfig.put(Context.PROVIDER_URL, url); // For non-anonymous authentication security needs to be configured if (securityAuth != null && securityAuth.equals(\"none\") == false) { contextConfig.put(Context.SECURITY_AUTHENTICATION, securityAuth); contextConfig.put(Context.SECURITY_PRINCIPAL, securityPrincipal); contextConfig.put(Context.SECURITY_CREDENTIALS, securityCredentials); } ctx = new InitialLdapContext(contextConfig, null); return ctx; } private Map<String, String> getSecurityInfo(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws ServiceException { Map<String, String> resultMap = new HashMap<String, String>(); resultMap.put(\"auth\", (String) pParameters.get(\"security-authentication\")); if (resultMap.get(\"auth\") != null) { resultMap.put(\"principal\", (String) pParameters.get(\"security-principal\")); resultMap.put(\"credentials\", (String) pParameters.get(\"security-credentials\")); } if (pServiceCredentialsProvider != null) { if (pServiceCredentialsProvider.getId() == \"basic\") { resultMap.put(\"auth\", \"simple\"); try { // use reflection to get username and password resultMap.put(\"principal\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getUsername\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); resultMap.put(\"credentials\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getPassword\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); } catch (Exception e) { throw new ServiceException(e); } } } if (resultMap.get(\"principal\") == null) resultMap.put(\"principal\", \"\"); if (resultMap.get(\"credentials\") == null) resultMap.put(\"credentials\", \"\"); return resultMap; } /** * Creates an empty XML document. */ private Document createDocument() throws ServiceException { Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.newDocument(); } catch (Exception ex) { throw new ServiceException(ex); } return doc; } /** * Serializes an XML document to a String. */ private String serializeDocument(Document pDocument) throws ServiceException { try { Transformer t = TransformerFactory.newInstance().newTransformer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); t.transform(new DOMSource(pDocument), new StreamResult(baos)); return new String(baos.toByteArray(), \"UTF-8\"); } catch (Exception ex) { throw new ServiceException(ex); } } } Sample LDAP query Service Description This service description utilizes the previous sample LDAP transport to search an LDAP server for employee info. The results returned are based on a wildcard match of the employee's name or email address. <?xml version=\"1.0\" encoding=\"UTF-8\"?> <serviceDescription> <id>com.mycompany.services.SampleLDAPSearch</id> <defaultLocale>en-us</defaultLocale> <transportId>com.mycompany.services.SampleLDAPServiceTransport.id</transportId> <name>Sample LDAP Search Service</name> <description>Searches an LDAP server for employee information.</description> <credentials providerId=\"basic\"> <property name=\"realm\" value=\"com.mycompany.services.SampleLDAPRealm\"/> </credentials> <inbound> <parameters> <parameter> <id>searchName</id> <name>Search Name</name> <description>The employee name to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> <parameter> <id>searchEmail</id> <name>Search Email</name> <description>The employee email to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>url</id> <value>ldap://ldap.mysite.com:389/</value> </constant> <constant> <id>basedn</id> <value>ou=employees,o=mysite.com</value> </constant> <constant> <id>filter</id> <value>(&(objectClass=person)(cn=*{0}*)(email=*{1}*))</value> </constant> <constant> <id>result-attributes</id> <value>cn,telephone,email</value> </constant> </constants> <mapping> <mapping target=\"transport:url\" source=\"constant:url\" /> <mapping target=\"transport:basedn\" source=\"constant:basedn\" /> <mapping target=\"transport:filter\" source=\"constant:filter\" /> <mapping target=\"transport:filter-arg-0\" source=\"parameter:searchName\" /> <mapping target=\"transport:filter-arg-1\" source=\"parameter:searchEmail\" /> <mapping target=\"transport:result-attributes\" source=\"constant:result-attributes\" /> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>searchResults</id> <name>Search Results</name> <description>The list of search results</description> <type>LIST</type> <parameters> <parameter> <id>name</id> <name>Employee Name</name> <description>The employee's name.</description> <type>STRING</type> </parameter> <parameter> <id>email</id> <name>Employee Email</name> <description>The employee's email address.</description> <type>STRING</type> </parameter> <parameter> <id>phone</id> <name>Employee Phone Number</name> <description>The employee's phone number.</description> <type>STRING</type> </parameter> </parameters> </parameter> </parameters> <serviceMapping> <mapping> <mapping target=\"parameter:searchResults\" source=\"transport:resultXML\" sourceRef=\"searchresults/searchresult\" sourceType=\"xml\"> <mapping target=\"parameter:name\" sourceRef=\"cn\" sourceType=\"xml\" /> <mapping target=\"parameter:email\" sourceRef=\"email\" sourceType=\"xml\" /> <mapping target=\"parameter:phone\" sourceRef=\"telephone\" sourceType=\"xml\" /> </mapping> </mapping> </serviceMapping> </outbound> </serviceDescription> Parent topic: Service Oriented Architecture \u2013 Service Transport","title":"Creating your own custom Service Transport"},{"location":"ser_create_custom_service_transport.html#ser_create_custom_service_transport","text":"By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. If you plan to call an external service using HTTP, consider using the HTTP Service Transport instead. Refer to HTTP Service Transport for more information. A custom Service Transport can be added to the Leap environment by creating and deploying an appropriate OSGi JAR bundle. Refer to Setting up your development environment before starting. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceTransport interface. The following example is a Hello example transport that returns a greeting to a person. This transport expects a single input parameter person and responds with a single output parameter greeting. In this simple example, the transport does not talk to any external system to run the service. The transport implements the service itself. package com.mycompany.services; import com.ibm.form.nitro.service.model.IUser; import com.ibm.form.nitro.service.services.*; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.*; public class HelloServiceTransport implements IServiceTransport { public String getId() { return \"com.mycompany.services.HelloServiceTransport.id\"; } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { String personName = (String) pParameters.get(\"person\"); Locale requestLocale = LocaleUtils.getRequestLocale(); String greeting = \"\"; if (requestLocale.getLanguage().equals(Locale.FRENCH.getLanguage())) greeting = \"Bonjour\" + personName; else greeting = \"Hello \" + personName; pParameters.put(\"greeting\", greeting); ServiceResult result = new ServiceResult(200, \"success\"); return result; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public IServiceTransportMetadata getMetadata() { return new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { return Collections.emptySet(); } }; } } Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a HelloServiceTransport.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" immediate=\"true\" name=\"com.mycompany.services.HelloServiceTransport.service\"> <implementation class=\"com.mycompany.services.HelloServiceTransport\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceTransport\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1. Ensure that the name attribute of the component element is unique. Although not required, you can make it the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. Deploy the Service Transport. Create a .jar file that contains the Java class, OSGi Service Description, and the MANIFEST.MF, created in steps 1 - 3. For example: / META-INF/ MANIFEST.MF OSGI-INF/ HelloServiceTransport.xml com/ mycompany/ services/ HelloServiceTransport.class HelloServiceTransport$1.class Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same .jar file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case-sensitive.","title":"Creating your own custom Service Transport"},{"location":"ser_create_custom_service_transport.html#sample-ldap-query-service-transport","text":"The following example is a more complex Service Transport that demonstrates one possible way to query an LDAP server. The transport itself remains fairly generic so that multiple different service descriptions, each with their own custom parameters and LDAP search properties, can use this same transport. This sample uses the JVM's naming services (javax.naming.directory and javax.naming.ldap) to communicate with the external LDAP server. LDAP search results are converted to XML which can then be pulled apart by the outgoing mapping section of the service description as needed. For example: <searchresults> <searchresult> <telephone>1-555-555-555</telephone> <email>csmith@mycompany.com</email> <cn>Chris Smith</cn> </searchresult> <searchresult> ... </searchresult> ... </searchresults> If necessary, the Basic Credentials Provider is used to collect the credentials needed to query the LDAP server. Sample Java code: package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.io.*; import java.util.*; import javax.naming.*; import javax.naming.directory.*; import javax.naming.ldap.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.*; public class SampleLDAPServiceTransport implements IServiceTransport { private IServiceTransportMetadata metaData; public String getId() { return \"com.mycompany.services.SampleLDAPServiceTransport.id\"; } public IServiceTransportMetadata getMetadata() { if (this.metaData == null) { this.metaData = new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { Set<String> ids = new HashSet<String>(); ids.add(\"basic\"); return ids; } }; } return this.metaData; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { if (pParameters == null) { pParameters = new HashMap<String, Object>(); } String baseDN = (String) pParameters.get(\"basedn\"); String filter = (String) pParameters.get(\"filter\"); List<String> filterArgs = new ArrayList<String>(); int argIndex = 0; while (pParameters.containsKey(\"filter-arg-\" + argIndex)) { String filterArgValue = (String) pParameters.get(\"filter-arg-\" + argIndex); filterArgs.add(filterArgValue == null ? \"\" : filterArgValue); argIndex++; } String[] attributes = null; if (pParameters.containsKey(\"result-attributes\")) { attributes = ((String) pParameters.get(\"result-attributes\")).trim().split(\"[\\\\s]*,[\\\\s]*\"); } int resultCountLimit = 50; if (pParameters.containsKey(\"result-count-limit\")) { resultCountLimit = Integer.parseInt((String) pParameters.get(\"result-count-limit\")); } int resultCount = 0; InitialLdapContext ctx = null; try { ctx = ldapConnect(pServiceCredentialsProvider, pParameters); if (ctx != null) { Document doc = createDocument(); Node rootNode = doc.createElement(\"searchresults\"); doc.appendChild(rootNode); SearchControls sc = new SearchControls(); sc.setSearchScope(SearchControls.SUBTREE_SCOPE); sc.setCountLimit(resultCountLimit); sc.setReturningAttributes(attributes); sc.setReturningObjFlag(false); // fetch results NamingEnumeration<SearchResult> searchResults = ctx.search(baseDN, filter, filterArgs.toArray(new String[0]), sc); while (searchResults.hasMore()) { Node resultNode = doc.createElement(\"searchresult\"); rootNode.appendChild(resultNode); resultCount++; SearchResult result = searchResults.next(); Attributes resultAttrs = result.getAttributes(); NamingEnumeration<String> attrIds = resultAttrs.getIDs(); while (attrIds.hasMore()) { String attrName = attrIds.next(); String attrValue = (String) resultAttrs.get(attrName).get(0); Node attrNode = doc.createElement(attrName); attrNode.setTextContent(attrValue); resultNode.appendChild(attrNode); } } String result = serializeDocument(doc); pParameters.put(\"resultXML\", result); } } catch (AuthenticationException ex) { if (pServiceCredentialsProvider != null) { return new ServiceResult(401); } else { return new ServiceResult(500, ex.getLocalizedMessage()); } } catch (Exception ex) { return new ServiceResult(500, ex.getLocalizedMessage()); } finally { if (ctx != null) { try { ctx.close(); } catch (NamingException ex) { // Ignore } } } // Success return new ServiceResult(200, resultCount + \" LDAP search result(s)\"); } /** * Creates the LDAP Context used to call to the LDAP server. */ private InitialLdapContext ldapConnect(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws NamingException, ServiceException { String url = (String) pParameters.get(\"url\"); Map<String, String> securityInfo = this.getSecurityInfo(pServiceCredentialsProvider, pParameters); String securityAuth = securityInfo.get(\"auth\"); String securityPrincipal = securityInfo.get(\"principal\"); String securityCredentials = securityInfo.get(\"credentials\"); InitialLdapContext ctx = null; Hashtable<String, String> contextConfig = null; // Set up LDAP config settings contextConfig = new Hashtable<String, String>(); contextConfig.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.ldap.LdapCtxFactory\"); contextConfig.put(Context.REFERRAL, \"follow\"); contextConfig.put(Context.PROVIDER_URL, url); // For non-anonymous authentication security needs to be configured if (securityAuth != null && securityAuth.equals(\"none\") == false) { contextConfig.put(Context.SECURITY_AUTHENTICATION, securityAuth); contextConfig.put(Context.SECURITY_PRINCIPAL, securityPrincipal); contextConfig.put(Context.SECURITY_CREDENTIALS, securityCredentials); } ctx = new InitialLdapContext(contextConfig, null); return ctx; } private Map<String, String> getSecurityInfo(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws ServiceException { Map<String, String> resultMap = new HashMap<String, String>(); resultMap.put(\"auth\", (String) pParameters.get(\"security-authentication\")); if (resultMap.get(\"auth\") != null) { resultMap.put(\"principal\", (String) pParameters.get(\"security-principal\")); resultMap.put(\"credentials\", (String) pParameters.get(\"security-credentials\")); } if (pServiceCredentialsProvider != null) { if (pServiceCredentialsProvider.getId() == \"basic\") { resultMap.put(\"auth\", \"simple\"); try { // use reflection to get username and password resultMap.put(\"principal\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getUsername\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); resultMap.put(\"credentials\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getPassword\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); } catch (Exception e) { throw new ServiceException(e); } } } if (resultMap.get(\"principal\") == null) resultMap.put(\"principal\", \"\"); if (resultMap.get(\"credentials\") == null) resultMap.put(\"credentials\", \"\"); return resultMap; } /** * Creates an empty XML document. */ private Document createDocument() throws ServiceException { Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.newDocument(); } catch (Exception ex) { throw new ServiceException(ex); } return doc; } /** * Serializes an XML document to a String. */ private String serializeDocument(Document pDocument) throws ServiceException { try { Transformer t = TransformerFactory.newInstance().newTransformer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); t.transform(new DOMSource(pDocument), new StreamResult(baos)); return new String(baos.toByteArray(), \"UTF-8\"); } catch (Exception ex) { throw new ServiceException(ex); } } } Sample LDAP query Service Description This service description utilizes the previous sample LDAP transport to search an LDAP server for employee info. The results returned are based on a wildcard match of the employee's name or email address. <?xml version=\"1.0\" encoding=\"UTF-8\"?> <serviceDescription> <id>com.mycompany.services.SampleLDAPSearch</id> <defaultLocale>en-us</defaultLocale> <transportId>com.mycompany.services.SampleLDAPServiceTransport.id</transportId> <name>Sample LDAP Search Service</name> <description>Searches an LDAP server for employee information.</description> <credentials providerId=\"basic\"> <property name=\"realm\" value=\"com.mycompany.services.SampleLDAPRealm\"/> </credentials> <inbound> <parameters> <parameter> <id>searchName</id> <name>Search Name</name> <description>The employee name to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> <parameter> <id>searchEmail</id> <name>Search Email</name> <description>The employee email to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>url</id> <value>ldap://ldap.mysite.com:389/</value> </constant> <constant> <id>basedn</id> <value>ou=employees,o=mysite.com</value> </constant> <constant> <id>filter</id> <value>(&(objectClass=person)(cn=*{0}*)(email=*{1}*))</value> </constant> <constant> <id>result-attributes</id> <value>cn,telephone,email</value> </constant> </constants> <mapping> <mapping target=\"transport:url\" source=\"constant:url\" /> <mapping target=\"transport:basedn\" source=\"constant:basedn\" /> <mapping target=\"transport:filter\" source=\"constant:filter\" /> <mapping target=\"transport:filter-arg-0\" source=\"parameter:searchName\" /> <mapping target=\"transport:filter-arg-1\" source=\"parameter:searchEmail\" /> <mapping target=\"transport:result-attributes\" source=\"constant:result-attributes\" /> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>searchResults</id> <name>Search Results</name> <description>The list of search results</description> <type>LIST</type> <parameters> <parameter> <id>name</id> <name>Employee Name</name> <description>The employee's name.</description> <type>STRING</type> </parameter> <parameter> <id>email</id> <name>Employee Email</name> <description>The employee's email address.</description> <type>STRING</type> </parameter> <parameter> <id>phone</id> <name>Employee Phone Number</name> <description>The employee's phone number.</description> <type>STRING</type> </parameter> </parameters> </parameter> </parameters> <serviceMapping> <mapping> <mapping target=\"parameter:searchResults\" source=\"transport:resultXML\" sourceRef=\"searchresults/searchresult\" sourceType=\"xml\"> <mapping target=\"parameter:name\" sourceRef=\"cn\" sourceType=\"xml\" /> <mapping target=\"parameter:email\" sourceRef=\"email\" sourceType=\"xml\" /> <mapping target=\"parameter:phone\" sourceRef=\"telephone\" sourceType=\"xml\" /> </mapping> </mapping> </serviceMapping> </outbound> </serviceDescription> Parent topic: Service Oriented Architecture \u2013 Service Transport","title":"Sample LDAP query Service Transport"},{"location":"ser_provide_groups_of_dynamic_services.html","text":"Providing Groups of Dynamic Services You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Adding a Service Catalog Group A Service Catalog Group provides a way to group web services in HCL Leap. Adding a Service Catalog A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. Parent topic: Adding services","title":"Providing Groups of Dynamic Services"},{"location":"ser_provide_groups_of_dynamic_services.html#ser_provide_groups_of_dynamic_services","text":"You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Adding a Service Catalog Group A Service Catalog Group provides a way to group web services in HCL Leap. Adding a Service Catalog A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. Parent topic: Adding services","title":"Providing Groups of Dynamic Services"},{"location":"ser_setup_development_environment.html","text":"Setting up your development environment The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Gather Leap JAR files Use the following script, or a similar script, to extract appropriate .jar files from the Leap .ear file. If you use the following script, update the variables to match your system. The extracted JAR files are placed in the %EXTRACT_DIR%\\Leap_bundles\\ directory. SET EXTRACT_DIR=C:\\temp\\Builder_extract SET JAVA_BIN=C:\\hcl-java-sdk-60-win-i386\\bin SET LEAP_INSTALL_DIR=C:\\Program Files\\HCL\\Leap Server\\8.0\\Leap SET LEAP_VERSION=8.0.0.1013 SET FSP_VERSION=8.0.0.494 mkdir \"%EXTRACT_DIR%\" mkdir \"%EXTRACT_DIR%\\fsp\" mkdir \"%EXTRACT_DIR%\\core\" mkdir \"%EXTRACT_DIR%\\Leap_bundles\" copy \"%LEAP_INSTALL_DIR%\\deploy\\hcl-leap.ear\" \"%EXTRACT_DIR%\" cd \"%EXTRACT_DIR%\" \"%JAVA_BIN%\\jar\" xvf hcl-leap.ear \"%JAVA_BIN%\\jar\" xvf leap.war copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\fsp\" copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\core\" cd \"%EXTRACT_DIR%\\fsp\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPJARS.jar copy ibm.fsp.core.service.framework-%FSP_VERSION%.jar ..\\Leap_bundles cd \"%EXTRACT_DIR%\\core\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPBUNDLES.jar copy ibm.nitro.services-%LEAP_VERSION%.jar ..\\Leap_bundles Create a Plug-in Project In the Eclipse IDE, an OSGi bundle is also referred to as a plug-in. Start a new Plug-in Project to create an OSGi bundle: Select File > New > Project... > Plug-in Development > Plug-in Project . In the Target Platform section, select an OSGi framework: , and select Equinox . Add Leap Jars to the Build Path To compile your custom bundle against the Leapjars extracted in Step 1, add them to the build path by changing the Target Platform that your plug-in builds against: Select Window > Preferences > Plug-in Development > Target Platform . Select Running Platform (Active) > Edit > Locations > Add... > ****. Enter the complete path of the Leap_bundles directory from Step 1. Select Finish . Implement any classes and supporting files as needed. Refer to other documents and JavaDocs. Package your Plug-In and Deploy Package your code as a .jar file. The typical structure for an OSGi bundle is shown here: / META-INF/ MANIFEST.MF OSGI-INF/ Service1.xml Service2.xml com/ mycompany/ services/ hclLeap Service1.class Service2.class If you are using the Eclipse IDE, you can package your bundle with the Export feature: Make sure the build.properties file for the project, which is created automatically for a Plug-in Project, includes all the resources you want included in your bundle. For example, make sure the OSGI-INF directory and its contents are included. Right-click your Plug-in project. Select Export > Plug-in Development > Deployable plug-ins and fragments . Select your Plug-in project. Specify an output directory. Click Finish . On the Leap server, put the exported .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non-Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case sensitive. Debugging If you start the Leap server in debug mode, you can attach your debugger to the running JVM and step through your own code. Also, you can enable debug logging or finer logging for the com.ibm.form.nitro.service.services package to get more information from the Leap code. Refer to the documentation for WebSphere\u00ae Application Server for more details. Do not run a production system in debug mode or with debug logging enabled. Enabling these options degrades performance. Parent topic: Adding services","title":"Setting up your development environment"},{"location":"ser_setup_development_environment.html#ser_setup_development_environment","text":"The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Gather Leap JAR files Use the following script, or a similar script, to extract appropriate .jar files from the Leap .ear file. If you use the following script, update the variables to match your system. The extracted JAR files are placed in the %EXTRACT_DIR%\\Leap_bundles\\ directory. SET EXTRACT_DIR=C:\\temp\\Builder_extract SET JAVA_BIN=C:\\hcl-java-sdk-60-win-i386\\bin SET LEAP_INSTALL_DIR=C:\\Program Files\\HCL\\Leap Server\\8.0\\Leap SET LEAP_VERSION=8.0.0.1013 SET FSP_VERSION=8.0.0.494 mkdir \"%EXTRACT_DIR%\" mkdir \"%EXTRACT_DIR%\\fsp\" mkdir \"%EXTRACT_DIR%\\core\" mkdir \"%EXTRACT_DIR%\\Leap_bundles\" copy \"%LEAP_INSTALL_DIR%\\deploy\\hcl-leap.ear\" \"%EXTRACT_DIR%\" cd \"%EXTRACT_DIR%\" \"%JAVA_BIN%\\jar\" xvf hcl-leap.ear \"%JAVA_BIN%\\jar\" xvf leap.war copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\fsp\" copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\core\" cd \"%EXTRACT_DIR%\\fsp\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPJARS.jar copy ibm.fsp.core.service.framework-%FSP_VERSION%.jar ..\\Leap_bundles cd \"%EXTRACT_DIR%\\core\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPBUNDLES.jar copy ibm.nitro.services-%LEAP_VERSION%.jar ..\\Leap_bundles Create a Plug-in Project In the Eclipse IDE, an OSGi bundle is also referred to as a plug-in. Start a new Plug-in Project to create an OSGi bundle: Select File > New > Project... > Plug-in Development > Plug-in Project . In the Target Platform section, select an OSGi framework: , and select Equinox . Add Leap Jars to the Build Path To compile your custom bundle against the Leapjars extracted in Step 1, add them to the build path by changing the Target Platform that your plug-in builds against: Select Window > Preferences > Plug-in Development > Target Platform . Select Running Platform (Active) > Edit > Locations > Add... > ****. Enter the complete path of the Leap_bundles directory from Step 1. Select Finish . Implement any classes and supporting files as needed. Refer to other documents and JavaDocs. Package your Plug-In and Deploy Package your code as a .jar file. The typical structure for an OSGi bundle is shown here: / META-INF/ MANIFEST.MF OSGI-INF/ Service1.xml Service2.xml com/ mycompany/ services/ hclLeap Service1.class Service2.class If you are using the Eclipse IDE, you can package your bundle with the Export feature: Make sure the build.properties file for the project, which is created automatically for a Plug-in Project, includes all the resources you want included in your bundle. For example, make sure the OSGI-INF directory and its contents are included. Right-click your Plug-in project. Select Export > Plug-in Development > Deployable plug-ins and fragments . Select your Plug-in project. Specify an output directory. Click Finish . On the Leap server, put the exported .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non-Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case sensitive. Debugging If you start the Leap server in debug mode, you can attach your debugger to the running JVM and step through your own code. Also, you can enable debug logging or finer logging for the com.ibm.form.nitro.service.services package to get more information from the Leap code. Refer to the documentation for WebSphere\u00ae Application Server for more details. Do not run a production system in debug mode or with debug logging enabled. Enabling these options degrades performance. Parent topic: Adding services","title":"Setting up your development environment"},{"location":"services_toc.html","text":"Adding services The following topics describe how to add services to your Leap applications. Setting up your development environment The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Providing Groups of Dynamic Services You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Service Oriented Architecture \u2013 Service Transport HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Parent topic: Extending","title":"Adding services"},{"location":"services_toc.html#addingservicestofeb","text":"The following topics describe how to add services to your Leap applications. Setting up your development environment The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Providing Groups of Dynamic Services You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Service Oriented Architecture \u2013 Service Transport HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Parent topic: Extending","title":"Adding services"},{"location":"sub_adding_stages_toc.html","text":"Adding Stages to an application It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Each form in an HCL Leap application can have multiple stages. By default, a newly created form has two stages: Start \u2013 The initial state of every form. Once the form transitions away from the Start stage it cannot return. Submitted \u2013 A submitted form is stored in this stage. Forms in this stage may be updated by users with permission. Additional stages can be added and configured by clicking the plus (+) icon that appears when hovering over a Stage box or by clicking the Add Stage button in the Properties panel; however, the Start stage is always required and is unique. Actions Each stage can have multiple stage actions. Each stage action presents itself as a button in the form's footer area and therefore the terms \u201cstage action\u201d, and \u201cstage button\u201d are used interchangeably. There are three types of stage actions: Submit \u2013 Submits the form data, and transitions the form to the next stage. A single stage can have multiple Submit buttons. Each Submit button may have different settings, and may transition the form to a different next stage. A stage that does not have any Submit buttons will be depicted as an \"End\" stage with a red square icon, however stage buttons may be added at any time. Save Draft \u2013 Temporarily stores the form's data so the user can return later to complete the rest of the form. A single stage can have multiple Save Draft buttons. Each button may have different settings, such as a unique message for the user. A stage is not required to have a Save Draft button. For more information, see Saving work as Draft . Cancel \u2013 Returns the form to its original state before the end-user started making modifications. The form remains within the same stage. A single stage can have only one Cancel button. A stage is not required to have a Cancel button. Every newly created stage, including the Start stage, is given by default a single Submit button and Cancel button as a starting point. Activities During the transition from one stage to the next, there are several activities that can take place: Send an Email, Call a Service, and Assign Users. The Visibility tab also allows the application designer to disable or hide any form item, or entire page, within a specific stage for a particular form. Leap provides control over which users can access or modify the Form's data at any particular stage. The setting of these permissions is done by clicking on a stage and navigating to Permissions , or by clicking the Visibility tab. For more information, see Application and Security overview . Branching Each stage action may define one (or more) conditional branch by clicking on the diamond icon below the stage object in the workflow diagram, or with the action selected by clicking on + Add conditional branch . A branch defines an alternate path the form takes when submitted. A branch must define a condition that determines when it will be followed. Branch conditions may be based on a user in/not in a role or the value of an item on the form. Each branch may have its own distinct activities that are executed when followed. Editing the message a user sees upon form submission The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. Redirecting users after form submission The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. Sending an email after a user submits a form You can send email notifications to managers or other users by adding an activity to the Submit button in a form. Populating information upon form submission using a web service Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. Assigning users to a role after submission You can dynamically assign roles to a form after form submission. Configuring behavior of a form on submission Once a user completes an HCL Leap form, you can send them to another stage of that form. Saving work as a draft Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. Scenario: hidden or read-only form items in Stages This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. Saving a PDF to a file location Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. Parent topic: Creating and managing applications","title":"Adding Stages to an application"},{"location":"sub_adding_stages_toc.html#configuringwhatusersseeaftersubmittingaform","text":"It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Each form in an HCL Leap application can have multiple stages. By default, a newly created form has two stages: Start \u2013 The initial state of every form. Once the form transitions away from the Start stage it cannot return. Submitted \u2013 A submitted form is stored in this stage. Forms in this stage may be updated by users with permission. Additional stages can be added and configured by clicking the plus (+) icon that appears when hovering over a Stage box or by clicking the Add Stage button in the Properties panel; however, the Start stage is always required and is unique.","title":"Adding Stages to an application"},{"location":"sub_adding_stages_toc.html#section_gcf_vqw_rvb","text":"Each stage can have multiple stage actions. Each stage action presents itself as a button in the form's footer area and therefore the terms \u201cstage action\u201d, and \u201cstage button\u201d are used interchangeably. There are three types of stage actions: Submit \u2013 Submits the form data, and transitions the form to the next stage. A single stage can have multiple Submit buttons. Each Submit button may have different settings, and may transition the form to a different next stage. A stage that does not have any Submit buttons will be depicted as an \"End\" stage with a red square icon, however stage buttons may be added at any time. Save Draft \u2013 Temporarily stores the form's data so the user can return later to complete the rest of the form. A single stage can have multiple Save Draft buttons. Each button may have different settings, such as a unique message for the user. A stage is not required to have a Save Draft button. For more information, see Saving work as Draft . Cancel \u2013 Returns the form to its original state before the end-user started making modifications. The form remains within the same stage. A single stage can have only one Cancel button. A stage is not required to have a Cancel button. Every newly created stage, including the Start stage, is given by default a single Submit button and Cancel button as a starting point.","title":"Actions"},{"location":"sub_adding_stages_toc.html#section_rjf_wqw_rvb","text":"During the transition from one stage to the next, there are several activities that can take place: Send an Email, Call a Service, and Assign Users. The Visibility tab also allows the application designer to disable or hide any form item, or entire page, within a specific stage for a particular form. Leap provides control over which users can access or modify the Form's data at any particular stage. The setting of these permissions is done by clicking on a stage and navigating to Permissions , or by clicking the Visibility tab. For more information, see Application and Security overview .","title":"Activities"},{"location":"sub_adding_stages_toc.html#section_hjd_3rw_rvb","text":"Each stage action may define one (or more) conditional branch by clicking on the diamond icon below the stage object in the workflow diagram, or with the action selected by clicking on + Add conditional branch . A branch defines an alternate path the form takes when submitted. A branch must define a condition that determines when it will be followed. Branch conditions may be based on a user in/not in a role or the value of an item on the form. Each branch may have its own distinct activities that are executed when followed. Editing the message a user sees upon form submission The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. Redirecting users after form submission The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. Sending an email after a user submits a form You can send email notifications to managers or other users by adding an activity to the Submit button in a form. Populating information upon form submission using a web service Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. Assigning users to a role after submission You can dynamically assign roles to a form after form submission. Configuring behavior of a form on submission Once a user completes an HCL Leap form, you can send them to another stage of that form. Saving work as a draft Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. Scenario: hidden or read-only form items in Stages This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. Saving a PDF to a file location Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. Parent topic: Creating and managing applications","title":"Branching"},{"location":"sub_assigning_a_user.html","text":"Assigning users to a role after submission You can dynamically assign roles to a form after form submission. You can assign users to roles dynamically using a web service with data, or metadata captured from the form. Assign an approver or reviewer by creating rules based on the data from the form, or by who submitted the form. For example, you can create a workflow application with rules to determine who can send notification by email. To use the following instructions, you must have user Roles, such as \u201cManager\u201d, set to Open . For more information on setting roles, see Application and Security overview . Click the Workflow tab. Select a \"Submit\" stage in the diagram. Select the Activities tab. Click Add Activity . In the Activity Settings panel, select Assign Users . Assign By Service Call: To assign users via a service call, select Service Call . The Assign Users (by Service Call) window opens. If there are no existing activities, you see: There are no activities. Click here to create one. Select a service from the list in the Service tab. Services in the Service tab are populated by your administrator. To use these instructions, you require a service that is able to search for a user\u2019s manager. Click the Inputs tab. Map form fields to the input parameters of the service. For example, if your application asks for the user\u2019s name: Select Name from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. For example, you can map the outputs of the service to the Manager role: Select Manager Name from the Select source: window. Expand the directory so you see Member > Members . Select Members from the Select target : window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Now, the manager of the user who created the form can approve the form, but no other manager can do so. Assign By Value in Form: You can also assign users using the Value in Form option, such as a Single Line Entry. This option allows for more flexibility in determining what qualifies a user's assigned role. To assign a user a role from a form field, complete the following steps. Follow steps 1-4 in the task above. Select Value in Form . The applicable fields on the form appear in the \"Value in Form\" dropdown. Select the field that contains the value that represents the user to assign. Select the Role from the dropdown to which the user will be assigned. Parent topic: Adding Stages to an application","title":"Assigning users to a role after submission"},{"location":"sub_assigning_a_user.html#assigningausertoaformaftersubmission","text":"You can dynamically assign roles to a form after form submission. You can assign users to roles dynamically using a web service with data, or metadata captured from the form. Assign an approver or reviewer by creating rules based on the data from the form, or by who submitted the form. For example, you can create a workflow application with rules to determine who can send notification by email. To use the following instructions, you must have user Roles, such as \u201cManager\u201d, set to Open . For more information on setting roles, see Application and Security overview . Click the Workflow tab. Select a \"Submit\" stage in the diagram. Select the Activities tab. Click Add Activity . In the Activity Settings panel, select Assign Users . Assign By Service Call: To assign users via a service call, select Service Call . The Assign Users (by Service Call) window opens. If there are no existing activities, you see: There are no activities. Click here to create one. Select a service from the list in the Service tab. Services in the Service tab are populated by your administrator. To use these instructions, you require a service that is able to search for a user\u2019s manager. Click the Inputs tab. Map form fields to the input parameters of the service. For example, if your application asks for the user\u2019s name: Select Name from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. For example, you can map the outputs of the service to the Manager role: Select Manager Name from the Select source: window. Expand the directory so you see Member > Members . Select Members from the Select target : window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Now, the manager of the user who created the form can approve the form, but no other manager can do so. Assign By Value in Form: You can also assign users using the Value in Form option, such as a Single Line Entry. This option allows for more flexibility in determining what qualifies a user's assigned role. To assign a user a role from a form field, complete the following steps. Follow steps 1-4 in the task above. Select Value in Form . The applicable fields on the form appear in the \"Value in Form\" dropdown. Select the field that contains the value that represents the user to assign. Select the Role from the dropdown to which the user will be assigned. Parent topic: Adding Stages to an application","title":"Assigning users to a role after submission"},{"location":"sub_editing_the_message_a_user_sees.html","text":"Editing the message a user sees upon form submission The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. In the Workflow tab, you can choose what message users see when they submit a form by editing the properties of the Submit button. Click the Workflow tab. Open the properties for any Submit button in any stage. You can control the message a user sees for every action button. Enter your message in the Action Completion Message field. When the user submits a form, they are shown the text you entered. Note: To show no dialog clear the message field. Parent topic: Adding Stages to an application","title":"Editing the message a user sees upon form submission"},{"location":"sub_editing_the_message_a_user_sees.html#editingthemessageauserseesaftercompletingaform","text":"The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. In the Workflow tab, you can choose what message users see when they submit a form by editing the properties of the Submit button. Click the Workflow tab. Open the properties for any Submit button in any stage. You can control the message a user sees for every action button. Enter your message in the Action Completion Message field. When the user submits a form, they are shown the text you entered. Note: To show no dialog clear the message field. Parent topic: Adding Stages to an application","title":"Editing the message a user sees upon form submission"},{"location":"sub_editing_the_url_a_user_sees.html","text":"Redirecting users after form submission The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. You can set Leap to redirect the user to another application, URL, form, or app page upon form submission. Redirecting users to a secondary URL is useful if the user must complete another application that is directly related to the first. The user is redirected to the second URL in a dialog when the first form is submitted. Click the Workflow tab. Select the desired Stage button in the diagram. In the Properties tab , under On action completion redirect to: , select one of the following options from the drop-down: Another Leap application Website URL A Form or App Page Parent topic: Adding Stages to an application","title":"Redirecting users after form submission"},{"location":"sub_editing_the_url_a_user_sees.html#editingtheurlauserseesaftersubmittingaform","text":"The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. You can set Leap to redirect the user to another application, URL, form, or app page upon form submission. Redirecting users to a secondary URL is useful if the user must complete another application that is directly related to the first. The user is redirected to the second URL in a dialog when the first form is submitted. Click the Workflow tab. Select the desired Stage button in the diagram. In the Properties tab , under On action completion redirect to: , select one of the following options from the drop-down: Another Leap application Website URL A Form or App Page Parent topic: Adding Stages to an application","title":"Redirecting users after form submission"},{"location":"sub_hidden_or_read_only_items_in_stages.html","text":"Scenario: hidden or read-only form items in Stages This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. The Vacation Request application is built with two sections: the top section contains fields the employee fills out to schedule vacation time. The bottom section of the form contains information for the manager's approval or rejection. When the users complete the form, they do not need to see the manager's portion. When managers review the submitted form, they must not modify the employee's submitted portion. In both parts of this example, marking items as hidden, or read-only is valuable. Tip: By building the user's and manager's portions of the form inside a Section, you can apply the hidden or read-only values to the entire section. Without using Sections, you must set the property for each individual form item. The Vacation Request form has three Stages: Start : The beginning phase where users view and complete the form for submission Approval : This stage was created by the form designer. When the user submits the form, it moves to the Approval stage and is processed by a manager. Completed : When the manager approves, or denies the request, the submitter is notified, and the form is considered closed. When the form is viewed in the Workflow tab, it is identical to how it appears the design environment. The main differences are the icon buttons on the upper right of each form item, and the addition of workflow buttons at the bottom of the form. You automatically view the section in the Start stage. For each form item, the following icons are available: : The Visibility icon. When clicked, this icon hides form items or a section on a particular Stage. : The Read-Only icon. When clicked, this icon makes a form item or section Read-Only in a Stage. To make the Vacation Request form hide the Manager's section of the form: In the Start stage, scroll down to the Manager's section and click the Visibility icon. A red line appears diagonally through the icon, representing that the section is now hidden from view in this stage. If you save and preview the form, the Manager's section is not visible. To make the user's portion of the form read-only: In the Approval stage, go to the top of the user's portion of the form. Click the Read-Only icon. A red line appears diagonally through the icon, representing that the section is now read-only. Using a basic example, this scenario described how to set properties on form items within Stages. Setting items or sections as hidden or read-only simplifies form design, yet allows for complex processes to be built into one form. Parent topic: Adding Stages to an application","title":"Scenario -- hidden or read-only form items in Stages"},{"location":"sub_hidden_or_read_only_items_in_stages.html#hiddenreadonlyitems","text":"This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. The Vacation Request application is built with two sections: the top section contains fields the employee fills out to schedule vacation time. The bottom section of the form contains information for the manager's approval or rejection. When the users complete the form, they do not need to see the manager's portion. When managers review the submitted form, they must not modify the employee's submitted portion. In both parts of this example, marking items as hidden, or read-only is valuable. Tip: By building the user's and manager's portions of the form inside a Section, you can apply the hidden or read-only values to the entire section. Without using Sections, you must set the property for each individual form item. The Vacation Request form has three Stages: Start : The beginning phase where users view and complete the form for submission Approval : This stage was created by the form designer. When the user submits the form, it moves to the Approval stage and is processed by a manager. Completed : When the manager approves, or denies the request, the submitter is notified, and the form is considered closed. When the form is viewed in the Workflow tab, it is identical to how it appears the design environment. The main differences are the icon buttons on the upper right of each form item, and the addition of workflow buttons at the bottom of the form. You automatically view the section in the Start stage. For each form item, the following icons are available: : The Visibility icon. When clicked, this icon hides form items or a section on a particular Stage. : The Read-Only icon. When clicked, this icon makes a form item or section Read-Only in a Stage. To make the Vacation Request form hide the Manager's section of the form: In the Start stage, scroll down to the Manager's section and click the Visibility icon. A red line appears diagonally through the icon, representing that the section is now hidden from view in this stage. If you save and preview the form, the Manager's section is not visible. To make the user's portion of the form read-only: In the Approval stage, go to the top of the user's portion of the form. Click the Read-Only icon. A red line appears diagonally through the icon, representing that the section is now read-only. Using a basic example, this scenario described how to set properties on form items within Stages. Setting items or sections as hidden or read-only simplifies form design, yet allows for complex processes to be built into one form. Parent topic: Adding Stages to an application","title":"Scenario: hidden or read-only form items in Stages"},{"location":"sub_saving_pdf.html","text":"Saving a PDF to a file location Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. File locations are whitelisted in the Leap_config.properties. Your file location can be any non-root directory. For example: storageBaseDirWhiteList = /Leap/PDFs Multiple locations can be whitelisted by separating them with a comma: storageBaseDirWhiteList = /Leap/locationA , /Leap/locationB The option for PDF Save Location appears in your PDF fill service configuration if a location has been whitelisted as described above. You need to map the location you want to save to the option in your service configuration. This can be done as an input item from the form or a constant (shown in the following graphic). The path must match exactly to what is whitelisted and the location must include the file name and path. If the file already exists a duplicate will be made - for example, sample.pdf, sample(1).pdf, etc. Parent topic: Adding Stages to an application","title":"Saving a PDF to a file location"},{"location":"sub_saving_pdf.html#savingpdf","text":"Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. File locations are whitelisted in the Leap_config.properties. Your file location can be any non-root directory. For example: storageBaseDirWhiteList = /Leap/PDFs Multiple locations can be whitelisted by separating them with a comma: storageBaseDirWhiteList = /Leap/locationA , /Leap/locationB The option for PDF Save Location appears in your PDF fill service configuration if a location has been whitelisted as described above. You need to map the location you want to save to the option in your service configuration. This can be done as an input item from the form or a constant (shown in the following graphic). The path must match exactly to what is whitelisted and the location must include the file name and path. If the file already exists a duplicate will be made - for example, sample.pdf, sample(1).pdf, etc. Parent topic: Adding Stages to an application","title":"Saving a PDF to a file location"},{"location":"sub_sending_a_user_to_another_url.html","text":"Configuring behavior of a form on submission Once a user completes an HCL Leap form, you can send them to another stage of that form. After a user submits a form, you can show them the next stage of a form. For example, to confirm what they submitted by pressing a confirmation button, or to show a read-only copy of the information they submitted. You can also limit authenticated users from submitting multiple forms. Click the Workflow tab . Click the area outside the outline in the Workflow view. The form Properties displays on the side of the screen. In the Upon Submission : section, choose one of the following options: Show the success message page Show the success message in a dialog and then display a new form Show the success message in a dialog and then display the next stage of the form Parent topic: Adding Stages to an application","title":"Configuring behavior of a form on submission"},{"location":"sub_sending_a_user_to_another_url.html#sendingausertoanotherurlaftercompletingaform","text":"Once a user completes an HCL Leap form, you can send them to another stage of that form. After a user submits a form, you can show them the next stage of a form. For example, to confirm what they submitted by pressing a confirmation button, or to show a read-only copy of the information they submitted. You can also limit authenticated users from submitting multiple forms. Click the Workflow tab . Click the area outside the outline in the Workflow view. The form Properties displays on the side of the screen. In the Upon Submission : section, choose one of the following options: Show the success message page Show the success message in a dialog and then display a new form Show the success message in a dialog and then display the next stage of the form Parent topic: Adding Stages to an application","title":"Configuring behavior of a form on submission"},{"location":"sub_sending_an_email.html","text":"Sending an email after a user submits a form You can send email notifications to managers or other users by adding an activity to the Submit button in a form. You can send one or more email on a Submit action, or send one email to multiple email addresses. Click the Workflow tab. Select the desired Stage button in the diagram. The Properties panel displays on the side of the screen. In the Activities tab, click Add Activity . Select Send an Email. In the Activity Settings panel, you can: Manually add the email address of the recipient, a subject line, and a message, if required. Populate each of the fields with information from the form. Under each field, click Insert and select a form item from the list. Address an email to everyone in a predefined role by clicking Insert Item > Roles , and selecting the role that you want. Parent topic: Adding Stages to an application","title":"Sending an email after a user submits a form"},{"location":"sub_sending_an_email.html#sendinganemailafterauserhassubmittedaform","text":"You can send email notifications to managers or other users by adding an activity to the Submit button in a form. You can send one or more email on a Submit action, or send one email to multiple email addresses. Click the Workflow tab. Select the desired Stage button in the diagram. The Properties panel displays on the side of the screen. In the Activities tab, click Add Activity . Select Send an Email. In the Activity Settings panel, you can: Manually add the email address of the recipient, a subject line, and a message, if required. Populate each of the fields with information from the form. Under each field, click Insert and select a form item from the list. Address an email to everyone in a predefined role by clicking Insert Item > Roles , and selecting the role that you want. Parent topic: Adding Stages to an application","title":"Sending an email after a user submits a form"},{"location":"sub_use_service_to_populate_on_form_submission.html","text":"Populating information upon form submission using a web service Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. HCL Leap can look up user information for you using a web service call. For example, you can connect a manager with a user submitted form using an intranet directory search. Click the Workflow tab. Click the Add Activity button in a submit button on the diagram, or select the button and click Add Activity in the side panel. In Activity Settings , select Call a Service . For this example, select the directory for your company intranet. Click Configure Service . Click the Inputs tab. Map the form fields to the input parameters of the service. Select Current User from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. Map the outputs of the service to the Manager role. Select Manager Name from the Select source: window. In the Select target: window, choose a form item from the list. Click the connector icon located between the two windows to link the source and the target. After the source and target are linked, they appear in the Assigned Outputs area of the screen. Click OK to exit the Call a Service window. When the user clicks Submit , Leap calls a service to populate the manager\u2019s name into the selected form item. Parent topic: Adding Stages to an application","title":"Populating information upon form submission using a web service"},{"location":"sub_use_service_to_populate_on_form_submission.html#sendingamessagetoauserusingaservice","text":"Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. HCL Leap can look up user information for you using a web service call. For example, you can connect a manager with a user submitted form using an intranet directory search. Click the Workflow tab. Click the Add Activity button in a submit button on the diagram, or select the button and click Add Activity in the side panel. In Activity Settings , select Call a Service . For this example, select the directory for your company intranet. Click Configure Service . Click the Inputs tab. Map the form fields to the input parameters of the service. Select Current User from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. Map the outputs of the service to the Manager role. Select Manager Name from the Select source: window. In the Select target: window, choose a form item from the list. Click the connector icon located between the two windows to link the source and the target. After the source and target are linked, they appear in the Assigned Outputs area of the screen. Click OK to exit the Call a Service window. When the user clicks Submit , Leap calls a service to populate the manager\u2019s name into the selected form item. Parent topic: Adding Stages to an application","title":"Populating information upon form submission using a web service"},{"location":"tr_troubleshooting.html","text":"Troubleshooting HCL Leap The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues. Table 1. Known limitations of Leap Limitations Resolution HCL Connections Community Surveys are not available in Leap 8.6.0 and later versions. To add Surveys to your Connections application, you must use Leap 8.5 with Connections 4.5, or Leap 8.5.1 with Connections 5.0. Form item size limitations. When building a Leap application, you must not exceed the following size limits You cannot have more than 1000 data items in your form You cannot have more than 200 data items in your form DB2\u00ae has a page size limit for tables of 32kb. Each data item in a Leap application has a size limit. For example: - Single Line \u2013 200 bytes and Multiple line - Leap uses a CLOB data type to store the value of each multiple line entry data item. The limit to the number of characters stored in a CLOB is dependent on language and character set. The English limit is approximately 1 million characters.If the content of any given multiple line field exceeds the database allowance, you see a \u201c500 Internal Server Error\u201d message, and form submission fails. The full message is stored in the system log files. - Currency/Number \u2013 8 bytes - Attachment \u2013 108 bytes - Select One and Survey \u2013 size is based on the number of choices and questions If you receive the error The row length of the table exceeded a limit of \u201c32677\u201d bytes. (Table space \u201c\u201d.). SQLCODE=-670 , your form exceeds the maximum size. You must remove items from the form, or break the application into multiple forms. It is important to note that items create database columns, and contribute to the limit even when they are hidden on the form. Note: This is no longer applicable as of DB2 10.5 and newer, due to extended row size. Limit on the number of embedded sections. When designing a form in Leap, you can embed sections within sections to achieve the wanted layout. Do not embed more than 5 sections within one another. When using more than five embedded sections, it becomes difficult to select the action icons for a specific section. Exceeding 5 sections also results in forms not rendering properly. Printing Leap content Leap provides a print button. If there is no print button in the contents of your form, the web browser print function does not work well. To print out the contents shown in your browser, uses a screen capture. For more information, see Taking a screen capture in Windows\u2122 . Adding Groups to Leap applications. Leap cannot resolve users if they are members of nested groups. For example, your company LDAP contains a super group called \u201cManagers\u201d. This super group consists of several smaller groups, such as \u201cSupervisors\u201d, and \u201cShift Leaders\u201d. In the Access tab of Leap, you must add the \u201cSupervisors\u201d, and \u201cShift Leaders\u201d as groups individually, rather than using the \u201cManagers\u201d super group. Table 2. Leap Best Practices Issue Resolution Canonical URLs versus short URL in the ibm.nitro.NitroConfig.serverURI property of the Leap_config.properties file When accessing Leap, the ibm.nitro.NitroConfig.serverURI entry setting is different from the browser address base URI. If you are using a short URL format to design your application, you must set ibm.nitro.NitroConfig.serverURI entry with the canonical URL. For example, if your short URL is http://localhost:9080/apps, the canonical URL for the user is http://hostname:9080/apps. Using two different URLs means users must sign on twice, as the short URL is replaced by the canonical URL. It is a best practice to use the canonical URL whenever possible. Web Link and Website form items. When using the Web Link or Website form items in your application, ensure that you enter the correct URL to get the runtime result. If the link goes to an external site, you must enter the URL with a URL protocol. For example, enter the URL as http://www.ibm.com, rather than www.ibm.com. - If you enter the URL with no protocol, then the URL is considered relative the current location. The prefix for the relative URL is attached, which might result in errors. - If you enter the URL with a single slash '/', it resolves to a URL relative to the root of the host. When using the Website item in a Leap the URLs entered must begin with: http://, https://, ftp://, or ftps:// Leap users and groups When using WebSphere\u00ae Application Server to directly maintain users and groups, it is important to maintain integrity between the WebSphere Application Server users and Leap. If you change a user definition in WebSphere Application Server, and that user is used in Leap, the relationship might be corrupted. The user would no longer be able to access Leap. Uploading files in Leap If an application requires supplemental files, it is a best practice to use reference URLs, rather than uploading the files directly into the application. The option to include reference URLs is available in the Upload dialog from the Settings tab. Leap Preview mode To use the Leap Preview feature, you must ensure that your browser is configured to allow all pop-up windows. If your browser does not allow pop-up windows, users cannot see the preview window. Browser cookies must be enabled. To successfully log in Leap, you must have browser cookie enabled. If you have deployed Leap with WebSphere Application Server Community Edition as your application server, you must ensure that you have only one Leap window or tab running in your browser at any time. Attempting to log in to multiple Leap windows or tabs results in login errors. Table 3. Troubleshooting Leap errors Problem Resolution Building Leap applications in Safari with bidirectional languages Designing Leap applications with the Safari locale set to a bidirectional language results in extraneous horizontal scroll bars shown in each form cell. These scroll bars do not affect the rendering of the completed form at run time. Allowing non-ASCII administrative login characters If the Leap administrative user name or password contains non-ASCII characters, you must complete an additional configuration task. In WebSphere Application Server: 1. Log in to WebSphere Application Server administrative console, and select the server. 2. On the settings page for the selected application server, go to Server Infrastructure > Java and Process Management . 3. Go to Process Definition > Java Virtual Machine , and specify -Dclient.encoding.override=UTF-8 for Generic JVM Arguments. 4. Click OK , then Save 5. Restart the application server Table 4. General Leap information Topic Additional Information Using the Upgrade link on the Manage tab. You can upgrade an application with a new application definition using theLeap Upgrade feature. Upgrading replaces all access rules, business rules, formulas, interface options, Stages definitions, JavaScript\u2122, images, and service mappings with those in the new version. It then updates the data base definition to the model described by the new application, and merges existing data into that model. If data elements were removed in the new version, or their unique identifiers changed, the data associated with those elements is not migrated to the new application. Data elements that did not exist in the previous version, but were added in the new version, are added as columns to existing data records with a NULL value. Parent topic: Troubleshooting","title":"Troubleshooting Leap"},{"location":"tr_troubleshooting.html#troubleshooting-hcl-leap","text":"The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues. Table 1. Known limitations of Leap Limitations Resolution HCL Connections Community Surveys are not available in Leap 8.6.0 and later versions. To add Surveys to your Connections application, you must use Leap 8.5 with Connections 4.5, or Leap 8.5.1 with Connections 5.0. Form item size limitations. When building a Leap application, you must not exceed the following size limits You cannot have more than 1000 data items in your form You cannot have more than 200 data items in your form DB2\u00ae has a page size limit for tables of 32kb. Each data item in a Leap application has a size limit. For example: - Single Line \u2013 200 bytes and Multiple line - Leap uses a CLOB data type to store the value of each multiple line entry data item. The limit to the number of characters stored in a CLOB is dependent on language and character set. The English limit is approximately 1 million characters.If the content of any given multiple line field exceeds the database allowance, you see a \u201c500 Internal Server Error\u201d message, and form submission fails. The full message is stored in the system log files. - Currency/Number \u2013 8 bytes - Attachment \u2013 108 bytes - Select One and Survey \u2013 size is based on the number of choices and questions If you receive the error The row length of the table exceeded a limit of \u201c32677\u201d bytes. (Table space \u201c\u201d.). SQLCODE=-670 , your form exceeds the maximum size. You must remove items from the form, or break the application into multiple forms. It is important to note that items create database columns, and contribute to the limit even when they are hidden on the form. Note: This is no longer applicable as of DB2 10.5 and newer, due to extended row size. Limit on the number of embedded sections. When designing a form in Leap, you can embed sections within sections to achieve the wanted layout. Do not embed more than 5 sections within one another. When using more than five embedded sections, it becomes difficult to select the action icons for a specific section. Exceeding 5 sections also results in forms not rendering properly. Printing Leap content Leap provides a print button. If there is no print button in the contents of your form, the web browser print function does not work well. To print out the contents shown in your browser, uses a screen capture. For more information, see Taking a screen capture in Windows\u2122 . Adding Groups to Leap applications. Leap cannot resolve users if they are members of nested groups. For example, your company LDAP contains a super group called \u201cManagers\u201d. This super group consists of several smaller groups, such as \u201cSupervisors\u201d, and \u201cShift Leaders\u201d. In the Access tab of Leap, you must add the \u201cSupervisors\u201d, and \u201cShift Leaders\u201d as groups individually, rather than using the \u201cManagers\u201d super group. Table 2. Leap Best Practices Issue Resolution Canonical URLs versus short URL in the ibm.nitro.NitroConfig.serverURI property of the Leap_config.properties file When accessing Leap, the ibm.nitro.NitroConfig.serverURI entry setting is different from the browser address base URI. If you are using a short URL format to design your application, you must set ibm.nitro.NitroConfig.serverURI entry with the canonical URL. For example, if your short URL is http://localhost:9080/apps, the canonical URL for the user is http://hostname:9080/apps. Using two different URLs means users must sign on twice, as the short URL is replaced by the canonical URL. It is a best practice to use the canonical URL whenever possible. Web Link and Website form items. When using the Web Link or Website form items in your application, ensure that you enter the correct URL to get the runtime result. If the link goes to an external site, you must enter the URL with a URL protocol. For example, enter the URL as http://www.ibm.com, rather than www.ibm.com. - If you enter the URL with no protocol, then the URL is considered relative the current location. The prefix for the relative URL is attached, which might result in errors. - If you enter the URL with a single slash '/', it resolves to a URL relative to the root of the host. When using the Website item in a Leap the URLs entered must begin with: http://, https://, ftp://, or ftps:// Leap users and groups When using WebSphere\u00ae Application Server to directly maintain users and groups, it is important to maintain integrity between the WebSphere Application Server users and Leap. If you change a user definition in WebSphere Application Server, and that user is used in Leap, the relationship might be corrupted. The user would no longer be able to access Leap. Uploading files in Leap If an application requires supplemental files, it is a best practice to use reference URLs, rather than uploading the files directly into the application. The option to include reference URLs is available in the Upload dialog from the Settings tab. Leap Preview mode To use the Leap Preview feature, you must ensure that your browser is configured to allow all pop-up windows. If your browser does not allow pop-up windows, users cannot see the preview window. Browser cookies must be enabled. To successfully log in Leap, you must have browser cookie enabled. If you have deployed Leap with WebSphere Application Server Community Edition as your application server, you must ensure that you have only one Leap window or tab running in your browser at any time. Attempting to log in to multiple Leap windows or tabs results in login errors. Table 3. Troubleshooting Leap errors Problem Resolution Building Leap applications in Safari with bidirectional languages Designing Leap applications with the Safari locale set to a bidirectional language results in extraneous horizontal scroll bars shown in each form cell. These scroll bars do not affect the rendering of the completed form at run time. Allowing non-ASCII administrative login characters If the Leap administrative user name or password contains non-ASCII characters, you must complete an additional configuration task. In WebSphere Application Server: 1. Log in to WebSphere Application Server administrative console, and select the server. 2. On the settings page for the selected application server, go to Server Infrastructure > Java and Process Management . 3. Go to Process Definition > Java Virtual Machine , and specify -Dclient.encoding.override=UTF-8 for Generic JVM Arguments. 4. Click OK , then Save 5. Restart the application server Table 4. General Leap information Topic Additional Information Using the Upgrade link on the Manage tab. You can upgrade an application with a new application definition using theLeap Upgrade feature. Upgrading replaces all access rules, business rules, formulas, interface options, Stages definitions, JavaScript\u2122, images, and service mappings with those in the new version. It then updates the data base definition to the model described by the new application, and merges existing data into that model. If data elements were removed in the new version, or their unique identifiers changed, the data associated with those elements is not migrated to the new application. Data elements that did not exist in the previous version, but were added in the new version, are added as columns to existing data records with a NULL value. Parent topic: Troubleshooting","title":"Troubleshooting HCL Leap"},{"location":"tr_troubleshooting_and_support.html","text":"Troubleshooting and support Troubleshooting and support information for the HCL Leap. If you are experiencing a problem with the Leap: Refer to the documentation for the task you are performing or the product component you are working with. These topics may contain troubleshooting information for common problems. Refer to the Directory of worldwide contacts Web page and contact HCL Software Support for your region. Parent topic: Troubleshooting","title":"Troubleshooting and support"},{"location":"tr_troubleshooting_and_support.html#troubleshootingandsupport","text":"Troubleshooting and support information for the HCL Leap. If you are experiencing a problem with the Leap: Refer to the documentation for the task you are performing or the product component you are working with. These topics may contain troubleshooting information for common problems. Refer to the Directory of worldwide contacts Web page and contact HCL Software Support for your region. Parent topic: Troubleshooting","title":"Troubleshooting and support"},{"location":"tr_troubleshooting_toc.html","text":"Troubleshooting The following pages provide information on how to troubleshoot HCL Leap, and how to contact support. Troubleshooting and support Troubleshooting and support information for the HCL Leap. Troubleshooting HCL Leap The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues.","title":"Troubleshooting"},{"location":"tr_troubleshooting_toc.html#troubleshootingtoc","text":"The following pages provide information on how to troubleshoot HCL Leap, and how to contact support. Troubleshooting and support Troubleshooting and support information for the HCL Leap. Troubleshooting HCL Leap The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues.","title":"Troubleshooting"},{"location":"tr_troubleshooting_wsdl_sd_tool.html","text":"Troubleshooting the WSDL service description generator - FAQ Use the following information to help you troubleshoot your WSDL service description generator. Is my schema valid? Make sure that all prefixes are bound to a namespace Usually schemas contains the following namespace declarations in <xsd:schema> : xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" When a schema includes or imports other schemas, make sure that the schema is accessible through the @schemaLocation. If the @schemaLocation is a URL, verify that you can access the URL and that the URL is indeed a schema. If the @schemaLocation is an absolute file path verify that the .xsd file exists in that path. If the @schemaLocation is a relative file path make sure that the .xsd file exists in that path relative to where the importing schema is stored. When a WSDL file is manually retrieved from the web and stored locally, you must clearly indicate the path. If the WSDL file imports an external schema with a relative URL, you must either change the schema location to point to the full URL, or save a copy of the schema and change the schema location to point to the local copy of the schema. Is my WSDL file valid? Check namespace declarations. Usually WSDL files contaims the following namespace declarations in <wsdl:definitions> : xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" Several WSDL file tags have an attribute @name. According to the WSDL schema, the @name is of type NCName. It is a string without any colons. For example, <wsdl:definitions name=\"ABCOrg:WebService\"> is invalid. Check the WSDL tags for case sensitivity errors. For example, <wsdl:porttype> is invalid, but <wsdl:portType> is valid. Make sure that the binding style is specified. Binding style can either be Document/Literal or RPC/Encoded. This information is declared in this style: wsdl:binding/soap:binding/@style . This example can either be Document or RPC. wsdl:binding/wsdl:operation/wsdl:input/soap:body/@used can either be Literal or Encoded. Make sure that the request URL is specified. This information is located here: wsdl:service/wsdl:port/soap:address/ @location . Make sure that for every <wsdl:port> under <wsdl:service> has a matching <wsdl:binding> . Make sure that all <wsdl:binding> has a matching <wsdl:portType> . Make sure that all <wsdl:input> and <wsdl:output> of all <wsdl:operation> under all <wsdl:portType> references a valid <wsdl:message> . Make sure that all <wsdl:message> contains at least one <wsdl:part> . If the WSDL binding style is Document/Literal, make sure that all <wsdl:part> uses @element and references an element declaration in a schema. If the WSDL binding style is RPC/Encoded, make sure that all <wsdl:part> uses @type and references an actual schema data type such as xsd:string , a schema <xsd:simpleType> , or a <xsd:complexType> . Is my service mapping reference correct? Incorrect references often happen on RPC/Encoded outbound mapping references. This is the format of the tool, with namespace omitted. <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> The following example uses a different SOAP convention that does not work with this tool: <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <return> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </return> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <soapVal> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </soapVal> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[message name]> <!--Succeeding section base on schema--> </[message name]> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> This is how RPC/Encoded declare a recurring simple type element: <element name=\"elem\" type=\"tns:ArrayOfString\"/> <complexType name=\"ArrayOfString\"> <complexContent> <restriction base=\"SOAP-ENC:Array\"> <attribute ref=\"SOAP-ENC:arrayType\" wsdl:arrayType=\"string[]/></></></> Then, the tool expects a SOAP message of the following format: \u2026 <elem> <item>\u2026</item> <item>\u2026</item> \u2026 </elem> \u2026 If the RPC/Encoded web service SOAP message uses a different convention, the tool does not work. For example, \u2026 <elem> <elem>\u2026</elem> <elem>\u2026</elem> \u2026 </elem> \u2026 Why are there missing parameters or no parameters in the generated service description? Make sure that the WSDL file has access to the schema. All imported and included schemas are accessible. Make sure that each operation has its matching messages and each message part has its matching schema declaration. For Document/Literal binding style, the message part should reference a schema element declaration. An RPC/Encoded binding style should reference a schema complex type declaration. Make sure that elements and attributes have a valid type. These types can either be a <simpleType> declaration, a <complexType> declaration, or a primitive schema data type such as xsd:string or xsd:boolean . The schema data type xsd:anyType is not mapped to a parameter. Make sure that the schema does not use <any> , <anyAttribute> or @abtract=true . If it does, you must manually add the required parameters and appropriate service mapping elements. Why does the web service respond with an Error 415 Unsupported media type? The tool assumes that the value of the constant Content-Type, which in turn is mapped as the HTTP header Content-Type. If the WSDL file uses SOAP 1.1, the Content-Type is set to text/xml. If the web service uses SOAP 1.2, then the Content-Type is set to Application/soap+xml. Why is my request-entity not being mapped correctly? By schema declaration and convention, inbound service mapping elements @targetRef are based on the inbound constant prototypicalInstance . It is constructed based on the declared schema, and for RPC/Encoded style binding, it also follows those conventions. Similarly, the outbound service mapping elements @sourceRef are based on an internally created prototypical instance, which is different from the inbound constant prototypicalInstance , but constructed in the similar fashion. Why is my targetType=STRING when I map to an XML and use XPath in my targetRef . If you use an inbound service mapping and use XPath in your targetRef , the targetType= is not set to STRING because of the service mapping element wrapper. Since <mapping target=\"request-entity\" targetType=\"XML\"> is set to XML, so all service mapping element child targetTypeType are set to STRING . Why am I getting a \u201cnamespace not binded\u201d error? Verify that all prefixes you use in all service mapping element references are binded. Namespace declarations are in the <serviceMapping> . Parent topic: Using the service description tool for WSDL web service","title":"Troubleshooting the WSDL service description generator - FAQ"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#troubleshootingthewsdlservicedescriptiongenerator","text":"Use the following information to help you troubleshoot your WSDL service description generator.","title":"Troubleshooting the WSDL service description generator - FAQ"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#is-my-schema-valid","text":"Make sure that all prefixes are bound to a namespace Usually schemas contains the following namespace declarations in <xsd:schema> : xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" When a schema includes or imports other schemas, make sure that the schema is accessible through the @schemaLocation. If the @schemaLocation is a URL, verify that you can access the URL and that the URL is indeed a schema. If the @schemaLocation is an absolute file path verify that the .xsd file exists in that path. If the @schemaLocation is a relative file path make sure that the .xsd file exists in that path relative to where the importing schema is stored. When a WSDL file is manually retrieved from the web and stored locally, you must clearly indicate the path. If the WSDL file imports an external schema with a relative URL, you must either change the schema location to point to the full URL, or save a copy of the schema and change the schema location to point to the local copy of the schema.","title":"Is my schema valid?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#is-my-wsdl-file-valid","text":"Check namespace declarations. Usually WSDL files contaims the following namespace declarations in <wsdl:definitions> : xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" Several WSDL file tags have an attribute @name. According to the WSDL schema, the @name is of type NCName. It is a string without any colons. For example, <wsdl:definitions name=\"ABCOrg:WebService\"> is invalid. Check the WSDL tags for case sensitivity errors. For example, <wsdl:porttype> is invalid, but <wsdl:portType> is valid. Make sure that the binding style is specified. Binding style can either be Document/Literal or RPC/Encoded. This information is declared in this style: wsdl:binding/soap:binding/@style . This example can either be Document or RPC. wsdl:binding/wsdl:operation/wsdl:input/soap:body/@used can either be Literal or Encoded. Make sure that the request URL is specified. This information is located here: wsdl:service/wsdl:port/soap:address/ @location . Make sure that for every <wsdl:port> under <wsdl:service> has a matching <wsdl:binding> . Make sure that all <wsdl:binding> has a matching <wsdl:portType> . Make sure that all <wsdl:input> and <wsdl:output> of all <wsdl:operation> under all <wsdl:portType> references a valid <wsdl:message> . Make sure that all <wsdl:message> contains at least one <wsdl:part> . If the WSDL binding style is Document/Literal, make sure that all <wsdl:part> uses @element and references an element declaration in a schema. If the WSDL binding style is RPC/Encoded, make sure that all <wsdl:part> uses @type and references an actual schema data type such as xsd:string , a schema <xsd:simpleType> , or a <xsd:complexType> .","title":"Is my WSDL file valid?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#is-my-service-mapping-reference-correct","text":"Incorrect references often happen on RPC/Encoded outbound mapping references. This is the format of the tool, with namespace omitted. <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> The following example uses a different SOAP convention that does not work with this tool: <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <return> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </return> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <soapVal> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </soapVal> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[message name]> <!--Succeeding section base on schema--> </[message name]> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> This is how RPC/Encoded declare a recurring simple type element: <element name=\"elem\" type=\"tns:ArrayOfString\"/> <complexType name=\"ArrayOfString\"> <complexContent> <restriction base=\"SOAP-ENC:Array\"> <attribute ref=\"SOAP-ENC:arrayType\" wsdl:arrayType=\"string[]/></></></> Then, the tool expects a SOAP message of the following format: \u2026 <elem> <item>\u2026</item> <item>\u2026</item> \u2026 </elem> \u2026 If the RPC/Encoded web service SOAP message uses a different convention, the tool does not work. For example, \u2026 <elem> <elem>\u2026</elem> <elem>\u2026</elem> \u2026 </elem> \u2026","title":"Is my service mapping reference correct?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-are-there-missing-parameters-or-no-parameters-in-the-generated-service-description","text":"Make sure that the WSDL file has access to the schema. All imported and included schemas are accessible. Make sure that each operation has its matching messages and each message part has its matching schema declaration. For Document/Literal binding style, the message part should reference a schema element declaration. An RPC/Encoded binding style should reference a schema complex type declaration. Make sure that elements and attributes have a valid type. These types can either be a <simpleType> declaration, a <complexType> declaration, or a primitive schema data type such as xsd:string or xsd:boolean . The schema data type xsd:anyType is not mapped to a parameter. Make sure that the schema does not use <any> , <anyAttribute> or @abtract=true . If it does, you must manually add the required parameters and appropriate service mapping elements.","title":"Why are there missing parameters or no parameters in the generated service description?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-does-the-web-service-respond-with-an-error-415-unsupported-media-type","text":"The tool assumes that the value of the constant Content-Type, which in turn is mapped as the HTTP header Content-Type. If the WSDL file uses SOAP 1.1, the Content-Type is set to text/xml. If the web service uses SOAP 1.2, then the Content-Type is set to Application/soap+xml.","title":"Why does the web service respond with an Error 415 Unsupported media type?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-is-my-request-entity-not-being-mapped-correctly","text":"By schema declaration and convention, inbound service mapping elements @targetRef are based on the inbound constant prototypicalInstance . It is constructed based on the declared schema, and for RPC/Encoded style binding, it also follows those conventions. Similarly, the outbound service mapping elements @sourceRef are based on an internally created prototypical instance, which is different from the inbound constant prototypicalInstance , but constructed in the similar fashion.","title":"Why is my request-entity not being mapped correctly?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-is-my-targettypestring-when-i-map-to-an-xml-and-use-xpath-in-my-targetref","text":"If you use an inbound service mapping and use XPath in your targetRef , the targetType= is not set to STRING because of the service mapping element wrapper. Since <mapping target=\"request-entity\" targetType=\"XML\"> is set to XML, so all service mapping element child targetTypeType are set to STRING .","title":"Why is my targetType=STRING when I map to an XML and use XPath in my targetRef."},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-am-i-getting-a-namespace-not-binded-error","text":"Verify that all prefixes you use in all service mapping element references are binded. Namespace declarations are in the <serviceMapping> . Parent topic: Using the service description tool for WSDL web service","title":"Why am I getting a \u201cnamespace not binded\u201d error?"},{"location":"tut_roles_and_stages_OV.html","text":"Adding tables and workflow elements to a HCL Leap form This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial. Prerequisites This tutorial contains the following lessons: Tables \u2013 Adding tables to your form to collect data from users. Stages \u2013 Adding workflow to your form, turning it into an application. The Stages section covers both basic workflow and conditional workflow. Access \u2013 Adding permissions to the stages on your form, which allows specific people to access the form at different points in the workflow. If you have no experience with Leap, complete the Building a Survey application tutorial to learn the basics of building and deploying applications in Leap. This tutorial does not cover concepts of form design, deployment, or reviewing submitted data. Go to the Leap community on developerWorks , and import ExpenseReport.nitro_s into Leap. Use the following instructions to complete the partially complete Expense Report application. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Adding tables to forms Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. Adding workflow Stages to a form Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. Tutorial summary You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. Parent topic: Tutorials for app design","title":"Adding tables and workflow elements to a Leap form"},{"location":"tut_roles_and_stages_OV.html#addingworkflowtoaform","text":"This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial.","title":"Adding tables and workflow elements to a HCL Leap form"},{"location":"tut_roles_and_stages_OV.html#prerequisites","text":"This tutorial contains the following lessons: Tables \u2013 Adding tables to your form to collect data from users. Stages \u2013 Adding workflow to your form, turning it into an application. The Stages section covers both basic workflow and conditional workflow. Access \u2013 Adding permissions to the stages on your form, which allows specific people to access the form at different points in the workflow. If you have no experience with Leap, complete the Building a Survey application tutorial to learn the basics of building and deploying applications in Leap. This tutorial does not cover concepts of form design, deployment, or reviewing submitted data. Go to the Leap community on developerWorks , and import ExpenseReport.nitro_s into Leap. Use the following instructions to complete the partially complete Expense Report application. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Adding tables to forms Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. Adding workflow Stages to a form Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. Tutorial summary You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. Parent topic: Tutorials for app design","title":"Prerequisites"},{"location":"tut_roles_and_stages_SM.html","text":"Tutorial summary You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. In this tutorial, you learned how to: Add a Table to a form. Format the table headings Add page navigation to the form Add Stages to create workflow functionality Make form items, and entire form pages hidden and read-only in a particular stage Create Roles and assign users to Roles Assign Role permissions to specific stages For more information about Stages and Access Control, see the following topics: Adding Stages to an application Security overview . Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Tutorial summary"},{"location":"tut_roles_and_stages_SM.html#addingworkflowtoaform","text":"You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. In this tutorial, you learned how to: Add a Table to a form. Format the table headings Add page navigation to the form Add Stages to create workflow functionality Make form items, and entire form pages hidden and read-only in a particular stage Create Roles and assign users to Roles Assign Role permissions to specific stages For more information about Stages and Access Control, see the following topics: Adding Stages to an application Security overview . Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Tutorial summary"},{"location":"tut_roles_and_stages_module1.html","text":"Adding tables to forms Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. In this lesson, learn how to: Add a Table to the form. Add form items as column headings in the table. Add page navigation buttons to the form. Estimated time required to complete this module: 20 minutes Add a table to the Expenses page For this tutorial, add a table for the user to submit a list of expenses. In the Manage tab, open the Expense Report application by clicking Edit. The Outline view displays all the forms and pages within an application. You can change the default names of forms and pages to more specific names. You can also move between form pages by clicking them in the Outline view. In the Outline view, click the Expenses page. The blank Expenses page is displayed. Add a section to the Expenses page, and extend it to span all columns. In the properties side panel, change the title of the section to \u201cItemized Expenses\u201d. Click the Display title bar check box so the title is displayed on the form. Expand the Specialized section of the Palette and add a Table to the form. To set the table headers, click the \u201chere\u201d link in the information window. A new child page is created for the table that stores the form items that are used as table column headers. A grid with one column and one row is displayed. Add the following form items to the Table page, either vertically, or horizontally. When the user enters data into the table, a window opens and displays the column headings as a list. If there are more column headings than space in the window, scroll bars are displayed to the user. You must decide whether you want users to scroll vertically, or horizontally, then build the column headers in that direction. Whether you build the list in the child page, the column headers are displayed horizontally in the table on the form. Expand the Common section of the Palette. Add a Date. Set the Hint to Date the expense was incurred. Add a Dropdown. In the properties side panel: set the title to \u201cType\u201d and set the hint to \u201cType of expense\u201d. Click the Edit Properties icon. Then click the Edit button in the Options: section. Enter the following options into the displayed value column, create row with the Add option icon after each: Air Travel, Car rental, Food, Hotel, Postage, Other Add a Single Line Entry. Set the Title to Description. Set the Width to Medium in the Properties side panel. Add a Currency. Set the Title to Amount. Set the Width to Short. Make all form items in the Table required by clicking the required box for each item. In the Outline view, click the Expenses page to continue building the form. On the Expenses page notice that the table headings are displayed horizontally. Expand the table to cover both columns in the grid. In the Properties side panel set the title of the table to \u201cYour Expenses\u201d. Enter a Hint. For example: Enter each itemized expense in the table. Save and preview the form. The Preview icon is located with the Save icon. When the preview is displayed, click Next to get to the Expenses page. In the validation error message window, click Continue. The error is displayed because you are leaving the first page of the form without entering data into mandatory fields. The table is then displayed with no entries. Click the Add a new entry icon to add test information to the table. A window is displayed containing the column headers displayed vertically, and they all fit in the window. If the table headers were entered onto the Table page horizontally, the user must scroll to see all table fields. Close the preview form to return to building the form. Set a formula on the table so the total of the submitted expenses is displayed in a separate Currency area. This total is supplied to the reviewer on the Approval page you create next. On the Expenses page, add a Currency form item beneath the table. Click the newly added currency field to reveal the properties side panel. Change the Title to Total Expense Amount. Click the Formula tab. From the Choose the function used to set the value of this item: select Table Sum. Click the Column entry field. A window opens for you to select a form item. Expand the tree until Amount is available. The formula is set. Add Page Navigation buttons to the end of the form. Save and preview the form. If you enter test data into the table, the numbers that are entered in the Amount columns are automatically added and displayed in the Total Expense Amount. Adding an approval page with more logic to the form The following steps describe how to create an approval page where a supervisor approves or denies the expense report. A rule is set so that if the reviewer denies the expense claim, they can provide a reason why the expense was denied. First, create a page in the form to use as the Approval page. It displays the Total Expense Amount from the Expenses page to the approver. In the Outline view, click the Add icon to add another page to the form. Change the name of the page to Approval. Add a Section and span the section across the two columns. In the properties side panel, change the title to \u201cExpense Approval\u201d, and select the Display title bar option. Add a Single Line Entry form item to the section. Change the name to Approver\u2019s Name. Add a Currency form item next. Change the title to Expense Amount to Approve Click the currency form item to reveal the properties side panel. The following substeps describe how to pull the total from the Total Expense Amount on the Expenses page into the Expense Amount to Approve form item. A rule is then set to make the amount read-only to the approver if its value is greater than zero. This way, the approver can see the amount, but cannot change it. In the properties side panel, select the Formula tab. From the Choose the function used to set the value of this item menu, select Assign. Select Total Expense Amount from the list of form items available. Click the Edit Rules icon and add a rule. In the When the following condition is true section, select Expense Amount to Approve from the first menu. Select Greater than from the second menu. Leave \u201cA fixed value\u201d selected and add the number 0 to the empty field. In the Perform this action section, select Expense Amount to Approve from the first menu. Select Disable from the second menu. Click Apply and Close. Add a Select One item in the section. Click the newly added select one to reveal the properties side panel. Set the Title to Do you approve this expense? Click the check box to make this item Required. Edit the Options: to Approve and Decline. Set the Choice Layout to Horizontal. Add a Multi-Line Entry beneath Expense Amount to Approve. Title the Multi-Line Entry: Reason for Declining: Click the Rules icon. This rule will hide this Multi-Line Entry item if the expense is approved. Click Add Rule. From the When this is true: section, select Do you approve this expense? Select Does not equal. Leave A fixed value selected and then select Approve from the next set of options. Select Reason for declining: from the Perform this action section. Select Hide from the next menu. Click Apply and Close. Add page navigation buttons to the end of the page. This set of buttons allows the user to see the comments of the approver if the Expense Report is rejected. In the next lesson, you will hide these navigation buttons, so they are displayed after the approver reviews the Expense Report. Save the form. The approval page is created, but is only used when a workflow is applied to the form. Creating a workflow with Stages is covered in the next section of the tutorial. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Adding tables to forms"},{"location":"tut_roles_and_stages_module1.html#addingworkflowtoaform","text":"Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. In this lesson, learn how to: Add a Table to the form. Add form items as column headings in the table. Add page navigation buttons to the form. Estimated time required to complete this module: 20 minutes","title":"Adding tables to forms"},{"location":"tut_roles_and_stages_module1.html#lesson11","text":"For this tutorial, add a table for the user to submit a list of expenses. In the Manage tab, open the Expense Report application by clicking Edit. The Outline view displays all the forms and pages within an application. You can change the default names of forms and pages to more specific names. You can also move between form pages by clicking them in the Outline view. In the Outline view, click the Expenses page. The blank Expenses page is displayed. Add a section to the Expenses page, and extend it to span all columns. In the properties side panel, change the title of the section to \u201cItemized Expenses\u201d. Click the Display title bar check box so the title is displayed on the form. Expand the Specialized section of the Palette and add a Table to the form. To set the table headers, click the \u201chere\u201d link in the information window. A new child page is created for the table that stores the form items that are used as table column headers. A grid with one column and one row is displayed. Add the following form items to the Table page, either vertically, or horizontally. When the user enters data into the table, a window opens and displays the column headings as a list. If there are more column headings than space in the window, scroll bars are displayed to the user. You must decide whether you want users to scroll vertically, or horizontally, then build the column headers in that direction. Whether you build the list in the child page, the column headers are displayed horizontally in the table on the form. Expand the Common section of the Palette. Add a Date. Set the Hint to Date the expense was incurred. Add a Dropdown. In the properties side panel: set the title to \u201cType\u201d and set the hint to \u201cType of expense\u201d. Click the Edit Properties icon. Then click the Edit button in the Options: section. Enter the following options into the displayed value column, create row with the Add option icon after each: Air Travel, Car rental, Food, Hotel, Postage, Other Add a Single Line Entry. Set the Title to Description. Set the Width to Medium in the Properties side panel. Add a Currency. Set the Title to Amount. Set the Width to Short. Make all form items in the Table required by clicking the required box for each item. In the Outline view, click the Expenses page to continue building the form. On the Expenses page notice that the table headings are displayed horizontally. Expand the table to cover both columns in the grid. In the Properties side panel set the title of the table to \u201cYour Expenses\u201d. Enter a Hint. For example: Enter each itemized expense in the table. Save and preview the form. The Preview icon is located with the Save icon. When the preview is displayed, click Next to get to the Expenses page. In the validation error message window, click Continue. The error is displayed because you are leaving the first page of the form without entering data into mandatory fields. The table is then displayed with no entries. Click the Add a new entry icon to add test information to the table. A window is displayed containing the column headers displayed vertically, and they all fit in the window. If the table headers were entered onto the Table page horizontally, the user must scroll to see all table fields. Close the preview form to return to building the form. Set a formula on the table so the total of the submitted expenses is displayed in a separate Currency area. This total is supplied to the reviewer on the Approval page you create next. On the Expenses page, add a Currency form item beneath the table. Click the newly added currency field to reveal the properties side panel. Change the Title to Total Expense Amount. Click the Formula tab. From the Choose the function used to set the value of this item: select Table Sum. Click the Column entry field. A window opens for you to select a form item. Expand the tree until Amount is available. The formula is set. Add Page Navigation buttons to the end of the form. Save and preview the form. If you enter test data into the table, the numbers that are entered in the Amount columns are automatically added and displayed in the Total Expense Amount.","title":"Add a table to the Expenses page"},{"location":"tut_roles_and_stages_module1.html#approvalpagewithadditionallogic","text":"The following steps describe how to create an approval page where a supervisor approves or denies the expense report. A rule is set so that if the reviewer denies the expense claim, they can provide a reason why the expense was denied. First, create a page in the form to use as the Approval page. It displays the Total Expense Amount from the Expenses page to the approver. In the Outline view, click the Add icon to add another page to the form. Change the name of the page to Approval. Add a Section and span the section across the two columns. In the properties side panel, change the title to \u201cExpense Approval\u201d, and select the Display title bar option. Add a Single Line Entry form item to the section. Change the name to Approver\u2019s Name. Add a Currency form item next. Change the title to Expense Amount to Approve Click the currency form item to reveal the properties side panel. The following substeps describe how to pull the total from the Total Expense Amount on the Expenses page into the Expense Amount to Approve form item. A rule is then set to make the amount read-only to the approver if its value is greater than zero. This way, the approver can see the amount, but cannot change it. In the properties side panel, select the Formula tab. From the Choose the function used to set the value of this item menu, select Assign. Select Total Expense Amount from the list of form items available. Click the Edit Rules icon and add a rule. In the When the following condition is true section, select Expense Amount to Approve from the first menu. Select Greater than from the second menu. Leave \u201cA fixed value\u201d selected and add the number 0 to the empty field. In the Perform this action section, select Expense Amount to Approve from the first menu. Select Disable from the second menu. Click Apply and Close. Add a Select One item in the section. Click the newly added select one to reveal the properties side panel. Set the Title to Do you approve this expense? Click the check box to make this item Required. Edit the Options: to Approve and Decline. Set the Choice Layout to Horizontal. Add a Multi-Line Entry beneath Expense Amount to Approve. Title the Multi-Line Entry: Reason for Declining: Click the Rules icon. This rule will hide this Multi-Line Entry item if the expense is approved. Click Add Rule. From the When this is true: section, select Do you approve this expense? Select Does not equal. Leave A fixed value selected and then select Approve from the next set of options. Select Reason for declining: from the Perform this action section. Select Hide from the next menu. Click Apply and Close. Add page navigation buttons to the end of the page. This set of buttons allows the user to see the comments of the approver if the Expense Report is rejected. In the next lesson, you will hide these navigation buttons, so they are displayed after the approver reviews the Expense Report. Save the form. The approval page is created, but is only used when a workflow is applied to the form. Creating a workflow with Stages is covered in the next section of the tutorial. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Adding an approval page with more logic to the form"},{"location":"tut_roles_and_stages_module2.html","text":"Adding workflow Stages to a form Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. A Stage describes: The behavior of the form while it is in a stage, including what portions of the form are visible or read only. The flow of the form, determining navigation between stages. For example, a form goes to a manager for general expense approval, but to another manager if the amount of the expense exceeds a predefined amount. Who has access to the form while the form is in that stage. By default, each form has a Start and a Submitted stage. The Start stage is the beginning of the workflow, and describes a form that has not been completed or submitted by the user. After a form leaves the Start stage, it can never return to the Start stage. The Submitted stage describes a form that has reached the next part of the workflow. You may add other stages to your workflow to fit your use case. In this lesson, learn how to: Go to the Workflow tab. Add new stages and modify various stage properties. Make form items read-only in a specific stage. Make form pages read-only and hidden in specific stages. Set navigation between stages to create a workflow. Estimated time required to complete this module: 20 minutes Adding Stages to your form The workflow for this form is summarized as follows: The user accesses the form in the Start stage. When the user submits the form, it goes to the Awaiting Approval stage, where an approver can either accept or reject the Expense Report. If the reviewer accepts the Expense Report, the form goes to the Accepted stage. If the reviewer rejects the Expense Report, the form goes to the Approval Request stage so the submitter can make corrections and resubmit. Click the Workflow tab. The view is made of the diagram canvas and the properties side panel. In the Start stage, the user who enters data into the form does not need to see the Approval page. To ensure that the user cannot find their way to that page, hide it from view. Click the Visibility button at the top of the screen, then in the side panel, click the Hide icon for the Approval page. The Approval page is hidden from view when the form user first submits the form. Note: The hidden or read-only status applies to a form item in a particular stage. If you add another stage, the hidden or read-only status does not carry forward to the new stage. The user does not need to see the page navigation buttons to the Approval page. Hide them by clicking the Expenses page. Go to the page navigation buttons. In the properties side panel, click the eye icon to hide in this stage. The page navigation buttons are now hidden from view when the user submits the form. The page navigation buttons are only hidden in this stage. Create a stage to add the Approval page that is created in the previous section. Click the Add a new stage icon while the Start stage is in focus. A new stage is inserted after the Start stage and before the Submitted stage. Click the label \u201cStage n \u201d to change the name of the stage to \u201cApproval Request\u201d. This stage allows users to open the form again and edit the expense report if it is rejected by an approver. Click on the Visibility button at the top of the screen. Set the Approval page to read-only by clicking on the lock icon with the \u201cApproval Request\u201d stage selected. You want the user to see the comments that are written by the reviewer, but do not want the user to be able to modify the choices that are set by the reviewer. Add another stage, and title it Awaiting Approval. The form progresses to this stage after the user submits it. In the Visibility View, set the Basic Information and Expenses pages to be read-only. At the end of the form, Submit and Cancel buttons are automatically added. Click the Add Action icon, and add another Submit button. Click the Submit action on the diagram, or with the stage selected click the Edit Properties icon for the Submit button. Change the title to Accept. So users know whether their Expense Reports were accepted or rejected, send them an email. In the Action Completion Message: field, set it to read You have approved the submitter\u2019s expense report. They are notified by email of the approval. This message is shown to the approver every time they accept an expense report. Click the Activities tab. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject entry field, type Your Expense Report was accepted. In the Contents of the Email: box, write your email. For example, enter: Thank you for submitting your expense report. It was accepted, and payment will be made shortly. To view the approved report, click the following link: To insert a link to the form, click the Insert item: menu that is located in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. When the reviewer approves the expense report, the user receives an email at the address they provided on the Basic Information page. Now configure the second Submit button to use if the approver rejects the submitted form. With the stage selected, click the label for the second Submit button and change the title to \u201cDecline\u201d. In the Action Completion Message: field set it to read: You have rejected the submitter\u2019s request. They are notified to correct errors and resubmit the Expense Report. In the Next Stage: menu, select Approval Request. If the Expense Report is rejected, the user can reopen it to correct errors. Now set the stage to send an email to notify the submitter of the rejection. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject: entry field, type Your Expense Report was rejected. In the Contents of the Email: box, write your email. For example, enter: Your submitted expense report was rejected.Click the following link to review the report, make corrections and resubmit: To insert a link to the form, click the Insert item: menu in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. Go to the Approval Request stage. Set which stage the button activates by clicking on the submit button on the diagram and in the Properties side panel change the Next Stage to \u201cAwaiting Approval\u201d. When the approver receives the form to review, it is best if the submitted information is read-only. This way the reviewer cannot modify any data that the user submitted. When you set pages and form items as read-only in the Start stage, and must do so again in Approval Request stage. In the Visibility view, click the \u201cApproval Request\u201d stage and then click the lock icon next to the page to make it read-only in this stage. Now that the Approval Request stage is created, you must modify the Start stage so the form is routed to the Approval Request stage. Click the Start stage. Click the Edit Properties icon for Submit. Change the Action Completion Message: to read: Your data was submitted and will be reviewed soon. Change the Next Stage to \u201cApproval Request\u201d. Save your application. When the user completes and submits the form, it is sent to an approver for review. When the user submits the form, it goes from the Start to the Awaiting Approval stage. If the approver accepts, the form is sent to the Submitted stage, and the workflow is complete. If the approver rejects the Expense Report, it is sent to the Approval Request stage so the user can fix errors and resubmit. If the approver rejects the Expense Report, the form is sent to this stage so the user can open the form, change it, and resubmit. When the user submits the corrected form, it goes to the Awaiting Approval stage again. Optional: Applying conditional workflow to the form There is a rule on the form that states any expense reimbursement must be approved by a reviewer. However, you can create a stage in the workflow to request special approval for amounts larger than $2000. In the Workflow tab, create a stage and title it Special Approval. Create a second Submit button. Click label for the first Submit button to change the title to Accept. Set the Next stage: to Awaiting Approval. When the special request is approved, the form is sent to the main approver for review. Click label for the second Submit button to change the title to Reject. Set the Next stage: to Approval Request. Click \u201c+ Add Action\u201d in the properties side panel or hover over the stage card in the diagram and click the \u201c+\u201d to create a second submit button. Click the Edit Properties icon for new Submit button. Click the Visibility button. Click on the Actions section where the submit buttons are shown. Click the Rules icon for the new submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Less than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit2, but a different number can be appended if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply. The rule states that the button is hidden if the expense amount claimed is less than $2000. Now set the opposite rule on the first submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Greater than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit, but a number can be appended to that string if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply and Close. When the user opens the form, only one Submit button is visible. When the user clicks the Submit button, the form is sent to the appropriate stage based on the total amount of the expense. Note: Submit buttons are not available in Preview mode. You must deploy the form to test the rules that are set on the button. If you deploy the form, there is no difference in the appearance of the form because both buttons have the same name. When you click View Data, you see the additional workflow steps that are required for the form. The conditional workflow is set. In the next section, add access control to each stage so the Approval Request stage is set to one set of reviewers, while the Special Approval stage is set to another set of reviewers. Save the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Adding workflow Stages to a form"},{"location":"tut_roles_and_stages_module2.html#addingworkflowtoaform","text":"Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. A Stage describes: The behavior of the form while it is in a stage, including what portions of the form are visible or read only. The flow of the form, determining navigation between stages. For example, a form goes to a manager for general expense approval, but to another manager if the amount of the expense exceeds a predefined amount. Who has access to the form while the form is in that stage. By default, each form has a Start and a Submitted stage. The Start stage is the beginning of the workflow, and describes a form that has not been completed or submitted by the user. After a form leaves the Start stage, it can never return to the Start stage. The Submitted stage describes a form that has reached the next part of the workflow. You may add other stages to your workflow to fit your use case. In this lesson, learn how to: Go to the Workflow tab. Add new stages and modify various stage properties. Make form items read-only in a specific stage. Make form pages read-only and hidden in specific stages. Set navigation between stages to create a workflow. Estimated time required to complete this module: 20 minutes","title":"Adding workflow Stages to a form"},{"location":"tut_roles_and_stages_module2.html#lesson21","text":"The workflow for this form is summarized as follows: The user accesses the form in the Start stage. When the user submits the form, it goes to the Awaiting Approval stage, where an approver can either accept or reject the Expense Report. If the reviewer accepts the Expense Report, the form goes to the Accepted stage. If the reviewer rejects the Expense Report, the form goes to the Approval Request stage so the submitter can make corrections and resubmit. Click the Workflow tab. The view is made of the diagram canvas and the properties side panel. In the Start stage, the user who enters data into the form does not need to see the Approval page. To ensure that the user cannot find their way to that page, hide it from view. Click the Visibility button at the top of the screen, then in the side panel, click the Hide icon for the Approval page. The Approval page is hidden from view when the form user first submits the form. Note: The hidden or read-only status applies to a form item in a particular stage. If you add another stage, the hidden or read-only status does not carry forward to the new stage. The user does not need to see the page navigation buttons to the Approval page. Hide them by clicking the Expenses page. Go to the page navigation buttons. In the properties side panel, click the eye icon to hide in this stage. The page navigation buttons are now hidden from view when the user submits the form. The page navigation buttons are only hidden in this stage. Create a stage to add the Approval page that is created in the previous section. Click the Add a new stage icon while the Start stage is in focus. A new stage is inserted after the Start stage and before the Submitted stage. Click the label \u201cStage n \u201d to change the name of the stage to \u201cApproval Request\u201d. This stage allows users to open the form again and edit the expense report if it is rejected by an approver. Click on the Visibility button at the top of the screen. Set the Approval page to read-only by clicking on the lock icon with the \u201cApproval Request\u201d stage selected. You want the user to see the comments that are written by the reviewer, but do not want the user to be able to modify the choices that are set by the reviewer. Add another stage, and title it Awaiting Approval. The form progresses to this stage after the user submits it. In the Visibility View, set the Basic Information and Expenses pages to be read-only. At the end of the form, Submit and Cancel buttons are automatically added. Click the Add Action icon, and add another Submit button. Click the Submit action on the diagram, or with the stage selected click the Edit Properties icon for the Submit button. Change the title to Accept. So users know whether their Expense Reports were accepted or rejected, send them an email. In the Action Completion Message: field, set it to read You have approved the submitter\u2019s expense report. They are notified by email of the approval. This message is shown to the approver every time they accept an expense report. Click the Activities tab. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject entry field, type Your Expense Report was accepted. In the Contents of the Email: box, write your email. For example, enter: Thank you for submitting your expense report. It was accepted, and payment will be made shortly. To view the approved report, click the following link: To insert a link to the form, click the Insert item: menu that is located in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. When the reviewer approves the expense report, the user receives an email at the address they provided on the Basic Information page. Now configure the second Submit button to use if the approver rejects the submitted form. With the stage selected, click the label for the second Submit button and change the title to \u201cDecline\u201d. In the Action Completion Message: field set it to read: You have rejected the submitter\u2019s request. They are notified to correct errors and resubmit the Expense Report. In the Next Stage: menu, select Approval Request. If the Expense Report is rejected, the user can reopen it to correct errors. Now set the stage to send an email to notify the submitter of the rejection. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject: entry field, type Your Expense Report was rejected. In the Contents of the Email: box, write your email. For example, enter: Your submitted expense report was rejected.Click the following link to review the report, make corrections and resubmit: To insert a link to the form, click the Insert item: menu in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. Go to the Approval Request stage. Set which stage the button activates by clicking on the submit button on the diagram and in the Properties side panel change the Next Stage to \u201cAwaiting Approval\u201d. When the approver receives the form to review, it is best if the submitted information is read-only. This way the reviewer cannot modify any data that the user submitted. When you set pages and form items as read-only in the Start stage, and must do so again in Approval Request stage. In the Visibility view, click the \u201cApproval Request\u201d stage and then click the lock icon next to the page to make it read-only in this stage. Now that the Approval Request stage is created, you must modify the Start stage so the form is routed to the Approval Request stage. Click the Start stage. Click the Edit Properties icon for Submit. Change the Action Completion Message: to read: Your data was submitted and will be reviewed soon. Change the Next Stage to \u201cApproval Request\u201d. Save your application. When the user completes and submits the form, it is sent to an approver for review. When the user submits the form, it goes from the Start to the Awaiting Approval stage. If the approver accepts, the form is sent to the Submitted stage, and the workflow is complete. If the approver rejects the Expense Report, it is sent to the Approval Request stage so the user can fix errors and resubmit. If the approver rejects the Expense Report, the form is sent to this stage so the user can open the form, change it, and resubmit. When the user submits the corrected form, it goes to the Awaiting Approval stage again.","title":"Adding Stages to your form"},{"location":"tut_roles_and_stages_module2.html#applyingconditionallogictoastage","text":"There is a rule on the form that states any expense reimbursement must be approved by a reviewer. However, you can create a stage in the workflow to request special approval for amounts larger than $2000. In the Workflow tab, create a stage and title it Special Approval. Create a second Submit button. Click label for the first Submit button to change the title to Accept. Set the Next stage: to Awaiting Approval. When the special request is approved, the form is sent to the main approver for review. Click label for the second Submit button to change the title to Reject. Set the Next stage: to Approval Request. Click \u201c+ Add Action\u201d in the properties side panel or hover over the stage card in the diagram and click the \u201c+\u201d to create a second submit button. Click the Edit Properties icon for new Submit button. Click the Visibility button. Click on the Actions section where the submit buttons are shown. Click the Rules icon for the new submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Less than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit2, but a different number can be appended if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply. The rule states that the button is hidden if the expense amount claimed is less than $2000. Now set the opposite rule on the first submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Greater than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit, but a number can be appended to that string if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply and Close. When the user opens the form, only one Submit button is visible. When the user clicks the Submit button, the form is sent to the appropriate stage based on the total amount of the expense. Note: Submit buttons are not available in Preview mode. You must deploy the form to test the rules that are set on the button. If you deploy the form, there is no difference in the appearance of the form because both buttons have the same name. When you click View Data, you see the additional workflow steps that are required for the form. The conditional workflow is set. In the next section, add access control to each stage so the Approval Request stage is set to one set of reviewers, while the Special Approval stage is set to another set of reviewers. Save the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Optional: Applying conditional workflow to the form"},{"location":"tut_roles_and_stages_module3.html","text":"Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. In this lesson, learn how to: Open to the Access tab. Know the difference between Closed and Open role types. Add a user type to the list of defined Roles. Assign users to the various Roles. Assign users to Stages. Estimated time that is required to complete this module: 20 minutes Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. By default, the Access tab, three roles are already defined for you: Administrator \u2013 Users, or groups, with administrator privileges for an application. Initiator \u2013 Any user, or group, who can submit a form or initiate an application. You can set some applications to be available to all users, and some to be available to specific users, or groups. Record Owner \u2013 The user who submits the form. After a user initiates and submits a form, they become the Record Owner. Each role can be either Open or Closed. When a role is Open, it dynamically assigns users at run time. When a role is Closed, the users must be set on the Access screen, and are static. For example, in a form, you might have employees sign in and enter their names and employee numbers. If the role is Open, the application can pull information about the employees\u2019 superior from a company database and populate the form. For this tutorial, all roles must remain Closed. The users who submit Expense Reports are Initiators, and for this scenario the users who review the Expense Reports are Human Resources. As the Initiator role is already created, you must create the Human Resources role. Click the Access tab. Click the Add Role icon for the Record Owner role. A new role is created. Rename the new role Human Resources. Now that the roles are created, add members to the roles. Adding members to the roles determines who can access the application. There are four predefined user groups: All Authenticated Users : Any user who is authenticated with your organization. Users must sign in with a user ID and password to access the application. Anonymous Users : Any user who you want to work anonymously with the application. Anyone who has the link to the application can submit it, without signing in. Invited Users : Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Instance Creator : The user who submitted a form. You can also add your own Groups or Individual users to a role. In the Assign Users menu, select Initiator. The Initiator role automatically has All Authenticated Users added. Access for this role is complete. Select Human Resources from the Assign Users menu. In the Individual Users field, add your own name. As you manually enter Individual Users or Groups, Leap provides you with predictive matches based on your entry. These predictive matches are taken from your company LDAP, users that are configured in your IBM\u00ae WebSphere\u00ae Application Server, or IBM WebSphere Portal Server. By adding your name to the Human Resources Group, you are able to enter sample data into the form, and review all submitted responses. Click Add User icon. Now that access to submit and review a form is set, edit the properties of the individual roles. For example, you want Human Resources to review and approve the form, but the form must be read-only unless it is returned to the user. Remember the order of the workflow for our form: When the user submits the form, it moves from the Start stage to the Awaiting Approval stage. If a form is rejected because of errors, it is sent to the Approval Request stage, so the submitter can correct the errors and submit the form again. Go to Stage SettingsExpense Report, and select Start. You see that the Initiator has permission to Create and submit the form. Go to Stage SettingsExpense Report, and select Approval Request. For the Administrator, make Read and Delete are selected. These permissions give the Administrator the ability to see and delete submitted forms in this stage, but not to change the submitted data. For Record Owner, ensure Read and Update are selected. These permissions allow the person who submitted the form to edit the form in the case of errors, and submit it again for approval. For Human Resources, ensure the Read is enabled. Go to Stage SettingsExpense Report, and select Awaiting Approval . For the Administrator, make Read and Delete are selected. For Record Owner, ensure Read is selected. This permission allows the person who submitted the form to see it, but not change any data. For Human Resources, select Read, and Update. Although the information submitted by the user is read-only for the approver in Human Resources, the word Update is used to manage access settings. In this instance, the word Update means that an approver can use the Submit and Cancel buttons on the form. Update does NOT mean that the approver can update or manipulate the submitted data. Save the application. Click the Manage tab and deploy the application and enter sample data into the form. After you submit sample data, return to the form and click View Data from the Manage tab. Accept or reject the sample data to test the workflow elements you built into the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Applying access control through Roles"},{"location":"tut_roles_and_stages_module3.html#addingworkflowtoaform","text":"Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. In this lesson, learn how to: Open to the Access tab. Know the difference between Closed and Open role types. Add a user type to the list of defined Roles. Assign users to the various Roles. Assign users to Stages. Estimated time that is required to complete this module: 20 minutes","title":"Applying access control through Roles"},{"location":"tut_roles_and_stages_module3.html#applyingaccesscontrolthroughroles","text":"Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. By default, the Access tab, three roles are already defined for you: Administrator \u2013 Users, or groups, with administrator privileges for an application. Initiator \u2013 Any user, or group, who can submit a form or initiate an application. You can set some applications to be available to all users, and some to be available to specific users, or groups. Record Owner \u2013 The user who submits the form. After a user initiates and submits a form, they become the Record Owner. Each role can be either Open or Closed. When a role is Open, it dynamically assigns users at run time. When a role is Closed, the users must be set on the Access screen, and are static. For example, in a form, you might have employees sign in and enter their names and employee numbers. If the role is Open, the application can pull information about the employees\u2019 superior from a company database and populate the form. For this tutorial, all roles must remain Closed. The users who submit Expense Reports are Initiators, and for this scenario the users who review the Expense Reports are Human Resources. As the Initiator role is already created, you must create the Human Resources role. Click the Access tab. Click the Add Role icon for the Record Owner role. A new role is created. Rename the new role Human Resources. Now that the roles are created, add members to the roles. Adding members to the roles determines who can access the application. There are four predefined user groups: All Authenticated Users : Any user who is authenticated with your organization. Users must sign in with a user ID and password to access the application. Anonymous Users : Any user who you want to work anonymously with the application. Anyone who has the link to the application can submit it, without signing in. Invited Users : Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Instance Creator : The user who submitted a form. You can also add your own Groups or Individual users to a role. In the Assign Users menu, select Initiator. The Initiator role automatically has All Authenticated Users added. Access for this role is complete. Select Human Resources from the Assign Users menu. In the Individual Users field, add your own name. As you manually enter Individual Users or Groups, Leap provides you with predictive matches based on your entry. These predictive matches are taken from your company LDAP, users that are configured in your IBM\u00ae WebSphere\u00ae Application Server, or IBM WebSphere Portal Server. By adding your name to the Human Resources Group, you are able to enter sample data into the form, and review all submitted responses. Click Add User icon. Now that access to submit and review a form is set, edit the properties of the individual roles. For example, you want Human Resources to review and approve the form, but the form must be read-only unless it is returned to the user. Remember the order of the workflow for our form: When the user submits the form, it moves from the Start stage to the Awaiting Approval stage. If a form is rejected because of errors, it is sent to the Approval Request stage, so the submitter can correct the errors and submit the form again. Go to Stage SettingsExpense Report, and select Start. You see that the Initiator has permission to Create and submit the form. Go to Stage SettingsExpense Report, and select Approval Request. For the Administrator, make Read and Delete are selected. These permissions give the Administrator the ability to see and delete submitted forms in this stage, but not to change the submitted data. For Record Owner, ensure Read and Update are selected. These permissions allow the person who submitted the form to edit the form in the case of errors, and submit it again for approval. For Human Resources, ensure the Read is enabled. Go to Stage SettingsExpense Report, and select Awaiting Approval . For the Administrator, make Read and Delete are selected. For Record Owner, ensure Read is selected. This permission allows the person who submitted the form to see it, but not change any data. For Human Resources, select Read, and Update. Although the information submitted by the user is read-only for the approver in Human Resources, the word Update is used to manage access settings. In this instance, the word Update means that an approver can use the Submit and Cancel buttons on the form. Update does NOT mean that the approver can update or manipulate the submitted data. Save the application. Click the Manage tab and deploy the application and enter sample data into the form. After you submit sample data, return to the form and click View Data from the Manage tab. Accept or reject the sample data to test the workflow elements you built into the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Applying access control through Roles"},{"location":"tut_survey_application_OV.html","text":"Building a Survey application This tutorial describes how to build a simple survey application with HCL Leap. No previous knowledge of Leap is required. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Building a survey with Leap This tutorial contains two sections. Tutorial summary You successfully built a basic Leap application. Parent topic: Tutorials for app design","title":"Building a Survey application"},{"location":"tut_survey_application_OV.html#buildingasurveyapplication","text":"This tutorial describes how to build a simple survey application with HCL Leap. No previous knowledge of Leap is required. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Building a survey with Leap This tutorial contains two sections. Tutorial summary You successfully built a basic Leap application. Parent topic: Tutorials for app design","title":"Building a Survey application"},{"location":"tut_survey_application_SM.html","text":"Tutorial summary You successfully built a basic Leap application. In this tutorial, you learned how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data For more detailed information about specific topics that are covered in this tutorial, see Creating and managing applications in the HCL Leap product documentation. Parent topic: Building a Survey application","title":"Tutorial summary"},{"location":"tut_survey_application_SM.html#buildingasurveyapplication","text":"You successfully built a basic Leap application. In this tutorial, you learned how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data For more detailed information about specific topics that are covered in this tutorial, see Creating and managing applications in the HCL Leap product documentation. Parent topic: Building a Survey application","title":"Tutorial summary"},{"location":"tut_survey_application_module1.html","text":"Building a survey with Leap This tutorial contains two sections. In the first section, Opening Leap and building a form, learn how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase In the second section, Application Management, learn how to: Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data The scenario: The coffee services in your office are not ideal. Every morning in the break room, you hear coworkers complain about the coffee, but nothing is being done to improve the coffee at work. Your Office Manager asks you to find out how your coworkers would like the coffee services changed. You must poll everyone in the office to get their opinions. Your options: Email Send out an email to all your coworkers and ask them to provide their opinions on the coffee and how it can be improved. If you send out a mass email, sporadic responses from people arrive throughout the day, cluttering up your inbox. You must then take the feedback from the emails and collate it in a spreadsheet program, and there is no easy way to track who did not answer. Create a survey Create a survey form in Leap. You email the survey link to your coworkers, and they go online to provide you with feedback. All results are stored in a database and are easy to review and sort, and your email inbox is not filled with the sporadic responses. Creating a survey is the option that you select. Note: Throughout the Leap documentation, the words \u201cform\u201d and \u201capplication\u201d are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather information that is submitted by users when they complete the form, and automatically store the submissions in a database. Estimated time that is required to complete this module: 50 - 60 minutes Opening Leap and building a form The following steps describe how to open a new Leap application and build a form. You want your coffee feedback to have: An area that contains the title of the form, and a description of the purpose of the form. Include the amount of time that is needed to complete the form. An area that contains the name of the submitter. Also included in this area if the form is the basic question: \"Do you drink the coffee that is brewed in the office?\" An area that contains the survey questions. Creating an application \u2013 When you start Leap, a screen is displayed with two tabs on the Forms toolbar: Use and Manage. The Use tab displays a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. Click New Application. Enter a descriptive Application Name and Application Description, and select Create. A blank form with a two-by-two grid is displayed. The grid automatically aligns form items with one another when you place them on the form, and expands as you add form items. You can add and delete columns and rows as needed by clicking the border bar surrounding the grid. Note: As you add sections and form items to the form, the grid automatically expands to include the additional form items. You can add extra rows to your form manually, but it is not required. If there are empty rows or columns in a completed form, they are not displayed when the form is previewed or deployed. When you design forms, there are two ways to add form items to your form: You can drag form items from the Palette onto the form You can select a location on the grid, then click a form item. The form item is placed into the grid location. You can build forms by placing form items directly on the form or grouping form items in Sections. For our coffee feedback form, we use Sections to organize the form items. Sections are useful for the following reasons: They group form items in a way that is easy for the user to understand. When the form is viewed, the sections have specific background colors that are based on the style that is applied to the form. They make applying complex form functionality easier. For example, our form has a rule to hide the survey until the user selects a specific option. Instead of setting the rule on every form item individually, the rule is on the section. The rule applies to every form item within the section. They allow the form designer, and the form user, to collapse and expand entire parts of the form. In longer forms, collapsing sections is useful, as it keeps the form submitter from being overwhelmed by too much information. If you finish building your form and decide to change the layout, moving sections of form items is much easier than moving each form item individually. Creating the general information area: The general information area contains the title of the survey, more information for the form submitter, and an estimated time for completion. Drag a Section onto the form. The Section is placed into the grid area, and is highlighted to show the section has focus. Notice that the Section contains a grid within it. Form items for a section are added to the grid of the section. Click the field spanning handle and drag it to extend the section over both columns. You can resize any form item to span across multiple rows or columns. Click a grid box, then select Image from the Palette. The image form item is added to the form. You can edit many form items directly on the form, but others require you to use the Properties side panel. To display the list of available options for any form item, click the item on the canvas. The Properties side panel opens. Click Add file, then Browse to locate the logo of your company. If you do not have a logo, browse to a small resolution image on your computer. Click Open to select the image, and OK to close the Add File or URL Link window. The image is added to the form. Add a Text item to the Image. This text item contains the name of the survey. In the Size menu, set the font size to Large, then and Bold. Type Workplace Coffee Feedback and click OK. The formatted text is inserted into the form. Note: You can adjust the spacing between form items by dragging the slider in the border bar. The mouse changes to a slider, and you can adjust the proportions of the form items. Add another Text item with the image. Using the field spanning handle, drag the form item to span both columns. Enter the following text: We\u2019d like your feedback on coffee services in the office. Complete the survey to provide your feedback. Time to complete survey: 3 minutes or less. Click OK to add the text to the form. Save the form, either by pressing Ctrl + S, or by clicking the Save icon. Creating the primary information area: Now, create the section that collects the name of the submitter, and asks the basic question of \u201cDo you drink the office coffee?\u201d You want to have 100% participation, but not everyone in the office might drink coffee. By allowing users to submit the survey with a negative response, you receive a complete set of data. Set a rule on the survey section to ask coffee-relevant questions only if the submitter indicates that they drink the office coffee. Add another Section to the form. Click the field spanning handle and drag it to extend the section over both columns. Click a grid box, then click Single Line Entry. The Single Line Entry is placed onto the form. Edit the title of the Single Line Entry directly on the form. Click the title of the item: \u201cSingle Line Entry\u201d. The text is highlighted, and is now editable. Change the text to read: Your Name. Click Add hint... and type \u201cEnter your given name and surname.\u201d The hint is displayed directly on the form. Tip: Adding information to the hint fields gives more information that helps the user complete your form. For example, in this form, you ask for the user name. The hint helps clarify whether you want given name and surname, given name only, or given , middle, and surname. You can also provide more clarification for users by inserting place holder text into each Single Line Entry item. Place holder text is available in the Properties side panel, and is available for any form item where the user must type information. For example, Single Line, Multi-Line, Currency, Number, and Email. In the Single Line Entry on the canvas, click the box that is labeled Click to set as required. Users must complete this field to submit the form. Select Select One from the Palette and put it in a grid area with the Your Name text item. The Properties side panel opens. Change the Title: to Do you drink the office coffee? Click the Required check box to make this question mandatory. In the Options: section, one option is automatically available. To add another option, click the Add option plus sign. Set the options to: Yes No, I drink other hot beverages. No, I don\u2019t drink hot beverages. Displayed Value and Saved Value \u2013 When you use any form item that has Set Options, two fields are displayed: Displayed Value and Saved value. As you type in the Displayed Value, the Saved Value is automatically updated with the same value. There are some cases where the Saved Value differs from the Displayed Value. For example, our Displayed Value questions are long. If you export the data from a Leap application to a spreadsheet, the selected answers are truncated and the data might be difficult to interpret. If you change the Saved Values of the three questions to \u201cYes\u201d, \u201cOther\u201d, and \u201cNo\u201d, or assign numerical values, the results are easier to understand. Click OK. Save your form and preview it. The Preview icon is located with the Save icon. Note: Ensure that your browser does not block pop-up windows, as the preview form opens in a new window or new tab, depending on your browser settings. Notice that the Submit and Cancel buttons are automatically added for you. While you can enter data into the form in Preview mode, you cannot submit a form until it is deployed. To return to building the form, close the tab or the browser window in which the preview opened. Creating the survey: Now create the section which contains the survey questions. This section has a rule set on it, so if the user selects \u201cNo, I drink other hot beverages\u201d or \u201cNo, I don\u2019t drink hot beverages\u201d, the survey is not displayed. First create the rule, then add the survey to the section. Click the border bar to access the row action menu. Select Insert Row (after). Click Section from the Palette, then click the form. Extend the section over both columns. Click the Rules icon. The Rules window opens. Click Add Rule. In the When this is true: section, select Do you drink coffee?. Set the operation to Does not equal. Leave A fixed value in the next menu and select Yes. In the Perform this action section, select Survey in the first menu. As you build the rule, it is automatic error checking is performed. If there is an error in the logic, either a warning sign or an error sign is displayed. As this rule contains no errors, a verification icon is displayed. Select Hide in the second menu. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user responds that they don't drink coffee, they are not shown the survey about what type of coffee they prefer. Now that the rule is set, add the survey questions using: Two Survey form items: one to ask what roast of coffee the employees prefer, the other to ask them questions about the coffee provided. A Select Many form item to provide more information about what they like or dislike about the coffee. A Multi-Line Entry form item to provide detailed comments. Select Survey from the Palette and add it to the section grid. Extend the survey over both columns. Set the following properties in the side panel: Title: \u2013 Coffee preference Hint: \u2013 What type of coffee roast do you prefer? Options: Dark Roast Medium Roast Light Roast Decaf Click OK. Change the survey question from the default \u201cClick to edit\u201d to I prefer to drink: Select Survey from the Palette and add it with the Coffee preference survey. Extend the survey over both columns. In the Properties panel, set the following properties: Title: \u2013 Please rank each question: Options: Displayed Value Saved Value Totally agree 5 Somewhat agree 4 Agree 3 No opinion 0 Somewhat disagree 2 Totally disagree 1 If you export the data to a spreadsheet program, each user\u2019s response displays as the numerical code, rather than the Displayed Value. Tabulation of results is easier as you can sort the submitted responses by Saved Value numerical indicator. Review the ranking labels. Ranking labels are displayed before and after the Displayed Value. Set the following properties: Select Display before and after labels. In the Before label: text box, typeAgree. In the After label: text box, typeDisagree. Change the survey question from the default \u201cClick to edit\u201d to: I like the coffee at work. Click Add question to add another row to the survey. Change the survey question to: If changes were made, I would drink more coffee. You can repeat this step to add more questions to the survey. An alternative to multiple survey questions is to add a Select Many form item where users can select multiple choices from a list. Click Select Many from the Palette and place it onto the form near the survey. Extend the Select Many form item over both columns. The properties panel opens. Note: You can change the orientation of the Select Many choices by changing the Choice Layout. Changes are made instantly on the form. You can also select a minimum and maximum number of choices the user can select. Set the following properties: Title: \u2013 I find the coffee in the office: Hint: \u2013 Select all that apply. Options: Too acidic Too bitter Too weak Too strong Goes cold too quickly Too gritty Perfect. No changes required. For example, you can require the user to select a minimum of two choices and a maximum of 5. Click OK. Save the form. To complete the survey form, add a Multi-Line Entry so users can submit other options, or opinions. Click Multi-Line Entry from the Palette and place it onto the form with the Select Many form item. Extend the Multi-Line Entry form item over both columns. The properties panel opens. Set the following properties: Title: \u2013 Please enter any specific suggestions you might have: Width: \u2013 Full width. Selecting Full width results in the space for entering data automatically adjusting to the size of the form in the browser window. Hint: \u2013 For example, a specific bean blend you\u2019d like us to try. Click OK. The functionality of the survey is now in place. When users complete the survey and submit it, they receive a visual confirmation on the screen that the survey is submitted, and by default, are shown the survey again. To prevent user confusion, and to prevent the user from submitting the form again, redirect the user to your company website after the form is submitted. Adding a redirect URL is done in the Workflow tab. By default, each form automatically has a Start stage and a Submitted stage. The Start stage contains the Submit and Cancel buttons that are seen when you preview the form. Click the Workflow tab. Click the Submit button node. The Properties panel opens. The Action Completion Message: has \u201cYour data has been successfully submitted.\u201d as the default message. You can leave the default, or change the text. In the Action Completion Redirect URL (optional): text entry area, enter the URL of your company website. Click the Design tab to return to the main body of the form. The coffee survey is now complete. Save and preview the form. Now that you have built a form, you must deploy it so it is available for users. Application management The following steps describe how to deploy a completed form, launch a form, enter sample data, review the submitted sample data, then delete the submitted sample data. Deploying an application \u2013 Deploying, or publishing forms is done in the Manage tab. Click the Manage tab. Click the Deploy link for your survey. The Deployment Settings window is displayed. Select Set deployment Period. Set the Start and Stop dates to span a two week window, starting today. Tip: It is useful to have a start and end date for some applications because users are forced to complete the form within a specific time frame. Click Start. The application is deployed. After the application is deployed, you need the URL to provide to your colleagues so they can complete the survey. There are two ways to get the URL: Click the Launch link. A browser window launches with the URL of the deployed form in the address bar. Notice that the Submit button on the end of the form is now available. Expand the information for the Coffee Feedback application by clicking the Show application details button for application. The link is provided on the screen in the URL Links section. Copy the URL for distribution to your coworkers. Updating an application after deployment \u2013 You can change an application at any time. However, you must deploy the application again for users to see your changes. There are two ways to change a deployed application: Update the deployed application, or stop the deployment, and then redeploy. To update a deployed application, in the Manage tab click the Edit link. A message is displayed to warn you that changing an application after it is deployed can affect previously collected data. Click Yes on the warning message. The form opens and is available for editing. Make the required changes to the form. Save the form again. Click the Manage tab, then click the Deploy link. Click Update. The application is redeployed with the updated form. You can also stop the deployment manually, make changes, then redeploy the application. If a deployment is stopped, the application is no longer available online. To stop a deployed application, click the Deploy link. The Deployment Settings window opens Click Stop. Note: If a user is completing the form when you stop, redeploy, or update an application, they receive an error message. The unsubmitted data is lost and the user must fill the form in again. Adding sample data to an application \u2013 Now that the form is complete and deployed, add some sample data. Click the Launch link. The application opens in a new browser window. Submit the form several times with various sample data. Here are some examples to try, but you can use your own combination of survey results. John Smith who drinks the office coffee. He prefers dark roast, and does not enjoy the office coffee because it is too weak and cold. Mary Jones who drinks only tea. Sam Wesson who drinks the office coffee. He likes a medium roast and like the coffee the way it is. He would like management to try a different roast combination by a local roast house. Ellen Steele who drinks the coffee, but prefers decaffeinated coffee. She would like the coffee to be weaker. Note: As you submit each survey, you see a message upon completion, and then are redirected to the company website. Viewing submitted data \u2013 After the sample data is added, return to Leap to review the submitted data. In the Manage tab, click the View Data link. The View Data screen is displayed in either a new tab or a new browser window, depending on your browser settings. On the View Data page, all submitted responses are summarized in a chart. Click Sam Wesson\u2019s name. His submitted form is displayed in the Application view. Deleting sample data \u2013 Now that you tested the form, it is highly recommended that you delete all sample responses to avoid interference with the actual data from your coworkers. There are two ways to delete the sample data: Delete individual entries from the View Data screen Update the deployment to delete previous records. To delete submitted data from the View Data screen: Select a sample record from the list so it is displayed in the Application view window. If the form is wider than the allotted screen space, scroll bars are displayed. Click Delete Record in the Application view window. Note: Clicking the x in that window closes the record, but does not delete it. To delete submitted data by updating the deployment: Close the View Data tab or browser window. You are on the Leap Manage screen. Click Deploy. The Deployment Settings window opens. Click the Advanced tab. Select the check box for Delete previous submissions. You are asked to confirm the deletion of the submitted data. Click OK. Click Update. Click the View Data link. The blank View Data page is displayed. The survey form is complete and ready to send to your coworkers. You can send out the survey link in an office-wide email. After two weeks, the survey deployment period ends, and you provide the survey results to the Office Manager. Parent topic: Building a Survey application","title":"Building a survey with Leap"},{"location":"tut_survey_application_module1.html#building-a-survey-with-leap","text":"This tutorial contains two sections. In the first section, Opening Leap and building a form, learn how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase In the second section, Application Management, learn how to: Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data The scenario: The coffee services in your office are not ideal. Every morning in the break room, you hear coworkers complain about the coffee, but nothing is being done to improve the coffee at work. Your Office Manager asks you to find out how your coworkers would like the coffee services changed. You must poll everyone in the office to get their opinions. Your options: Email Send out an email to all your coworkers and ask them to provide their opinions on the coffee and how it can be improved. If you send out a mass email, sporadic responses from people arrive throughout the day, cluttering up your inbox. You must then take the feedback from the emails and collate it in a spreadsheet program, and there is no easy way to track who did not answer. Create a survey Create a survey form in Leap. You email the survey link to your coworkers, and they go online to provide you with feedback. All results are stored in a database and are easy to review and sort, and your email inbox is not filled with the sporadic responses. Creating a survey is the option that you select. Note: Throughout the Leap documentation, the words \u201cform\u201d and \u201capplication\u201d are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather information that is submitted by users when they complete the form, and automatically store the submissions in a database. Estimated time that is required to complete this module: 50 - 60 minutes","title":"Building a survey with Leap"},{"location":"tut_survey_application_module1.html#lesson11","text":"The following steps describe how to open a new Leap application and build a form. You want your coffee feedback to have: An area that contains the title of the form, and a description of the purpose of the form. Include the amount of time that is needed to complete the form. An area that contains the name of the submitter. Also included in this area if the form is the basic question: \"Do you drink the coffee that is brewed in the office?\" An area that contains the survey questions. Creating an application \u2013 When you start Leap, a screen is displayed with two tabs on the Forms toolbar: Use and Manage. The Use tab displays a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. Click New Application. Enter a descriptive Application Name and Application Description, and select Create. A blank form with a two-by-two grid is displayed. The grid automatically aligns form items with one another when you place them on the form, and expands as you add form items. You can add and delete columns and rows as needed by clicking the border bar surrounding the grid. Note: As you add sections and form items to the form, the grid automatically expands to include the additional form items. You can add extra rows to your form manually, but it is not required. If there are empty rows or columns in a completed form, they are not displayed when the form is previewed or deployed. When you design forms, there are two ways to add form items to your form: You can drag form items from the Palette onto the form You can select a location on the grid, then click a form item. The form item is placed into the grid location. You can build forms by placing form items directly on the form or grouping form items in Sections. For our coffee feedback form, we use Sections to organize the form items. Sections are useful for the following reasons: They group form items in a way that is easy for the user to understand. When the form is viewed, the sections have specific background colors that are based on the style that is applied to the form. They make applying complex form functionality easier. For example, our form has a rule to hide the survey until the user selects a specific option. Instead of setting the rule on every form item individually, the rule is on the section. The rule applies to every form item within the section. They allow the form designer, and the form user, to collapse and expand entire parts of the form. In longer forms, collapsing sections is useful, as it keeps the form submitter from being overwhelmed by too much information. If you finish building your form and decide to change the layout, moving sections of form items is much easier than moving each form item individually. Creating the general information area: The general information area contains the title of the survey, more information for the form submitter, and an estimated time for completion. Drag a Section onto the form. The Section is placed into the grid area, and is highlighted to show the section has focus. Notice that the Section contains a grid within it. Form items for a section are added to the grid of the section. Click the field spanning handle and drag it to extend the section over both columns. You can resize any form item to span across multiple rows or columns. Click a grid box, then select Image from the Palette. The image form item is added to the form. You can edit many form items directly on the form, but others require you to use the Properties side panel. To display the list of available options for any form item, click the item on the canvas. The Properties side panel opens. Click Add file, then Browse to locate the logo of your company. If you do not have a logo, browse to a small resolution image on your computer. Click Open to select the image, and OK to close the Add File or URL Link window. The image is added to the form. Add a Text item to the Image. This text item contains the name of the survey. In the Size menu, set the font size to Large, then and Bold. Type Workplace Coffee Feedback and click OK. The formatted text is inserted into the form. Note: You can adjust the spacing between form items by dragging the slider in the border bar. The mouse changes to a slider, and you can adjust the proportions of the form items. Add another Text item with the image. Using the field spanning handle, drag the form item to span both columns. Enter the following text: We\u2019d like your feedback on coffee services in the office. Complete the survey to provide your feedback. Time to complete survey: 3 minutes or less. Click OK to add the text to the form. Save the form, either by pressing Ctrl + S, or by clicking the Save icon. Creating the primary information area: Now, create the section that collects the name of the submitter, and asks the basic question of \u201cDo you drink the office coffee?\u201d You want to have 100% participation, but not everyone in the office might drink coffee. By allowing users to submit the survey with a negative response, you receive a complete set of data. Set a rule on the survey section to ask coffee-relevant questions only if the submitter indicates that they drink the office coffee. Add another Section to the form. Click the field spanning handle and drag it to extend the section over both columns. Click a grid box, then click Single Line Entry. The Single Line Entry is placed onto the form. Edit the title of the Single Line Entry directly on the form. Click the title of the item: \u201cSingle Line Entry\u201d. The text is highlighted, and is now editable. Change the text to read: Your Name. Click Add hint... and type \u201cEnter your given name and surname.\u201d The hint is displayed directly on the form. Tip: Adding information to the hint fields gives more information that helps the user complete your form. For example, in this form, you ask for the user name. The hint helps clarify whether you want given name and surname, given name only, or given , middle, and surname. You can also provide more clarification for users by inserting place holder text into each Single Line Entry item. Place holder text is available in the Properties side panel, and is available for any form item where the user must type information. For example, Single Line, Multi-Line, Currency, Number, and Email. In the Single Line Entry on the canvas, click the box that is labeled Click to set as required. Users must complete this field to submit the form. Select Select One from the Palette and put it in a grid area with the Your Name text item. The Properties side panel opens. Change the Title: to Do you drink the office coffee? Click the Required check box to make this question mandatory. In the Options: section, one option is automatically available. To add another option, click the Add option plus sign. Set the options to: Yes No, I drink other hot beverages. No, I don\u2019t drink hot beverages. Displayed Value and Saved Value \u2013 When you use any form item that has Set Options, two fields are displayed: Displayed Value and Saved value. As you type in the Displayed Value, the Saved Value is automatically updated with the same value. There are some cases where the Saved Value differs from the Displayed Value. For example, our Displayed Value questions are long. If you export the data from a Leap application to a spreadsheet, the selected answers are truncated and the data might be difficult to interpret. If you change the Saved Values of the three questions to \u201cYes\u201d, \u201cOther\u201d, and \u201cNo\u201d, or assign numerical values, the results are easier to understand. Click OK. Save your form and preview it. The Preview icon is located with the Save icon. Note: Ensure that your browser does not block pop-up windows, as the preview form opens in a new window or new tab, depending on your browser settings. Notice that the Submit and Cancel buttons are automatically added for you. While you can enter data into the form in Preview mode, you cannot submit a form until it is deployed. To return to building the form, close the tab or the browser window in which the preview opened. Creating the survey: Now create the section which contains the survey questions. This section has a rule set on it, so if the user selects \u201cNo, I drink other hot beverages\u201d or \u201cNo, I don\u2019t drink hot beverages\u201d, the survey is not displayed. First create the rule, then add the survey to the section. Click the border bar to access the row action menu. Select Insert Row (after). Click Section from the Palette, then click the form. Extend the section over both columns. Click the Rules icon. The Rules window opens. Click Add Rule. In the When this is true: section, select Do you drink coffee?. Set the operation to Does not equal. Leave A fixed value in the next menu and select Yes. In the Perform this action section, select Survey in the first menu. As you build the rule, it is automatic error checking is performed. If there is an error in the logic, either a warning sign or an error sign is displayed. As this rule contains no errors, a verification icon is displayed. Select Hide in the second menu. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user responds that they don't drink coffee, they are not shown the survey about what type of coffee they prefer. Now that the rule is set, add the survey questions using: Two Survey form items: one to ask what roast of coffee the employees prefer, the other to ask them questions about the coffee provided. A Select Many form item to provide more information about what they like or dislike about the coffee. A Multi-Line Entry form item to provide detailed comments. Select Survey from the Palette and add it to the section grid. Extend the survey over both columns. Set the following properties in the side panel: Title: \u2013 Coffee preference Hint: \u2013 What type of coffee roast do you prefer? Options: Dark Roast Medium Roast Light Roast Decaf Click OK. Change the survey question from the default \u201cClick to edit\u201d to I prefer to drink: Select Survey from the Palette and add it with the Coffee preference survey. Extend the survey over both columns. In the Properties panel, set the following properties: Title: \u2013 Please rank each question: Options: Displayed Value Saved Value Totally agree 5 Somewhat agree 4 Agree 3 No opinion 0 Somewhat disagree 2 Totally disagree 1 If you export the data to a spreadsheet program, each user\u2019s response displays as the numerical code, rather than the Displayed Value. Tabulation of results is easier as you can sort the submitted responses by Saved Value numerical indicator. Review the ranking labels. Ranking labels are displayed before and after the Displayed Value. Set the following properties: Select Display before and after labels. In the Before label: text box, typeAgree. In the After label: text box, typeDisagree. Change the survey question from the default \u201cClick to edit\u201d to: I like the coffee at work. Click Add question to add another row to the survey. Change the survey question to: If changes were made, I would drink more coffee. You can repeat this step to add more questions to the survey. An alternative to multiple survey questions is to add a Select Many form item where users can select multiple choices from a list. Click Select Many from the Palette and place it onto the form near the survey. Extend the Select Many form item over both columns. The properties panel opens. Note: You can change the orientation of the Select Many choices by changing the Choice Layout. Changes are made instantly on the form. You can also select a minimum and maximum number of choices the user can select. Set the following properties: Title: \u2013 I find the coffee in the office: Hint: \u2013 Select all that apply. Options: Too acidic Too bitter Too weak Too strong Goes cold too quickly Too gritty Perfect. No changes required. For example, you can require the user to select a minimum of two choices and a maximum of 5. Click OK. Save the form. To complete the survey form, add a Multi-Line Entry so users can submit other options, or opinions. Click Multi-Line Entry from the Palette and place it onto the form with the Select Many form item. Extend the Multi-Line Entry form item over both columns. The properties panel opens. Set the following properties: Title: \u2013 Please enter any specific suggestions you might have: Width: \u2013 Full width. Selecting Full width results in the space for entering data automatically adjusting to the size of the form in the browser window. Hint: \u2013 For example, a specific bean blend you\u2019d like us to try. Click OK. The functionality of the survey is now in place. When users complete the survey and submit it, they receive a visual confirmation on the screen that the survey is submitted, and by default, are shown the survey again. To prevent user confusion, and to prevent the user from submitting the form again, redirect the user to your company website after the form is submitted. Adding a redirect URL is done in the Workflow tab. By default, each form automatically has a Start stage and a Submitted stage. The Start stage contains the Submit and Cancel buttons that are seen when you preview the form. Click the Workflow tab. Click the Submit button node. The Properties panel opens. The Action Completion Message: has \u201cYour data has been successfully submitted.\u201d as the default message. You can leave the default, or change the text. In the Action Completion Redirect URL (optional): text entry area, enter the URL of your company website. Click the Design tab to return to the main body of the form. The coffee survey is now complete. Save and preview the form. Now that you have built a form, you must deploy it so it is available for users.","title":"Opening Leap and building a form"},{"location":"tut_survey_application_module1.html#lesson12","text":"The following steps describe how to deploy a completed form, launch a form, enter sample data, review the submitted sample data, then delete the submitted sample data. Deploying an application \u2013 Deploying, or publishing forms is done in the Manage tab. Click the Manage tab. Click the Deploy link for your survey. The Deployment Settings window is displayed. Select Set deployment Period. Set the Start and Stop dates to span a two week window, starting today. Tip: It is useful to have a start and end date for some applications because users are forced to complete the form within a specific time frame. Click Start. The application is deployed. After the application is deployed, you need the URL to provide to your colleagues so they can complete the survey. There are two ways to get the URL: Click the Launch link. A browser window launches with the URL of the deployed form in the address bar. Notice that the Submit button on the end of the form is now available. Expand the information for the Coffee Feedback application by clicking the Show application details button for application. The link is provided on the screen in the URL Links section. Copy the URL for distribution to your coworkers. Updating an application after deployment \u2013 You can change an application at any time. However, you must deploy the application again for users to see your changes. There are two ways to change a deployed application: Update the deployed application, or stop the deployment, and then redeploy. To update a deployed application, in the Manage tab click the Edit link. A message is displayed to warn you that changing an application after it is deployed can affect previously collected data. Click Yes on the warning message. The form opens and is available for editing. Make the required changes to the form. Save the form again. Click the Manage tab, then click the Deploy link. Click Update. The application is redeployed with the updated form. You can also stop the deployment manually, make changes, then redeploy the application. If a deployment is stopped, the application is no longer available online. To stop a deployed application, click the Deploy link. The Deployment Settings window opens Click Stop. Note: If a user is completing the form when you stop, redeploy, or update an application, they receive an error message. The unsubmitted data is lost and the user must fill the form in again. Adding sample data to an application \u2013 Now that the form is complete and deployed, add some sample data. Click the Launch link. The application opens in a new browser window. Submit the form several times with various sample data. Here are some examples to try, but you can use your own combination of survey results. John Smith who drinks the office coffee. He prefers dark roast, and does not enjoy the office coffee because it is too weak and cold. Mary Jones who drinks only tea. Sam Wesson who drinks the office coffee. He likes a medium roast and like the coffee the way it is. He would like management to try a different roast combination by a local roast house. Ellen Steele who drinks the coffee, but prefers decaffeinated coffee. She would like the coffee to be weaker. Note: As you submit each survey, you see a message upon completion, and then are redirected to the company website. Viewing submitted data \u2013 After the sample data is added, return to Leap to review the submitted data. In the Manage tab, click the View Data link. The View Data screen is displayed in either a new tab or a new browser window, depending on your browser settings. On the View Data page, all submitted responses are summarized in a chart. Click Sam Wesson\u2019s name. His submitted form is displayed in the Application view. Deleting sample data \u2013 Now that you tested the form, it is highly recommended that you delete all sample responses to avoid interference with the actual data from your coworkers. There are two ways to delete the sample data: Delete individual entries from the View Data screen Update the deployment to delete previous records. To delete submitted data from the View Data screen: Select a sample record from the list so it is displayed in the Application view window. If the form is wider than the allotted screen space, scroll bars are displayed. Click Delete Record in the Application view window. Note: Clicking the x in that window closes the record, but does not delete it. To delete submitted data by updating the deployment: Close the View Data tab or browser window. You are on the Leap Manage screen. Click Deploy. The Deployment Settings window opens. Click the Advanced tab. Select the check box for Delete previous submissions. You are asked to confirm the deletion of the submitted data. Click OK. Click Update. Click the View Data link. The blank View Data page is displayed. The survey form is complete and ready to send to your coworkers. You can send out the survey link in an office-wide email. After two weeks, the survey deployment period ends, and you provide the survey results to the Office Manager. Parent topic: Building a Survey application","title":"Application management"},{"location":"tut_tutorials_toc.html","text":"Tutorials for app design The HCL Leap tutorial section contains two tutorials to help you learn to use Leap. HCL Software U: Application development Building a Survey application This tutorial describes how to build a simple survey application with HCL Leap. Adding tables and workflow elements to a HCL Leap form This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial.","title":"Tutorials for form design"},{"location":"tut_tutorials_toc.html#tutorials-for-app-design","text":"The HCL Leap tutorial section contains two tutorials to help you learn to use Leap. HCL Software U: Application development Building a Survey application This tutorial describes how to build a simple survey application with HCL Leap. Adding tables and workflow elements to a HCL Leap form This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial.","title":"Tutorials for app design"},{"location":"tut_video_overview.html","text":"HCL Software U: Application development Introduction to application development HLP-CD-101 Introduction to Application Development Parent topic: Tutorials for app design","title":"Video -- Creating and deploying an application using Leap"},{"location":"tut_video_overview.html#videoibmformsexperiencebuilder","text":"","title":"HCL Software U: Application development"},{"location":"tut_video_overview.html#section_pjl_n4m_lzb","text":"HLP-CD-101 Introduction to Application Development Parent topic: Tutorials for app design","title":"Introduction to application development"},{"location":"upgrade_application_design.html","text":"Upgrading an application design The upgrade feature allows an application design to be replaced by a new version. You many want to make significant changes to your application but do not want to affect the running version while you finalize the details. If you create a copy of the application, using export and import, you can make and test all changes. The copy can be edited, deployed, and records submitted without affecting the original application. Once you have completed the changes on the application copy, you can upgrade the original app with the export of the copy. The original app will maintain its application identification, but will also contain all the changes from the copy. Export an existing application: Select a local directory where the application file will stored. Select New Application > From Existing > Next . Choose the application from your local directory and click Create . Note: The imported application will have the same name as the original - edit the name to distinguish it from the original. It is also recommended that you change the access permissions so that others may not use the application while it is in development. Edit the new application to work on the next iteration of the app. This can be deployed and tested, without interfering with the original application. When satisfied, Export the new application (without data): In the original application, select Upgrade and choose the exported new application (ex. MyApp v2). Note: Do not check Replace submitted data . This will result in the older app (MyApp) being upgraded to the newer version. Decide if you are going to keep the copy for further future edits or delete it. Parent topic: Creating and managing applications","title":"Upgrading an application design"},{"location":"upgrade_application_design.html#untitled1","text":"The upgrade feature allows an application design to be replaced by a new version. You many want to make significant changes to your application but do not want to affect the running version while you finalize the details. If you create a copy of the application, using export and import, you can make and test all changes. The copy can be edited, deployed, and records submitted without affecting the original application. Once you have completed the changes on the application copy, you can upgrade the original app with the export of the copy. The original app will maintain its application identification, but will also contain all the changes from the copy. Export an existing application: Select a local directory where the application file will stored. Select New Application > From Existing > Next . Choose the application from your local directory and click Create . Note: The imported application will have the same name as the original - edit the name to distinguish it from the original. It is also recommended that you change the access permissions so that others may not use the application while it is in development. Edit the new application to work on the next iteration of the app. This can be deployed and tested, without interfering with the original application. When satisfied, Export the new application (without data): In the original application, select Upgrade and choose the exported new application (ex. MyApp v2). Note: Do not check Replace submitted data . This will result in the older app (MyApp) being upgraded to the newer version. Decide if you are going to keep the copy for further future edits or delete it. Parent topic: Creating and managing applications","title":"Upgrading an application design"},{"location":"upgradingleap_sec.html","text":"Upgrading The following topics describe how to upgrade Leap. Upgrading Leap on a traditional platform The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Parent topic: Deploying Leap","title":"Upgrading"},{"location":"upgradingleap_sec.html#upgradingleap_sec","text":"The following topics describe how to upgrade Leap. Upgrading Leap on a traditional platform The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Parent topic: Deploying Leap","title":"Upgrading"},{"location":"wf_managing_the_files_associated_with_your_appl.html","text":"Managing the files associated with your application You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab You can upload files such as images, JavaScript\u2122, or CSS files from the Settings tab. Files are also uploaded using many form items, such as Media, Image, Button, Page Navigation, and Text, when creating your form. Once a file is uploaded, use the file manager to update, copy or delete files. HCL Leap maintains references on the relationships between the files and where they are placed on the form. The files stored in the file manager are also exported with the application. Uploading files for use in your application The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. Parent topic: Creating and managing applications","title":"Managing the files associated with your application"},{"location":"wf_managing_the_files_associated_with_your_appl.html#managingthefilesassociatedwithyourapplication","text":"You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab You can upload files such as images, JavaScript\u2122, or CSS files from the Settings tab. Files are also uploaded using many form items, such as Media, Image, Button, Page Navigation, and Text, when creating your form. Once a file is uploaded, use the file manager to update, copy or delete files. HCL Leap maintains references on the relationships between the files and where they are placed on the form. The files stored in the file manager are also exported with the application. Uploading files for use in your application The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. Parent topic: Creating and managing applications","title":"Managing the files associated with your application"},{"location":"whats_new.html","text":"What's new in 9.3.5? For a full list of fixes by release, see this article . New features Bug fixes. 9.3.4 Bug fixes. Added support for Secrets in Kubernetes. For more information, see helm_admin_customsecret.md . 9.3.3 Support for Custom Widget API. For more information, see customwidgetapi_landing.md . Support for PostgreSQL databases. For more information, see create_postgresql_db.md . Admin Application Dashboard. For more information, see admin_application_dashboard.md . 9.3.2 Open Liberty support. For more information, see the following topics: deploy_container_kubernetes_openliberty.md 9.3.1 New Copy/Paste feature. The \"copy/paste\" feature enables the application author to copy an item from their form and paste it into another page/form/app page within the same application or another one on the same Leap server. For more information, see cr_copying_items.md . New Workflow Branching feature. The \"workflow branching\" feature enables the application author to specify a condition that changes where a submitted form is directed. For more information, see sub_adding_stages_toc.md#section_hjd_3rw_rvb . Improved HTML editor experience. Improved page navigation and validation behavior, including custom error handling with JavaScript API. Refreshed Workflow diagram UI. Administrative improvements: Beginning with this release, Leap has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. For more information, see leap_strict_csp.md . Kubernetes-friendly Container. Access to service descriptions may be restricted by user, group or special role (i.e. authenticated, anonymous, etc). For more information, see the following topics: ref_service_deploying_service_description.md co_configuration_properties.md 9.3 UI Improvements: Tabs across the top are replaced by a sidebar. Added breadcrumb navigation Updated the toolbar Item Properties are now shown in a side panel instead of a modal dialog. New Workflow Design. New apps will have two stages: Start and Submitted. Improved user experience for Action Properties and Submit Activities Improved user experience for Workflow Stage Visibility Improved user experience for Stage Properties and Roles/Permissions New Palette Items: App pages. App Pages provide a free-form app building canvas, and allow authors to build anything from simple welcome pages to complex dashboards. App pages differ from Forms, which provide a canvas that specifically defines an interface to collect and store data with a built-in function to submit a record and move it through workflow stages. For more information, see Creating an application and navigate to Step 4. DataGrid RichText Entry field Name Picker field Other: New service activity timing: before or after data is submitted Support for Role based rules allows authors to define a rule with the condition that a user is or is not in a particular role. For more information, see Creating rules in your application . Support for Stage based rules allows authors to define a rule with a condition that the form is or is not in a particular stage. New javascript functions are supported. For more information, see Interface objects . New options for redirecting: redirect to another Leap Application, web URL, form or app page. For more information, see Redirecting users after form submission . New form property Show print and delete buttons. User\u2019s can now determine where to save a filled PDF. For more information, see Saving a PDF to a file location. Ability to add a custom theme to be shared by multiple applications. 9.2.1 Support for the following: Oracle 19c: New features include: Embedding of forms without an <iframe> 9.2 New features include: New Application wizard Create an application directly from an existing Excel spreadsheet Send attachments in email notifications (including filled PDF\u2019s) Numerous visual and usability improvements, including: Double-click to open item properties One-click \u201ccopy to clipboard\u201d on URLs and embed codes Improved first-time-user experience Redesigned palette Additional confirmation prompts on irreversible actions Stylistic improvements to the \u201cManager\u201d page Addition of \u201chas value\u201d and \u201cnot\u201d operators for View Responses and the Data REST API Addition of \u201chas value\u201d and \u201chas no value\u201d for rules Improved experience for those using FlexNet licensing Print view enhancements Vertical table layout option (for wide tables) Removed application size limit Use the \u201cData Label\u201d property mark-up is instrumented to allow for easier manipulation Better default logging on failed service calls Attachment clean-up service now configurable Include record UID in exported spreadsheets General fixes and security patches 9.1 New features include: PDF document integration enhancements: Store filled PDFs to a network drive Map Table items to tables in a PDF Ability to flatten a filled PDF New JavaScript API functions: app.getLocation() item.setColumnHeaders() and item.getColumnHeaders() for Table items A new \u201cCustom Attribute\u201d property Full accessibility of the date picker Ability to render HCL Leap applications within ElectronJS desktop applications New applications now have a middle \u201cSubmitted\u201d stage by default Option to block UI interaction while a service call is executing Ability to hide the \u201cUse\u201d tab General fixes and minor improvements 9.0 New features include: New JavaScript API functions: BO.isValid() , BO.getInvalidMessages() , and app.showMessage() . \"Reply To\" capability for email notifications. Allow attachments to be viewed in browser instead of downloading. Display Data Label property in View Responses. Custom JavaScript editor is now resizable. Design-time usability improvements for service calls. General and security fixes. 8.6.4.2 Support for the following versions: Oracle 12c and 11g 10.5 and 11.x 8.5.5 and 9 Java\u2122 7 Derby 10.10.2 ICU 55.1 New features include: An updated Styles tab to enable easy customization of an application's appearance through changes to colors, fonts and other style attributes. Use the provided Customize action to customized your theme and then use the theme export and import functionality to style other applications with the same theme. Previously available styling features, like the ability to add additional custom CSS are still available and contribute to the overall look of an application, but are not edited or modified as part of the new theme customization feature. For more information, see Styling your application with a custom theme . Application owners can now import a set of data from a spreadsheet into an application. An Import Data button for each application is provided in View Responses. Data can be imported from recent versions of xls and xlsx and the data must conform to specific application constraints and setup requirements. For more information, see Importing data in view responses . Application designers will now have the choice to store filled PDF documents as an attachment as part of a submitted record, rather than simply returning the filled PDF to the user. For more information, see Mapping form items to PDF fields and storing the filled PDF . General and security fixes. 8.6.3 Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: An easy-to-use Format feature. Line of Business users can enter simple expressions samples of the required format to set format parameters. More advanced users can enter regular expressions. A customizable error message is also available for this feature. Post deployment window containing all the details that are required to start using your application. After you deploy an application, the window opens and describes the\u201cNext Steps\u201d available. Send the launch URL to your users so they can access the application. URLs for viewing responses, charts, and other options are also displayed. The post deployment dialog is also displayed when you import and deploy an application. When you import an existing application, you can choose to remove users from theAccess page. Clearing the previously added users ensures only the people you add to the application have access. After importing an application, use theAccess page to review and modify the existing permissions. The editor for adding rich text to your application was updated. The Data Access Rest API contains additional filtering parameters to allow more specific refinement of the response data. The following API usability enhancements were added: Simplified JSON requests and response structures. New metadata option Automatic generation of swagger files for applications. A new Service Configuration window where you can quickly set up your application to make JSON service calls. For more information, see cr_in_app_service.md . The addition of a new configuration flag that disables the embedding of your application into other web sites. General usability enhancements include: Carbon Copy and Blind Carbon Copy fields for Stage Action emails. New Welcome text on the Manage page. On the Manage page, you can access the Summary Charts URL. This link takes a user with the appropriate permission settings to the stand-alone Summary Chart page. Security fixes. General bug fixes. 8.6.2 Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: A new Events tab for easier management of custom JavaScript\u2122 within an application. The Events tab displays all JavaScript used within an application. A new Alterntative text tag for Image and Media form items. To increase the accessibility of your form, you can now add alternative text to the Image and Media form items. You can now import a list of choices from a spreadsheet into Select One , Select Many , and Dropdown form items. The lists can be comma separated, or space separated. If you copy two columns of choices from a spreadsheet, the first column is set as the Displayed Value, and the second column set as the Saved Value. In the Settings tab, under Files , you can now download any previously uploaded file. A Java 2 Connector (J2C) provider is now supported for use in the HTTP Service Transport with . A new openURL query parameter so you can dynamically set a application to open at run time. The Media form item is supported in Google Chrome via HTML5. Two new JavaScript functions were added to the User Interface Objects: setTabTitle and setTabTitleList . The amount of Stage Action data an application can have has been increased. General and security fixes. 8.6.1 Support for the following versions: Oracle 11g 10.5 8.5.5 Java 7 Derby 10.10.2 New features include: Document Integration : Where compliance or regulatory requirements mandate it, integrating captured data with existing documents can be an important part of the overall solution. These output documents can be provided for precise printing, document signing or archiving. Using a Service Configuration, you can map form items to PDF items. When the user clicks a button, the PDF is populated. For more information, see document integration . integration features Render parameters : Two public render parameters were added to provide additional portlet-to-portlet communication. For more information, see ref_public_render_parameters.md Page refresh setting : A new page refresh setting is available in the Shared Settings . This property lets you set whether the portal page is refreshed when the form is submitted. For more information, see in_portlet_selecting_application_using_edit_shared_setting.md . Support for non-default portal context root : The Leap Portlet now supports portal with a non-default context root, or an empty context root. Script Portlet and DDC samples : Two new samples are available for usingwith . Both samples are available on the developerWorks\u00ae wiki: DDC integration Script Portlet integration Additional in-product help : If you're new to , blue help bubbles describe the basic function of each page or section, as well as provide additional help resources. Additional hover help, and context sensitive help were added throughout the application. JSON is now supported in the : HTTP Transport JavaScript Data Access Rest API New JavaScript functionality : New JavaScript functions were added to the User Interface Objects. Forms Tab : Moving items in an application : You can now move form items between pages of a form. For more information, see cr_moving_items_on_a_form.md . Order of forms in a application : You can change the order of the forms within an application by dragging and dropping them in the Outline view. When the application is deployed and launched, the first form in the application becomes the default form seen by the user. Warning message on Save : does not support multiple people editing the same application. If you and another user edit the same application, and the other user saves changes while you are still editing, a warning message is now displayed asking if you want to overwrite the changes made by the other user. Date item loads current date : A new property is available for the Date field. When selected, if the user leaves the Date field empty, the current date is loaded upon form submission. If the user fills in the date field, the date supplied by the user is used. Single and Multi-Line entries uppercase : This new feature, located in the Basic tab of the Properties window lets you automatically change the user's entered text into upper case letters. Hiding Table buttons for Add, Edit, and Delete : In the Advanced tab for a Table , you can now set that no buttons are displayed with your table. The buttons can be enabled using JavaScript, if required. Manage Tab : Default sort order : Default sort order was changed so the most recently changed applications are listed at the top. Now you can quickly find recently modified applications. Alphabetical sorting is still available, but no longer the default. Redeploy after saving : When you edit an application, and save the changes you must redeploy the application for the changes to be implemented. A visual indicator is now displayed as a reminder when an application has changes that have not been deployed. Adding tags to an application : When you create a new application, you can add tags at the same time. Tags are used to search for applications in the Manage screen. Previously, you could only add tags to your application after it was created and listed in the Manage tab. Tags are separated by spaces, so if you need to make a multiple-word tag, use an underscore between the words. Access Tab : The \"All Authenticated Users\" group cannot be added to any role that has Edit permissions. Users can still be assigned individually, or as groups, to roles with edit permissions. This prevents your application from showing up in the Manage Tab for all authenticated users, and from their applications appearing on your Manage tab. You see only the applications you created, or those to which you have edit permissions. Rules : Naming Rules : You can now name and rename rules. Providing unique, descriptive names to rules makes them easier to find when building your application. See which item is used in a Rule : When a form item has a rule enabled, the Rules icon for the item contains a check mark. The check mark lets you quickly see which form items are involved in a rule. Stages : Stage Description : When you create a new Stage, you can add a detailed description. Adding descriptions is useful if you will have several similarly named stages that perform slightly different portions of the workflow. Rich Text Action Completion Message : The Action Completion Message is now a rich text field. Success message after submission : When a user completes and submits a form, the new default is to take the user away from the form and display the Action Completion Message. This reduces user confusion as they no longer see an empty, reloaded form on the screen. The existing options for the action taken upon form submission are still available in the Edit Form Properties window. View Responses : Individual Print, Email, and Delete buttons added : Print, email and delete buttons were added to each record row, so you can access them without opening each individual record. Email option contains the link to the record : The email operation emails the link to both print and launch the record. New fields added to Responses screen : \u201cCreated on\u201dand \u201cLast Updated By\u201d were added to the table so you can see additional information on each submitted form. Selected results open in a new window : When you click on a submitted record, it opens in a window, rather than in a side pane. Default view changed : When you click the View Responses link, the default view is now Responses , rather than Summary . A number of upgrade routine fixes, accessibility, and usability changes were implemented. Values entered into the password item are not stored in your application. Since the password is never stored, it is never exported or shown in any field. The password field is empty when the form is rendered in its next stage. Using the password for calling server-side services during stage transitions still work as the value is included as part of the submitted data and not stored as part of the application record.","title":"What's new?"},{"location":"whats_new.html#whatsnew","text":"For a full list of fixes by release, see this article .","title":"What's new in 9.3.5?"},{"location":"whats_new.html#section_zml_blt_b1c","text":"Bug fixes.","title":"New features"},{"location":"whats_new.html#section_y12_hlh_jzb","text":"Bug fixes. Added support for Secrets in Kubernetes. For more information, see helm_admin_customsecret.md .","title":"9.3.4"},{"location":"whats_new.html#section_f3b_htl_2yb","text":"Support for Custom Widget API. For more information, see customwidgetapi_landing.md . Support for PostgreSQL databases. For more information, see create_postgresql_db.md . Admin Application Dashboard. For more information, see admin_application_dashboard.md .","title":"9.3.3"},{"location":"whats_new.html#section_um3_2mt_2xb","text":"Open Liberty support. For more information, see the following topics: deploy_container_kubernetes_openliberty.md","title":"9.3.2"},{"location":"whats_new.html#section_vzz_w4p_rvb","text":"New Copy/Paste feature. The \"copy/paste\" feature enables the application author to copy an item from their form and paste it into another page/form/app page within the same application or another one on the same Leap server. For more information, see cr_copying_items.md . New Workflow Branching feature. The \"workflow branching\" feature enables the application author to specify a condition that changes where a submitted form is directed. For more information, see sub_adding_stages_toc.md#section_hjd_3rw_rvb . Improved HTML editor experience. Improved page navigation and validation behavior, including custom error handling with JavaScript API. Refreshed Workflow diagram UI. Administrative improvements: Beginning with this release, Leap has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. For more information, see leap_strict_csp.md . Kubernetes-friendly Container. Access to service descriptions may be restricted by user, group or special role (i.e. authenticated, anonymous, etc). For more information, see the following topics: ref_service_deploying_service_description.md co_configuration_properties.md","title":"9.3.1"},{"location":"whats_new.html#93","text":"UI Improvements: Tabs across the top are replaced by a sidebar. Added breadcrumb navigation Updated the toolbar Item Properties are now shown in a side panel instead of a modal dialog. New Workflow Design. New apps will have two stages: Start and Submitted. Improved user experience for Action Properties and Submit Activities Improved user experience for Workflow Stage Visibility Improved user experience for Stage Properties and Roles/Permissions New Palette Items: App pages. App Pages provide a free-form app building canvas, and allow authors to build anything from simple welcome pages to complex dashboards. App pages differ from Forms, which provide a canvas that specifically defines an interface to collect and store data with a built-in function to submit a record and move it through workflow stages. For more information, see Creating an application and navigate to Step 4. DataGrid RichText Entry field Name Picker field Other: New service activity timing: before or after data is submitted Support for Role based rules allows authors to define a rule with the condition that a user is or is not in a particular role. For more information, see Creating rules in your application . Support for Stage based rules allows authors to define a rule with a condition that the form is or is not in a particular stage. New javascript functions are supported. For more information, see Interface objects . New options for redirecting: redirect to another Leap Application, web URL, form or app page. For more information, see Redirecting users after form submission . New form property Show print and delete buttons. User\u2019s can now determine where to save a filled PDF. For more information, see Saving a PDF to a file location. Ability to add a custom theme to be shared by multiple applications.","title":"9.3"},{"location":"whats_new.html#921","text":"Support for the following: Oracle 19c: New features include: Embedding of forms without an <iframe>","title":"9.2.1"},{"location":"whats_new.html#92","text":"New features include: New Application wizard Create an application directly from an existing Excel spreadsheet Send attachments in email notifications (including filled PDF\u2019s) Numerous visual and usability improvements, including: Double-click to open item properties One-click \u201ccopy to clipboard\u201d on URLs and embed codes Improved first-time-user experience Redesigned palette Additional confirmation prompts on irreversible actions Stylistic improvements to the \u201cManager\u201d page Addition of \u201chas value\u201d and \u201cnot\u201d operators for View Responses and the Data REST API Addition of \u201chas value\u201d and \u201chas no value\u201d for rules Improved experience for those using FlexNet licensing Print view enhancements Vertical table layout option (for wide tables) Removed application size limit Use the \u201cData Label\u201d property mark-up is instrumented to allow for easier manipulation Better default logging on failed service calls Attachment clean-up service now configurable Include record UID in exported spreadsheets General fixes and security patches","title":"9.2"},{"location":"whats_new.html#91","text":"New features include: PDF document integration enhancements: Store filled PDFs to a network drive Map Table items to tables in a PDF Ability to flatten a filled PDF New JavaScript API functions: app.getLocation() item.setColumnHeaders() and item.getColumnHeaders() for Table items A new \u201cCustom Attribute\u201d property Full accessibility of the date picker Ability to render HCL Leap applications within ElectronJS desktop applications New applications now have a middle \u201cSubmitted\u201d stage by default Option to block UI interaction while a service call is executing Ability to hide the \u201cUse\u201d tab General fixes and minor improvements","title":"9.1"},{"location":"whats_new.html#90","text":"New features include: New JavaScript API functions: BO.isValid() , BO.getInvalidMessages() , and app.showMessage() . \"Reply To\" capability for email notifications. Allow attachments to be viewed in browser instead of downloading. Display Data Label property in View Responses. Custom JavaScript editor is now resizable. Design-time usability improvements for service calls. General and security fixes.","title":"9.0"},{"location":"whats_new.html#8642","text":"Support for the following versions: Oracle 12c and 11g 10.5 and 11.x 8.5.5 and 9 Java\u2122 7 Derby 10.10.2 ICU 55.1 New features include: An updated Styles tab to enable easy customization of an application's appearance through changes to colors, fonts and other style attributes. Use the provided Customize action to customized your theme and then use the theme export and import functionality to style other applications with the same theme. Previously available styling features, like the ability to add additional custom CSS are still available and contribute to the overall look of an application, but are not edited or modified as part of the new theme customization feature. For more information, see Styling your application with a custom theme . Application owners can now import a set of data from a spreadsheet into an application. An Import Data button for each application is provided in View Responses. Data can be imported from recent versions of xls and xlsx and the data must conform to specific application constraints and setup requirements. For more information, see Importing data in view responses . Application designers will now have the choice to store filled PDF documents as an attachment as part of a submitted record, rather than simply returning the filled PDF to the user. For more information, see Mapping form items to PDF fields and storing the filled PDF . General and security fixes.","title":"8.6.4.2"},{"location":"whats_new.html#863","text":"Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: An easy-to-use Format feature. Line of Business users can enter simple expressions samples of the required format to set format parameters. More advanced users can enter regular expressions. A customizable error message is also available for this feature. Post deployment window containing all the details that are required to start using your application. After you deploy an application, the window opens and describes the\u201cNext Steps\u201d available. Send the launch URL to your users so they can access the application. URLs for viewing responses, charts, and other options are also displayed. The post deployment dialog is also displayed when you import and deploy an application. When you import an existing application, you can choose to remove users from theAccess page. Clearing the previously added users ensures only the people you add to the application have access. After importing an application, use theAccess page to review and modify the existing permissions. The editor for adding rich text to your application was updated. The Data Access Rest API contains additional filtering parameters to allow more specific refinement of the response data. The following API usability enhancements were added: Simplified JSON requests and response structures. New metadata option Automatic generation of swagger files for applications. A new Service Configuration window where you can quickly set up your application to make JSON service calls. For more information, see cr_in_app_service.md . The addition of a new configuration flag that disables the embedding of your application into other web sites. General usability enhancements include: Carbon Copy and Blind Carbon Copy fields for Stage Action emails. New Welcome text on the Manage page. On the Manage page, you can access the Summary Charts URL. This link takes a user with the appropriate permission settings to the stand-alone Summary Chart page. Security fixes. General bug fixes.","title":"8.6.3"},{"location":"whats_new.html#862","text":"Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: A new Events tab for easier management of custom JavaScript\u2122 within an application. The Events tab displays all JavaScript used within an application. A new Alterntative text tag for Image and Media form items. To increase the accessibility of your form, you can now add alternative text to the Image and Media form items. You can now import a list of choices from a spreadsheet into Select One , Select Many , and Dropdown form items. The lists can be comma separated, or space separated. If you copy two columns of choices from a spreadsheet, the first column is set as the Displayed Value, and the second column set as the Saved Value. In the Settings tab, under Files , you can now download any previously uploaded file. A Java 2 Connector (J2C) provider is now supported for use in the HTTP Service Transport with . A new openURL query parameter so you can dynamically set a application to open at run time. The Media form item is supported in Google Chrome via HTML5. Two new JavaScript functions were added to the User Interface Objects: setTabTitle and setTabTitleList . The amount of Stage Action data an application can have has been increased. General and security fixes.","title":"8.6.2"},{"location":"whats_new.html#861","text":"Support for the following versions: Oracle 11g 10.5 8.5.5 Java 7 Derby 10.10.2 New features include: Document Integration : Where compliance or regulatory requirements mandate it, integrating captured data with existing documents can be an important part of the overall solution. These output documents can be provided for precise printing, document signing or archiving. Using a Service Configuration, you can map form items to PDF items. When the user clicks a button, the PDF is populated. For more information, see document integration . integration features Render parameters : Two public render parameters were added to provide additional portlet-to-portlet communication. For more information, see ref_public_render_parameters.md Page refresh setting : A new page refresh setting is available in the Shared Settings . This property lets you set whether the portal page is refreshed when the form is submitted. For more information, see in_portlet_selecting_application_using_edit_shared_setting.md . Support for non-default portal context root : The Leap Portlet now supports portal with a non-default context root, or an empty context root. Script Portlet and DDC samples : Two new samples are available for usingwith . Both samples are available on the developerWorks\u00ae wiki: DDC integration Script Portlet integration Additional in-product help : If you're new to , blue help bubbles describe the basic function of each page or section, as well as provide additional help resources. Additional hover help, and context sensitive help were added throughout the application. JSON is now supported in the : HTTP Transport JavaScript Data Access Rest API New JavaScript functionality : New JavaScript functions were added to the User Interface Objects. Forms Tab : Moving items in an application : You can now move form items between pages of a form. For more information, see cr_moving_items_on_a_form.md . Order of forms in a application : You can change the order of the forms within an application by dragging and dropping them in the Outline view. When the application is deployed and launched, the first form in the application becomes the default form seen by the user. Warning message on Save : does not support multiple people editing the same application. If you and another user edit the same application, and the other user saves changes while you are still editing, a warning message is now displayed asking if you want to overwrite the changes made by the other user. Date item loads current date : A new property is available for the Date field. When selected, if the user leaves the Date field empty, the current date is loaded upon form submission. If the user fills in the date field, the date supplied by the user is used. Single and Multi-Line entries uppercase : This new feature, located in the Basic tab of the Properties window lets you automatically change the user's entered text into upper case letters. Hiding Table buttons for Add, Edit, and Delete : In the Advanced tab for a Table , you can now set that no buttons are displayed with your table. The buttons can be enabled using JavaScript, if required. Manage Tab : Default sort order : Default sort order was changed so the most recently changed applications are listed at the top. Now you can quickly find recently modified applications. Alphabetical sorting is still available, but no longer the default. Redeploy after saving : When you edit an application, and save the changes you must redeploy the application for the changes to be implemented. A visual indicator is now displayed as a reminder when an application has changes that have not been deployed. Adding tags to an application : When you create a new application, you can add tags at the same time. Tags are used to search for applications in the Manage screen. Previously, you could only add tags to your application after it was created and listed in the Manage tab. Tags are separated by spaces, so if you need to make a multiple-word tag, use an underscore between the words. Access Tab : The \"All Authenticated Users\" group cannot be added to any role that has Edit permissions. Users can still be assigned individually, or as groups, to roles with edit permissions. This prevents your application from showing up in the Manage Tab for all authenticated users, and from their applications appearing on your Manage tab. You see only the applications you created, or those to which you have edit permissions. Rules : Naming Rules : You can now name and rename rules. Providing unique, descriptive names to rules makes them easier to find when building your application. See which item is used in a Rule : When a form item has a rule enabled, the Rules icon for the item contains a check mark. The check mark lets you quickly see which form items are involved in a rule. Stages : Stage Description : When you create a new Stage, you can add a detailed description. Adding descriptions is useful if you will have several similarly named stages that perform slightly different portions of the workflow. Rich Text Action Completion Message : The Action Completion Message is now a rich text field. Success message after submission : When a user completes and submits a form, the new default is to take the user away from the form and display the Action Completion Message. This reduces user confusion as they no longer see an empty, reloaded form on the screen. The existing options for the action taken upon form submission are still available in the Edit Form Properties window. View Responses : Individual Print, Email, and Delete buttons added : Print, email and delete buttons were added to each record row, so you can access them without opening each individual record. Email option contains the link to the record : The email operation emails the link to both print and launch the record. New fields added to Responses screen : \u201cCreated on\u201dand \u201cLast Updated By\u201d were added to the table so you can see additional information on each submitted form. Selected results open in a new window : When you click on a submitted record, it opens in a window, rather than in a side pane. Default view changed : When you click the View Responses link, the default view is now Responses , rather than Summary . A number of upgrade routine fixes, accessibility, and usability changes were implemented. Values entered into the password item are not stored in your application. Since the password is never stored, it is never exported or shown in any field. The password field is empty when the form is rendered in its next stage. Using the password for calling server-side services during stage transitions still work as the value is included as part of the submitted data and not stored as part of the application record.","title":"8.6.1"},{"location":"wi_adding_html_fragments_to_a_form.html","text":"Adding HTML fragments to a form Using the HTML Fragment item, you can add HTML anywhere in your form. From the Palette, click Specialized toolbar. Drop an HTML Fragment item onto the form. Click HTML, click to edit... and enter your HTML code. Note: Any application Cascading Style Sheets (CSS) used by the form are also applied to the HTML code you enter in the HTML Fragment form item. To see the CSS associated with your form, click the Styles tab. Parent topic: Adding specialized form items","title":"Adding HTML fragments to a form"},{"location":"wi_adding_html_fragments_to_a_form.html#addinghtmlfragmentstoaform","text":"Using the HTML Fragment item, you can add HTML anywhere in your form. From the Palette, click Specialized toolbar. Drop an HTML Fragment item onto the form. Click HTML, click to edit... and enter your HTML code. Note: Any application Cascading Style Sheets (CSS) used by the form are also applied to the HTML code you enter in the HTML Fragment form item. To see the CSS associated with your form, click the Styles tab. Parent topic: Adding specialized form items","title":"Adding HTML fragments to a form"},{"location":"wi_adding_media_to_a_form.html","text":"Adding media to a form You can add media to the form anywhere you place the Media form item. The Media item supports .avi, .mpeg, .mpg, .wmv, .wma, .mov, .mp3, .mp4, and .swf file types. When you use the Media item in an HCL Leap application, it is important to use a media type that renders properly in the supported browsers that you expect your users to use. The ability to render a specific media type is dependent on the browser configuration and which plug-ins they installed. Note: Ensure that you have proper spacing between Media form items and other form items that require pop-ups, such as Calendar . If these types of form items are too close together, the Media item blocks the pop-ups of the other form items. In the Palette, click Specialized . The list of specialized form items expands. Select Media and drop it onto the form. The properties side panel appears so you can configure the media file. Click Add file to upload a file, or point to a URL that hosts the file. Or you can select previously uploaded media from the Media drop-down menu. To set a media item to display on an iPad, click Use a file on the internet . Set the URL for the file, then select Maintain a link to the file only . Click OK . Configure the viewing options by adjusting the Show Control , Auto Start , and Loop radio buttons. Adjust the height and width of the view with the fields provided. Your changes are saved automatically. Parent topic: Adding specialized form items","title":"Adding media to a form"},{"location":"wi_adding_media_to_a_form.html#addingmediatoaform","text":"You can add media to the form anywhere you place the Media form item. The Media item supports .avi, .mpeg, .mpg, .wmv, .wma, .mov, .mp3, .mp4, and .swf file types. When you use the Media item in an HCL Leap application, it is important to use a media type that renders properly in the supported browsers that you expect your users to use. The ability to render a specific media type is dependent on the browser configuration and which plug-ins they installed. Note: Ensure that you have proper spacing between Media form items and other form items that require pop-ups, such as Calendar . If these types of form items are too close together, the Media item blocks the pop-ups of the other form items. In the Palette, click Specialized . The list of specialized form items expands. Select Media and drop it onto the form. The properties side panel appears so you can configure the media file. Click Add file to upload a file, or point to a URL that hosts the file. Or you can select previously uploaded media from the Media drop-down menu. To set a media item to display on an iPad, click Use a file on the internet . Set the URL for the file, then select Maintain a link to the file only . Click OK . Configure the viewing options by adjusting the Show Control , Auto Start , and Loop radio buttons. Adjust the height and width of the view with the fields provided. Your changes are saved automatically. Parent topic: Adding specialized form items","title":"Adding media to a form"},{"location":"wi_adding_tables_to_a_form.html","text":"Adding tables to a form The Table form item enables the user to add complex entries to a form. You can use the Table form item to create a section where a user can submit repeated data. For example, in a job application you can build a table that asks for work history. You can create columns such as the \u201cCompany Name\u201d, \u201cJob Title\u201d, \u201cStart Date\u201d, and \u201cEnd Date\u201d. The user can add as many rows under these columns as required to provide their work history. In many cases, it is not feasible to add individual items for each repeating element as you cannot know in advance how many repeating elements the use requires. To achieve this functionality, the Table form item contains the following two complimentary elements: Child form \u2013 The Child form is a supporting form that contains the form items that collect the repeated data. In the \u201cwork history\u201d example, the child form contains a Date form item for collecting the \u201cStart Date\u201d of a previous job. A child form is similar to a regular form, however it is limited to a single page. When a user completes their job history, the child form is shown in a dialog box. The user can enter as many rows as required to submit a complete job history. In the Outline view, the child form is called \"Table\", and is listed as a subset of the parent page. Table display \u2013 The Table display shows the data entries that are collected by the child form. The columns in the table represent the individual items from the child form. The visibility of specific columns in the table is configurable in the properties side panel. In the Palette, click Specialized . The list of specialized form items expands. Select Table , and drop it onto the form. Adding the table creates a Table child form in the Outline view. In the table, click the link to access the child form, and define the table columns by selecting form items from the Common Palette. Ensure that you give each form item a specific name as the items added to the Table child form become column titles for the table. For example, if you insert a Single Line Entry form item to record someone\u2019s name, you must change the title of the item, or the table on the will display \u201cSingle Line Entry\u201d. The title of the form item is not helpful to users. You will then have to manually adjust the item name using the Properties side panel. When you have built your table, go to the Outline view on the right side of the screen and click the parent Page . You are returned to the main form design area. The table appears on the form, and the titles of the table items are displayed as column headers. Parent topic: Adding specialized form items","title":"Adding tables to a form"},{"location":"wi_adding_tables_to_a_form.html#addinglinesdynamicallytoaform","text":"The Table form item enables the user to add complex entries to a form. You can use the Table form item to create a section where a user can submit repeated data. For example, in a job application you can build a table that asks for work history. You can create columns such as the \u201cCompany Name\u201d, \u201cJob Title\u201d, \u201cStart Date\u201d, and \u201cEnd Date\u201d. The user can add as many rows under these columns as required to provide their work history. In many cases, it is not feasible to add individual items for each repeating element as you cannot know in advance how many repeating elements the use requires. To achieve this functionality, the Table form item contains the following two complimentary elements: Child form \u2013 The Child form is a supporting form that contains the form items that collect the repeated data. In the \u201cwork history\u201d example, the child form contains a Date form item for collecting the \u201cStart Date\u201d of a previous job. A child form is similar to a regular form, however it is limited to a single page. When a user completes their job history, the child form is shown in a dialog box. The user can enter as many rows as required to submit a complete job history. In the Outline view, the child form is called \"Table\", and is listed as a subset of the parent page. Table display \u2013 The Table display shows the data entries that are collected by the child form. The columns in the table represent the individual items from the child form. The visibility of specific columns in the table is configurable in the properties side panel. In the Palette, click Specialized . The list of specialized form items expands. Select Table , and drop it onto the form. Adding the table creates a Table child form in the Outline view. In the table, click the link to access the child form, and define the table columns by selecting form items from the Common Palette. Ensure that you give each form item a specific name as the items added to the Table child form become column titles for the table. For example, if you insert a Single Line Entry form item to record someone\u2019s name, you must change the title of the item, or the table on the will display \u201cSingle Line Entry\u201d. The title of the form item is not helpful to users. You will then have to manually adjust the item name using the Properties side panel. When you have built your table, go to the Outline view on the right side of the screen and click the parent Page . You are returned to the main form design area. The table appears on the form, and the titles of the table items are displayed as column headers. Parent topic: Adding specialized form items","title":"Adding tables to a form"},{"location":"wi_echoing_text_with_a_text_item.html","text":"Echoing text with a Text item You can use the Text item to echo text, or build a summary page. Use the Text item from the Palette to create a header or title for your form. You can also use it to echo text, make a summary page, or to add a user\u2019s name to the beginning of a form. The following instructions describe how to create a summary page on your form. The summary page displays a read-only version of the changes a user made before confirming a change. For example, if your application is a checkout feature where users enter billing and shipping information, you can set an echo text page to confirm their billing and shipping addresses before completing and confirming the order. In the Outline view insert a page by clicking the Ellipses (\u2026) icon for Page 1 and selecting \u201c+ Add Form Page\u201d. An empty form page appears. Drop a Text item onto the form. Click the newly created text item. The properties side panel opens. Enter the name of the Text item in the text area. For example, you might enter \u201cSummary Page\u201d. Under the Content: heading, click Insert item . Select the page and item you want to display on the summary page. Repeat for all of the items in your form you want to summarize. You can separate the selected items by spaces, commas, line breaks, or other formatting. Parent topic: Adding specialized form items","title":"Echoing text with a Text item"},{"location":"wi_echoing_text_with_a_text_item.html#echoingtextwithatextwidget","text":"You can use the Text item to echo text, or build a summary page. Use the Text item from the Palette to create a header or title for your form. You can also use it to echo text, make a summary page, or to add a user\u2019s name to the beginning of a form. The following instructions describe how to create a summary page on your form. The summary page displays a read-only version of the changes a user made before confirming a change. For example, if your application is a checkout feature where users enter billing and shipping information, you can set an echo text page to confirm their billing and shipping addresses before completing and confirming the order. In the Outline view insert a page by clicking the Ellipses (\u2026) icon for Page 1 and selecting \u201c+ Add Form Page\u201d. An empty form page appears. Drop a Text item onto the form. Click the newly created text item. The properties side panel opens. Enter the name of the Text item in the text area. For example, you might enter \u201cSummary Page\u201d. Under the Content: heading, click Insert item . Select the page and item you want to display on the summary page. Repeat for all of the items in your form you want to summarize. You can separate the selected items by spaces, commas, line breaks, or other formatting. Parent topic: Adding specialized form items","title":"Echoing text with a Text item"},{"location":"wi_introduction_to_specialized_form_items.html","text":"Adding specialized form items You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Echoing text with a Text item You can use the Text item to echo text, or build a summary page. Adding tables to a form The Table form item enables the user to add complex entries to a form. Adding HTML fragments to a form Using the HTML Fragment item, you can add HTML anywhere in your form. Adding media to a form You can add media to the form anywhere you place the Media form item. Parent topic: Creating and managing applications","title":"Adding specialized form items"},{"location":"wi_introduction_to_specialized_form_items.html#introductiontospecializedwidgets","text":"You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Echoing text with a Text item You can use the Text item to echo text, or build a summary page. Adding tables to a form The Table form item enables the user to add complex entries to a form. Adding HTML fragments to a form Using the HTML Fragment item, you can add HTML anywhere in your form. Adding media to a form You can add media to the form anywhere you place the Media form item. Parent topic: Creating and managing applications","title":"Adding specialized form items"},{"location":"widget_instantiation.html","text":"Widget Instantiation The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. instantiate() is called with the following arguments: context : an object containing useful meta-data, including: locale : the locale of current page. This is useful for displaying messages in the correct language or for dealing with locale preferences (ex. number formatting). mode : one of 'design' (authoring), 'preview' (previewing), or 'run' (running app). The widget's behaviour may need to be tailored based on the context, for example disabling some behaviours in 'design' mode. domNode : the parent DOM node into which the widget's DOM must be placed. The custom widget code must not manipulate the parent node or anything outside of it. initialProps : these will be the initial set of property values as chosen by the app author. eventManager : for triggering events. For example, eventManager.fireEvent('onChange') . The returned object is expected to supply the following functions: getValue() : required for data widgets. setValue(value) : required for data widgets. setProperty(propName, propValue) : required for all widgets. getDisplayTitle() : (optional) for display widget's title in various parts of the UI. setDisabled(isDisabled) : (optional) to tailor the widget's behaviour when disabled and enabled. setErrorMessage(errorMessage) : (optional) for the widget to report validation errors. errorMessage will be null if the data is valid. setRequired(isRequired) : (optional) to tailor the widget's behaviour when the data is required, or not required. getOptions() : (optional) see Widgets with Options . validateValue(value) : (optional) - see Validation . getJSAPIFacade() : (optional) returns an object that supplies additional custom functions that will be available to app authors to use in their custom JavaScript. Special care must be taken to ensure that app authors have a limited range of possibilities and cannot take over the whole page with their custom JavaScript. When Leap's secure sandbox mode is enabled ( secureJS=true ), an author's custom JavaScript cannot access any variables prefixed with a double-underscore. The widget creator is free to decide how they want to code and manage the widget instance internally. Parent topic: Custom Widget API","title":"Widget Instantiation"},{"location":"widget_instantiation.html#widget_instantiation","text":"The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. instantiate() is called with the following arguments: context : an object containing useful meta-data, including: locale : the locale of current page. This is useful for displaying messages in the correct language or for dealing with locale preferences (ex. number formatting). mode : one of 'design' (authoring), 'preview' (previewing), or 'run' (running app). The widget's behaviour may need to be tailored based on the context, for example disabling some behaviours in 'design' mode. domNode : the parent DOM node into which the widget's DOM must be placed. The custom widget code must not manipulate the parent node or anything outside of it. initialProps : these will be the initial set of property values as chosen by the app author. eventManager : for triggering events. For example, eventManager.fireEvent('onChange') . The returned object is expected to supply the following functions: getValue() : required for data widgets. setValue(value) : required for data widgets. setProperty(propName, propValue) : required for all widgets. getDisplayTitle() : (optional) for display widget's title in various parts of the UI. setDisabled(isDisabled) : (optional) to tailor the widget's behaviour when disabled and enabled. setErrorMessage(errorMessage) : (optional) for the widget to report validation errors. errorMessage will be null if the data is valid. setRequired(isRequired) : (optional) to tailor the widget's behaviour when the data is required, or not required. getOptions() : (optional) see Widgets with Options . validateValue(value) : (optional) - see Validation . getJSAPIFacade() : (optional) returns an object that supplies additional custom functions that will be available to app authors to use in their custom JavaScript. Special care must be taken to ensure that app authors have a limited range of possibilities and cannot take over the whole page with their custom JavaScript. When Leap's secure sandbox mode is enabled ( secureJS=true ), an author's custom JavaScript cannot access any variables prefixed with a double-underscore. The widget creator is free to decide how they want to code and manage the widget instance internally. Parent topic: Custom Widget API","title":"Widget Instantiation"},{"location":"widget_internationalization.html","text":"Internationalization Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. For example: label: 'Yes/No', can be written as label: { \"default\": 'Yes/No', \"fr\": 'Oui/No', \"de\": 'Ja/Nein' }, The property names are expected to match the lang attribute of the current HTML page. For example, \"fr\": 'Oui/No' matches <html lang=\"fr\"> . If there is no match, then the \"default\" property will be used as a fallback. The following widget attributes are globalizable: label description category > label properties > (property) > label properties > (property) > defaultValue properties > (property) > options > (option) > title Parent topic: Custom Widget API","title":"Internationalization"},{"location":"widget_internationalization.html#widget_internationalization","text":"Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. For example: label: 'Yes/No', can be written as label: { \"default\": 'Yes/No', \"fr\": 'Oui/No', \"de\": 'Ja/Nein' }, The property names are expected to match the lang attribute of the current HTML page. For example, \"fr\": 'Oui/No' matches <html lang=\"fr\"> . If there is no match, then the \"default\" property will be used as a fallback. The following widget attributes are globalizable: label description category > label properties > (property) > label properties > (property) > defaultValue properties > (property) > options > (option) > title Parent topic: Custom Widget API","title":"Internationalization"},{"location":"widget_javaapi.html","text":"Usage of JavaScript API Custom widgets can use Leap's JavaScript API to help achieve their objectives. The API can be accessed via the global NitroApplication object or by the passed-in context object. For example, the following is a widget that renders itself appropriately based on the form's currently selected page: const myPageNavigator = { ... instantiate: function (context, domNode) { if (context.mode === 'run' || context.mode === 'preview') { const currentPage = context.page; context.form.getPageIds().forEach((pageId) => { const page = context.form.getPage(pageId); const btn = document.createElement('button'); btn.innerHTML = makeHTMLSafe(page.getTitle()); if (page === currentPage) { btn.setAttribute('disabled', 'true'); } else { btn.addEventListener('click', () => { context.form.selectPage(pageId); }); } domNode.appendChild(btn); }); } else { ... } return { ... }; } } Parent topic: Custom Widget API","title":"Usage of JavaScript API"},{"location":"widget_javaapi.html#widget_javaapi","text":"Custom widgets can use Leap's JavaScript API to help achieve their objectives. The API can be accessed via the global NitroApplication object or by the passed-in context object. For example, the following is a widget that renders itself appropriately based on the form's currently selected page: const myPageNavigator = { ... instantiate: function (context, domNode) { if (context.mode === 'run' || context.mode === 'preview') { const currentPage = context.page; context.form.getPageIds().forEach((pageId) => { const page = context.form.getPage(pageId); const btn = document.createElement('button'); btn.innerHTML = makeHTMLSafe(page.getTitle()); if (page === currentPage) { btn.setAttribute('disabled', 'true'); } else { btn.addEventListener('click', () => { context.form.selectPage(pageId); }); } domNode.appendChild(btn); }); } else { ... } return { ... }; } } Parent topic: Custom Widget API","title":"Usage of JavaScript API"},{"location":"widget_upgrade.html","text":"Upgrading The exact techniques for upgrading widgets from one major version to the next has not yet been established. The intention is to solicit feedback from the community on how best to achieve this. Parent topic: Custom Widget API","title":"Upgrading"},{"location":"widget_upgrade.html#widget_upgrade","text":"The exact techniques for upgrading widgets from one major version to the next has not yet been established. The intention is to solicit feedback from the community on how best to achieve this. Parent topic: Custom Widget API","title":"Upgrading"},{"location":"widget_validation.html","text":"Validation Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. This can be done by supplying a validateValue() function, which returns one of the following values: null : indicates the value is valid An error message : the returned error message will be displayed to the app user in some contexts (ex. when attempting to go the next page). It is responsibility of the custom widget to render itself appropriately based on its state of validity. Note: The widget's setErrorMessage function will be triggered whenever the validity changes, due to contraints on the datatype or custom validation from the validateValue() function. Note: Any additional validation provided by the custom widget via a validateValue() function will not be enforced on the server; however, it will prevent the form from being submitted by the user in the browser. Parent topic: Custom Widget API","title":"Validation"},{"location":"widget_validation.html#widget_validation","text":"Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. This can be done by supplying a validateValue() function, which returns one of the following values: null : indicates the value is valid An error message : the returned error message will be displayed to the app user in some contexts (ex. when attempting to go the next page). It is responsibility of the custom widget to render itself appropriately based on its state of validity. Note: The widget's setErrorMessage function will be triggered whenever the validity changes, due to contraints on the datatype or custom validation from the validateValue() function. Note: Any additional validation provided by the custom widget via a validateValue() function will not be enforced on the server; however, it will prevent the form from being submitted by the user in the browser. Parent topic: Custom Widget API","title":"Validation"},{"location":"widget_versioning.html","text":"Versioning This topic describes the widget's version . The widget version must follow \"Semantic Versioning\" ( semver.org ) practices of MAJOR.MINOR.PATCH . The following behaviours are expected: PATCH increment (ex. 1.0.0 > 1.0.1) For backwards compatible bug fixes. Authors : any widgets already declared with the same minor version will automatically start using the newest patch version. Newly added widgets will use the newest patch version. End-Users : any widgets declared with the same minor version will automatically start using the newest patch version. MINOR increment (ex. 1.0.1 > 1.1.0) For new functionality that is backwards compatible. Authors : any widgets already declared with the same major version will automatically start using the newest minor version. Newly added widgets will use the new minor version. New optional widget properties might appear to the app author. End-Users : any widgets declared with the same major version will automatically start using the newest minor version. End-users might experience some noticeable improvements. MAJOR increment (ex. 1.1.0 > 2.0.0) For major changes that are not backwards compatible. Authors : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. The customer will decide which major versions of the widget will display on the palette. See \"Upgrading\" below for more information. End-Users : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. See \" Upgrading for more information. Note: This Custom Widget API will also follow \"semver\" practices. Parent topic: Custom Widget API","title":"Versioning"},{"location":"widget_versioning.html#widget_versioning","text":"This topic describes the widget's version . The widget version must follow \"Semantic Versioning\" ( semver.org ) practices of MAJOR.MINOR.PATCH . The following behaviours are expected: PATCH increment (ex. 1.0.0 > 1.0.1) For backwards compatible bug fixes. Authors : any widgets already declared with the same minor version will automatically start using the newest patch version. Newly added widgets will use the newest patch version. End-Users : any widgets declared with the same minor version will automatically start using the newest patch version. MINOR increment (ex. 1.0.1 > 1.1.0) For new functionality that is backwards compatible. Authors : any widgets already declared with the same major version will automatically start using the newest minor version. Newly added widgets will use the new minor version. New optional widget properties might appear to the app author. End-Users : any widgets declared with the same major version will automatically start using the newest minor version. End-users might experience some noticeable improvements. MAJOR increment (ex. 1.1.0 > 2.0.0) For major changes that are not backwards compatible. Authors : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. The customer will decide which major versions of the widget will display on the palette. See \"Upgrading\" below for more information. End-Users : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. See \" Upgrading for more information. Note: This Custom Widget API will also follow \"semver\" practices. Parent topic: Custom Widget API","title":"Versioning"},{"location":"widgets_examples.html","text":"Examples Note: The examples mentioned here are deployed with Leap. To access them, modify the provided URLs to include your server hostname. Full Example - Display Widget See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_PageNavHeader_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE Full Example - Data Widget See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_YesNo_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE Full Example - React Material UI Widget Coming soon to https://github.com/HCL-TECH-SOFTWARE Parent topic: Custom Widget API","title":"Examples"},{"location":"widgets_examples.html#widgets_examples","text":"Note: The examples mentioned here are deployed with Leap. To access them, modify the provided URLs to include your server hostname.","title":"Examples"},{"location":"widgets_examples.html#section_xxx_b3n_jyb","text":"See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_PageNavHeader_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE","title":"Full Example - Display Widget"},{"location":"widgets_examples.html#section_ivr_c3n_jyb","text":"See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_YesNo_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE","title":"Full Example - Data Widget"},{"location":"widgets_examples.html#section_tj2_mdn_jyb","text":"Coming soon to https://github.com/HCL-TECH-SOFTWARE Parent topic: Custom Widget API","title":"Full Example - React Material UI Widget"},{"location":"widgets_limitations.html","text":"Known limitations Complex Data : Widgets that need to store complex data are expected to use a \"parsable\" string value (ex. JSON ). There is no mechanism to handle customized rendering of this value in some parts of the product (ex. Print View), or to customize searching/filtering based on the intricacies of the complex value. Containers : There is no support for custom container widgets, those being widgets that contain other widgets, such as a collapsible section. Full Custom Properties : There is no mechanism to supply 100% custom properties. Properties of the custom widget will be from a set of common prescribed types. In-line Editing : There is no mechanism to support the app author in direct in-line editing of a widget's properties on the canvas. Multilingual Apps : There is no mechanism (beyond an app author's custom JavaScript) to allow app authors to supply property values for an application that is to be used by end-users who speak different languages. Author-Defined Data Constraints - There are limited mechanisms for app authors to define data constraints on the values supplied by end-users. Values can be constrained in the UI by the custom widget itself, or by the author's custom JavaScript. Parent topic: Custom Widget API","title":"Known limitations"},{"location":"widgets_limitations.html#widgets_limitations","text":"Complex Data : Widgets that need to store complex data are expected to use a \"parsable\" string value (ex. JSON ). There is no mechanism to handle customized rendering of this value in some parts of the product (ex. Print View), or to customize searching/filtering based on the intricacies of the complex value. Containers : There is no support for custom container widgets, those being widgets that contain other widgets, such as a collapsible section. Full Custom Properties : There is no mechanism to supply 100% custom properties. Properties of the custom widget will be from a set of common prescribed types. In-line Editing : There is no mechanism to support the app author in direct in-line editing of a widget's properties on the canvas. Multilingual Apps : There is no mechanism (beyond an app author's custom JavaScript) to allow app authors to supply property values for an application that is to be used by end-users who speak different languages. Author-Defined Data Constraints - There are limited mechanisms for app authors to define data constraints on the values supplied by end-users. Values can be constrained in the UI by the custom widget itself, or by the author's custom JavaScript. Parent topic: Custom Widget API","title":"Known limitations"},{"location":"widgets_options.html","text":"Widgets with Options Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author. Author-Defined Options If a widget requires app authors to define their own options, define a property with both id and propType set to a value of \"customOptions\" . Example: const myWidgetDefintion = { ... properties: [ { id: \"customOptions\", propType: \"customOptions\", label: \"Options\" }, ... ], ... Note: An id of 'customOptions' is meaningful to Leap. All other custom property id's are arbitrary. Hardcoded Options If the widget's options are hardcoded, add a getOptions() function to your widget. Example: const myWidgetDefintion = { ... getOptions : function () { return [{title: 'Yes', value: 'yes'}, {title: 'No', value: 'no'}]; }, ... }; Parent topic: Custom Widget API","title":"Widgets with Options"},{"location":"widgets_options.html#widgets_options","text":"Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author.","title":"Widgets with Options"},{"location":"widgets_options.html#section_gdf_tfn_jyb","text":"If a widget requires app authors to define their own options, define a property with both id and propType set to a value of \"customOptions\" . Example: const myWidgetDefintion = { ... properties: [ { id: \"customOptions\", propType: \"customOptions\", label: \"Options\" }, ... ], ... Note: An id of 'customOptions' is meaningful to Leap. All other custom property id's are arbitrary.","title":"Author-Defined Options"},{"location":"widgets_options.html#section_rnj_wfn_jyb","text":"If the widget's options are hardcoded, add a getOptions() function to your widget. Example: const myWidgetDefintion = { ... getOptions : function () { return [{title: 'Yes', value: 'yes'}, {title: 'No', value: 'no'}]; }, ... }; Parent topic: Custom Widget API","title":"Hardcoded Options"},{"location":"widgets_security.html","text":"Security Considerations This topic describes security considerations for Custom Widget API. It is the responsibility of the widget creator to avoid script injection attacks by ensuring that values are sanitized or escaped properly before placing them into the DOM. In general, the widget creator is responsible for following secure engineering practices. The custom widget code has full access to the page, but it should not call product functions, manipulate the product's JavaScript values, or interact with the product's DOM nodes in any way that is not prescribed by this API. Doing so could jeporadize the security of the product and break your custom widgets in future product releases. As stated above, special care must be taken when supplying a getJSAPIFacade() function to expose additional widget capabilities for app authors to leverage in their custom JavaScript. These functions should provide tightly constrained interactions with the custom widget, with no possibility for script injection or access to the widget's internal objects or its DOM, or those of the product. The \"facade\" naming is a reminder that the app author's code should only get references to values and objects that are necessary and \"safe\". It is the responsibility of widget creators and Leap administrators to ensure that only trusted stable resources are loaded into Leap's pages. The specified additional resources will be loaded directly into the user's browser (by injecting them as-written into the <head> of the page). There will be no additional vetting or sanitizing of resources by Leap. It is not recommended for a customer to rely on resources that they do not tightly control (ie. avoid usage of libraries from a 3rd-party CDN). Strict CSP support requires a special nonce='#!#cspNonce!#!' attribute on <script> tags. For example: ibm.nitro.NitroConfig.runtimeResources.4 = <script nonce='#!#cspNonce!#!' src='https://myWidgets.example.com/MyYesNoWidget.js'></script> Parent topic: Custom Widget API","title":"Security Considerations"},{"location":"widgets_security.html#widgets_security","text":"This topic describes security considerations for Custom Widget API. It is the responsibility of the widget creator to avoid script injection attacks by ensuring that values are sanitized or escaped properly before placing them into the DOM. In general, the widget creator is responsible for following secure engineering practices. The custom widget code has full access to the page, but it should not call product functions, manipulate the product's JavaScript values, or interact with the product's DOM nodes in any way that is not prescribed by this API. Doing so could jeporadize the security of the product and break your custom widgets in future product releases. As stated above, special care must be taken when supplying a getJSAPIFacade() function to expose additional widget capabilities for app authors to leverage in their custom JavaScript. These functions should provide tightly constrained interactions with the custom widget, with no possibility for script injection or access to the widget's internal objects or its DOM, or those of the product. The \"facade\" naming is a reminder that the app author's code should only get references to values and objects that are necessary and \"safe\". It is the responsibility of widget creators and Leap administrators to ensure that only trusted stable resources are loaded into Leap's pages. The specified additional resources will be loaded directly into the user's browser (by injecting them as-written into the <head> of the page). There will be no additional vetting or sanitizing of resources by Leap. It is not recommended for a customer to rely on resources that they do not tightly control (ie. avoid usage of libraries from a 3rd-party CDN). Strict CSP support requires a special nonce='#!#cspNonce!#!' attribute on <script> tags. For example: ibm.nitro.NitroConfig.runtimeResources.4 = <script nonce='#!#cspNonce!#!' src='https://myWidgets.example.com/MyYesNoWidget.js'></script> Parent topic: Custom Widget API","title":"Security Considerations"},{"location":"widgets_thirdpartylibraries.html","text":"Incorporating third-party libraries This topic describes incorporating third-party libraries. 3rd-party libraries are expected to be bundled and loaded in an isolated manner so that they do not pollute the global namespace or interfere with the product code, in the current release or future releases Usage of the product's 3rd-party libraries is not supported; these may change or be removed at any time. Parent topic: Custom Widget API","title":"Incorporating third-party libraries"},{"location":"widgets_thirdpartylibraries.html#widgets_thirdpartylibraries","text":"This topic describes incorporating third-party libraries. 3rd-party libraries are expected to be bundled and loaded in an isolated manner so that they do not pollute the global namespace or interfere with the product code, in the current release or future releases Usage of the product's 3rd-party libraries is not supported; these may change or be removed at any time. Parent topic: Custom Widget API","title":"Incorporating third-party libraries"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"index.html","text":"","title":"Introducing Leap"},{"location":"ac_accessibility_features_for_designers.html","text":"Accessibility features for application designers HCL Leap contains accessibility features so users with disabilities can create forms and applications. To make designing forms and applications easier for users with disabilities, Leap has the following keyboard shortcuts: Adding items to your form To add items to your form from the Palette, set focus on the form item with the Tab key and press Enter. The item appears on the form where indicated by a blue line. Focus indicator When a form item has focus the background changes color, and the area that is occupied by the form item is defined by a colored line. Item triggers When an item has focus, you can trigger it by pressing the Enter key or space bar. The browser that you use determines whether you must press the Enter key or space bar. Tab key You can navigate to any visible form item, link, or menu by pressing the Tab key. Tab navigation The Properties side panel contains multiple tabs. To navigate between tabs, use the arrow keys. Tab order of form items When you place items on a form, the tab order is set based on item placement. If you insert a form item before existing items, the tab order is automatically reset. You do not have to manually configure tab order when you insert additional items into a form. Navigating between Palettes You can navigate between the Common, and Specialized palettes. When the focus is on one Palette use any arrow key to collapse the open Palette and expand another one. If you want to switch palettes while focus is on a form item, you must use the Tab key to move to the palette name, then navigate with the arrow keys. You cannot navigate between palettes when a form item has focus. Keyboard commands for common items Leap has three menu items: Save , Preview , and Cancel . The following keyboard commands are available so you do not have to navigate away from your form. Save: Ctrl+s Preview: Ctrl+e Cancel: Ctrl+q When designing forms the Properties side panel contains a box titled \u201cAccessibility - Alternative text ID\u201d. Use this box to provide a text description that is used by accessibility tools to describe the item. The following WAI ARIA attributes are automatically added to form items when you design forms: aria-labelledby and Aria-label are added to fields to associate the correct label with each field. aria-describedby are added to fields where more description is needed to describe the function of a field. aria-required is added to inform a user that the field is mandatory. aria-invalid is added to fields when the value is not valid. aria-alert is used with Aria-invalid in error messages. Screen readers read the Aria-alert text to the user. aria-valuemin and aria-valuemax are used to denote if the file has an acceptable value range. If the value is outside the range, the aria-invalid attribute is set. Parent topic: Accessibility overview","title":"Accessibility features for application designers"},{"location":"ac_accessibility_features_for_designers.html#accessibility-features-for-application-designers","text":"HCL Leap contains accessibility features so users with disabilities can create forms and applications. To make designing forms and applications easier for users with disabilities, Leap has the following keyboard shortcuts:","title":"Accessibility features for application designers"},{"location":"ac_accessibility_features_for_designers.html#adding-items-to-your-form","text":"To add items to your form from the Palette, set focus on the form item with the Tab key and press Enter. The item appears on the form where indicated by a blue line.","title":"Adding items to your form"},{"location":"ac_accessibility_features_for_designers.html#focus-indicator","text":"When a form item has focus the background changes color, and the area that is occupied by the form item is defined by a colored line.","title":"Focus indicator"},{"location":"ac_accessibility_features_for_designers.html#item-triggers","text":"When an item has focus, you can trigger it by pressing the Enter key or space bar. The browser that you use determines whether you must press the Enter key or space bar.","title":"Item triggers"},{"location":"ac_accessibility_features_for_designers.html#tab-key","text":"You can navigate to any visible form item, link, or menu by pressing the Tab key.","title":"Tab key"},{"location":"ac_accessibility_features_for_designers.html#tab-navigation","text":"The Properties side panel contains multiple tabs. To navigate between tabs, use the arrow keys.","title":"Tab navigation"},{"location":"ac_accessibility_features_for_designers.html#tab-order-of-form-items","text":"When you place items on a form, the tab order is set based on item placement. If you insert a form item before existing items, the tab order is automatically reset. You do not have to manually configure tab order when you insert additional items into a form.","title":"Tab order of form items"},{"location":"ac_accessibility_features_for_designers.html#navigating-between-palettes","text":"You can navigate between the Common, and Specialized palettes. When the focus is on one Palette use any arrow key to collapse the open Palette and expand another one. If you want to switch palettes while focus is on a form item, you must use the Tab key to move to the palette name, then navigate with the arrow keys. You cannot navigate between palettes when a form item has focus.","title":"Navigating between Palettes"},{"location":"ac_accessibility_features_for_designers.html#keyboard-commands-for-common-items","text":"Leap has three menu items: Save , Preview , and Cancel . The following keyboard commands are available so you do not have to navigate away from your form. Save: Ctrl+s Preview: Ctrl+e Cancel: Ctrl+q When designing forms the Properties side panel contains a box titled \u201cAccessibility - Alternative text ID\u201d. Use this box to provide a text description that is used by accessibility tools to describe the item. The following WAI ARIA attributes are automatically added to form items when you design forms: aria-labelledby and Aria-label are added to fields to associate the correct label with each field. aria-describedby are added to fields where more description is needed to describe the function of a field. aria-required is added to inform a user that the field is mandatory. aria-invalid is added to fields when the value is not valid. aria-alert is used with Aria-invalid in error messages. Screen readers read the Aria-alert text to the user. aria-valuemin and aria-valuemax are used to denote if the file has an acceptable value range. If the value is outside the range, the aria-invalid attribute is set. Parent topic: Accessibility overview","title":"Keyboard commands for common items"},{"location":"ac_accessibility_features_for_users.html","text":"Accessibility features for application users When given the link to an HCL Leap application, a user is provided with many built in accessibility features. To make using forms and applications easier for users with disabilities, Leap has the following accessibility features and keyboard shortcuts: Screen reader compatibility : Leap is compatible with screen readers that comply with WCAG 2.0 and WAI-ARIA. Some screen readers perform a read through of web pages from start to finish as the default. Tab key : You can navigate to any visible form item, link, or menu by pressing the Tab key. Parent topic: Accessibility overview","title":"Accessibility features for application users"},{"location":"ac_accessibility_features_for_users.html#accessibilityfeaturesforapplicationusers","text":"When given the link to an HCL Leap application, a user is provided with many built in accessibility features. To make using forms and applications easier for users with disabilities, Leap has the following accessibility features and keyboard shortcuts: Screen reader compatibility : Leap is compatible with screen readers that comply with WCAG 2.0 and WAI-ARIA. Some screen readers perform a read through of web pages from start to finish as the default. Tab key : You can navigate to any visible form item, link, or menu by pressing the Tab key. Parent topic: Accessibility overview","title":"Accessibility features for application users"},{"location":"ac_creating_accessible_application.html","text":"Creating an accessible application When you create a form or application, the following information helps you design an accessible form for users with disabilities. HCL Leap is designed to make building accessible forms easy. For example, the tab order of form items is set to start at the first item on the page, and work through consecutive items. You do not have to reset the tab order if you must add items to the beginning of a form. There are several things that you can do to make your forms more accessible to users with disabilities: During the creation of your application, accessibility standards, such as WCAG 2.0 , should be considered with regards to layout and content. Leap does not prevent authors from creating non-accessible forms. When you add items to your form, give each form item a clear description or name. Screen readers read the name that is associated with a form item. You can also use a Text item as a data label instead of the field provided. For more information, see Using a Text item as a label . Add hints to each form item by modifying the Add hint field. The Hint provides more information when read to the user. For example, if your form has a Name field, the hint tells the user your preference for how to enter their given and surnames. Text blocks are not automatically part of the tab order. Screen readers do not put focus on text blocks, and your users might miss vital information. To ensure that text information is not omitted, select the text item, in the properties side panel, select the check box for Add to tab order . The text is added to the tab order, and is read by screen readers. If you add images or media items to your forms, open the Properties side panel and add descriptive text to the Alternative text property. A screen reader uses the alternative text to describe the image or media item to the user. You can add text items to your form and have them associate with other form items. You can use this technique to create formatted titles for your form items. However, you must link the text item and the form item together. For example, you have a Select One item on your form. You want its title to be rich text so it can have a color, background, and format different from the default title. You add the title with the Text form item, which gives the formatting you want. However, the text item is not read by the screen reader, and the user might not know what the choice list represents. To ensure that the Text field is read by a screen reader, go to the choice list Properties side panel. Insert the name of the Text field into the Accessibility \u2013 Alternative label ID field. A screen reader reads the appropriate text for the choice list. When using the new dynamic layout, it might be necessary to group items into Sections to convey the proper meaning to users. For example, when creating a custom label via the alternative text ID option. When using Sections , if a label exists, it provides a navigation landmark using WAI-ARIA that is available to assistive technologies. For more information, WAI_ARIA roles . Using a Text item as a label For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. Parent topic: Creating and managing applications","title":"Creating an accessible application"},{"location":"ac_creating_accessible_application.html#creatinganaccessibleapplication","text":"When you create a form or application, the following information helps you design an accessible form for users with disabilities. HCL Leap is designed to make building accessible forms easy. For example, the tab order of form items is set to start at the first item on the page, and work through consecutive items. You do not have to reset the tab order if you must add items to the beginning of a form. There are several things that you can do to make your forms more accessible to users with disabilities: During the creation of your application, accessibility standards, such as WCAG 2.0 , should be considered with regards to layout and content. Leap does not prevent authors from creating non-accessible forms. When you add items to your form, give each form item a clear description or name. Screen readers read the name that is associated with a form item. You can also use a Text item as a data label instead of the field provided. For more information, see Using a Text item as a label . Add hints to each form item by modifying the Add hint field. The Hint provides more information when read to the user. For example, if your form has a Name field, the hint tells the user your preference for how to enter their given and surnames. Text blocks are not automatically part of the tab order. Screen readers do not put focus on text blocks, and your users might miss vital information. To ensure that text information is not omitted, select the text item, in the properties side panel, select the check box for Add to tab order . The text is added to the tab order, and is read by screen readers. If you add images or media items to your forms, open the Properties side panel and add descriptive text to the Alternative text property. A screen reader uses the alternative text to describe the image or media item to the user. You can add text items to your form and have them associate with other form items. You can use this technique to create formatted titles for your form items. However, you must link the text item and the form item together. For example, you have a Select One item on your form. You want its title to be rich text so it can have a color, background, and format different from the default title. You add the title with the Text form item, which gives the formatting you want. However, the text item is not read by the screen reader, and the user might not know what the choice list represents. To ensure that the Text field is read by a screen reader, go to the choice list Properties side panel. Insert the name of the Text field into the Accessibility \u2013 Alternative label ID field. A screen reader reads the appropriate text for the choice list. When using the new dynamic layout, it might be necessary to group items into Sections to convey the proper meaning to users. For example, when creating a custom label via the alternative text ID option. When using Sections , if a label exists, it provides a navigation landmark using WAI-ARIA that is available to assistive technologies. For more information, WAI_ARIA roles . Using a Text item as a label For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. Parent topic: Creating and managing applications","title":"Creating an accessible application"},{"location":"ac_experience_builder_accessibility.html","text":"Accessibility overview HCL Leap contains a number of built-in accessibility features to make applications easy to create and use by people with disabilities. Leap provides the best accessibility experience when used with the newest release of the browser and the newest release of the screen reader. For more information, see the following URLs: Accessible Rich Internet Applications (WAI-ARIA) 1.0 Web Content Accessibility Guidelines (WCAG) 2.0 Accessibility features for application designers HCL Leap contains accessibility features so users with disabilities can create forms and applications. Accessibility features for application users When given the link to an HCL Leap application, a user is provided with many built in accessibility features.","title":"Accessibility Overview"},{"location":"ac_experience_builder_accessibility.html#experiencebuilderaccessibility","text":"HCL Leap contains a number of built-in accessibility features to make applications easy to create and use by people with disabilities. Leap provides the best accessibility experience when used with the newest release of the browser and the newest release of the screen reader. For more information, see the following URLs: Accessible Rich Internet Applications (WAI-ARIA) 1.0 Web Content Accessibility Guidelines (WCAG) 2.0 Accessibility features for application designers HCL Leap contains accessibility features so users with disabilities can create forms and applications. Accessibility features for application users When given the link to an HCL Leap application, a user is provided with many built in accessibility features.","title":"Accessibility overview"},{"location":"ac_using_text_item_as_label.html","text":"Using a Text item as a label For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. The following instructions describe how to set a text item as the title of a field. For this example, the title is displayed to the left of the field where the user will type information. You can also use these instructions inside a Section, which allows you to format the spacing between the Text item and the Entry Field without affecting the spacing of the rest of your form. Add a Text item to the left column of the grid. The Edit Text Properties side panel opens. Type the title you want to display to users on the form. Copy the information displayed in the ID field. On a new form, where the text item is the first item on the form, the default name is F_Text1. You can change this ID to be any name you want, however each form item must have a unique ID. Add a Single Line Entry , or Multi-Line Entry to the right of the Text item. In the properties side panel, delete the text from the Title field. Go to Data Label and paste the unique ID you copied from the Text field. When you save and preview the form, the text item appears as the label for the entry field. Parent topic: Creating an accessible application","title":"Using a Text item as a label"},{"location":"ac_using_text_item_as_label.html#settingatextitemasalabel","text":"For accessibility ease of use, users might prefer to see the title of an entry field to the side of the field, rather than above the field. The following instructions describe how to set a text item as the title of a field. For this example, the title is displayed to the left of the field where the user will type information. You can also use these instructions inside a Section, which allows you to format the spacing between the Text item and the Entry Field without affecting the spacing of the rest of your form. Add a Text item to the left column of the grid. The Edit Text Properties side panel opens. Type the title you want to display to users on the form. Copy the information displayed in the ID field. On a new form, where the text item is the first item on the form, the default name is F_Text1. You can change this ID to be any name you want, however each form item must have a unique ID. Add a Single Line Entry , or Multi-Line Entry to the right of the Text item. In the properties side panel, delete the text from the Title field. Go to Data Label and paste the unique ID you copied from the Text field. When you save and preview the form, the text item appears as the label for the entry field. Parent topic: Creating an accessible application","title":"Using a Text item as a label"},{"location":"ad_managing_db2_database.html","text":"Backing up and restoring the DB2 database Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Backing up and restoring data in DB2\u00ae is done using the Backup and Restore commands. If you plan to restore data from a server with a different bit order than the one currently storing the data, you must use the Data Movement Tool. For more information, see Data Movement Tool . Parent topic: Administering Leap","title":"Backing up and restoring the DB2 database"},{"location":"ad_managing_db2_database.html#managingyourdb2database","text":"Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Backing up and restoring data in DB2\u00ae is done using the Backup and Restore commands. If you plan to restore data from a server with a different bit order than the one currently storing the data, you must use the Data Movement Tool. For more information, see Data Movement Tool . Parent topic: Administering Leap","title":"Backing up and restoring the DB2 database"},{"location":"admin_application_dashboard.html","text":"Admin Application Dashboard The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups. An Admin tab will appear in the top banner for users with permission. The page provides information about all the applications on the Leap server. To manage the load on the server, the details are gathered using a timer task that runs at a regular configurable interval (see Application Statistics collection timer in Configuration properties ). The dashboard shows the following: The total number of applications. A breakdown of the applications by status (i.e. running, undeployed). The total number of application records across all applications. A filterable table of all the applications. Clicking on a row in the table reveals additional details about the selected application. The data may be updated by clicking Refresh . The data may be exported to a spreadsheet by clicking Export to spreadsheet . For more information, see Application statistics REST API . Parent topic: Administering Leap","title":"Admin Application Dashboard"},{"location":"admin_application_dashboard.html#admin_application_dashboard","text":"The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups. An Admin tab will appear in the top banner for users with permission. The page provides information about all the applications on the Leap server. To manage the load on the server, the details are gathered using a timer task that runs at a regular configurable interval (see Application Statistics collection timer in Configuration properties ). The dashboard shows the following: The total number of applications. A breakdown of the applications by status (i.e. running, undeployed). The total number of application records across all applications. A filterable table of all the applications. Clicking on a row in the table reveals additional details about the selected application. The data may be updated by clicking Refresh . The data may be exported to a spreadsheet by clicking Export to spreadsheet . For more information, see Application statistics REST API . Parent topic: Administering Leap","title":"Admin Application Dashboard"},{"location":"administering_leap.html","text":"Administering Leap The following topics contain information on administering Leap. Backing up and restoring the DB2 database Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Strict CSP HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Admin Application Dashboard The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups.","title":"Administering"},{"location":"administering_leap.html#administering_leap","text":"The following topics contain information on administering Leap. Backing up and restoring the DB2 database Data for HCL Leap applications is stored within a database. Ensure that you have a backup and restore strategy in place to protect your data. Strict CSP HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Admin Application Dashboard The Admin Application Dashboard is a page that is available to members of the Admin or SuperAdmin groups.","title":"Administering Leap"},{"location":"app_stats_restapi.html","text":"Application statistics REST API Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Statistics are collected by a timer task which can be configured by an administrator using Configuration properties . Authentication All REST API calls must be made as an authenticated user in Administrator or Super Administrator role. If you want to exercise the API with code, you may use basic authentication. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string. REST actions The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb ActionName /apps-basic/secure/org/admin/apps GET list /apps-basic/secure/org/admin/apps/{app-uid} GET app detail Note: app-uid is the UID of the application. List This action retrieves a list of all apps, available query parameters: forceRefresh : executes statistics collection on all apps. Default value: false includeForms : whether includes app forms information in response. Default value: false includeAdmins : whether includes app administrators information in response. Default value: false format : (case sensitive) acceptable values: json, application/json, xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet filename : only used when pFormat is set to xlsx format. The file extension has to be xlsx. Note: When the format is an open document and a file is downloaded, if the file name is not set, the default file name is app.xlsx. App detail This action retrieves the details for a single app. Parent topic: REST API reference","title":"Application statistics REST API"},{"location":"app_stats_restapi.html#app_stats_restapi","text":"Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Statistics are collected by a timer task which can be configured by an administrator using Configuration properties . Authentication All REST API calls must be made as an authenticated user in Administrator or Super Administrator role. If you want to exercise the API with code, you may use basic authentication. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string. REST actions The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb ActionName /apps-basic/secure/org/admin/apps GET list /apps-basic/secure/org/admin/apps/{app-uid} GET app detail Note: app-uid is the UID of the application.","title":"Application statistics REST API"},{"location":"app_stats_restapi.html#section_p5n_2bc_kyb","text":"This action retrieves a list of all apps, available query parameters: forceRefresh : executes statistics collection on all apps. Default value: false includeForms : whether includes app forms information in response. Default value: false includeAdmins : whether includes app administrators information in response. Default value: false format : (case sensitive) acceptable values: json, application/json, xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet filename : only used when pFormat is set to xlsx format. The file extension has to be xlsx. Note: When the format is an open document and a file is downloaded, if the file name is not set, the default file name is app.xlsx.","title":"List"},{"location":"app_stats_restapi.html#section_qwb_qbc_kyb","text":"This action retrieves the details for a single app. Parent topic: REST API reference","title":"App detail"},{"location":"as_assigning_users_or_groups_to_roles.html","text":"Assigning users or groups to roles Give the users in your organization permission to work with the data relevant to them by assigning them roles. After you establish roles for the users in your organization, you can start assigning users to those roles by adding them individually, or in groups using the Access tab in HCL Leap. For example, you can assign users or groups as defined in your LDAP to Roles . You can use the search to find users and groups within your company directory, or database. There are several predefined groups from which to choose: All Authenticated Users Any user who is authenticated with your organization. Anonymous Users Any user who you want to work anonymously with the application. Invited Users Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Note: Requires allowed anonymous access. Instance Creator The user who submitted a form. Note: You cannot add All Authenticated Users to any role that has application Edit permissions. This prevents the applications from all other users from appearing in your Manage tab, making your applications easier to find. This also prevents your application from appearing on the Manage page for every other authenticated user. To add users from predefined groups: In the Access tab, go to the navigation tree and click the role you want to assign in the Assign Users menu. The Assign Users window opens. Add new usersor groups, or select from a predefined group: To create new usersor groups, enter the name of an individual useror group. Select it, then click the Add user plus sign. Note: There is a limit to the length of a single user name, or ID. The limit varies by language and character set. For example, the English limit is 256 characters. If you exceed the character limit, you are shown an error message when you attempt to save the form. To use an existing group, select the group and click the Add group plus sign. The Role Members window shows the members that are assigned to the role. You can remove members from a role by clicking Delete user for the name of the member., or run a test to see whether Leap can find the member. To remove a member from a group, click Delete group for the name of the member. To test if Leap can find a group member, click Validate . Parent topic: Securing","title":"Assigning users or groups to roles"},{"location":"as_assigning_users_or_groups_to_roles.html#assigning-users-or-groups-to-roles","text":"Give the users in your organization permission to work with the data relevant to them by assigning them roles. After you establish roles for the users in your organization, you can start assigning users to those roles by adding them individually, or in groups using the Access tab in HCL Leap. For example, you can assign users or groups as defined in your LDAP to Roles . You can use the search to find users and groups within your company directory, or database. There are several predefined groups from which to choose:","title":"Assigning users or groups to roles"},{"location":"as_assigning_users_or_groups_to_roles.html#all-authenticated-users","text":"Any user who is authenticated with your organization.","title":"All Authenticated Users"},{"location":"as_assigning_users_or_groups_to_roles.html#anonymous-users","text":"Any user who you want to work anonymously with the application.","title":"Anonymous Users"},{"location":"as_assigning_users_or_groups_to_roles.html#invited-users","text":"Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Note: Requires allowed anonymous access.","title":"Invited Users"},{"location":"as_assigning_users_or_groups_to_roles.html#instance-creator","text":"The user who submitted a form. Note: You cannot add All Authenticated Users to any role that has application Edit permissions. This prevents the applications from all other users from appearing in your Manage tab, making your applications easier to find. This also prevents your application from appearing on the Manage page for every other authenticated user. To add users from predefined groups: In the Access tab, go to the navigation tree and click the role you want to assign in the Assign Users menu. The Assign Users window opens. Add new usersor groups, or select from a predefined group: To create new usersor groups, enter the name of an individual useror group. Select it, then click the Add user plus sign. Note: There is a limit to the length of a single user name, or ID. The limit varies by language and character set. For example, the English limit is 256 characters. If you exceed the character limit, you are shown an error message when you attempt to save the form. To use an existing group, select the group and click the Add group plus sign. The Role Members window shows the members that are assigned to the role. You can remove members from a role by clicking Delete user for the name of the member., or run a test to see whether Leap can find the member. To remove a member from a group, click Delete group for the name of the member. To test if Leap can find a group member, click Validate . Parent topic: Securing","title":"Instance Creator"},{"location":"as_assigning_users_to_maintain_the_application.html","text":"Assigning users to maintain the application To define who can edit an HCL Leap application, use the design settings in the Access tab. By default, only administrators can edit and maintain an application. However, you can also assign other roles to do the task. In the Manage tab, an administrator can grant permission for other users to edit applications. To change who can edit an application, click Design Settings in the Access tab. The Design Settings table opens, displaying roles and their access permissions. To grant or remove edit permission from a user role, click the Edit check box next to that role. Parent topic: Securing","title":"Assigning users to maintain the application"},{"location":"as_assigning_users_to_maintain_the_application.html#assigninguserstomaintaintheapplication","text":"To define who can edit an HCL Leap application, use the design settings in the Access tab. By default, only administrators can edit and maintain an application. However, you can also assign other roles to do the task. In the Manage tab, an administrator can grant permission for other users to edit applications. To change who can edit an application, click Design Settings in the Access tab. The Design Settings table opens, displaying roles and their access permissions. To grant or remove edit permission from a user role, click the Edit check box next to that role. Parent topic: Securing","title":"Assigning users to maintain the application"},{"location":"as_define_security_roles.html","text":"Defining basic security roles for users Create roles for users in your organization so they can work with data that is relevant to them. HCL Leap uses a customizable role-based model to define who can access data and who can modify the application. Roles allow the assignment of data access, and application maintenance permissions.Individuals or groups are then assigned to the roles with the access component, or programmatically through web services. There are three predefined roles: Administrator A role that includes users, or groups, with administrator privileges for an application. Initiator A role that includes any user, or group, who can submit a form or initiate an application. For example, if the application was for Vacation Requests, you can allow all users in your organization to initiate, or submit, a Vacation Request. Record Owner A role that contains the user, or group, who submitted the form dynamically at run time. Each role can be Open (dynamic) or Closed (static). Open roles \u2013 where assignments are done either statically, or dynamically with a web service call defined on a stage action within stages. Users are assigned based on data that is gathered during the form submission. For example, a web service looks up a manager for each user who submits a form, and assigns the manager a role. Closed roles \u2013 where assignments of users and groups to the roles must be done explicitly from within the Access tab. Closed roles do not assign users dynamically with a web service. To add a role: In the design environment, click the Access tab. The Define Roles window opens. Click the Add role green plus sign to add a role. For example, you can name the new role, \u201cManager\u201d. Click the Add role plus sign to define another role. For example, your form also requires a \u201cShift Supervisor\u201d. Use the radio buttons to select whether the role is Open or Closed . Parent topic: Securing","title":"Defining basic security roles for users"},{"location":"as_define_security_roles.html#defining-basic-security-roles-for-users","text":"Create roles for users in your organization so they can work with data that is relevant to them. HCL Leap uses a customizable role-based model to define who can access data and who can modify the application. Roles allow the assignment of data access, and application maintenance permissions.Individuals or groups are then assigned to the roles with the access component, or programmatically through web services. There are three predefined roles:","title":"Defining basic security roles for users"},{"location":"as_define_security_roles.html#administrator","text":"A role that includes users, or groups, with administrator privileges for an application.","title":"Administrator"},{"location":"as_define_security_roles.html#initiator","text":"A role that includes any user, or group, who can submit a form or initiate an application. For example, if the application was for Vacation Requests, you can allow all users in your organization to initiate, or submit, a Vacation Request.","title":"Initiator"},{"location":"as_define_security_roles.html#record-owner","text":"A role that contains the user, or group, who submitted the form dynamically at run time. Each role can be Open (dynamic) or Closed (static). Open roles \u2013 where assignments are done either statically, or dynamically with a web service call defined on a stage action within stages. Users are assigned based on data that is gathered during the form submission. For example, a web service looks up a manager for each user who submits a form, and assigns the manager a role. Closed roles \u2013 where assignments of users and groups to the roles must be done explicitly from within the Access tab. Closed roles do not assign users dynamically with a web service. To add a role: In the design environment, click the Access tab. The Define Roles window opens. Click the Add role green plus sign to add a role. For example, you can name the new role, \u201cManager\u201d. Click the Add role plus sign to define another role. For example, your form also requires a \u201cShift Supervisor\u201d. Use the radio buttons to select whether the role is Open or Closed . Parent topic: Securing","title":"Record Owner"},{"location":"as_setting_stage_permissions.html","text":"Setting Stage permissions Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. A Stage is a step in the life of a form. By default, each form has a Start and Submitted stage. The Start stage is activated when a user begins a form. The Submitted stage is the end of the workflow. You can define different permissions for each role on different stages. There are four actions users can take in the Access tab: Create By default, an initiator can create a form when the application is deployed. Read By default, only record owners and administrators can read the form when it is submitted. Update By default, no one can change the form after it is submitted. However, you can authorize users to update the form in the View Data section. Delete By default, only administrators can delete a form from the database. For example, you can add a custom stage for manager approval by adding a stage, and giving a manager permission to modify the form. The following steps describe how to set the permission for a stage. Before using the following instructions, you must create a Stage between the Start and Submitted stages. Click the Access tab. In the Stage Settings parent, select the new stage that you created. Check the permissions for the stage for each role. Permissions must be set for each stage of a form. The permissions that are set on one stage do not carry forward to another stage. Parent topic: Securing","title":"Setting Stage permissions"},{"location":"as_setting_stage_permissions.html#settingstagepermissions","text":"Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. A Stage is a step in the life of a form. By default, each form has a Start and Submitted stage. The Start stage is activated when a user begins a form. The Submitted stage is the end of the workflow. You can define different permissions for each role on different stages. There are four actions users can take in the Access tab:","title":"Setting Stage permissions"},{"location":"as_setting_stage_permissions.html#create","text":"By default, an initiator can create a form when the application is deployed.","title":"Create"},{"location":"as_setting_stage_permissions.html#read","text":"By default, only record owners and administrators can read the form when it is submitted.","title":"Read"},{"location":"as_setting_stage_permissions.html#update","text":"By default, no one can change the form after it is submitted. However, you can authorize users to update the form in the View Data section.","title":"Update"},{"location":"as_setting_stage_permissions.html#delete","text":"By default, only administrators can delete a form from the database. For example, you can add a custom stage for manager approval by adding a stage, and giving a manager permission to modify the form. The following steps describe how to set the permission for a stage. Before using the following instructions, you must create a Stage between the Start and Submitted stages. Click the Access tab. In the Stage Settings parent, select the new stage that you created. Check the permissions for the stage for each role. Permissions must be set for each stage of a form. The permissions that are set on one stage do not carry forward to another stage. Parent topic: Securing","title":"Delete"},{"location":"as_setting_up_security_for_anon_access.html","text":"Setting up security for anonymous access Using the correct permissions, you can allow anonymous users to access a form. To allow anyone to complete a form anonymously, without asking for authentication, use the following steps. No data about the user is captured or stored. Note: Administrators must allow anonymous access first. Start a new application. Enter an application name. From the dashboard in the design environment, click Access . Click the Initiator role in the Access navigation. In the Add Users window, click the Add group icon next to the predefined \u201cAnonymous Users\u201d group. Once selected, the group appears in the Role Members window. In the Stage Settings section of the Access tab, select the Start stage for your form. Confirm that the Initiator has the Create permission selected. This setting allows anonymous users to submit responses. If a registered user is identified, they can either create a form anonymously or log in using their credentials. Note: If a user logs on using their credentials, they are no longer anonymous and their user data will be stored. In the Stage Settings section of the Access tab, select the Submitted stage for your form. Confirm that the Initiator has the Read permission selected. This setting allows anonymous users to view responses. You can now send users the View Data URL from the Manage tab. For more information on the View Data URL, see Viewing submitted responses . Parent topic: Securing","title":"Setting up security for anonymous access"},{"location":"as_setting_up_security_for_anon_access.html#settingupsecurityforanonymyousorguestaccess","text":"Using the correct permissions, you can allow anonymous users to access a form. To allow anyone to complete a form anonymously, without asking for authentication, use the following steps. No data about the user is captured or stored. Note: Administrators must allow anonymous access first. Start a new application. Enter an application name. From the dashboard in the design environment, click Access . Click the Initiator role in the Access navigation. In the Add Users window, click the Add group icon next to the predefined \u201cAnonymous Users\u201d group. Once selected, the group appears in the Role Members window. In the Stage Settings section of the Access tab, select the Start stage for your form. Confirm that the Initiator has the Create permission selected. This setting allows anonymous users to submit responses. If a registered user is identified, they can either create a form anonymously or log in using their credentials. Note: If a user logs on using their credentials, they are no longer anonymous and their user data will be stored. In the Stage Settings section of the Access tab, select the Submitted stage for your form. Confirm that the Initiator has the Read permission selected. This setting allows anonymous users to view responses. You can now send users the View Data URL from the Manage tab. For more information on the View Data URL, see Viewing submitted responses . Parent topic: Securing","title":"Setting up security for anonymous access"},{"location":"builtin_properties_widgets.html","text":"Built-In Properties Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. The following built-in properties are supported for custom widgets: 'required' : for data widgets, allows the app author to ensure that a value is collected. Requiredness will be enforced beyond the UI; the integrity of the data will be enforced when it is submitted to the server. 'title' : this is used in various contexts to allow for editing and display of the name of a widget instance. 'seenInOverview' : allows the app author to decide if the widget's data should be displayed in the View Data page. 'range' : this adds a Range with minimum and maximum properties to the property panel and allows an app author to specify minimum and maximum value. This property can be used with widgets with datatype of number, time, date and timestamp. 'format' : this adds a Format property to the property panel and allows an app author to specify a format for the string. This property can be used by widgets with datatype of string only. Example: const myWidgetDefinition = { ... builtInProperties : [{ id: 'required'}, {id: 'title'}, {id: 'seenInOverview', defaultValue: true}], ... } Note: All widgets will be implicitly given an ID property. The default value of this property will be auto-incrementing unique value based on the last substring of the widget definition's id. For example, a widget with an id of 'example.YesNo' will result in a default ID of ' F_YesNo1'. Similar to Leap's built-in widgets, the app author is free to alter the ID to suit their needs. Parent topic: Custom Widget API","title":"Built-In Properties"},{"location":"builtin_properties_widgets.html#builtin_properties_widgets","text":"Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. The following built-in properties are supported for custom widgets: 'required' : for data widgets, allows the app author to ensure that a value is collected. Requiredness will be enforced beyond the UI; the integrity of the data will be enforced when it is submitted to the server. 'title' : this is used in various contexts to allow for editing and display of the name of a widget instance. 'seenInOverview' : allows the app author to decide if the widget's data should be displayed in the View Data page. 'range' : this adds a Range with minimum and maximum properties to the property panel and allows an app author to specify minimum and maximum value. This property can be used with widgets with datatype of number, time, date and timestamp. 'format' : this adds a Format property to the property panel and allows an app author to specify a format for the string. This property can be used by widgets with datatype of string only. Example: const myWidgetDefinition = { ... builtInProperties : [{ id: 'required'}, {id: 'title'}, {id: 'seenInOverview', defaultValue: true}], ... } Note: All widgets will be implicitly given an ID property. The default value of this property will be auto-incrementing unique value based on the last substring of the widget definition's id. For example, a widget with an id of 'example.YesNo' will result in a default ID of ' F_YesNo1'. Similar to Leap's built-in widgets, the app author is free to alter the ID to suit their needs. Parent topic: Custom Widget API","title":"Built-In Properties"},{"location":"co_config_app_server_enviro.html","text":"Application server environment configuration The following general information describes the requirements for configuring your application server environment. By default the settings available from WebSphere\u00ae Application Server are sufficient for general usage. Refer to the WebSphere Application Server documentation for general set-up. For basic architecture of Leap, see Leap Basic Architecture . Loading/performance: When you set up your Application Server environment for HCL Leap, you should follow the performance tuning guidelines in the WebSphere Application Server documentation . To achieve the best performance for the workload on your system, you might want to consider altering the following settings: Use a web server and configure the WebSphere Application Server plugins to provide load balancing, fail-over, and the ability to deploy in a DMZ. Update the Java heap size for your server. For further information, see WebSphere Application Server documentation . Increase the web container threads within WebSphere Application Server Increase the JDBC connection pool to the Leap database. For more information, see WebSphere Application Server documentation . Security: When you consider security, standard web application security practices must be considered. Leap provides application-level security. However it relies on the server environment for extra security. Ensure that your information is secure by using SSL whenever possible. Communication between the web browser and Leap when you use service descriptions and web services through the HTTP Service Transport, and the JDBC connection between Leap and the Leap database must be secured. Setting up an HTTP Strict Transport Security provides a method to ensure SSL communications from your application environment. Restrict cookies to HTTP requests whenever possible to prevent access from JavaScript, especially relating to sessions and authentication (LTPA tokens). Restrict the ability to put Leap content in an iFrame if embedding is not part of your planned integration. Adding HTTP headers such as X-Frames-Options or Content-Security-Policy provides an extra layer of security. Use IBM HTTP Server as a front end server to prevent direct access to the Application Server environment. Using a front end server allows for clustering through the WebSphere Application Server plug-in. Keep your system updated with all security and maintenance patches to ensure a safe and stable environment. Watch for security bulletins in the HCL Support Portal, or by subscribing to My Notifications for updates. For more WebSphere Application Server information, see WebSphere Application Server documentation , and Advanced Security Hardening WebSphere Application Server . Parent topic: Configuring","title":"Application server environment configuration"},{"location":"co_config_app_server_enviro.html#concept_zdw_tzs_nv","text":"The following general information describes the requirements for configuring your application server environment. By default the settings available from WebSphere\u00ae Application Server are sufficient for general usage. Refer to the WebSphere Application Server documentation for general set-up. For basic architecture of Leap, see Leap Basic Architecture . Loading/performance: When you set up your Application Server environment for HCL Leap, you should follow the performance tuning guidelines in the WebSphere Application Server documentation . To achieve the best performance for the workload on your system, you might want to consider altering the following settings: Use a web server and configure the WebSphere Application Server plugins to provide load balancing, fail-over, and the ability to deploy in a DMZ. Update the Java heap size for your server. For further information, see WebSphere Application Server documentation . Increase the web container threads within WebSphere Application Server Increase the JDBC connection pool to the Leap database. For more information, see WebSphere Application Server documentation . Security: When you consider security, standard web application security practices must be considered. Leap provides application-level security. However it relies on the server environment for extra security. Ensure that your information is secure by using SSL whenever possible. Communication between the web browser and Leap when you use service descriptions and web services through the HTTP Service Transport, and the JDBC connection between Leap and the Leap database must be secured. Setting up an HTTP Strict Transport Security provides a method to ensure SSL communications from your application environment. Restrict cookies to HTTP requests whenever possible to prevent access from JavaScript, especially relating to sessions and authentication (LTPA tokens). Restrict the ability to put Leap content in an iFrame if embedding is not part of your planned integration. Adding HTTP headers such as X-Frames-Options or Content-Security-Policy provides an extra layer of security. Use IBM HTTP Server as a front end server to prevent direct access to the Application Server environment. Using a front end server allows for clustering through the WebSphere Application Server plug-in. Keep your system updated with all security and maintenance patches to ensure a safe and stable environment. Watch for security bulletins in the HCL Support Portal, or by subscribing to My Notifications for updates. For more WebSphere Application Server information, see WebSphere Application Server documentation , and Advanced Security Hardening WebSphere Application Server . Parent topic: Configuring","title":"Application server environment configuration"},{"location":"co_config_toc.html","text":"Configuring This section contains information on how to configure Leap. Application server environment configuration The following general information describes the requirements for configuring your application server environment. Configuring the properties file When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system.","title":"Configuring"},{"location":"co_config_toc.html#configtocdita","text":"This section contains information on how to configure Leap. Application server environment configuration The following general information describes the requirements for configuring your application server environment. Configuring the properties file When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system.","title":"Configuring"},{"location":"co_configuration_properties%28org%29.html","text":"Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ``` ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP ``` anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked | |appFilesWhiteList appFilesBlackList appFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi | |appStats.timerEnabled appStats.refreshHour appStats.refreshDays |By default, the timer is enabled and the collection time is set to 3am daily local server timer. Note: Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour Sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 | |attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) attachmentFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi | |blockAnonAccess|As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: enabled - anonymous access is blocked disabled - anonymous access is allowed redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect | |customThemes.[ID].displayName customThemes.[ID].location customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] |The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: customThemes.[ID].displayName customThemes.[ID].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] isDefault - If set to true, designates the theme as the default selection for new applications. nl.[LOCALE] - For globalization support of the theme's display name. [LOCALE] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the http task to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: ``` {#codeblock_wgh_s51_hzb} customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css | |detectBrowser|If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn **Example:** ``` {#codeblock_iqt_j2f_gzb} ibm.nitro.NitroConfig.detectBrowser=warn | |disableUseTab|Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: true - \"Use\" tab is hidden false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true | |EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents |Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: EventHandler.infoLevelEvents EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: \"builder/app/delete\" \u2013 Application is deleted \"builder/app/deploy\" \u2013 Application is deployed for the first time \"builder/app/redeploy\" \u2013 A deployed application is deployed again \"builder/app/stop\" \u2013 A deployed application is stopped \"builder/app/import\" \u2013 Application is imported \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data \"builder/app/export\" \u2013 Application is exported \"builder/app/exportWithData\" \u2013 Application is exported with data \"builder/app/upgrade\" \u2013 Application is upgraded \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced \"builder/app/result/export\" \u2013 Application data is exported from View Data (or REST API) \"builder/app/retrieve/source\" \"builder/app/query/deployed\" \"builder/record/submit\" \u2013 A form is submitted \"builder/record/update\" \u2013 A specific form record is updated \"builder/record/delete\" \u2013 A specific form record is deleted \"builder/data/insert/user\" \"builder/data/insert/code\" \"builder/data/update/user\" \"builder/data/update/code\" \"builder/data/delete/user\" \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit | |exportDataWithEmails|By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: true - emails are exported with application data false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true | |imageDomainWhitelist.enabled=true imageDomainWhitelist.[N].domain |The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.[N].domain = where \"[N]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com | |InfoEntryPoint.dailyInfo|Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help. Example: ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** | |LogoutServlet.postLogoutRedirectURL|The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ``` {#codeblock_zxm_42f_gzb} ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout | |maximumRecordsToRetrieve|Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. **Note:** The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. **Example:** ``` {#codeblock_qy1_1df_gzb} ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 | |MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName | MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias vmmAdmin to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn | |purgeOrphanFilesHours|In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 | |runtimeCSP|The runtimeCSP setting defines the Content-Security-Policy header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP For more information on Strict CSP, see Strict CSP . Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * | |runtimeResources.[N]|Additional web resources to load into the Domino Leap UI for leveraging the Custom Widget API . The values from these settings will be injected into the <head> section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = <link rel='stylesheet' type='text/css' media='screen' href='/custom-widgets/samples/acme/Acme_Widgets.css'> ibm.nitro.NitroConfig.runtimeResources.2 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_common.js'></script> ibm.nitro.NitroConfig.runtimeResources.3 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_Boolean_Widget.js'></script> | |secureJS|Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to FALSE might expose users to malicious JavaScript. Only set to FALSE in a secured environment where Leap applications are created by trusted users. For more information, see JavaScript API for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true | |serviceAuthorization.enabled serviceAuthorization.jxpath-sample |Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by ibm.was.MemberManager.userProps.id = mail and ibm.was.MemberManager.groupProps.id = name respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set ibm.nitro.NitroConfig.serviceAuthorization.enabled=true .Multiple services may be defined. To define a service authorization, add ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples. Note: A backslash (\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } | |serverURI|Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar. Example: ibm.nitro.NitroConfig.serverURI = http://host:9080/apps | |servicesWhitelist.enabled servicesWhitelist.[N].actions servicesWhitelist.[N].domain |The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting servicesWhitelist.enabled=true , for each service two additional parameters must be set: servicesWhitelist.[N].domain = servicesWhitelist.[N].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ``` {#codeblock_qdk_2ff_gzb} ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT **Note:** This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. | |SetupAll.setupStatus|After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. **Example**: ``` {#codeblock_twt_qs5_jzb} ibm.nitro.SetupAll.setupStatus = start | |viewResponsesMaximumCount|For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 | |wchApiUrl|IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/<guid> | |wchEnabled|Enables integration with IBM Watson Content Hub . This allows Leap applications to select assets from IBM Watson Content Hub.Where: true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub (a Watson Content Hub subscription is required) false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false | |xFrameOptions|Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN | Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuration_properties%28org%29.html#configuration-properties","text":"The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ``` ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP ``` anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked | |appFilesWhiteList appFilesBlackList appFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi | |appStats.timerEnabled appStats.refreshHour appStats.refreshDays |By default, the timer is enabled and the collection time is set to 3am daily local server timer. Note: Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour Sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 | |attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize |List of allowed (WhiteList), and not allowed (BlackList) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 empty (everything is allowed) attachmentFilesBlackList \u2013 A space separated list of: mimetypes \u2013 text/plain application/vnd.xfdl partial mimetypes \u2013 text/audio/ /plain file extensions \u2013 GIF PDF XML default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: mimetypes \u2013 text/plain application/ /vnd.xfdl file extensions \u2013 GIF PDF XML or default as special type default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi | |blockAnonAccess|As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: enabled - anonymous access is blocked disabled - anonymous access is allowed redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect | |customThemes.[ID].displayName customThemes.[ID].location customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] |The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: customThemes.[ID].displayName customThemes.[ID].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: customThemes.[ID].isDefault customThemes.[ID].nl.[LOCALE] isDefault - If set to true, designates the theme as the default selection for new applications. nl.[LOCALE] - For globalization support of the theme's display name. [LOCALE] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the http task to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: ``` {#codeblock_wgh_s51_hzb} customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css | |detectBrowser|If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn **Example:** ``` {#codeblock_iqt_j2f_gzb} ibm.nitro.NitroConfig.detectBrowser=warn | |disableUseTab|Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: true - \"Use\" tab is hidden false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true | |EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents |Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: EventHandler.infoLevelEvents EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: \"builder/app/delete\" \u2013 Application is deleted \"builder/app/deploy\" \u2013 Application is deployed for the first time \"builder/app/redeploy\" \u2013 A deployed application is deployed again \"builder/app/stop\" \u2013 A deployed application is stopped \"builder/app/import\" \u2013 Application is imported \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data \"builder/app/export\" \u2013 Application is exported \"builder/app/exportWithData\" \u2013 Application is exported with data \"builder/app/upgrade\" \u2013 Application is upgraded \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced \"builder/app/result/export\" \u2013 Application data is exported from View Data (or REST API) \"builder/app/retrieve/source\" \"builder/app/query/deployed\" \"builder/record/submit\" \u2013 A form is submitted \"builder/record/update\" \u2013 A specific form record is updated \"builder/record/delete\" \u2013 A specific form record is deleted \"builder/data/insert/user\" \"builder/data/insert/code\" \"builder/data/update/user\" \"builder/data/update/code\" \"builder/data/delete/user\" \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit | |exportDataWithEmails|By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: true - emails are exported with application data false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true | |imageDomainWhitelist.enabled=true imageDomainWhitelist.[N].domain |The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.[N].domain = where \"[N]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com | |InfoEntryPoint.dailyInfo|Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help. Example: ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** | |LogoutServlet.postLogoutRedirectURL|The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ``` {#codeblock_zxm_42f_gzb} ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout | |maximumRecordsToRetrieve|Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. **Note:** The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. **Example:** ``` {#codeblock_qy1_1df_gzb} ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 | |MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName | MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias vmmAdmin to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn | |purgeOrphanFilesHours|In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 | |runtimeCSP|The runtimeCSP setting defines the Content-Security-Policy header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP For more information on Strict CSP, see Strict CSP . Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * | |runtimeResources.[N]|Additional web resources to load into the Domino Leap UI for leveraging the Custom Widget API . The values from these settings will be injected into the <head> section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = <link rel='stylesheet' type='text/css' media='screen' href='/custom-widgets/samples/acme/Acme_Widgets.css'> ibm.nitro.NitroConfig.runtimeResources.2 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_common.js'></script> ibm.nitro.NitroConfig.runtimeResources.3 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_Boolean_Widget.js'></script> | |secureJS|Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to FALSE might expose users to malicious JavaScript. Only set to FALSE in a secured environment where Leap applications are created by trusted users. For more information, see JavaScript API for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true | |serviceAuthorization.enabled serviceAuthorization.jxpath-sample |Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by ibm.was.MemberManager.userProps.id = mail and ibm.was.MemberManager.groupProps.id = name respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set ibm.nitro.NitroConfig.serviceAuthorization.enabled=true .Multiple services may be defined. To define a service authorization, add ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples. Note: A backslash (\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } | |serverURI|Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar. Example: ibm.nitro.NitroConfig.serverURI = http://host:9080/apps | |servicesWhitelist.enabled servicesWhitelist.[N].actions servicesWhitelist.[N].domain |The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting servicesWhitelist.enabled=true , for each service two additional parameters must be set: servicesWhitelist.[N].domain = servicesWhitelist.[N].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ``` {#codeblock_qdk_2ff_gzb} ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT **Note:** This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. | |SetupAll.setupStatus|After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. **Example**: ``` {#codeblock_twt_qs5_jzb} ibm.nitro.SetupAll.setupStatus = start | |viewResponsesMaximumCount|For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 | |wchApiUrl|IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/<guid> | |wchEnabled|Enables integration with IBM Watson Content Hub . This allows Leap applications to select assets from IBM Watson Content Hub.Where: true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub (a Watson Content Hub subscription is required) false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false | |xFrameOptions|Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN | Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuration_properties.html","text":"Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked appFilesWhiteList appFilesBlackList appFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi appStats.timerEnabled appStats.refreshHour appStats.refreshDays By default, the timer is enabled and the collection time is set to 3am daily local server timer.**Note:** Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty \\(everything is allowed\\) attachmentFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi blockAnonAccess As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: - enabled - anonymous access is blocked - disabled - anonymous access is allowed - redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect customThemes.\\[ID\\].displayName customThemes.\\[ID\\].location customThemes.\\[ID\\].isDefault customThemes.\\[ID\\].nl.\\[LOCALE\\] The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: - customThemes.\\[ID\\].displayName - customThemes.\\[ID\\].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: - customThemes.\\[ID\\].isDefault - customThemes.\\[ID\\].nl.\\[LOCALE\\] isDefault - If set to true, designates the theme as the default selection for new applications. nl.\\[LOCALE\\] - For globalization support of the theme's display name. \\[LOCALE\\] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the Leap server to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css detectBrowser If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn Example: ibm.nitro.NitroConfig.detectBrowser=warn disableUseTab Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: - true - \"Use\" tab is hidden - false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap\\_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: - EventHandler.infoLevelEvents - EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: - \"builder/app/delete\" \u2013 Application is deleted - \"builder/app/deploy\" \u2013 Application is deployed for the first time - \"builder/app/redeploy\" \u2013 A deployed application is deployed again - \"builder/app/stop\" \u2013 A deployed application is stopped - \"builder/app/import\" \u2013 Application is imported - \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed - \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data - \"builder/app/export\" \u2013 Application is exported - \"builder/app/exportWithData\" \u2013 Application is exported with data - \"builder/app/upgrade\" \u2013 Application is upgraded - \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced - \"builder/app/result/export\" \u2013 Application data is exported from View Data \\(or REST API\\) - \"builder/app/retrieve/source\" - \"builder/app/query/deployed\" - \"builder/record/submit\" \u2013 A form is submitted - \"builder/record/update\" \u2013 A specific form record is updated - \"builder/record/delete\" \u2013 A specific form record is deleted - \"builder/data/insert/user\" - \"builder/data/insert/code\" - \"builder/data/update/user\" - \"builder/data/update/code\" - \"builder/data/delete/user\" - \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit exportDataWithEmails By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: - true - emails are exported with application data - false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true imageDomainWhitelist.enabled=true imageDomainWhitelist.\\[N\\].domain The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.\\[N\\].domain = where \"\\[N\\]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com InfoEntryPoint.dailyInfo Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help.**Example:** ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** LogoutServlet.postLogoutRedirectURL The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout maximumRecordsToRetrieve Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. Note: The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. Example: ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias **vmmAdmin** to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn purgeOrphanFilesHours In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 runtimeCSP The runtimeCSP setting defines the `Content-Security-Policy` header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see [https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP](https://apc01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FHTTP%2FCSP&data=05%7C01%7Cnatalie.mezzina%40hcl.com%7C8a7d42f352b44ca3836e08dacdb6b55a%7C189de737c93a4f5a8b686f4ca9941912%7C0%7C0%7C638048482179359357%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=EaK4MB589PFSRNjwx%2BZebUAajhhBcSLoGfPuyha2eY8%3D&reserved=0) For more information on Strict CSP, see [Strict CSP](leap_strict_csp.md). Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * runtimeResources.\\[N\\] Additional web resources to load into the Domino Leap UI for leveraging the [Custom Widget API](customwidgetapi_landing.md). The values from these settings will be injected into the section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = <link rel='stylesheet' type='text/css' media='screen' href='/custom-widgets/samples/acme/Acme_Widgets.css'> ibm.nitro.NitroConfig.runtimeResources.2 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_common.js'></script> ibm.nitro.NitroConfig.runtimeResources.3 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_Boolean_Widget.js'></script> secureJS Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to `FALSE` might expose users to malicious JavaScript. Only set to `FALSE` in a secured environment where Leap applications are created by trusted users. For more information, see [JavaScript API](ref_javascript_api.md) for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true serviceAuthorization.enabled serviceAuthorization.jxpath-sample Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by `ibm.was.MemberManager.userProps.id = mail` and `ibm.was.MemberManager.groupProps.id = name` respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set `ibm.nitro.NitroConfig.serviceAuthorization.enabled=true`.Multiple services may be defined. To define a service authorization, add `ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN` where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples.**Note:** A backslash \\(\\\\\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } serverURI Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar.**Example:** ibm.nitro.NitroConfig.serverURI = http://host:9080/apps servicesWhitelist.enabled servicesWhitelist.\\[N\\].actions servicesWhitelist.\\[N\\].domain The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting `servicesWhitelist.enabled=true`, for each service two additional parameters must be set: - servicesWhitelist.\\[N\\].domain = - servicesWhitelist.\\[N\\].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] < is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT Note: This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. SetupAll.setupStatus After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. Example: ibm.nitro.SetupAll.setupStatus = start viewResponsesMaximumCount For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 wchApiUrl IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/<guid> wchEnabled Enables integration with [IBM Watson Content Hub](https://www.digitalexperience.ibm.com/). This allows Leap applications to select assets from IBM Watson Content Hub.Where: - true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub \\(a Watson Content Hub subscription is required\\) - false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false xFrameOptions Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuration_properties.html#configuration-properties","text":"The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Table 1. List of properties in the Leap_config.properties configuration file Setting Description adminInfo You can provide the user more contact information when the following error message is shown. If the message is \u201cWe are unable to process your request. If this error persists, report the problem to your administrator at adminInfo1 , or adminInfo2 , and provide error reference: XXX.\u201d You provide adminInfo1 and adminInfo2 . If you provide only adminInfo1 , then the message is shortened. Examples: ibm.nitro.NitroConfig.adminInfo1 = admin@yourcompany.com ibm.nitro.NitroConfig.adminInfo2 = 1-800-GET-HELP anonBlockedMsg=Anonymous access blocked When a user attempts to access a Leap application anonymously, an error message is displayed. The default message is \u201cAnonymous access blocked\u201d. You can change the default message to provide additional information to the user. Example: ibm.nitro.NitroConfig.anonBlockedMsg=Anonymous access blocked appFilesWhiteList appFilesBlackList appFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for Application File uploads. appFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty (everything is allowed) appFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe appFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.appFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.appFilesBlackList =exe ibm.nitro.NitroConfig.appFilesMaxSize.10000 = default ibm.nitro.NitroConfig.appFilesMaxSize.50000 = mov avi appStats.timerEnabled appStats.refreshHour appStats.refreshDays By default, the timer is enabled and the collection time is set to 3am daily local server timer.**Note:** Depending on the volume of applications, statistics collection may take 10+ minutes, adjust the timer and frequency to server quiet time. appStats.timerEnabled Enable Application Statistics collection. To disable Application Statistics collection, set to false. Default value: true appStats.refreshHour sets the hour of day to start Application Statistics collection. Value 0 to 23, indicating the hour of day to start the statistics collection process. Default value: 3 appStats.refreshDays Sets the Application Statistics collection day. Use full names of day of the week, separated by a comma, semicolon, or space. Valid values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Default value: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday Examples: ibm.nitro.NitroConfig.appStats.timerEnabled=true ibm.nitro.NitroConfig.appStats.refreshDays=Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ibm.nitro.NitroConfig.appStats.refreshHour=3 attachmentFilesWhiteList attachmentFilesBlackList attachmentFilesMaxSize List of allowed \\(WhiteList\\), and not allowed \\(BlackList\\) of mimetypes, and the number of maximum file sizes for the Attachment form item. attachmentFilesWhiteList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 empty \\(everything is allowed\\) attachmentFilesBlackList \u2013 A space separated list of: - mimetypes \u2013 text/plain application/vnd.xfdl - partial mimetypes \u2013 text/audio/ /plain - file extensions \u2013 GIF PDF XML - default value \u2013 exe js html svg attachmentFilesMaxSize (size in kb) \u2013 A space separated list of: - mimetypes \u2013 text/plain application/ /vnd.xfdl - file extensions \u2013 GIF PDF XML or default as special type - default value \u2013 5000 Examples: ibm.nitro.NitroConfig.attachmentFilesWhiteList = css js html exe text/plain application/vnd.xfdl mov avi ibm.nitro.NitroConfig.attachmentFilesBlackList =exe ibm.nitro.NitroConfig.attachmentFilesMaxSize.10000 = default ibm.nitro.NitroConfig.attachmentFilesMaxSize.50000 = mov avi blockAnonAccess As of Leap 8.5.1 anonymous access is no longer allowed by default. To complete a Leap application or survey, users must authenticate with a valid user ID and password. Where: - enabled - anonymous access is blocked - disabled - anonymous access is allowed - redirect - redirects the user to authenticate Note: Redirection is not available for Leap with WebSphere\u00ae Portal. Default value: redirect Example: ibm.nitro.NitroConfig.blockAnonAccess=redirect customThemes.\\[ID\\].displayName customThemes.\\[ID\\].location customThemes.\\[ID\\].isDefault customThemes.\\[ID\\].nl.\\[LOCALE\\] The customThemes config settings define a list of customer-provided themes that can be used in Leap applications. For each theme, two parameters must be set: - customThemes.\\[ID\\].displayName - customThemes.\\[ID\\].location [ID] - An identifier for the custom theme (e.g. \"corpTheme1\"). The id can contain the letters 'a' through 'z' and numbers, and must start with a letter. displayName - The theme name to be displayed in the Leap authoring UI. location -The full URL of the theme's .css file. For each theme, there are 2 optional parameters: - customThemes.\\[ID\\].isDefault - customThemes.\\[ID\\].nl.\\[LOCALE\\] isDefault - If set to true, designates the theme as the default selection for new applications. nl.\\[LOCALE\\] - For globalization support of the theme's display name. \\[LOCALE\\] is the locale code that identifies the language (e.g.,\"en\", \"fr\", \"fr_CA\", \"zh\"). After modifying these settings, restart the Leap server to see the changes in the authoring environment. If the location property of a theme is modified, any deployed applications using that custom theme need to be redeployed for changes to take affect. Examples: customThemes.corpTheme1.displayName = Corporate Theme 1 customThemes.corpTheme1.nl.fr = Th\u00e8me d'entreprise 1 customThemes.corpTheme1.nl.zh = \u4f01\u4e1a\u4e3b\u98981 customThemes.corpTheme1.isDefault = true customThemes.corpTheme1.location =https://mycompany.com/theme1.css detectBrowser If Leap detects an unsupported browser, a warning message is displayed to the user. The user can still see the form after the warning message is closed.Where: - warn - The user is warned that the browser is unsupported. A list of supported browsers is displayed in the warning message. When the user closes the warning message, the form is displayed. - ignore - The user is not warned that the browser is unsupported, and the form is displayed. Default value: warn Example: ibm.nitro.NitroConfig.detectBrowser=warn disableUseTab Hides the \"Use\" tab, and prevents fetching the list of deployed and usable applications.Where: - true - \"Use\" tab is hidden - false - \"Use\" tab is displayed Default value: false Example: ibm.nitro.NitroConfig.disableUseTab=true EventHandler.infoLevelEvents EventHandler.debugLevelEvents EventHandler.auditLevelEvents Leap contains an event handling implementation that enables printing out all or specific events in the system log or in a separate file based on properties setting, by default this feature is not enabled. Change properties, in the Leap\\_config.properties file, to monitor events that you are interested in, and where you want to output the event information.The following will output Events information in Application Server's system log at info or debug level: - EventHandler.infoLevelEvents - EventHandler.debugLevelEvents auditLevelEvents will output to a file. The default file location on Windows is c:\\\\febEvents.log and AIX/Linux is /febEvents.log, with maximum file size 5MB, back up to 5 files. The content of the event output is in CSV format, the description of the data: Event topic, event issued time stamp, user id, user email, Leap application id, Leap application name, Leap application Form short name, Record Id, result The following is the list of event topics that Leap sends out: - \"builder/app/delete\" \u2013 Application is deleted - \"builder/app/deploy\" \u2013 Application is deployed for the first time - \"builder/app/redeploy\" \u2013 A deployed application is deployed again - \"builder/app/stop\" \u2013 A deployed application is stopped - \"builder/app/import\" \u2013 Application is imported - \"builder/app/importAndDeploy\" \u2013 Application is imported and deployed - \"builder/app/importAndDeployWithData\" \u2013 Application is imported and deployed with data - \"builder/app/export\" \u2013 Application is exported - \"builder/app/exportWithData\" \u2013 Application is exported with data - \"builder/app/upgrade\" \u2013 Application is upgraded - \"builder/app/upgradeWithDataReplaced\" \u2013 Application is upgraded and the data replaced - \"builder/app/result/export\" \u2013 Application data is exported from View Data \\(or REST API\\) - \"builder/app/retrieve/source\" - \"builder/app/query/deployed\" - \"builder/record/submit\" \u2013 A form is submitted - \"builder/record/update\" \u2013 A specific form record is updated - \"builder/record/delete\" \u2013 A specific form record is deleted - \"builder/data/insert/user\" - \"builder/data/insert/code\" - \"builder/data/update/user\" - \"builder/data/update/code\" - \"builder/data/delete/user\" - \"builder/data/delete/code\" To capture failed events, use \"builder/error\" + mainEventCode Example: ibm.nitro.EventHandler.infoLevelEvents=builder/record/submit,builder/error/submit exportDataWithEmails By default when you export data from applications, emails are also exported. You can exclude emails from the export by changing the property value to false. Where: - true - emails are exported with application data - false - emails are not exported with application data Default value: true Example: ibm.nitro.NitroConfig.exportDataWithEmails=true imageDomainWhitelist.enabled=true imageDomainWhitelist.\\[N\\].domain The imageDomainWhitelist config settings define a white-list of domains from where images can be uploaded to a Rich Text Entry field. In addition to setting the following: imageDomainWhitelist.enabled=true for each domain an additional parameters must be set. imageDomainWhitelist.\\[N\\].domain = where \"\\[N\\]\" is an integer number identifying that service. domain - The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. Examples: ibm.nitro.imageDomainWhitelist.enabled=true ibm.nitro.imageDomainWhitelist.[1].domain=http://acme.com ibm.nitro.imageDomainWhitelist.[2].domain=http://acme2.com InfoEntryPoint.dailyInfo Provides HTML content that is shown at the end of the login screen. Can be used for status messages, or help.**Example:** ibm.nitro.InfoEntryPoint.dailyInfo = Welcome to **HCL Leap** LogoutServlet.postLogoutRedirectURL The value of this parameter tells Leap where to redirect user after log off. If the parameter is not configured or left blank, the user is redirected to the login page. Example: ibm.nitro.LogoutServlet.postLogoutRedirectURL=http://example_url.com/signout maximumRecordsToRetrieve Maximum number of records that are permitted for export from the View Data page at one time. If the number of records to be exported exceeds the number set by this property, the export is stopped, and an error message is shown. Note: The default value of 20,000 is supported for base systems. Setting the value higher results in poor performance, depending on result set size and server hardware. Example: ibm.nitro.NitroConfig.maximumRecordsToRetrieve=25000 MemberManager.adminAlias MemberManager.userProps.loginName MemberManager.userProps.id MemberManager.groupProps.id MemberManager.userProps.email MemberManager.userProps.displayName MemberManager.adminAlias setting is mandatory. For WebSphere Application Server only, configure the VMM login. By default, Leap uses J2C alias **vmmAdmin** to authenticate with VMM. You must configure it here if you want to change the J2C alias name. You must have WebSphere Application Server administrative user credentials to run Leap If you use LDAP within WebSphere Application Server, there are a number of properties that look up user and group information. If your LDAP uses different property keys than the ones set by default, update the property keys here so that user and group look up function correctly. If you are using LDAP within WebSphere Application Server, refer to the following settings: MemberManager.userProps.loginName Describes the LDAP property used as the login ID. Each loginName must be unique. Default setting: uid MemberManager.userProps.id Represents a unique key for the user. This key must be identical to the loginName. Default setting: uid MemberManager.groupProps.id Represents a unique key for the group. The value is the LDAP property that is used. For example, cn, represents Common Name. Default setting: cn MemberManager.userProps.email The email address of the user. Leap uses this email address to send notifications and other emails to the user. Default setting: mail MemberManager.userProps.displayName Used to display the name of the user, instead of the login id. Default setting: cn Examples: ibm.was.MemberManager.userProps.loginName = mail ibm.was.MemberManager.userProps.id = mail ibm.was.MemberManager.groupProps.id = name ibm.was.MemberManager.userProps.email = mail ibm.was.MemberManager.userProps.displayName = cn purgeOrphanFilesHours In some circumstances, files attached to either application designs or user-submitted records can become orphaned if the primary design or record element is removed outside the normal process. File records which are older than this number of hours and are no longer associated with an existing primary record are removed by a clean-up agent in VoltBuilder.nsf. Default value: 48 Example: ibm.nitro.purgeOrphanFilesHours=36 runtimeCSP The runtimeCSP setting defines the `Content-Security-Policy` header that will be applied to running Forms. Note: This setting only applies to Forms. It does not currently apply to App Pages, Summarry Charts, or the View Data page. For more information, see [https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP](https://apc01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FHTTP%2FCSP&data=05%7C01%7Cnatalie.mezzina%40hcl.com%7C8a7d42f352b44ca3836e08dacdb6b55a%7C189de737c93a4f5a8b686f4ca9941912%7C0%7C0%7C638048482179359357%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=EaK4MB589PFSRNjwx%2BZebUAajhhBcSLoGfPuyha2eY8%3D&reserved=0) For more information on Strict CSP, see [Strict CSP](leap_strict_csp.md). Example: ibm.nitro.NitroConfig.runtimeCSP=default-src 'self' *.example.com; img-src * runtimeResources.\\[N\\] Additional web resources to load into the Domino Leap UI for leveraging the [Custom Widget API](customwidgetapi_landing.md). The values from these settings will be injected into the section of Domino Leap's HTML pages. Example: ibm.nitro.NitroConfig.runtimeResources.1 = <link rel='stylesheet' type='text/css' media='screen' href='/custom-widgets/samples/acme/Acme_Widgets.css'> ibm.nitro.NitroConfig.runtimeResources.2 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_common.js'></script> ibm.nitro.NitroConfig.runtimeResources.3 = <script nonce='#!#cspNonce!#!' type='text/javascript' src='/custom-widgets/samples/acme/Acme_Boolean_Widget.js'></script> secureJS Enables or disables JavaScript security in run time forms. When a form designer adds custom JavaScript to an application, this flag applies security settings to the custom JavaScript. This flag applies to the entire Leap server for all users. Note: Setting this parameter to `FALSE` might expose users to malicious JavaScript. Only set to `FALSE` in a secured environment where Leap applications are created by trusted users. For more information, see [JavaScript API](ref_javascript_api.md) for Leap. Default value: true Example: ibm.nitro.ApplicationCompilerService.secureJS = true serviceAuthorization.enabled serviceAuthorization.jxpath-sample Access to a service description may be given to a specific user, group, or special assignment. The access control is made up of two parts:- Who may discover and work with the service while designing an application. - Who may run the service. Users or Groups provided must be defined using the attributes defined by `ibm.was.MemberManager.userProps.id = mail` and `ibm.was.MemberManager.groupProps.id = name` respectively.Special assignment valid values are:- all-authenticated: for app author \"discover\" privilege only - anonymous: for app authors and end-user \"discover\" and \"invoke\" privileges - all-authors: for end-user \"invoke\" privilege only To enable service authorizations, set `ibm.nitro.NitroConfig.serviceAuthorization.enabled=true`.Multiple services may be defined. To define a service authorization, add `ibm.nitro.NitroConfig.serviceAuthorization.serviceIdN` where serviceIdN is the 'id' of the service description. The value must be a valid JSON string, see provided samples.**Note:** A backslash \\(\\\\\\) at the very end of a line can be used to present a value over multiple lines. The backslashmust be the very last character on the line. Examples: ibm.nitro.NitroConfig.serviceAuthorization.enabled = true ibm.nitro.NitroConfig.serviceAuthorization.jxpath-sample = {{\"comment\": \"Sample 1\",\"discover\": { \"users\": [ \"user1\" ], \"groups\": [],\"special\": [] }, \"invoke\": { \"users\": [ \"user1\"], \"groups\": [], \"special\": [] } } serverURI Indicates the base URI used for critical functions, including editing applications, and email. Must include everything necessary to connect to the Leap context, for example, /apps. With this entry, all emailed links, and absolute links visible during Leap design time start with the following base URI regardless of what the user enters in the address bar.**Example:** ibm.nitro.NitroConfig.serverURI = http://host:9080/apps servicesWhitelist.enabled servicesWhitelist.\\[N\\].actions servicesWhitelist.\\[N\\].domain The servicesWhitelist config settings define a white list of domains and HTTP actions that app authors are allowed to call directly from their applications using URL based services. In addition to setting `servicesWhitelist.enabled=true`, for each service two additional parameters must be set: - servicesWhitelist.\\[N\\].domain = - servicesWhitelist.\\[N\\].actions = The domain property implicitly allows sub-domains. For example, a domain property of example.com allows URLs such as https://www.example.com/anything,http://api.example.com/anything , or https://example.com/anything. The https or http protocol included in the domain property is respected. For example, a domain property of https://api.example.com only allows calls to secure SSL https://api.example.com/anything and not to non-secure http://api.example.com/anything. The actions property is a comma-separated list of the HTTP actions allowed for a particular domain. Valid values are GET, PUT, POST, and DELETE. If the actions value is missing, no actions are allowed. Where [N] < is an integer number identifying that service. For more information, see the servicesWhitelist documents in VoltConfig.nsf. Default value: true Examples: ibm.nitro.NitroConfig.servicesWhitelist.enabled = true ibm.nitro.NitroConfig.servicesWhitelist.1.domain = example.com ibm.nitro.NitroConfig.servicesWhitelist.1.actions = GET ibm.nitro.NitroConfig.servicesWhitelist.2.domain = https://securehost.com ibm.nitro.NitroConfig.servicesWhitelist.2.actions = GET, POST,PUT Note: This white-list has no effect on service descriptions and custom service transports that were installed on the server by the administrator. SetupAll.setupStatus After deploying Leap for the first time or upgrading to a newer version, there is a setup screen that is presented upon accessing the manage page. This setup screen shows the status of detecting and updating the database tables, checks that security is properly enabled, and a mail session is configured. This page requires the admin to click a button to fully progress through the setup. To disable this setup page and required admin interaction add the property `ibm.nitro.SetupAll.setupStatus = start`. Example: ibm.nitro.SetupAll.setupStatus = start viewResponsesMaximumCount For WebSphere Application Server with DB2\u00ae, or Oracle. The maximum number of records that View Response counts up to when returning large record sets. Larger values are still returned, but the paging no longer accurately lists the total number of pages. Setting this value higher can have performance consequences for the server if there are many users viewing forms with large response lists. Example: ibm.nitro.NitroConfig.viewResponsesMaximumCount=2000 wchApiUrl IBM Watson Content Hub API URL. This setting is optional. When set in the config, all Leap users will use the same Watson Content Hub tenant for selecting assets. When it's not set, Leap design users can set their own Watson Content Hub API URL at the time of use.ibm.nitro.NitroConfig.wchEnabled=true is required for this setting to work. Example: ibm.nitro.NitroConfig.wchApiUrl=https://my1.digitalexperience.ibm.com/api/<guid> wchEnabled Enables integration with [IBM Watson Content Hub](https://www.digitalexperience.ibm.com/). This allows Leap applications to select assets from IBM Watson Content Hub.Where: - true - enables a choice in the design experience that allows a design user to select assets from IBM Watson Content Hub \\(a Watson Content Hub subscription is required\\) - false - feature remains disabled Default value: false Example: ibm.nitro.NitroConfig.wchEnabled=false xFrameOptions Use this setting to control the X-Frame-Options response header for Leap pages. Example: ibm.nitro.NitroConfig.xFrameOptions = SAMEORIGIN Parent topic: Configuring the properties file","title":"Configuration properties"},{"location":"co_configuring_the_properties_file.html","text":"Configuring the properties file When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system. To use the provided properties file, you must move it to the extensions folder, then adjust the settings to match your system. Note: In a horizontally clustered environment, the Leap_config.properties must be configured for each node. Define extensions directory in the fsp.properties Go to <install location> /deploy, and locate Leap_config.properties. Copy the file and paste it to: Windows \u2013 C:\\HCL\\Leap\\extensions Linux , AIX \u2013 /opt/HCL/Leap/extensions Open the Leap_config.properties file and configure the settings to match your system. Customizing the location of the extensions directory To customize the location of the Leap_config.properties file, you must edit the fsp.properties file. Go to the fsp.properties file. The default location of the fsp.properties file is: \\AppServer\\profiles\\AppSrv01\\installedApps\\\\Experience Builder.ear\\builder.war\\WEB-INF\\classes. Open the properties file in a text editor and add a valid extensions= parameter. For example, extensions = /usr/HCL/Leap/extensions. Define extensions directory with jvm property Add the option -Dfsp.extensions.dirs to the jvm where Leap is deployed. The value is the path(s) to the extensions directory. AIX : -Dfsp.extensions.dirs=/customFolder/extensions,/customFolder2/extensions Windows -Dfsp.extensions.dirs=c:\\customFolder\\extensions,c:\\customFolder2\\extensions Validate which directory is loaded Check the Leap SystemOut.log . There is an entry that indicates which directory is recognized and loaded. For example: [5/21/14 22:51:37:095 PDT] 0000001b IntegratorSta I com.ibm.form.platform.service.startup.IntegratorStartup phase1Start Extensions folder: /usr/HCL/Leap/extensions Note: Some configuration properties require a restart of the Leap server. If you do not see your changes applied within a few minutes of modifying the properties file, restart the server. Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Parent topic: Configuring","title":"Configuring the properties file"},{"location":"co_configuring_the_properties_file.html#configuringthepropertiesfile","text":"When you install HCL Leap, a file containing sample configuration properties is also installed. You can configure the properties for optimal performance with your system. To use the provided properties file, you must move it to the extensions folder, then adjust the settings to match your system. Note: In a horizontally clustered environment, the Leap_config.properties must be configured for each node.","title":"Configuring the properties file"},{"location":"co_configuring_the_properties_file.html#section_xfj_ds5_jzb","text":"Go to <install location> /deploy, and locate Leap_config.properties. Copy the file and paste it to: Windows \u2013 C:\\HCL\\Leap\\extensions Linux , AIX \u2013 /opt/HCL/Leap/extensions Open the Leap_config.properties file and configure the settings to match your system.","title":"Define extensions directory in the fsp.properties"},{"location":"co_configuring_the_properties_file.html#section_nmd_q4f_zzb","text":"To customize the location of the Leap_config.properties file, you must edit the fsp.properties file. Go to the fsp.properties file. The default location of the fsp.properties file is: \\AppServer\\profiles\\AppSrv01\\installedApps\\\\Experience Builder.ear\\builder.war\\WEB-INF\\classes. Open the properties file in a text editor and add a valid extensions= parameter. For example, extensions = /usr/HCL/Leap/extensions.","title":"Customizing the location of the extensions directory"},{"location":"co_configuring_the_properties_file.html#section_fjf_4t5_jzb","text":"Add the option -Dfsp.extensions.dirs to the jvm where Leap is deployed. The value is the path(s) to the extensions directory. AIX : -Dfsp.extensions.dirs=/customFolder/extensions,/customFolder2/extensions Windows -Dfsp.extensions.dirs=c:\\customFolder\\extensions,c:\\customFolder2\\extensions","title":"Define extensions directory with jvm property"},{"location":"co_configuring_the_properties_file.html#section_h25_tt5_jzb","text":"Check the Leap SystemOut.log . There is an entry that indicates which directory is recognized and loaded. For example: [5/21/14 22:51:37:095 PDT] 0000001b IntegratorSta I com.ibm.form.platform.service.startup.IntegratorStartup phase1Start Extensions folder: /usr/HCL/Leap/extensions Note: Some configuration properties require a restart of the Leap server. If you do not see your changes applied within a few minutes of modifying the properties file, restart the server. Configuration properties The following table contains a list of properties in the HCL Leap Leap_config.properties file. You can adjust the settings listed in the file, or add your own for a custom configuration. Parent topic: Configuring","title":"Validate which directory is loaded"},{"location":"cr_adding_formula_from_settings_tab.html","text":"Creating a formula from the Settings tab The Settings tab contains a Formula section from which you can view and create formulas. When you select the Formulas menu option, you are shown the formulas for your form. They are divided into two categories: General Formulas and Item Formulas. Item Formulas is a list of the formulas created in the form using the Properties side panel. General Formulas are complex formulas created on the Settings tab. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. To create a complex formula: Click Add Formula . Add a title and description to your formula. Although the description is optional, it is useful for users to distinguish between several similarly titled formulas. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function input areas, and a result area are shown. Click either the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click either the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click Result to select where the result of the formula is shown to the user. Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. To create complex formulas, click the Add green plus icon. A second set of inputs is shown. Set values for the inputs and the result to create the second function. You can add as many additional functions as required to complete your formula. The formula runs when there are changes to the item. If you do not want the formula to automatically run, clear the check box for Automatically run this formula when there are changes to item values . You can change the order of functions in a formula by clicking the Move up or Move down arrows located. Click OK to save and apply the formula. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a formula from the Settings tab"},{"location":"cr_adding_formula_from_settings_tab.html#creatingaformulafromthesettingstab","text":"The Settings tab contains a Formula section from which you can view and create formulas. When you select the Formulas menu option, you are shown the formulas for your form. They are divided into two categories: General Formulas and Item Formulas. Item Formulas is a list of the formulas created in the form using the Properties side panel. General Formulas are complex formulas created on the Settings tab. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. To create a complex formula: Click Add Formula . Add a title and description to your formula. Although the description is optional, it is useful for users to distinguish between several similarly titled formulas. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function input areas, and a result area are shown. Click either the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click either the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click Result to select where the result of the formula is shown to the user. Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. To create complex formulas, click the Add green plus icon. A second set of inputs is shown. Set values for the inputs and the result to create the second function. You can add as many additional functions as required to complete your formula. The formula runs when there are changes to the item. If you do not want the formula to automatically run, clear the check box for Automatically run this formula when there are changes to item values . You can change the order of functions in a formula by clicking the Move up or Move down arrows located. Click OK to save and apply the formula. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a formula from the Settings tab"},{"location":"cr_adding_formula_running_formula_from_event.html","text":"Running a formula from an event After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. General formulas by default run whenever a form item is changed by the user. You can set formulas to run upon a specific event. For example, if a customer is entering information into an order form, you can set a formula to calculate sales tax and a subtotal when the user clicks a button. To run a formula when a user clicks a button: Add a button to your form. Select the newly added button. The Properties side panel opens. Click the Events tab. Select onClick from the list of Client Side events. The onClick options window opens. Select Run a Formula . Click the list to reveal the list of General formula created in the Settings tab. Click Add/Edit Formula to create a formula. After you either select or create the formula, click OK to close the onClick window. Parent topic: Adding formulas to your application","title":"Running a formula from an event"},{"location":"cr_adding_formula_running_formula_from_event.html#runningaformulafromanevent","text":"After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. General formulas by default run whenever a form item is changed by the user. You can set formulas to run upon a specific event. For example, if a customer is entering information into an order form, you can set a formula to calculate sales tax and a subtotal when the user clicks a button. To run a formula when a user clicks a button: Add a button to your form. Select the newly added button. The Properties side panel opens. Click the Events tab. Select onClick from the list of Client Side events. The onClick options window opens. Select Run a Formula . Click the list to reveal the list of General formula created in the Settings tab. Click Add/Edit Formula to create a formula. After you either select or create the formula, click OK to close the onClick window. Parent topic: Adding formulas to your application","title":"Running a formula from an event"},{"location":"cr_adding_formulas_from_properties_window.html","text":"Creating a Formula from the Properties side panel You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. You must set the formula on the form item that stores the result. For example, if you want to add two numbers together, set the formula on the field where you want the result shown. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. Select the form item. The Properties side panel opens. Click the Formula tab. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function, input areas and a result area are shown. Click the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a Formula from the Properties side panel"},{"location":"cr_adding_formulas_from_properties_window.html#usingtheformulaeditorfromthepropertieswindow","text":"You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. You must set the formula on the form item that stores the result. For example, if you want to add two numbers together, set the formula on the field where you want the result shown. Note: If you are creating a formula to assign a string value to a Time form item, the content of the string must be based on a 24-hour clock. If the input value is not in a valid 24-hour clock format, the resulting value will not be correct. Select the form item. The Properties side panel opens. Click the Formula tab. Select the function from the list of available options. The available options are: Add \u2013 Adds two values together. Assign \u2013 Assigns a value to the specified form item. Table Average \u2013 Calculates the average column value of a table. Concatenate \u2013 Concatenates two values together into a single string. Power \u2013 Raises power of one value to another value. Table Max \u2013 The maximum column value of a table on the form. Multiply \u2013 Multiplies two values together. Minus \u2013 Subtracts one value from another value. Table Sum \u2013 The sum of a column of a table. Table Count \u2013 The number of rows in a table. Divide \u2013 Divide one value by another. Table Min \u2013 The minimum column value of a table. After you select a function, input areas and a result area are shown. Click the Input 1 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Click the Input 2 field. Select a form item from the list. Click Or, Enter a Number . Enter a number in the Value: field, and click OK . Note: If your formula contains errors, an error icon is shown. Ensure that a formula is free of errors before applying it to a form item. Save and preview your form to test the formula. Parent topic: Adding formulas to your application","title":"Creating a Formula from the Properties side panel"},{"location":"cr_adding_formulas_toc.html","text":"Adding formulas to your application You can create and edit formulas to assign values to an item on your HCL Leap form. There are two places within Leap where you can access the Formula editor: The Formula tab of the Properties side panel. The Formula menu item from the Settings tab. Creating a Formula from the Properties side panel You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. Creating a formula from the Settings tab The Settings tab contains a Formula section from which you can view and create formulas. Running a formula from an event After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. Parent topic: Creating and managing applications","title":"Adding formulas to your application"},{"location":"cr_adding_formulas_toc.html#addingformulastoyourapplication","text":"You can create and edit formulas to assign values to an item on your HCL Leap form. There are two places within Leap where you can access the Formula editor: The Formula tab of the Properties side panel. The Formula menu item from the Settings tab. Creating a Formula from the Properties side panel You can set a formula on a form item using the Properties side panel. The following instructions describe how to open the Formula editor and the formula options available. Creating a formula from the Settings tab The Settings tab contains a Formula section from which you can view and create formulas. Running a formula from an event After you add General formulas using the Settings tab, you can use the formulas when running events. For example, you can set a formula to run when a user clicks a button. Parent topic: Creating and managing applications","title":"Adding formulas to your application"},{"location":"cr_copying_items.html","text":"Copying items Items may be copied from one form to another form within any application. If you want to copy an item from one form to another, select the item and press Ctrl+C . Select the target form and press Ctrl+V . If a cell on the target form's page is selected, the copy is inserted there, otherwise it will be inserted into the first available cell on that page. If there is no empty cell, then a new row will be added with the pasted item. Note: Table items cannot be copied. Note: Copying an entire page is not supported at this time. Usage details Use Ctrl+C to copy the selected item. Use Ctrl+V to paste the item to the selected page within any Leap application. Users can only copy one item at a time. If the browser clipboard is not accessible, the copy/paste action will not be allowed. Parent topic: Creating and managing applications","title":"Copying items"},{"location":"cr_copying_items.html#cr_copying_items","text":"Items may be copied from one form to another form within any application. If you want to copy an item from one form to another, select the item and press Ctrl+C . Select the target form and press Ctrl+V . If a cell on the target form's page is selected, the copy is inserted there, otherwise it will be inserted into the first available cell on that page. If there is no empty cell, then a new row will be added with the pasted item. Note: Table items cannot be copied. Note: Copying an entire page is not supported at this time.","title":"Copying items"},{"location":"cr_copying_items.html#section_f3b_1vn_hvb","text":"Use Ctrl+C to copy the selected item. Use Ctrl+V to paste the item to the selected page within any Leap application. Users can only copy one item at a time. If the browser clipboard is not accessible, the copy/paste action will not be allowed. Parent topic: Creating and managing applications","title":"Usage details"},{"location":"cr_creating_and_managing_toc.html","text":"Creating and managing applications Creating and managing applications contains a variety of topics on how to build and efficiently use applications. Creating an application This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. Creating an application from an excel spreadsheet Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. Styling your application with a custom theme Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. Upgrading an application design The upgrade feature allows an application design to be replaced by a new version. Copying items Items may be copied from one form to another form within any application. Moving items on a form Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Creating an accessible application When you create a form or application, the following information helps you design an accessible form for users with disabilities. Enabling dynamic layout When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. Globalization features The following information describes the languages formatting features supported by HCL Leap. Creating rules in your application Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. Labeling data, performing data analysis, and exporting data You can add labels to data elements in your application that become the label in the export file. Incorporating web services into your applications The following topics describe how to incorporate web services into your HCL Leap application. Adding formulas to your application You can create and edit formulas to assign values to an item on your HCL Leap form. Adding specialized form items You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Managing the files associated with your application You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab Leap document integration Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Adding Stages to an application It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Deploying applications and viewing data responses After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses.","title":"Building Apps"},{"location":"cr_creating_and_managing_toc.html#creatingandmanagingapplicationstoc","text":"Creating and managing applications contains a variety of topics on how to build and efficiently use applications. Creating an application This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. Creating an application from an excel spreadsheet Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. Styling your application with a custom theme Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. Upgrading an application design The upgrade feature allows an application design to be replaced by a new version. Copying items Items may be copied from one form to another form within any application. Moving items on a form Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Creating an accessible application When you create a form or application, the following information helps you design an accessible form for users with disabilities. Enabling dynamic layout When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. Globalization features The following information describes the languages formatting features supported by HCL Leap. Creating rules in your application Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. Labeling data, performing data analysis, and exporting data You can add labels to data elements in your application that become the label in the export file. Incorporating web services into your applications The following topics describe how to incorporate web services into your HCL Leap application. Adding formulas to your application You can create and edit formulas to assign values to an item on your HCL Leap form. Adding specialized form items You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Managing the files associated with your application You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab Leap document integration Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Adding Stages to an application It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Deploying applications and viewing data responses After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses.","title":"Creating and managing applications"},{"location":"cr_creating_application_excel.html","text":"Creating an application from an excel spreadsheet Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. The following steps describe how to prepare a spreadsheet that you want to import into Leap and how to create the application from the spreadsheet. Prepare the spreadsheet for importation. Points to consider: Each sheet in the spreadsheet file will be turned into a form in a new application. The first non-empty row in the sheet will be considered the 'header row'. If all the sheets in the spreadsheet have no header rows, the import will fail. The contents of a header row cell will be the name of the widget for that column. There can be a horizontal gap of a single cell between the header row cells. If there is a gap of more than one cell in the header row, then the cells to the right of the gap will not be processed. Header titles get processed to only have valid characters and then are assigned to the corresponding widget name. If after processing there are too few characters, the widget gets a default name. The contents of cells under the header row cell will be used for the data import process. There can be one gap of up to two columns in the data and header row. There can be a gap between the left-hand edge of the spreadsheet and the header row. There can be a gap between the header row and data. Parsing of rows will stop after parsing 10 empty rows in a row. If the column under a non-blank header row cell is empty, then the resulting widget will be a single line entry. Web links must have https:// or http:// at the beginning of the URL. Select many widgets can be created when the contents of a cell contains [value],[value],[value].... with no spaces between values and commas. Values cannot be duplicated, and the cell cannot begin or end with a comma. Commas are used as delimiters for multi select widgets; therefore, any comma will not be part of the value itself and will separate values. For a widget to be selectable (i.e. a Dropdown, Select One, Select Many, etc.), then the number of possible values must be greater than one and less than a certain value, currently set at 30. If there are only numbers and currency cells in a column, then the column widget type will be whichever count is greater. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from an Excel spreadsheet. For a topic covering creating applications from a blank canvas, see Creating an application . Click From Spreadsheet . An upload file dialog will open. Upload the prepared excel spreadsheet here, then click Next . Leap will parse the spreadsheet one sheet at a time. Each column in the main data range will be used to create a widget in the form. Leap will go through the rows of each column within that range, then attempt to assign a type based on the contents of the cells of the column. Choose the fields, names, and types of your application. On the next dialog, the names of sheets (forms) and columns (widgets) can be changed. Additionaly, the type of the created widgets can be changed (within limits of the imported data). When the names and types are set up properly, click Next . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . Parent topic: Creating and managing applications","title":"Creating an application from an excel spreadsheet"},{"location":"cr_creating_application_excel.html#creatinganapplicationexcel","text":"Leap allows you to create an application from an excel spreadsheet, automatically creating the widgets and importing the data found in the spreadsheet. The following steps describe how to prepare a spreadsheet that you want to import into Leap and how to create the application from the spreadsheet. Prepare the spreadsheet for importation. Points to consider: Each sheet in the spreadsheet file will be turned into a form in a new application. The first non-empty row in the sheet will be considered the 'header row'. If all the sheets in the spreadsheet have no header rows, the import will fail. The contents of a header row cell will be the name of the widget for that column. There can be a horizontal gap of a single cell between the header row cells. If there is a gap of more than one cell in the header row, then the cells to the right of the gap will not be processed. Header titles get processed to only have valid characters and then are assigned to the corresponding widget name. If after processing there are too few characters, the widget gets a default name. The contents of cells under the header row cell will be used for the data import process. There can be one gap of up to two columns in the data and header row. There can be a gap between the left-hand edge of the spreadsheet and the header row. There can be a gap between the header row and data. Parsing of rows will stop after parsing 10 empty rows in a row. If the column under a non-blank header row cell is empty, then the resulting widget will be a single line entry. Web links must have https:// or http:// at the beginning of the URL. Select many widgets can be created when the contents of a cell contains [value],[value],[value].... with no spaces between values and commas. Values cannot be duplicated, and the cell cannot begin or end with a comma. Commas are used as delimiters for multi select widgets; therefore, any comma will not be part of the value itself and will separate values. For a widget to be selectable (i.e. a Dropdown, Select One, Select Many, etc.), then the number of possible values must be greater than one and less than a certain value, currently set at 30. If there are only numbers and currency cells in a column, then the column widget type will be whichever count is greater. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from an Excel spreadsheet. For a topic covering creating applications from a blank canvas, see Creating an application . Click From Spreadsheet . An upload file dialog will open. Upload the prepared excel spreadsheet here, then click Next . Leap will parse the spreadsheet one sheet at a time. Each column in the main data range will be used to create a widget in the form. Leap will go through the rows of each column within that range, then attempt to assign a type based on the contents of the cells of the column. Choose the fields, names, and types of your application. On the next dialog, the names of sheets (forms) and columns (widgets) can be changed. Additionaly, the type of the created widgets can be changed (within limits of the imported data). When the names and types are set up properly, click Next . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . Parent topic: Creating and managing applications","title":"Creating an application from an excel spreadsheet"},{"location":"cr_creating_application_overview.html","text":"Creating an application This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. The following steps are a general overview of the lifecycle of an application. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from a blank canvas. For a topic covering creating applications from spreadsheets, see Creating an application from an excel spreadsheet . Click From Blank . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . An application opens. A blank grid appears with a Palette of form items. Add items from the Palette to build the form. The grid automatically expands as you add form items, and automatically aligns items in the cells. You can change the size of columns or rows in the grid. Right-click on the edge of the grid to reveal row or column properties. You can insert additional pages to a form in the Outline view. Page order is flexible, and you can reorder the pages in your form by dragging dropping them to your preferred order. Many form items can be edited directly on the grid. Click the title of a form item to edit it. You can modify the properties of each form item by using the Properties side panel. The panel contains tabs that allows the creation of rules, web service calls, or event triggers. You can save and preview the form at any time by using the Save and Preview icons. Click the Style tab to customize the appearance of your application. Select or customize a theme or add your own custom CSS to change the style of your application. Use the Access tab to define user roles, such as \u201cAdministrator\u201d, \u201cSupervisor\u201d, or \u201cRecord Owner\u201d. You can add as many users as required for your application to function. For example, when a user completes a vacation request form, the form is sent only to the user\u2019s supervisor. You can also add groups of users to specific roles. For example, you might have a time sheet application that is sent to a group of supervisors upon submission. For more information, see Security overview . Use the Workflow tab to define stages within a form. You can create as many stages as required for your form or workflow. For example, an employee completes a vacation request form. The employee does not see the part of the form where the supervisor approves or rejects the request. When the supervisor receives the form, the next stage is visible, and the request is granted, or refused. You can also use stages to set buttons at specific points in your form. For example, you might want to allow a user to save a draft copy of the form after they reach a specific stage. For more information, see Adding Stages to an application . Use the Events tab to review any custom Javascript added to the application. Click the Validation tab to check your application for errors. After an application is built, click the Manage tab. You must now deploy the application. Click Deploy . Adjust the Deployment Settings and click Start . Click Launch to view the live application in a web browser. The link URL is what is sent to users so they can access the application. Note: As an application creator, you can edit an application at any time. If you edit a live application, you must redeploy and relaunch it after your changes are saved. If a user is entering data into an application as you redeploy, their work is not saved. Parent topic: Creating and managing applications","title":"Creating an application"},{"location":"cr_creating_application_overview.html#creatinganapplication","text":"This topic gives a general overview of the application creation process, from opening the HCL Leap interface to launching a completed application. The following steps are a general overview of the lifecycle of an application. Log on to Leap. By default you see the Manage window which displays the New Application button, any previously created applications, and any applications to which you have edit permissions. Click New Application . A dialog will open, which provides a choice to create an application from a blank canvas or from an Excel spreadsheet. The rest of this topic describes how to create an application from a blank canvas. For a topic covering creating applications from spreadsheets, see Creating an application from an excel spreadsheet . Click From Blank . Enter the name of the new application, and (optional) a description or tags for the application. Click Create . An application opens. A blank grid appears with a Palette of form items. Add items from the Palette to build the form. The grid automatically expands as you add form items, and automatically aligns items in the cells. You can change the size of columns or rows in the grid. Right-click on the edge of the grid to reveal row or column properties. You can insert additional pages to a form in the Outline view. Page order is flexible, and you can reorder the pages in your form by dragging dropping them to your preferred order. Many form items can be edited directly on the grid. Click the title of a form item to edit it. You can modify the properties of each form item by using the Properties side panel. The panel contains tabs that allows the creation of rules, web service calls, or event triggers. You can save and preview the form at any time by using the Save and Preview icons. Click the Style tab to customize the appearance of your application. Select or customize a theme or add your own custom CSS to change the style of your application. Use the Access tab to define user roles, such as \u201cAdministrator\u201d, \u201cSupervisor\u201d, or \u201cRecord Owner\u201d. You can add as many users as required for your application to function. For example, when a user completes a vacation request form, the form is sent only to the user\u2019s supervisor. You can also add groups of users to specific roles. For example, you might have a time sheet application that is sent to a group of supervisors upon submission. For more information, see Security overview . Use the Workflow tab to define stages within a form. You can create as many stages as required for your form or workflow. For example, an employee completes a vacation request form. The employee does not see the part of the form where the supervisor approves or rejects the request. When the supervisor receives the form, the next stage is visible, and the request is granted, or refused. You can also use stages to set buttons at specific points in your form. For example, you might want to allow a user to save a draft copy of the form after they reach a specific stage. For more information, see Adding Stages to an application . Use the Events tab to review any custom Javascript added to the application. Click the Validation tab to check your application for errors. After an application is built, click the Manage tab. You must now deploy the application. Click Deploy . Adjust the Deployment Settings and click Start . Click Launch to view the live application in a web browser. The link URL is what is sent to users so they can access the application. Note: As an application creator, you can edit an application at any time. If you edit a live application, you must redeploy and relaunch it after your changes are saved. If a user is entering data into an application as you redeploy, their work is not saved. Parent topic: Creating and managing applications","title":"Creating an application"},{"location":"cr_custom_theme.html","text":"Styling your application with a custom theme Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. An application can have one theme; the theme is applied to all forms in the application. Themes are customized in the Style tab. Settings made in the General section of the Theme Editor will be applied to specific attributes of all items in your application, but will be overridden by settings made to a more specific item type. For example, settings made in General > Fonts > General can be overridden by values set in General > Fonts > Label Fonts or set in Buttons > Fonts . A section's background color and border visibility can be set in the item's properties. This will override the theme settings. Background images maintain aspect ratio, but are stretched to fit the browser window. During application design, themes, and custom CSS are not applied to your application. To see how your application will display to end users, use the Preview button in either the Theme Editor dialog or the main banner. Browsers support different font file types (eg. .woff, .woff2, .ttf, eot, and .otf), so when specifying a custom font in your theme, you may need to include multiple font file types for a specific font family in order for it to render in all browsers. Themes can be exported and then imported into another application. To increase the portability of your customized theme, use the option to Maintain a link to the file only for font files and background image, instead of importing them into your application. Some limitations exist in IE8, including differences around the way IE8 displays background images. Custom CSS can be used in combination with themes. Custom CSS that you have included in your application is applied after all theme styling is applied except when the replace theme checkbox is selected. In this case, the custom CSS is the only styling that is applied to your application. CSS precedence rules still apply though, so some custom CSS may not override all theme settings. The Show CSS feature in the Style tab can be used by custom CSS developers to understand the CSS that is being generated by the theme. Custom CSS is not applied to the sample form in the Theme Editor dialog but is applied to the sample form in the Style tab. Parent topic: Creating and managing applications","title":"Styling your application with a custom theme"},{"location":"cr_custom_theme.html#concept_bwx_vwd_gy","text":"Style the colors, fonts, and other characteristics of the application by creating or importing a custom theme. An application can have one theme; the theme is applied to all forms in the application. Themes are customized in the Style tab. Settings made in the General section of the Theme Editor will be applied to specific attributes of all items in your application, but will be overridden by settings made to a more specific item type. For example, settings made in General > Fonts > General can be overridden by values set in General > Fonts > Label Fonts or set in Buttons > Fonts . A section's background color and border visibility can be set in the item's properties. This will override the theme settings. Background images maintain aspect ratio, but are stretched to fit the browser window. During application design, themes, and custom CSS are not applied to your application. To see how your application will display to end users, use the Preview button in either the Theme Editor dialog or the main banner. Browsers support different font file types (eg. .woff, .woff2, .ttf, eot, and .otf), so when specifying a custom font in your theme, you may need to include multiple font file types for a specific font family in order for it to render in all browsers. Themes can be exported and then imported into another application. To increase the portability of your customized theme, use the option to Maintain a link to the file only for font files and background image, instead of importing them into your application. Some limitations exist in IE8, including differences around the way IE8 displays background images. Custom CSS can be used in combination with themes. Custom CSS that you have included in your application is applied after all theme styling is applied except when the replace theme checkbox is selected. In this case, the custom CSS is the only styling that is applied to your application. CSS precedence rules still apply though, so some custom CSS may not override all theme settings. The Show CSS feature in the Style tab can be used by custom CSS developers to understand the CSS that is being generated by the theme. Custom CSS is not applied to the sample form in the Theme Editor dialog but is applied to the sample form in the Style tab. Parent topic: Creating and managing applications","title":"Styling your application with a custom theme"},{"location":"cr_deploy_and_launch_toc.html","text":"Deploying applications and viewing data responses After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses. Deploying an application Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. Updating and stopping a deployment The following instructions describe how to update, or stop, the deployment of an HCL Leap application. Launching an application After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. Viewing submitted responses After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. Importing data in View Data Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. Parent topic: Creating and managing applications","title":"Deploying applications and viewing data responses"},{"location":"cr_deploy_and_launch_toc.html#deployingandlaunchingapplications","text":"After an HCL Leap application is built it must be deployed. After it is deployed, you can supply users with the URL of the application so they can launch it. After users submit completed forms, you can view the responses. Deploying an application Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. Updating and stopping a deployment The following instructions describe how to update, or stop, the deployment of an HCL Leap application. Launching an application After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. Viewing submitted responses After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. Importing data in View Data Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. Parent topic: Creating and managing applications","title":"Deploying applications and viewing data responses"},{"location":"cr_deploying_an_application.html","text":"Deploying an application Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. You can update Leap applications with existing data that are currently deployed. However, these types of changes might impact existing data, and forms in-progress, depending on the type of changes made to the application. The impact occurs when the application is deployed, not during the design phase. The following changes might result in data loss, or prevent in-progress forms from being completed: If you delete fields that capture data from a form, any existing data for those fields is removed. If you change the ID of a field that contains data, any existing data is removed. If you change Access settings, users might no longer have access to existing data or forms in progress. If you change Stage IDs, in-progress applications at or before the stage are not completed. Before deploying an application, click Save to ensure the latest version of the application is saved. Note: If you make changes to an application while it is deployed, a warning icon is displayed on the Manage tab next to Deploy . This is to remind you to redeploy the application after making changes. Go to the Manage tab, and click Deploy for the application. The Deployment Settings window opens. Set the deployment options for your application from the Basic and Advanced tabs. Leap can send out email notifications when an application is deployed or stopped. These notifications are triggered from the Email Notifications section on the Deployment Setting window. The notifications are not triggered if the application is stopped on a preset Stop Date. The Stop notifications are only sent if the deployment is stopped manually using the Deployment Settings dialog. Click Start to deploy the application. After an application is deployed, the Launch tool is activated. Parent topic: Deploying applications and viewing data responses","title":"Deploying an application"},{"location":"cr_deploying_an_application.html#deployinganapplication","text":"Deploying an HCL Leap application makes it available for users. When you click Deploy , the application is loaded onto a server. You can deploy an application immediately, or set a timer to deploy the application for a specific period of time. You can update Leap applications with existing data that are currently deployed. However, these types of changes might impact existing data, and forms in-progress, depending on the type of changes made to the application. The impact occurs when the application is deployed, not during the design phase. The following changes might result in data loss, or prevent in-progress forms from being completed: If you delete fields that capture data from a form, any existing data for those fields is removed. If you change the ID of a field that contains data, any existing data is removed. If you change Access settings, users might no longer have access to existing data or forms in progress. If you change Stage IDs, in-progress applications at or before the stage are not completed. Before deploying an application, click Save to ensure the latest version of the application is saved. Note: If you make changes to an application while it is deployed, a warning icon is displayed on the Manage tab next to Deploy . This is to remind you to redeploy the application after making changes. Go to the Manage tab, and click Deploy for the application. The Deployment Settings window opens. Set the deployment options for your application from the Basic and Advanced tabs. Leap can send out email notifications when an application is deployed or stopped. These notifications are triggered from the Email Notifications section on the Deployment Setting window. The notifications are not triggered if the application is stopped on a preset Stop Date. The Stop notifications are only sent if the deployment is stopped manually using the Deployment Settings dialog. Click Start to deploy the application. After an application is deployed, the Launch tool is activated. Parent topic: Deploying applications and viewing data responses","title":"Deploying an application"},{"location":"cr_enabling_dynamic_layout.html","text":"Enabling dynamic layout When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. To set dynamic width on a page: In the Outline menu, click the Properties icon for the desired page. The Properties side panel opens. In the Width: options, select Dynamic Value , and enter a minimum and maximum value. Note: If you click the green plus sign to add another page to your application, the values you set are automatically copied to the new page. To set Dynamic Layout on a page or in a section: Click the check box beside Enable dynamic layout , and set the minimum window width. Select whether the user sees form items in single column mode, or in carousel mode. The default is single column mode. Note: If you have or add a Section on the page, the Dynamic Layout settings of the Page are duplicated in the Section. For best results, Carousel mode should be used on forms that do not contain sections. Parent topic: Creating and managing applications","title":"Enabling dynamic layout"},{"location":"cr_enabling_dynamic_layout.html#enablingdynamiclayout","text":"When you build applications, you can now set the display width of your Leap application. Setting this feature reduces or removes the need for horizontal scrolling when you have an unknown or limited amount of space, such as when the application is displayed in a WebSphere_Portal portlet. To set dynamic width on a page: In the Outline menu, click the Properties icon for the desired page. The Properties side panel opens. In the Width: options, select Dynamic Value , and enter a minimum and maximum value. Note: If you click the green plus sign to add another page to your application, the values you set are automatically copied to the new page. To set Dynamic Layout on a page or in a section: Click the check box beside Enable dynamic layout , and set the minimum window width. Select whether the user sees form items in single column mode, or in carousel mode. The default is single column mode. Note: If you have or add a Section on the page, the Dynamic Layout settings of the Page are duplicated in the Section. For best results, Carousel mode should be used on forms that do not contain sections. Parent topic: Creating and managing applications","title":"Enabling dynamic layout"},{"location":"cr_import_data_in_view_responses.html","text":"Importing data in View Data Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. The import operation is available for application Owners to use as an alternative to keying each row of data into the Launch experience of their Leap application and as an alternative to using the Data Access Rest API to programmatically add the data. Each row of data in the spreadsheet is imported into the Start stage of your Leap application as a new submitted record. Supported spreadsheet formats are Microsoft Excel 97 workbook and Microsoft Excel workbook (.xls and .xlsx). Note: Microsoft Excel 5.0/95 workbooks are not supported. When using other spreadsheet tools, save the spreadsheet file into one to the supported formats before attempting to import your data. Only spreadsheet data on the active sheet can be imported. To indicate where in your application each column of spreadsheet data should be imported, the first row of your spreadsheet must be modified to provide data mapping instructions. Each column header must include the ID of the item within your application where the data is mapped. An item's ID can be found on the Advanced tab of the Properties Dialog when editing the application. The Import Data button on the View Data page is available only to an application's Owners/Administrators and only active when the following is true: Imports respect the access settings that are configured within the application, so the application owner must be included in the list of people in the Initiator role. The application must not be configured to Limit to single submission per Authenticated User . The application must be deployed and not stopped. Validation and enforcement of your applications data types, required elements, and rules are performed on import. Custom JavaScript added to the applications UI is not run during data import. Some data elements, including dates and times, need to be in a specific format to import successfully. To identify the correct input format, it can be helpful to add a record of data using the application Launch UI, and then exporting the row from View Data and review the output format. Table data and Attachments can not be imported. Surveys and Select Many items can contain values that are lists of multiple selected choices. Use commas to separate the selected choices. In cases where one of the selected choices contains a comma, the following sequence can be used as an alternative separator: __#__ The data import operation stops when it encounters blank columns or rows in the spreadsheet. The data import operation supports a maximum of 1000 rows of data. To import data that has been exported from a HCL Leap application: You must replace the column header label with the item IDs required for mapping. The metadata can not be imported and must be removed from the spreadsheet or mapped to a form item. Stage transition emails configured in your application will be sent, so depending on the nature of the emails and the number of records being imported, application owners may want to disable the stage action email associated with the Start stage prior to running the import operation. Import operations can not be undone and bulk deletion of records is not available. Using some of the following recommendations can help ensure the desired outcome when using the bulk data import. Select one or two rows or spreadsheet data to import as an initial test to help ensure the mapping is set up as expected and the data types are compatible. Review the imported data in View Data after the import to see that it imported as expected. To quickly remove all data from an application, on the Manage page, choose to Export your application without including submitted data and then choose to Upgrade your application and select the option to Replace submitted data . Prior to performing a large bulk data import into an application that already has submitted data, creating a backup of the application and all existing records is recommended. On the Manage page, select the Export operation for your application and be sure to select the option to Include submitted data . This will provide an archive of the application and data in the state it was in just prior to the import. Parent topic: Deploying applications and viewing data responses","title":"Importing data in View Data"},{"location":"cr_import_data_in_view_responses.html#concept_gxl_bf2_gy","text":"Application Owners can use an Import Data operation on the View Data page to import spreadsheet data into their application. This can provide a quick start method for adding many records/rows of data into an application from an existing spreadsheet. The import operation is available for application Owners to use as an alternative to keying each row of data into the Launch experience of their Leap application and as an alternative to using the Data Access Rest API to programmatically add the data. Each row of data in the spreadsheet is imported into the Start stage of your Leap application as a new submitted record. Supported spreadsheet formats are Microsoft Excel 97 workbook and Microsoft Excel workbook (.xls and .xlsx). Note: Microsoft Excel 5.0/95 workbooks are not supported. When using other spreadsheet tools, save the spreadsheet file into one to the supported formats before attempting to import your data. Only spreadsheet data on the active sheet can be imported. To indicate where in your application each column of spreadsheet data should be imported, the first row of your spreadsheet must be modified to provide data mapping instructions. Each column header must include the ID of the item within your application where the data is mapped. An item's ID can be found on the Advanced tab of the Properties Dialog when editing the application. The Import Data button on the View Data page is available only to an application's Owners/Administrators and only active when the following is true: Imports respect the access settings that are configured within the application, so the application owner must be included in the list of people in the Initiator role. The application must not be configured to Limit to single submission per Authenticated User . The application must be deployed and not stopped. Validation and enforcement of your applications data types, required elements, and rules are performed on import. Custom JavaScript added to the applications UI is not run during data import. Some data elements, including dates and times, need to be in a specific format to import successfully. To identify the correct input format, it can be helpful to add a record of data using the application Launch UI, and then exporting the row from View Data and review the output format. Table data and Attachments can not be imported. Surveys and Select Many items can contain values that are lists of multiple selected choices. Use commas to separate the selected choices. In cases where one of the selected choices contains a comma, the following sequence can be used as an alternative separator: __#__ The data import operation stops when it encounters blank columns or rows in the spreadsheet. The data import operation supports a maximum of 1000 rows of data. To import data that has been exported from a HCL Leap application: You must replace the column header label with the item IDs required for mapping. The metadata can not be imported and must be removed from the spreadsheet or mapped to a form item. Stage transition emails configured in your application will be sent, so depending on the nature of the emails and the number of records being imported, application owners may want to disable the stage action email associated with the Start stage prior to running the import operation. Import operations can not be undone and bulk deletion of records is not available. Using some of the following recommendations can help ensure the desired outcome when using the bulk data import. Select one or two rows or spreadsheet data to import as an initial test to help ensure the mapping is set up as expected and the data types are compatible. Review the imported data in View Data after the import to see that it imported as expected. To quickly remove all data from an application, on the Manage page, choose to Export your application without including submitted data and then choose to Upgrade your application and select the option to Replace submitted data . Prior to performing a large bulk data import into an application that already has submitted data, creating a backup of the application and all existing records is recommended. On the Manage page, select the Export operation for your application and be sure to select the option to Include submitted data . This will provide an archive of the application and data in the state it was in just prior to the import. Parent topic: Deploying applications and viewing data responses","title":"Importing data in View Data"},{"location":"cr_in_app_service.html","text":"Adding and configuring a service The following instructions describe how to add and configure a service so you can map it within your application. These instructions provide a general overview of adding and configuring services. They are used whenever you want to add a service to your application. Click \"Add/Edit Service Configuration\" The Service Configuration window opens. Enter the URL of your service Or, select a service to select a service from a list. To specify options for the URL, click the Properties icon located to the right of URL field. Use the Service Details dialog to configure how Leap should call the service. You can add details to the URL in the URL field. Specify the HTTP method for the service Make URL parameters and segments available for input mapping by selecting Assignable . The display name specified is used in the input mapping interface. URL parameters are query parameters within a URL. The first parameter follows the question mark in the URL. Additional parameters follow an ampersand. For example: https://server.com?this=1&that=2, where this is the first parameter, and that is the second parameter. When you make a parameter assignable, the parameter value is replaced at runtime. In the example https://server.com?this=1&that=2, if this is assignable, the value of this is replaced with the mapped input value from the form. For example:https://server.com?this=AAAAA&that=2, where AAAAA is the value from the form. URL segments are path elements within a URL. For example https://server.com/resources/identifier, where resources is the first segment, and identifier is the second segment. When you make a segment assignable, the segment is replaced at runtime. In the example https://server.com/resources/identifier, assigning identifier a value of 1234 results in a URL that reads: https://server.com/resources/1234. Note: To add or remove URL parameters or segments, you must modify the URL and tab out of the URL field. Specify authentication options in the Authentication section. If you want to add request headers, expand the Request header section and click Add a required request header . You can also make request headers assignable for input mapping. In the Sample Response JSON section, you can Fetch a sample JSON response, or insert your own. Elements in the provided JSON are automatically added as assignable outputs in the Outputs mapping tab. When you click Fetch , the Fetch a response window opens. You can modify the URL as required to connect to the service. Click Submit to fetch the response. Note: For Post and Put HTTP methods, you can enter Sample Request JSON. Elements in the provided JSON are automatically added as assignable inputs in the Inputs mapping tab. If you want to add response headers, expand the Response header section and click Add a required response header . Response headers are automatically assignable for output mapping. When you have finished making configuration changes click OK . Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Note: If you need to make changes to the service, or configure service details, click the Properties icon located to the right of URL. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Adding and configuring a service"},{"location":"cr_in_app_service.html#task_kgx_11y_mv","text":"The following instructions describe how to add and configure a service so you can map it within your application. These instructions provide a general overview of adding and configuring services. They are used whenever you want to add a service to your application. Click \"Add/Edit Service Configuration\" The Service Configuration window opens. Enter the URL of your service Or, select a service to select a service from a list. To specify options for the URL, click the Properties icon located to the right of URL field. Use the Service Details dialog to configure how Leap should call the service. You can add details to the URL in the URL field. Specify the HTTP method for the service Make URL parameters and segments available for input mapping by selecting Assignable . The display name specified is used in the input mapping interface. URL parameters are query parameters within a URL. The first parameter follows the question mark in the URL. Additional parameters follow an ampersand. For example: https://server.com?this=1&that=2, where this is the first parameter, and that is the second parameter. When you make a parameter assignable, the parameter value is replaced at runtime. In the example https://server.com?this=1&that=2, if this is assignable, the value of this is replaced with the mapped input value from the form. For example:https://server.com?this=AAAAA&that=2, where AAAAA is the value from the form. URL segments are path elements within a URL. For example https://server.com/resources/identifier, where resources is the first segment, and identifier is the second segment. When you make a segment assignable, the segment is replaced at runtime. In the example https://server.com/resources/identifier, assigning identifier a value of 1234 results in a URL that reads: https://server.com/resources/1234. Note: To add or remove URL parameters or segments, you must modify the URL and tab out of the URL field. Specify authentication options in the Authentication section. If you want to add request headers, expand the Request header section and click Add a required request header . You can also make request headers assignable for input mapping. In the Sample Response JSON section, you can Fetch a sample JSON response, or insert your own. Elements in the provided JSON are automatically added as assignable outputs in the Outputs mapping tab. When you click Fetch , the Fetch a response window opens. You can modify the URL as required to connect to the service. Click Submit to fetch the response. Note: For Post and Put HTTP methods, you can enter Sample Request JSON. Elements in the provided JSON are automatically added as assignable inputs in the Inputs mapping tab. If you want to add response headers, expand the Response header section and click Add a required response header . Response headers are automatically assignable for output mapping. When you have finished making configuration changes click OK . Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Note: If you need to make changes to the service, or configure service details, click the Properties icon located to the right of URL. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Adding and configuring a service"},{"location":"cr_launching_an_application.html","text":"Launching an application After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. You must deploy your application before you can launch it. See Deploying an application for instructions on how to deploy your application. To launch an application: Go to Manage tab, and click Launch . The application is launched in a web browser. Click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. Copy the URL and paste it into a web browser, or disseminate it through email, or your web site. Parent topic: Deploying applications and viewing data responses","title":"Launching an application"},{"location":"cr_launching_an_application.html#launchinganapplication","text":"After an HCL Leap application is deployed, the Launch link is enabled. When you click Launch , the live application opens in a new window. You must deploy your application before you can launch it. See Deploying an application for instructions on how to deploy your application. To launch an application: Go to Manage tab, and click Launch . The application is launched in a web browser. Click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. Copy the URL and paste it into a web browser, or disseminate it through email, or your web site. Parent topic: Deploying applications and viewing data responses","title":"Launching an application"},{"location":"cr_moving_items_on_a_form.html","text":"Moving items on a form Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Moving items on a single page of a form is done by clicking the item and dragging it to a new column or row. Notification is displayed by the mouse cursor if the location to which you move the form item is valid or not. You can move all Palette items between pages in a form. If you want to move an item from Page 1 to Page 2 of your form, select the item and drag it to the Outline view. Hover your mouse over Page 2. You can either drop the item on Page 2, where it is inserted into the first available cell of the page, or drag it onto a specific cell on Page 2. Usage details If you want to have a form item on multiple pages of your form, duplicate the item and move the duplicate to the other page. The duplicate icon is located to the right of the Rules icon on each form item. When you duplicate a form item: Rules : If a form item is part of a Rule, the Rule is replicated and applies to the duplicate form item. Formulas : If a form item uses a Formula, the Formula is replicated and applies to the duplicate form item. Events : If an Event is set on a form item, the Event is replicated and applies to the duplicate form item. Stage settings : Stage settings for a form item are not replicated onto the new form item. You must apply Stage settings to the new item in the Workflow tab. You can move forms and form items in the Outline view. This includes moving child pages, such as the ones created when you add a table to your form. Items in a table can be moved only within the same table. You can move entire Tables between form pages, but you cannot move a form item from inside one table to a table on another page. Keyboard shortcuts to move items between pages: Tab : Focus on a cell, or to move focus from one cell to another Space or Enter : Select focused item Ctrl+M : Drop an item on the cell that has focus Esc : Cancel selection. Parent topic: Creating and managing applications","title":"Moving items on a form"},{"location":"cr_moving_items_on_a_form.html#movingitemsonaform","text":"Form items are not static after they are added to a form. You can move items around on a single page, duplicate form items, and move items between pages on your form. Moving items on a single page of a form is done by clicking the item and dragging it to a new column or row. Notification is displayed by the mouse cursor if the location to which you move the form item is valid or not. You can move all Palette items between pages in a form. If you want to move an item from Page 1 to Page 2 of your form, select the item and drag it to the Outline view. Hover your mouse over Page 2. You can either drop the item on Page 2, where it is inserted into the first available cell of the page, or drag it onto a specific cell on Page 2. Usage details If you want to have a form item on multiple pages of your form, duplicate the item and move the duplicate to the other page. The duplicate icon is located to the right of the Rules icon on each form item. When you duplicate a form item: Rules : If a form item is part of a Rule, the Rule is replicated and applies to the duplicate form item. Formulas : If a form item uses a Formula, the Formula is replicated and applies to the duplicate form item. Events : If an Event is set on a form item, the Event is replicated and applies to the duplicate form item. Stage settings : Stage settings for a form item are not replicated onto the new form item. You must apply Stage settings to the new item in the Workflow tab. You can move forms and form items in the Outline view. This includes moving child pages, such as the ones created when you add a table to your form. Items in a table can be moved only within the same table. You can move entire Tables between form pages, but you cannot move a form item from inside one table to a table on another page. Keyboard shortcuts to move items between pages: Tab : Focus on a cell, or to move focus from one cell to another Space or Enter : Select focused item Ctrl+M : Drop an item on the cell that has focus Esc : Cancel selection. Parent topic: Creating and managing applications","title":"Moving items on a form"},{"location":"cr_updating_and_stopping_deployment.html","text":"Updating and stopping a deployment The following instructions describe how to update, or stop, the deployment of an HCL Leap application. There are many reasons why you might need to update, or stop, a deployed application. You might want to update the deployment parameters, such as adding a start and stop date. Or, you might need to stop the deployment to perform updates to the application, and do not want to impact existing data. To update, or stop, a deployment: Go to the Manage tab and click Deploy for the application. The Deployment Setting window opens. Modify the deployment settings: To update a deployment, update the deployment settings and click Update . To stop the deployment, click Stop . Note: If you want to set a Deployment period, you must stop the deployment first, set the Start and Stop dates, then deploy the application again. Parent topic: Deploying applications and viewing data responses","title":"Updating and stopping a deployment"},{"location":"cr_updating_and_stopping_deployment.html#updatingandstoppingadeployment","text":"The following instructions describe how to update, or stop, the deployment of an HCL Leap application. There are many reasons why you might need to update, or stop, a deployed application. You might want to update the deployment parameters, such as adding a start and stop date. Or, you might need to stop the deployment to perform updates to the application, and do not want to impact existing data. To update, or stop, a deployment: Go to the Manage tab and click Deploy for the application. The Deployment Setting window opens. Modify the deployment settings: To update a deployment, update the deployment settings and click Update . To stop the deployment, click Stop . Note: If you want to set a Deployment period, you must stop the deployment first, set the Start and Stop dates, then deploy the application again. Parent topic: Deploying applications and viewing data responses","title":"Updating and stopping a deployment"},{"location":"cr_uploading_and_using_files.html","text":"Uploading files for use in your application The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. There are two ways to upload files into a Leap application: Upload all files in the Settings tab before building the application. Upload files one by one as needed when you build the application. To upload files in the Settings tab: Open your Leap application, and click the Settings tab at the top of the page. Click Files from the menu on the left side of the screen, then click Add . The Add File or URL Link window opens. Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . The file is listed on the Files page. After multiple files are uploaded, you can sort the files by type, upload date, or relationship. To use the uploaded files during form design: Add form items, such as Button, Image or Media to your form. The Properties side panel opens. Click the drop-down menu to select from an available list of files. Note: Only the supported files types for the form item are displayed in the drop-down menu. A list of supported file types is provided on the window. Add form items, such as Button, Image, Media to your form, the Properties side panel opens and click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . Parent topic: Managing the files associated with your application Uploading files during form design To upload files while you build your form. Add form items, such as Button, Image, Media to your form, the Properties side panel opens, then click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK .","title":"Uploading files for use in your application"},{"location":"cr_uploading_and_using_files.html#uploadingfiles","text":"The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. There are two ways to upload files into a Leap application: Upload all files in the Settings tab before building the application. Upload files one by one as needed when you build the application. To upload files in the Settings tab: Open your Leap application, and click the Settings tab at the top of the page. Click Files from the menu on the left side of the screen, then click Add . The Add File or URL Link window opens. Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . The file is listed on the Files page. After multiple files are uploaded, you can sort the files by type, upload date, or relationship. To use the uploaded files during form design: Add form items, such as Button, Image or Media to your form. The Properties side panel opens. Click the drop-down menu to select from an available list of files. Note: Only the supported files types for the form item are displayed in the drop-down menu. A list of supported file types is provided on the window. Add form items, such as Button, Image, Media to your form, the Properties side panel opens and click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK . Parent topic: Managing the files associated with your application","title":"Uploading files for use in your application"},{"location":"cr_uploading_and_using_files.html#usinguploadedfiles","text":"To upload files while you build your form. Add form items, such as Button, Image, Media to your form, the Properties side panel opens, then click Add file . Select whether to add a file from your computer, or use a file from the internet. Browse to the location of the file, or enter the URL, then click OK .","title":"Uploading files during form design"},{"location":"cr_using_apps_as_services_toc.html","text":"Incorporating web services into your applications The following topics describe how to incorporate web services into your HCL Leap application. Adding and configuring a service The following instructions describe how to add and configure a service so you can map it within your application. Service Oriented Architecture \u2013 Exposing a service to HCL Leap The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. Triggering a service from a button You can use a service to add information to a form automatically after a user clicks a button. Using a service to populate form items You can use a web service to populate to a Drop Down, Select One, and Select Many form item. Integrating your application with existing HCL Leap applications Each Leap application can be used within another Leap applications as a service. Parent topic: Creating and managing applications","title":"Incorporating web services into your applications"},{"location":"cr_using_apps_as_services_toc.html#usingapplicationsasservices","text":"The following topics describe how to incorporate web services into your HCL Leap application. Adding and configuring a service The following instructions describe how to add and configure a service so you can map it within your application. Service Oriented Architecture \u2013 Exposing a service to HCL Leap The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. Triggering a service from a button You can use a service to add information to a form automatically after a user clicks a button. Using a service to populate form items You can use a web service to populate to a Drop Down, Select One, and Select Many form item. Integrating your application with existing HCL Leap applications Each Leap application can be used within another Leap applications as a service. Parent topic: Creating and managing applications","title":"Incorporating web services into your applications"},{"location":"cr_using_apps_exposing_service_to.html","text":"Service Oriented Architecture \u2013 Exposing a service to HCL Leap The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. The Leap has an extensible services architecture which allows Leap applications to send and receive data from any external system. The Services Architecture consists of the following components: Service Transports \u2013 The Service Transport is the Java\u2122 code responsible for communicating with an external service, such as a public REST service. It can send data out to the external service or receive data from the external service. The transport also uses JDBC to store and retrieve data from any database. Alternatively, the transport can simply implement a \u201cservice\u201d itself, such as a unit conversion library. You can add any custom transport installation to the Leap installation by placing an appropriate JAR file in a specific directory on the Leap server; however, Leap already includes a generic HTTP transport which can send and receive data over the internet or intranet, and will suffice for many use cases. For more information, see Service Description . Service Descriptions \u2013 The Service Description provides the interface for a Service Transport. A Service Description is usually described by an XML file, although it is also possible to programmatically create a Service Description. The Service Description specifies a service's name, description, input parameters, and output parameters. These attributes are what appear to the application designer when they are hooking up services to a Leap application. Data Mapping \u2013 Each service description can contain an optional \u201cmapping\u201d component which describes how the data coming from the Service Transport can be mapped to the outputs defined in the Service Description, or vice versa. The advantage of the mapping component is that it allows multiple Service Descriptions, each with its own name, description, input, and outputs to use to use the same generic transport. By using XPath-like references, the mapping component supports the mapping of complex data structures such as an XML document. The mapping of constant values is also supported. Service Configuration \u2013 The Service Configuration is another layer of mapping meant for application designers. It maps items in the form to the inputs and outputs of the Service Description. The application designer is responsible for creating service configurations and connecting form items to the service inputs and outputs. Service configurations are stored inside the application. Supporting documents Use the following documents to gain a better understanding of the steps required to expose a service to Leap. Understanding the HTTP transport \u2013 The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the service mapping engine of Leap, the HTTP Service Transport can extract data from an HTTP response and make it available to your application. The HTTP Service Transport can be used to communicate with any standard HTTP server. While there are some limits on the capabilities of the HTTP Service Transport, it is all that is needed to communicate with a basic HTTP server, or RESTful service, in most cases. For more information, see HTTP Service Transport Creating and deploying service descriptions \u2013 The Service Description provides an interface to Leap mapping interface, and an interface to a Service Transport. For more information on creating Service Descriptions, see Service Description Parent topic: Incorporating web services into your applications","title":"Service Oriented Architecture \u2013 Exposing a service to Leap"},{"location":"cr_using_apps_exposing_service_to.html#exposingaservicetofeb","text":"The following information is an overview of Service Oriented Architecture built into Leap, and describes how to expose a service to Leap. The Leap has an extensible services architecture which allows Leap applications to send and receive data from any external system. The Services Architecture consists of the following components: Service Transports \u2013 The Service Transport is the Java\u2122 code responsible for communicating with an external service, such as a public REST service. It can send data out to the external service or receive data from the external service. The transport also uses JDBC to store and retrieve data from any database. Alternatively, the transport can simply implement a \u201cservice\u201d itself, such as a unit conversion library. You can add any custom transport installation to the Leap installation by placing an appropriate JAR file in a specific directory on the Leap server; however, Leap already includes a generic HTTP transport which can send and receive data over the internet or intranet, and will suffice for many use cases. For more information, see Service Description . Service Descriptions \u2013 The Service Description provides the interface for a Service Transport. A Service Description is usually described by an XML file, although it is also possible to programmatically create a Service Description. The Service Description specifies a service's name, description, input parameters, and output parameters. These attributes are what appear to the application designer when they are hooking up services to a Leap application. Data Mapping \u2013 Each service description can contain an optional \u201cmapping\u201d component which describes how the data coming from the Service Transport can be mapped to the outputs defined in the Service Description, or vice versa. The advantage of the mapping component is that it allows multiple Service Descriptions, each with its own name, description, input, and outputs to use to use the same generic transport. By using XPath-like references, the mapping component supports the mapping of complex data structures such as an XML document. The mapping of constant values is also supported. Service Configuration \u2013 The Service Configuration is another layer of mapping meant for application designers. It maps items in the form to the inputs and outputs of the Service Description. The application designer is responsible for creating service configurations and connecting form items to the service inputs and outputs. Service configurations are stored inside the application.","title":"Service Oriented Architecture \u2013 Exposing a service to HCL Leap"},{"location":"cr_using_apps_exposing_service_to.html#supporting-documents","text":"Use the following documents to gain a better understanding of the steps required to expose a service to Leap. Understanding the HTTP transport \u2013 The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the service mapping engine of Leap, the HTTP Service Transport can extract data from an HTTP response and make it available to your application. The HTTP Service Transport can be used to communicate with any standard HTTP server. While there are some limits on the capabilities of the HTTP Service Transport, it is all that is needed to communicate with a basic HTTP server, or RESTful service, in most cases. For more information, see HTTP Service Transport Creating and deploying service descriptions \u2013 The Service Description provides an interface to Leap mapping interface, and an interface to a Service Transport. For more information on creating Service Descriptions, see Service Description Parent topic: Incorporating web services into your applications","title":"Supporting documents"},{"location":"cr_using_other_apps_as_services.html","text":"Integrating your application with existing HCL Leap applications Each Leap application can be used within another Leap applications as a service. You can use another application to provide data to populate a drop-down menu on your form. Or, you can search a list of products that are maintained by another application. The ability to share data is a powerful feature of Leap. To use an application as a service, the designer of an application must set the requisite permissions on the Access tab of the application. Access can be set for Read , or Read/Write . If you set Read access, other applications are able to Retrieve and Search information from a specific application. If you set Read/Write access, other applications are able to Retrieve, Search, Delete, and Submit information to and from a specific application. For more information about setting permissions, see Defining permissions to share data with other applications . Note: When you use another Leap application as a service, mandatory items must be explicitly mapped in the service mapping Inputs and Outputs. Default Items in the form do not satisfy the mandatory requirement as they are not evaluated on the server. If any value is marked as mandatory, it must have a value that is mapped to it in the mappings dialog. When mapping input parameters, each target has a Search Operator that can change how the inputs are interpreted. For example, you can apply a search operator to create an assignment that links the input with the target, and the operator. To apply the operator, you have to set the View to constant and then type the operator keyword in the editable field. The following table contains the list of available search operators. Search Operators Description equals Equal to notequals Not equal to lt Less than lte Less than or equal to gt Greater than gte Greater than or equal to Endswith The target ends with Startswith The target starts with contains The target contains The services also provide access to metadata about the records, such as author, creation time, and the current stage. When you call these services, metadata can be used to filter the results. The search results can be sorted by form data, such as a field in an application, or by some metadata, such as the lastUpdated time. The default sort order is ascending. To change it to descending, you must prefix your sort field with \u201cDESC\u201d. For example, the following string sorts ascending, \"F_Name\" . The following string sorts descending, \"DESCF_Name\" . The following values are available for you to use when you are searching with metadata: Metadata field Sort key Last update time \"lastUpdated\" Author name \"itemAuthor\" Stage name \"flowState\" Line ID \"dbId\" You can also limit the results by setting a Page Size that limits how many entries you return, or a Page, which limits pages to return. If you do not provide paging values, then all records that meet your filters are returned. To see the list of applications available as services select the HCL Leap Applications entry in the Service Catalog list. A list of all applications and methods available for Service mapping is shown. Each application can expose the following methods that are based on Access settings: Retrieve : Use Retrieve retrieve a single record from another application. For example, use Retrieve to pre-populate information that is based on an employee serial number that is entered by the user into the form. The retrieve returns a single row, and cannot be mapped to a repeating or list item. Search : Use Search to return a list of records from another application that meets the search criteria. For example, use Search to populate a drop-down with a list of values from another Leap application. The results from a search must be mapped to a repeating/list, drop-down, or table item. Delete : When Delete service method is called, it deletes the record in the target application that meets the supplied parameters. Use this method with caution as there is no way to retrieve the data after the record is deleted. Create : The Create method is used to create a record in the target application. Create replicates a user interacting with, and submitting, the target form. Update : The Update method is used to update an existing record in the target application. Update replicates a user interacting with, and submitting changes to a record in the target form Parent topic: Incorporating web services into your applications","title":"Integrating your application with existing Leap applications"},{"location":"cr_using_other_apps_as_services.html#definingaservicetotheexperiencebuilder","text":"Each Leap application can be used within another Leap applications as a service. You can use another application to provide data to populate a drop-down menu on your form. Or, you can search a list of products that are maintained by another application. The ability to share data is a powerful feature of Leap. To use an application as a service, the designer of an application must set the requisite permissions on the Access tab of the application. Access can be set for Read , or Read/Write . If you set Read access, other applications are able to Retrieve and Search information from a specific application. If you set Read/Write access, other applications are able to Retrieve, Search, Delete, and Submit information to and from a specific application. For more information about setting permissions, see Defining permissions to share data with other applications . Note: When you use another Leap application as a service, mandatory items must be explicitly mapped in the service mapping Inputs and Outputs. Default Items in the form do not satisfy the mandatory requirement as they are not evaluated on the server. If any value is marked as mandatory, it must have a value that is mapped to it in the mappings dialog. When mapping input parameters, each target has a Search Operator that can change how the inputs are interpreted. For example, you can apply a search operator to create an assignment that links the input with the target, and the operator. To apply the operator, you have to set the View to constant and then type the operator keyword in the editable field. The following table contains the list of available search operators. Search Operators Description equals Equal to notequals Not equal to lt Less than lte Less than or equal to gt Greater than gte Greater than or equal to Endswith The target ends with Startswith The target starts with contains The target contains The services also provide access to metadata about the records, such as author, creation time, and the current stage. When you call these services, metadata can be used to filter the results. The search results can be sorted by form data, such as a field in an application, or by some metadata, such as the lastUpdated time. The default sort order is ascending. To change it to descending, you must prefix your sort field with \u201cDESC\u201d. For example, the following string sorts ascending, \"F_Name\" . The following string sorts descending, \"DESCF_Name\" . The following values are available for you to use when you are searching with metadata: Metadata field Sort key Last update time \"lastUpdated\" Author name \"itemAuthor\" Stage name \"flowState\" Line ID \"dbId\" You can also limit the results by setting a Page Size that limits how many entries you return, or a Page, which limits pages to return. If you do not provide paging values, then all records that meet your filters are returned. To see the list of applications available as services select the HCL Leap Applications entry in the Service Catalog list. A list of all applications and methods available for Service mapping is shown. Each application can expose the following methods that are based on Access settings: Retrieve : Use Retrieve retrieve a single record from another application. For example, use Retrieve to pre-populate information that is based on an employee serial number that is entered by the user into the form. The retrieve returns a single row, and cannot be mapped to a repeating or list item. Search : Use Search to return a list of records from another application that meets the search criteria. For example, use Search to populate a drop-down with a list of values from another Leap application. The results from a search must be mapped to a repeating/list, drop-down, or table item. Delete : When Delete service method is called, it deletes the record in the target application that meets the supplied parameters. Use this method with caution as there is no way to retrieve the data after the record is deleted. Create : The Create method is used to create a record in the target application. Create replicates a user interacting with, and submitting, the target form. Update : The Update method is used to update an existing record in the target application. Update replicates a user interacting with, and submitting changes to a record in the target form Parent topic: Incorporating web services into your applications","title":"Integrating your application with existing HCL Leap applications"},{"location":"cr_viewing_submitted_responses.html","text":"Viewing submitted responses After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. To review user submitted responses, click View Data for a specific application. The View Data page opens, and you are presented with two options to view the submitted results: Viewing individual responses on the View Data page. The default is to see a list of responses. Viewing a summary of response data displayed in either a pie, bar chart, or table on the Summary page. Viewing responses in a list The following features are available on the View Data page: When you click on a response, it opens in a window so you can see all information easily. Print, email, and delete buttons are available on each row. You can access these buttons without having to open each individual response. If you choose to email the link to a response, the recipient receives not only a method of printing the response, but also a link to open and view the response. To obtain the View Data URL link On the Manage tab, click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. In the URL Links: section, change Launch Form to View Data . Copy the URL and paste it into a web browser, or disseminate it through email. Viewing summary responses in a chart Charts are available for the following form items: Check Box Currency Drop Down Number \u2013 both decimal and integer Select Many Select One Survey If there are no charts to display, or if you do not have the required access to view the submitted data, an error message is displayed. Access is configured when the application is created. The same access permissions that allow users to view and edit the form are used to display submitted results. The following list is a Summary of page chart features: Display type \u2013 By default, charts are displayed as pie charts. You can select to have the chart display as a bar chart. Selecting which charts to display \u2013 The Summary page displays charts for the first 10 form items in a form. If your form contains more than 10 items that can be displayed as charts, click Customize to add or remove form items from the Summary page. Selected charts are remembered as a personal setting from session to session and are also reflected in the distributed Share URLs. What a chart means \u2013 The question on which the results are based is displayed with each chart. If the form item charted is a survey, the survey title is displayed with each of the survey questions. Displaying choice results \u2013 Charts display the most popular 10 answers for a question. If there are more than 10 choices available to a user, the most popular 9 are displayed and the rest of the responses are grouped into an Other category. Displaying numerical results \u2013 If the form item requests a numerical value from the user, the first 10 values are displayed. If there are more than 10 submitted responses, the numerical values are grouped into Ranges . Although the range is automatically determined, some decisions for the range are based on form item configuration when the application is designed. Filtering data \u2013 You can filter the results that are displayed in the charts by clicking Filters and setting parameters. The charts display only the filtered results. Clearing the filters returns the original data set. You can also quickly filter data by clicking a section of the chart. The filter that results from the click is presented in the search dialog prior to application. Filters are applied to the overall set of submitted records and are therefore reflected in all charts. Filters are remembered as a personal setting from session to session, and are also reflected in any distributed Share URLs. Note that Filtering and Quick Filtering is not supported for the Select Many form item. Sharing charts \u2013 You can share the complete set of charts or individual charts by clicking Share . From the Share options, select whether to email or embed the URL of the chart. When you share a chart, the chart information is not static, and will continue to reflect new submissions. Any filters applied to the charts are also included when the chart URL is shared. Note: When you share charts, the people to whom you send the chart URL must have appropriate access permissions. Otherwise, an error message rather than the chart is displayed. iFrame embedding of charts \u2013 You can share charts by embedding the charts into an iFrame. You can use the embedding feature to show a chart on your own HTML page, or with an iFrame capable Portlet, such as the Web Clipping portlet. The iFrame content is also used to host the chart in a Leap application using the HTML form item. Statistical data provided \u2013 Each chart displays the number of times the question was answered from the total number of submitted responses. If questions in your form are not mandatory, you can see how many people answered the question, and how many did not answer the question. Charts that are based on Number or Currency form items display statistical data, such as the minimum, maximum, range, and average of the submitted values. Reflecting new data submission in existing charts \u2013 Click Refresh to reflect newly submitted data in existing charts. Viewing individual responses \u2013 A list of submitted responses is displayed in a table. By clicking the row of a response, the user\u2019s submitted form is displayed in the Application View frame. If the form contains workflow elements, such as approving or denying the form, buttons that are associated with the workflow are provided for you. Parent topic: Deploying applications and viewing data responses","title":"Viewing submitted responses"},{"location":"cr_viewing_submitted_responses.html#viewingsubmittedresponses","text":"After users complete and submit forms, you can view the submitted responses. Responses are available compiled into summary charts, or as a list of individual forms. To review user submitted responses, click View Data for a specific application. The View Data page opens, and you are presented with two options to view the submitted results: Viewing individual responses on the View Data page. The default is to see a list of responses. Viewing a summary of response data displayed in either a pie, bar chart, or table on the Summary page. Viewing responses in a list The following features are available on the View Data page: When you click on a response, it opens in a window so you can see all information easily. Print, email, and delete buttons are available on each row. You can access these buttons without having to open each individual response. If you choose to email the link to a response, the recipient receives not only a method of printing the response, but also a link to open and view the response. To obtain the View Data URL link On the Manage tab, click the arrow head to the left of the application name. The application information window expands and displays the URL of the application. In the URL Links: section, change Launch Form to View Data . Copy the URL and paste it into a web browser, or disseminate it through email. Viewing summary responses in a chart Charts are available for the following form items: Check Box Currency Drop Down Number \u2013 both decimal and integer Select Many Select One Survey If there are no charts to display, or if you do not have the required access to view the submitted data, an error message is displayed. Access is configured when the application is created. The same access permissions that allow users to view and edit the form are used to display submitted results. The following list is a Summary of page chart features: Display type \u2013 By default, charts are displayed as pie charts. You can select to have the chart display as a bar chart. Selecting which charts to display \u2013 The Summary page displays charts for the first 10 form items in a form. If your form contains more than 10 items that can be displayed as charts, click Customize to add or remove form items from the Summary page. Selected charts are remembered as a personal setting from session to session and are also reflected in the distributed Share URLs. What a chart means \u2013 The question on which the results are based is displayed with each chart. If the form item charted is a survey, the survey title is displayed with each of the survey questions. Displaying choice results \u2013 Charts display the most popular 10 answers for a question. If there are more than 10 choices available to a user, the most popular 9 are displayed and the rest of the responses are grouped into an Other category. Displaying numerical results \u2013 If the form item requests a numerical value from the user, the first 10 values are displayed. If there are more than 10 submitted responses, the numerical values are grouped into Ranges . Although the range is automatically determined, some decisions for the range are based on form item configuration when the application is designed. Filtering data \u2013 You can filter the results that are displayed in the charts by clicking Filters and setting parameters. The charts display only the filtered results. Clearing the filters returns the original data set. You can also quickly filter data by clicking a section of the chart. The filter that results from the click is presented in the search dialog prior to application. Filters are applied to the overall set of submitted records and are therefore reflected in all charts. Filters are remembered as a personal setting from session to session, and are also reflected in any distributed Share URLs. Note that Filtering and Quick Filtering is not supported for the Select Many form item. Sharing charts \u2013 You can share the complete set of charts or individual charts by clicking Share . From the Share options, select whether to email or embed the URL of the chart. When you share a chart, the chart information is not static, and will continue to reflect new submissions. Any filters applied to the charts are also included when the chart URL is shared. Note: When you share charts, the people to whom you send the chart URL must have appropriate access permissions. Otherwise, an error message rather than the chart is displayed. iFrame embedding of charts \u2013 You can share charts by embedding the charts into an iFrame. You can use the embedding feature to show a chart on your own HTML page, or with an iFrame capable Portlet, such as the Web Clipping portlet. The iFrame content is also used to host the chart in a Leap application using the HTML form item. Statistical data provided \u2013 Each chart displays the number of times the question was answered from the total number of submitted responses. If questions in your form are not mandatory, you can see how many people answered the question, and how many did not answer the question. Charts that are based on Number or Currency form items display statistical data, such as the minimum, maximum, range, and average of the submitted values. Reflecting new data submission in existing charts \u2013 Click Refresh to reflect newly submitted data in existing charts. Viewing individual responses \u2013 A list of submitted responses is displayed in a table. By clicking the row of a response, the user\u2019s submitted form is displayed in the Application View frame. If the form contains workflow elements, such as approving or denying the form, buttons that are associated with the workflow are provided for you. Parent topic: Deploying applications and viewing data responses","title":"Viewing submitted responses"},{"location":"create_postgresql_db.html","text":"Creating a PostgreSQL database The following instructions describe how to manually create the PostgreSQL database for Leap. In a production environment, you must create a PostgreSQL database before you install HCL Leap to WebSphere Application Server. Note: Do not create a new database if you want to continue using the same database with the existing user content. Create an empty PostgreSQL database following standard naming conventions. There are two methods: Use PGAdmin. Run psql.exe and execute the command create database mydbname;. Note: The default page size will be 8KB. Optionally, you may create a user for administering the Leap database: CREATE ROLE \u201cleap-admin\u201d WITH NOLOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD \u2018xxx\u2019; GRANT pg_database_owner to \u201cleap-admin\u201d WITH ADMIN OPTION; Parent topic: Create a Database","title":"Creating a PostgreSQL database"},{"location":"create_postgresql_db.html#create_postgresql_db","text":"The following instructions describe how to manually create the PostgreSQL database for Leap. In a production environment, you must create a PostgreSQL database before you install HCL Leap to WebSphere Application Server. Note: Do not create a new database if you want to continue using the same database with the existing user content. Create an empty PostgreSQL database following standard naming conventions. There are two methods: Use PGAdmin. Run psql.exe and execute the command create database mydbname;. Note: The default page size will be 8KB. Optionally, you may create a user for administering the Leap database: CREATE ROLE \u201cleap-admin\u201d WITH NOLOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD \u2018xxx\u2019; GRANT pg_database_owner to \u201cleap-admin\u201d WITH ADMIN OPTION; Parent topic: Create a Database","title":"Creating a PostgreSQL database"},{"location":"custom_properties_widgets.html","text":"Custom Properties The custom widget can define an array of custom properties for the app author to modify. Each property is an object with the following attributes: id : (required) uniquely identifies this property for this widget. label : (required) the property's label. propType : (required) one of: 'string' : rendered as a textbox. 'string-multiline' : rendered as a textarea. 'enum' : rendered as a dropdown. must be accompanied by a values attribute (see example below). 'boolean' : rendered as a checkbox. 'number' : rendered as a number input, for any number. 'integer' : rendered as a number input, for integers only. 'customOptions' : see the following listed items. values : required if propType is 'enum' (see the following example). defaultValue : (optional) the property's default value. constraints : (optional) min : (optional) minimum allowed property value for numbers. max : (optional) maximum allowed property value for numbers. Example: const myWidgetDefintion = { ... properties: [ ... { id: 'messageType', label: 'Message Type', propType: 'enum', values: [{title: 'Information', value: 'info'}, {title: 'Warning', value: 'warn'}, {title: 'Error', value: 'error'}], defaultValue: 'info' }, ... ], ... }; Parent topic: Custom Widget API","title":"Custom Properties"},{"location":"custom_properties_widgets.html#custom_properties_widgets","text":"The custom widget can define an array of custom properties for the app author to modify. Each property is an object with the following attributes: id : (required) uniquely identifies this property for this widget. label : (required) the property's label. propType : (required) one of: 'string' : rendered as a textbox. 'string-multiline' : rendered as a textarea. 'enum' : rendered as a dropdown. must be accompanied by a values attribute (see example below). 'boolean' : rendered as a checkbox. 'number' : rendered as a number input, for any number. 'integer' : rendered as a number input, for integers only. 'customOptions' : see the following listed items. values : required if propType is 'enum' (see the following example). defaultValue : (optional) the property's default value. constraints : (optional) min : (optional) minimum allowed property value for numbers. max : (optional) maximum allowed property value for numbers. Example: const myWidgetDefintion = { ... properties: [ ... { id: 'messageType', label: 'Message Type', propType: 'enum', values: [{title: 'Information', value: 'info'}, {title: 'Warning', value: 'warn'}, {title: 'Error', value: 'error'}], defaultValue: 'info' }, ... ], ... }; Parent topic: Custom Widget API","title":"Custom Properties"},{"location":"customwidgetapi_landing.html","text":"Custom Widget API This API provides a mechanism to incorporate custom widgets into the HCL Leap product. Getting started Product Configuration Additional resources can be loaded into Leap UI's by adding ibm.nitro.NitroConfig.runtimeResources properties to Leap_config.properties . These additional resources are expected to include definitions of your custom widgets and any auxiliary styles or libraries that are required to support them. For example: ibm.nitro.NitroConfig.runtimeResources.1 = \\ <link rel='stylesheet' type='text/css' media='screen' href='https://mywidgets.example.com/common.css'>; \\n\\ <link rel='stylesheet' type='text/css' media='screen' href='https://mywidgets.example.com/MyYesNoWidget.css'>; \\n\\ <script src='https://myWidgets.example.com/common.js'></script> \\n\\ <script src='https://myWidgets.example.com/MyYesNoWidget.js'></script> \\n Registering a Widget As your custom .js is loaded into the page, it is expected to register one or more widget definitions: const myWidgetDefinition = {...}; nitro.registerWidget(myWidgetDefintion); Full descriptions and examples are provided in the following topics. The following example is the basic skeleton of a custom widget: const myWidgetDefinition = { id: 'example.YesNo', // uniquely identifies this widget version: '2.0.0', // the widget's version apiVersion: '1.0.0', // the version of this API label: 'Yes/No', description: 'Allows user to choose \"Yes\" or \"No\"', datatype: { type: 'string' // must be one of 'string', 'date', 'number', 'boolean', 'time', 'timestamp' }, // for placement in the palette category: { id: 'example.choice.widgets', label: 'Choice Components' }, iconClassName: 'myYesNoIcon', // styling of this class expected in custom .css builtInProperties: [...], // use existing properties: 'title', 'required', etc properties: [...], // custom properties, of prescribed types // called by Leap to initialize widget in the DOM with initial properties, and set-up event handling instantiate: function (context, domNode, initialProps, eventManager) { return { // (optional) for display in various parts of the UI getDisplayTitle: function () { return ... }, // (required) for Leap to get widget's data value getValue: function () { return ... }, // (required) for Leap to set widget's data value setValue: function (val) { ... }, // (optional) for additional validation of value validateValue: function (val) { // return true, false, or custom error message }, // (required) called when properties change in the authoring environment, or via JavaScript API setProperty: function (propName, propValue) { ... }, // (optional) method to enable/disable widget setDisabled: function (isDisabled) { ... }, // (optional) determines what the author can do with the widget via custom JavaScript getJSAPIFacade: function () { return { ... }; } }; } }; Data Widgets vs Display Widgets Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). Data Types Data widgets can declare one of the listed data types, each with additional optional constraints. Rules App authors will be able to incorporate custom widgets in rules. Built-In Properties Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. Custom Properties The custom widget can define an array of custom properties for the app author to modify. Widgets with Options Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author. Widget Instantiation The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. Validation Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. Internationalization Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. Usage of JavaScript API Custom widgets can use Leap's JavaScript API to help achieve their objectives. Versioning This topic describes the widget's version . Upgrading The exact techniques for upgrading widgets from one major version to the next has not yet been established. Security Considerations This topic describes security considerations for Custom Widget API. Incorporating third-party libraries This topic describes incorporating third-party libraries. Known limitations Examples Parent topic: Reference","title":"Custom Widget API v1.0.0"},{"location":"customwidgetapi_landing.html#customwidgetapi_landing","text":"This API provides a mechanism to incorporate custom widgets into the HCL Leap product.","title":"Custom Widget API"},{"location":"customwidgetapi_landing.html#section_m5p_4cn_jyb","text":"Product Configuration Additional resources can be loaded into Leap UI's by adding ibm.nitro.NitroConfig.runtimeResources properties to Leap_config.properties . These additional resources are expected to include definitions of your custom widgets and any auxiliary styles or libraries that are required to support them. For example: ibm.nitro.NitroConfig.runtimeResources.1 = \\ <link rel='stylesheet' type='text/css' media='screen' href='https://mywidgets.example.com/common.css'>; \\n\\ <link rel='stylesheet' type='text/css' media='screen' href='https://mywidgets.example.com/MyYesNoWidget.css'>; \\n\\ <script src='https://myWidgets.example.com/common.js'></script> \\n\\ <script src='https://myWidgets.example.com/MyYesNoWidget.js'></script> \\n Registering a Widget As your custom .js is loaded into the page, it is expected to register one or more widget definitions: const myWidgetDefinition = {...}; nitro.registerWidget(myWidgetDefintion); Full descriptions and examples are provided in the following topics. The following example is the basic skeleton of a custom widget: const myWidgetDefinition = { id: 'example.YesNo', // uniquely identifies this widget version: '2.0.0', // the widget's version apiVersion: '1.0.0', // the version of this API label: 'Yes/No', description: 'Allows user to choose \"Yes\" or \"No\"', datatype: { type: 'string' // must be one of 'string', 'date', 'number', 'boolean', 'time', 'timestamp' }, // for placement in the palette category: { id: 'example.choice.widgets', label: 'Choice Components' }, iconClassName: 'myYesNoIcon', // styling of this class expected in custom .css builtInProperties: [...], // use existing properties: 'title', 'required', etc properties: [...], // custom properties, of prescribed types // called by Leap to initialize widget in the DOM with initial properties, and set-up event handling instantiate: function (context, domNode, initialProps, eventManager) { return { // (optional) for display in various parts of the UI getDisplayTitle: function () { return ... }, // (required) for Leap to get widget's data value getValue: function () { return ... }, // (required) for Leap to set widget's data value setValue: function (val) { ... }, // (optional) for additional validation of value validateValue: function (val) { // return true, false, or custom error message }, // (required) called when properties change in the authoring environment, or via JavaScript API setProperty: function (propName, propValue) { ... }, // (optional) method to enable/disable widget setDisabled: function (isDisabled) { ... }, // (optional) determines what the author can do with the widget via custom JavaScript getJSAPIFacade: function () { return { ... }; } }; } }; Data Widgets vs Display Widgets Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). Data Types Data widgets can declare one of the listed data types, each with additional optional constraints. Rules App authors will be able to incorporate custom widgets in rules. Built-In Properties Some properties that already exist in the product are general purpose, or, are integral to the proper functioning of a widget. Custom Properties The custom widget can define an array of custom properties for the app author to modify. Widgets with Options Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author. Widget Instantiation The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. Validation Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. Internationalization Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. Usage of JavaScript API Custom widgets can use Leap's JavaScript API to help achieve their objectives. Versioning This topic describes the widget's version . Upgrading The exact techniques for upgrading widgets from one major version to the next has not yet been established. Security Considerations This topic describes security considerations for Custom Widget API. Incorporating third-party libraries This topic describes incorporating third-party libraries. Known limitations Examples Parent topic: Reference","title":"Getting started"},{"location":"da_controlling_data_available_for_export.html","text":"Controlling data available for export Use Filters to set rules, and select which data you want to export. You can set rules about which search results you see, as well as what is exported to an XML file or spreadsheet. Click the Manage tab. Select the application and click View Data for the application you want to manage. Click Create Filters . The Search window opens. Create a rule to search for the results you want to see using the menu. For example, select Created By from the Select Item menu. Select Equals from the Choose Operator menu and enter text in the field, such as Frank Adams. The rule searches for all records created by Frank Adams. To add another rule, click Add search filter . This time, select Last Updated by from the Select Items menu. Select Equals from the Choose Operator menu, and enter text in the field, such as Amadou Alain. Select the And radio button. Click Search . Leap searches the records for any that were created by Frank Adams and last updated by Amadou Alain. To return to your full result set, click Clear Filters . Parent topic: Exporting data from your application","title":"Controlling data available for export"},{"location":"da_controlling_data_available_for_export.html#controllingdataavailableforexport","text":"Use Filters to set rules, and select which data you want to export. You can set rules about which search results you see, as well as what is exported to an XML file or spreadsheet. Click the Manage tab. Select the application and click View Data for the application you want to manage. Click Create Filters . The Search window opens. Create a rule to search for the results you want to see using the menu. For example, select Created By from the Select Item menu. Select Equals from the Choose Operator menu and enter text in the field, such as Frank Adams. The rule searches for all records created by Frank Adams. To add another rule, click Add search filter . This time, select Last Updated by from the Select Items menu. Select Equals from the Choose Operator menu, and enter text in the field, such as Amadou Alain. Select the And radio button. Click Search . Leap searches the records for any that were created by Frank Adams and last updated by Amadou Alain. To return to your full result set, click Clear Filters . Parent topic: Exporting data from your application","title":"Controlling data available for export"},{"location":"da_data_analysis_and_exporting_data.html","text":"Labeling data, performing data analysis, and exporting data You can add labels to data elements in your application that become the label in the export file. After capturing data from users, you can label data elements to help analyze the data when it is exported to a spreadsheet, or database. You can also set which data points other users see with security rules. For example, you can restrict managers from seeing the time sheets of employees who are not on their team. Or, you can choose to hide all forms that are in an end state and do not need attention. You can also export tables. In the spreadsheet, Leap creates one row for each header and one row for each table. With these topics, learn how to label data, how to export data, and how labels affect the exported data. Changing the Saved Value of a form item You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Adding Data Labels to form items Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Exporting data from your application After users complete and submit forms, you can export the data to a spreadsheet. Parent topic: Creating and managing applications","title":"Labeling data, performing data analysis, and exporting data"},{"location":"da_data_analysis_and_exporting_data.html#danaanalysisandexportingdata","text":"You can add labels to data elements in your application that become the label in the export file. After capturing data from users, you can label data elements to help analyze the data when it is exported to a spreadsheet, or database. You can also set which data points other users see with security rules. For example, you can restrict managers from seeing the time sheets of employees who are not on their team. Or, you can choose to hide all forms that are in an end state and do not need attention. You can also export tables. In the spreadsheet, Leap creates one row for each header and one row for each table. With these topics, learn how to label data, how to export data, and how labels affect the exported data. Changing the Saved Value of a form item You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Adding Data Labels to form items Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Exporting data from your application After users complete and submit forms, you can export the data to a spreadsheet. Parent topic: Creating and managing applications","title":"Labeling data, performing data analysis, and exporting data"},{"location":"da_exporting_data_from_your_application.html","text":"Exporting data from your application After users complete and submit forms, you can export the data to a spreadsheet. HCL Leap exports the data from your application to an Atom feed in XML format, JSON JavaScript\u2122 Object Notification file, an OpenDocument spreadsheet, or Microsoft\u2122 Excel. By default, all data for a specific application to which you have access is exported, unless you restrict the data set using Search. From the Manage tab, click View Data under the application you want to export. Click the Responses tab and select Export Data . Click the Export To to button and select the format of the file you want. Controlling data available for export Use Filters to set rules, and select which data you want to export. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Exporting data from your application"},{"location":"da_exporting_data_from_your_application.html#exportingdatafromyourapplication","text":"After users complete and submit forms, you can export the data to a spreadsheet. HCL Leap exports the data from your application to an Atom feed in XML format, JSON JavaScript\u2122 Object Notification file, an OpenDocument spreadsheet, or Microsoft\u2122 Excel. By default, all data for a specific application to which you have access is exported, unless you restrict the data set using Search. From the Manage tab, click View Data under the application you want to export. Click the Responses tab and select Export Data . Click the Export To to button and select the format of the file you want. Controlling data available for export Use Filters to set rules, and select which data you want to export. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Exporting data from your application"},{"location":"da_labeling_fields_in_a_form.html","text":"Adding Data Labels to form items Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Display Values are shown to users when they view forms. While informative, Display Values may not make the best column headings. When analyzing an exported spreadsheet, a descriptive Data Label provides a column name, and gives context to the data viewed outside of the form. The following instructions describe how to add Data Labels to form items: Select the form item to reveal the properties side panel. Add text in the Data Label field. When you export the data, the text you entered in the data label becomes the name of the column. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Adding Data Labels to form items"},{"location":"da_labeling_fields_in_a_form.html#labelingfieldsinaform","text":"Data labels added to form items provide descriptive column names when data is exported to a spreadsheet. If no data label is assigned, the Display Value is used. Display Values are shown to users when they view forms. While informative, Display Values may not make the best column headings. When analyzing an exported spreadsheet, a descriptive Data Label provides a column name, and gives context to the data viewed outside of the form. The following instructions describe how to add Data Labels to form items: Select the form item to reveal the properties side panel. Add text in the Data Label field. When you export the data, the text you entered in the data label becomes the name of the column. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Adding Data Labels to form items"},{"location":"da_labeling_saved_values_in_forms.html","text":"Changing the Saved Value of a form item You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Display Values are shown to users when they view forms. By default, the Display Value is the Saved Value. Altering Saved Values is useful when exporting data to a spreadsheet. For example, in a Drop Down, Select One, Select Many, or Survey, users are presented with a list of options. Changing the Saved Value of a form item is useful if you want to quantify, or rank the choices users make without presenting such ranks to the users. If the Saved Value of the data is shorter and more descriptive than the Displayed Value, it is easier for reviewers to understand when viewing the exported data in a spreadsheet. Select the form item with predefined choices, such as a Drop Down, or Select One, the Properties side panel appears. Enter a value in the Displayed Value field. The Displayed Value is what the user sees when viewing the form. What you type in the Displayed Value field is automatically used as the Saved Value. Enter a value in the Saved Value field. The Saved Value is displayed when you view the responses during an export. Click the green plus sign next to the Saved Value field to add another row to the list. If you want to have one option display to the users as a preselected default, click the radio button for the Saved Value field. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Changing the Saved Value of a form item"},{"location":"da_labeling_saved_values_in_forms.html#labelingsavedvaluesinforms","text":"You can add \u201cSaved Value\u201d labels for any form items that have a constant value so they reflect different data during export. Display Values are shown to users when they view forms. By default, the Display Value is the Saved Value. Altering Saved Values is useful when exporting data to a spreadsheet. For example, in a Drop Down, Select One, Select Many, or Survey, users are presented with a list of options. Changing the Saved Value of a form item is useful if you want to quantify, or rank the choices users make without presenting such ranks to the users. If the Saved Value of the data is shorter and more descriptive than the Displayed Value, it is easier for reviewers to understand when viewing the exported data in a spreadsheet. Select the form item with predefined choices, such as a Drop Down, or Select One, the Properties side panel appears. Enter a value in the Displayed Value field. The Displayed Value is what the user sees when viewing the form. What you type in the Displayed Value field is automatically used as the Saved Value. Enter a value in the Saved Value field. The Saved Value is displayed when you view the responses during an export. Click the green plus sign next to the Saved Value field to add another row to the list. If you want to have one option display to the users as a preselected default, click the radio button for the Saved Value field. Parent topic: Labeling data, performing data analysis, and exporting data","title":"Changing the Saved Value of a form item"},{"location":"datatypes_widgets.html","text":"Data Types Data widgets can declare one of the listed data types, each with additional optional constraints. Constraints on the data type goes beyond the UI. These constraints will be enforced when data is submitted to the server. **string** A piece of text. Constraints: length : the max number of characters allowed, including multi-byte charaters. Note, if this length is greater than 255 the submitted value will be stored as CLOB in the database and will not be sortable. Default value: 50 subType Email URL format : limit user's input to specific format, use # for numbers 0-9, @ for letters A-Z and ? for number or letter simplePattern invalidMessage multiValue - true or false . If true , the value returned by the widget is an array of strings, otherwise it is a single string. The default value is false . const myWidgetDefinition = { ... datatype: { type: 'string', length: 50, format: { simplePattern: '#####,#####-####' // US zip code invalidMessage: 'Please enter a valid US zip code' } } ... }; 'boolean' A true or false value. A null value is not supported. The default value is false Constraints: None. 'number' A number. Contraints: numberType : one of 'decimal' or 'integer' . Default: 'decimal' decimalPlaces : if number is a 'decimal' , will round to the given number of decimal places. Default: 2 minValue : minimum value of number expected. Can be omitted or set to null if no minimum maxValue : maximum value of number expected. Can be omitted or set to null if no maximum const myWidgetDefinition = { ... datatype: { type: 'number', numberType: 'decimal', decimalPlaces: 2 } ... }; 'date' A date-only value in 'YYYY-MM-DD' string format. Custom widgets are expected to handle the setting of the date in a 'YYYY-MM-DD' string format, or as a Date object. Contraints: minValue : minimum value of date expected. Can be omitted or set to null if no minimum maxValue : maximum value of date expected. Can be omitted or set to null if no maximum 'time' A time-only value in 'hh:mm' string format (24-hour clock). Contraints: minValue : minimum value of time expected. Can be omitted or set to null if no minimum maxValue : maximum value of time expected. Can be omitted or set to null if no maximum 'timestamp' A date-time value in ISO 8601 'YYYY-MM-DDThh:mmZ' string format, normalized to the UTC timezone (denoted by Z ) Custom widgets are expected to handle the setting of the date ISO 8601 'YYYY-MM-DDThh:mmZ' format, or as a Date object. Constraints: minValue : minimum value of time stamp expected. Can be omitted or set to null if no minimum maxValue : maximum value of time stamp expected. Can be omitted or set to null if no maximum Parent topic: Custom Widget API","title":"Data Types"},{"location":"datatypes_widgets.html#datatypes_widgets","text":"Data widgets can declare one of the listed data types, each with additional optional constraints. Constraints on the data type goes beyond the UI. These constraints will be enforced when data is submitted to the server. **string** A piece of text. Constraints: length : the max number of characters allowed, including multi-byte charaters. Note, if this length is greater than 255 the submitted value will be stored as CLOB in the database and will not be sortable. Default value: 50 subType Email URL format : limit user's input to specific format, use # for numbers 0-9, @ for letters A-Z and ? for number or letter simplePattern invalidMessage multiValue - true or false . If true , the value returned by the widget is an array of strings, otherwise it is a single string. The default value is false . const myWidgetDefinition = { ... datatype: { type: 'string', length: 50, format: { simplePattern: '#####,#####-####' // US zip code invalidMessage: 'Please enter a valid US zip code' } } ... }; 'boolean' A true or false value. A null value is not supported. The default value is false Constraints: None. 'number' A number. Contraints: numberType : one of 'decimal' or 'integer' . Default: 'decimal' decimalPlaces : if number is a 'decimal' , will round to the given number of decimal places. Default: 2 minValue : minimum value of number expected. Can be omitted or set to null if no minimum maxValue : maximum value of number expected. Can be omitted or set to null if no maximum const myWidgetDefinition = { ... datatype: { type: 'number', numberType: 'decimal', decimalPlaces: 2 } ... }; 'date' A date-only value in 'YYYY-MM-DD' string format. Custom widgets are expected to handle the setting of the date in a 'YYYY-MM-DD' string format, or as a Date object. Contraints: minValue : minimum value of date expected. Can be omitted or set to null if no minimum maxValue : maximum value of date expected. Can be omitted or set to null if no maximum 'time' A time-only value in 'hh:mm' string format (24-hour clock). Contraints: minValue : minimum value of time expected. Can be omitted or set to null if no minimum maxValue : maximum value of time expected. Can be omitted or set to null if no maximum 'timestamp' A date-time value in ISO 8601 'YYYY-MM-DDThh:mmZ' string format, normalized to the UTC timezone (denoted by Z ) Custom widgets are expected to handle the setting of the date ISO 8601 'YYYY-MM-DDThh:mmZ' format, or as a Date object. Constraints: minValue : minimum value of time stamp expected. Can be omitted or set to null if no minimum maxValue : maximum value of time stamp expected. Can be omitted or set to null if no maximum Parent topic: Custom Widget API","title":"Data Types"},{"location":"datawidgets_displaywidgets.html","text":"Data Widgets vs Display Widgets Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). A data widget is required to: Declare a datatype property (described below). Provide setValue() and getValue() functions. Publish an onChange event when its value is changed by the user. This will trigger a call to the widget's getValue() function, and validateValue() function if supplied. Some display widgets are still expected to trigger events (for example, onClick ), which can be used by the app author to invoke an action, by custom JavaScript or other techniques. Parent topic: Custom Widget API","title":"Data Widgets vs Display Widgets"},{"location":"datawidgets_displaywidgets.html#datawidgets_displaywidgets","text":"Some widgets are for collecting data (ie. \"data widgets\") and others are presentational in nature (ie. \"display widgets\"). A data widget is required to: Declare a datatype property (described below). Provide setValue() and getValue() functions. Publish an onChange event when its value is changed by the user. This will trigger a call to the widget's getValue() function, and validateValue() function if supplied. Some display widgets are still expected to trigger events (for example, onClick ), which can be used by the app author to invoke an action, by custom JavaScript or other techniques. Parent topic: Custom Widget API","title":"Data Widgets vs Display Widgets"},{"location":"deploy_container_kubernetes_openliberty.html","text":"Deploying to a Container (Kubernetes) Platform - Open Liberty The following sections describe how to deploy Leap to a Kubernetes-friendly container platform. All of the possible configuration parameters may be found in the values.yaml which is part of the deployment package. Prerequisite - Specifying persistant volumes Kubernetes must have: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. Note: If files are added to these volumes while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system or a location supplied by a cloud provider.","title":"Deploying to a Container \\(Kubernetes\\) Platform - Open Liberty {#deploy_container_kubernetes_openliberty .concept}"},{"location":"deploy_container_kubernetes_openliberty.html#deploy_container_kubernetes_openliberty","text":"The following sections describe how to deploy Leap to a Kubernetes-friendly container platform. All of the possible configuration parameters may be found in the values.yaml which is part of the deployment package.","title":"Deploying to a Container (Kubernetes) Platform - Open Liberty"},{"location":"deploy_container_kubernetes_openliberty.html#section_f4f_24s_gxb","text":"Kubernetes must have: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. Note: If files are added to these volumes while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system or a location supplied by a cloud provider.","title":"Prerequisite - Specifying persistant volumes"},{"location":"deploytraditional_leap.html","text":"Deploying to a traditional platform The following topics describe how to deploy Leap to a traditional platform. Basic Architecture Leap relies on two central components: the application server and the database. Manually deploying to WebSphere Application Server The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Parent topic: Deploying Leap","title":"Deploying to a traditional platform"},{"location":"deploytraditional_leap.html#untitled6","text":"The following topics describe how to deploy Leap to a traditional platform. Basic Architecture Leap relies on two central components: the application server and the database. Manually deploying to WebSphere Application Server The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Parent topic: Deploying Leap","title":"Deploying to a traditional platform"},{"location":"di_adding_pdf_to.html","text":"Adding a PDF to Leap The following instructions describe how to add a PDF to Leap. Go to Settings > Files . Click Add . The Add File or URL Link window opens. Select your PDF: Add a file from your computer \u2013 Browse to the file location on your computer. The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .pdf file extension remains. You can also enter a description of the file, which is useful if you have several similarly named PDFs. Note: The name of the file is displayed to users when they populate the PDF. Click OK to save changes and close the window. Save the application. Note: You must save the application after the PDF is loaded. Without saving the application, the PDF is not available when you attempt to create a Service Configuration. Parent topic: Leap document integration","title":"Adding a PDF to Leap"},{"location":"di_adding_pdf_to.html#addingapdftofeb","text":"The following instructions describe how to add a PDF to Leap. Go to Settings > Files . Click Add . The Add File or URL Link window opens. Select your PDF: Add a file from your computer \u2013 Browse to the file location on your computer. The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .pdf file extension remains. You can also enter a description of the file, which is useful if you have several similarly named PDFs. Note: The name of the file is displayed to users when they populate the PDF. Click OK to save changes and close the window. Save the application. Note: You must save the application after the PDF is loaded. Without saving the application, the PDF is not available when you attempt to create a Service Configuration. Parent topic: Leap document integration","title":"Adding a PDF to Leap"},{"location":"di_creating_the_pdf_trigger.html","text":"Creating the PDF trigger The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. When the user clicks the button, the service that maps information from the form to the PDF is triggered. The PDF is displayed, or stored as an attachment, with user supplied information in the PDF fields. Add a Button to your form from the Palette. Change the Caption of the button so users know that clicking it populates a PDF. For example, change the caption of the button to Create PDF. In the Properties side panel, select Call a service when clicked . Select the Service Configuration you created from the menu. Save your application. When the application is deployed, you can click the Create PDF button and a PDF is populated containing the values that are entered in the Leap application. Note: You can use other common form events as triggers, including validateButtonPressed . Stage action buttons cannot be used as triggers. Parent topic: Leap document integration","title":"Creating the PDF trigger"},{"location":"di_creating_the_pdf_trigger.html#creatingthepdfbutton","text":"The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. When the user clicks the button, the service that maps information from the form to the PDF is triggered. The PDF is displayed, or stored as an attachment, with user supplied information in the PDF fields. Add a Button to your form from the Palette. Change the Caption of the button so users know that clicking it populates a PDF. For example, change the caption of the button to Create PDF. In the Properties side panel, select Call a service when clicked . Select the Service Configuration you created from the menu. Save your application. When the application is deployed, you can click the Create PDF button and a PDF is populated containing the values that are entered in the Leap application. Note: You can use other common form events as triggers, including validateButtonPressed . Stage action buttons cannot be used as triggers. Parent topic: Leap document integration","title":"Creating the PDF trigger"},{"location":"di_mapping_form_items_to_pdf_fields.html","text":"Mapping form items to PDF fields The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > <form_name > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . When all inputs are mapped, click OK . Parent topic: Leap document integration","title":"Mapping form items to PDF fields"},{"location":"di_mapping_form_items_to_pdf_fields.html#mappingformitemstopdffields","text":"The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > <form_name > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . When all inputs are mapped, click OK . Parent topic: Leap document integration","title":"Mapping form items to PDF fields"},{"location":"di_mapping_form_items_to_pdf_fields_and_attaching.html","text":"Mapping form items to PDF fields and storing the filled PDF NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. You must have added an attachment item to your application. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > <form_name > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . In the Select Source window, switch from Basic view to Constant view. In the Event Value field type True . In the Select target window, select Create As Attachment and click the assign input button located between the two windows. The mapped value will appear in the list of Assigned Input . Click Next . The Outputs tab is active. Select Filled PDF from the Select Source window and select an attachment form item from the Select Target window. Click Assign Outputs button that is located between the two windows. The mapped value will appear in the list of Assigned Outputs . Click Ok . Parent topic: Leap document integration","title":"Mapping form items to PDF fields and storing the filled PDF"},{"location":"di_mapping_form_items_to_pdf_fields_and_attaching.html#mappingformitemstopdffields","text":"NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. You must have your PDF uploaded in the Settings > Files section. If you did not save your application after you uploaded the PDF, click Save before you use the following instructions. You must create a Leap form containing fields that are similar to the fields in the PDF. You must have added an attachment item to your application. Go to the Settings tab. If you only have one form, click Services from the menu on the left side of the page. If there are multiple forms, click Services > <form_name > . Click Add Service Configuration . The Service Configuration window opens. From the Service Catalog menu, select Documents . A list of available documents is displayed. Select the PDF from the list and click Next . The Inputs tab is activated. Select a form item from the Select source window, and a corresponding item from the Select target window. For example, you would map your Leap First Name form item to the First Name field in the PDF. Click the Assign input button that is located between the two windows. When valid mapping is done, a check mark appears to the right of the item name in the Select source , and Select target windows. The mapped value also appears in the list of Assigned Inputs . In the Select Source window, switch from Basic view to Constant view. In the Event Value field type True . In the Select target window, select Create As Attachment and click the assign input button located between the two windows. The mapped value will appear in the list of Assigned Input . Click Next . The Outputs tab is active. Select Filled PDF from the Select Source window and select an attachment form item from the Select Target window. Click Assign Outputs button that is located between the two windows. The mapped value will appear in the list of Assigned Outputs . Click Ok . Parent topic: Leap document integration","title":"Mapping form items to PDF fields and storing the filled PDF"},{"location":"di_pop_doc_with_app_data.html","text":"Leap document integration Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Where compliance or regulatory requirements mandate it, integrating Leap captured data with existing documents can be an important part of the overall Leap solution. These output documents can be provided for precise printing, document signing or archiving. You can now use a Leap form to collect user data, and display the information in a PDF. This process requires four steps: Load an existing PDF into Leap. Create a form that contains information fields that align with fields in the PDF. Create a service description by mapping fields from your form to fields in the PDF. Add a button that the user can click to populate and display a PDF. Note: For the Leap document integration, PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adding a PDF to Leap The following instructions describe how to add a PDF to Leap. Mapping form items to PDF fields The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. Mapping form items to PDF fields and storing the filled PDF NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. Creating the PDF trigger The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. Document integration usage details The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Parent topic: Creating and managing applications","title":"Leap document integration"},{"location":"di_pop_doc_with_app_data.html#generatingfillablepdfs","text":"Leap's document integration feature lets you use previously built PDF files and populate them with data captured by Leap. Where compliance or regulatory requirements mandate it, integrating Leap captured data with existing documents can be an important part of the overall Leap solution. These output documents can be provided for precise printing, document signing or archiving. You can now use a Leap form to collect user data, and display the information in a PDF. This process requires four steps: Load an existing PDF into Leap. Create a form that contains information fields that align with fields in the PDF. Create a service description by mapping fields from your form to fields in the PDF. Add a button that the user can click to populate and display a PDF. Note: For the Leap document integration, PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adding a PDF to Leap The following instructions describe how to add a PDF to Leap. Mapping form items to PDF fields The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, returns the filled PDF to the user. Mapping form items to PDF fields and storing the filled PDF NEW - The following instructions describe how to create a Service Configuration to map Leap fields to fields in an existing PDF and, when triggered, stores the filled PDF as an attachment to the record. Creating the PDF trigger The following instructions describe how to create a trigger that calls the PDF service, and triggers the service when the user clicks the button. Document integration usage details The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Parent topic: Creating and managing applications","title":"Leap document integration"},{"location":"di_usage_details.html","text":"Document integration usage details The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Selecting PDF types : PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adobe\u2122 Acrobat Pro is the primary tool that is used for creating PDFs where you can complete fields, and can be used to reliably create or modify existing PDFs to make them compatible with the Leap document integration feature. In some cases, Adobe Acrobat Reader extensions are removed by Reader after the document is populated. XFA PDFs have partial support when they have \u201ccompatibility mode\u201d enabled. Encrypted PDFs cannot be populated. Some PDF documents are intended only for printing and have no data entry fields. These PDFs cannot be populated. A number of freely available PDF authoring tools on the web do not create compatible PDFs. Some PDF documents that are created or modified with these tools might appear to have direct text entry support but do not allow completion of fields. If a PDF has limitations that make it unusable for populating with data from Leap, you can still attach the PDF to the form and it is returned unmodified. This is useful if you want to return a static PDF containing detailed instructions. Populating fields in a signed PDF document results in a validation warning message that is displayed by the PDF Reader. The warning message tells users unsigned changes were added after the document was signed. When you work with languages that contain extended character sets, be sure to match the language of the Leap form with the Language/Font of the PDF item. Any character or glyph that is missing from a font is omitted from the value that is passed. The built-in PDF viewer on iOS/Safari does not properly render values of filled PDF's. This is an iOS/Safari limitation. Mapping information : Values can be mapped to PDF Text Fields that are marked as readonly. You can populate a PDF from values that are collected in the Leap form, while the PDF remains unmodifiable through direct entry. The design time exercise of creating a map to indicate how data moves from application to the PDF are made much easier when items on both sides are properly named. When you use the Leap mapping dialog, if items in the PDF do not have recognizable names, Adobe Acrobat Pro can be used to modify the PDF. Take care to understand the format and constraints of the item you are mapping to and from. In some cases, a poorly matched map results in a blank item in the PDF because no value is mapped. For example, mapping a Number into a PDF Date Text Field , or mapping multiple selections from a Select Many choice item into a PDF Radio Group . In other cases, a value appears in the PDF but might result in constraint violations within the PDF. For example, mapping an unconstrained Single-Line Entry into a PDF Field . Multi-lined values cannot be mapped to single lined text fields in a PDF. The Export Values for PDF choice type items can be determined by inspecting the PDF with an editing tool. The Export Values are also displayed as part of the Description property in the extra information hover text within the Leap mapping dialog. To see the Export Values , hover over the information icon next to any PDF item in the list to be mapped. For a successful map, the Saved Value for the Leap item should be adjusted to match the Export Value . To map choice items, the Saved Value for the selected choice must match the Export Value for the available choice in the PDF item. The Export Value is used as an indicator of whether a particular choice in the item is marked as selected, or turned \u201con\u201d. This note is applicable to Leap choice items such as Select One , Select Many , Drop Down , Survey , and Choice Slider . When you map a Check Box to a PDF Check Box , the Export Value is automatically determined so no special consideration needs to be made around matching the Export Value. Select Many A Select Many can be mapped into a PDF Radio Group . However, configure the Select Many with a constraint that allows only one choice selection so the constraints of the PDF Radio Group are not violated A Select Many should not be mapped to a cluster of PDF Check Boxes if the PDF Check Boxes do not have unique Export Values . In this case, the Leap form might need to be altered to replace the Select Many item with a cluster of individual Checkboxes . A Select Many maps well to a PDF List Box Multi-Select but can also be mapped to a cluster of PDF Check Boxes by creating multiple maps. One map from the Select Many to each Check Box in the cluster. When mapping from a Select Many to a PDF Check Box , the Saved Value of a selected choice must match the Export Value of the PDF Check Box for the PDF check box to be turned on. Each question in a Survey must be mapped separately, and must use the same rules for mapping as a Select One or Select Many . Leap tables are repeating rows of data and cannot be mapped directly into a PDF. Some Leap items that cannot be mapped are Image , HTML Fragments , Text , Button , Line , Media , Web Link , Attachment , Page Navigation , Section , and Tabbed Folder . Some PDF items that cannot be mapped are Button , Digital Signature , Image , and Text . Parent topic: Leap document integration","title":"Document integration usage details"},{"location":"di_usage_details.html#documentintegrationusagedetails","text":"The following usage details describe the best practices and limitations for integrating your Leap application with a PDF. Selecting PDF types : PDFs must allow the input of information to be populated by data that is collected in a Leap application. Adobe\u2122 Acrobat Pro is the primary tool that is used for creating PDFs where you can complete fields, and can be used to reliably create or modify existing PDFs to make them compatible with the Leap document integration feature. In some cases, Adobe Acrobat Reader extensions are removed by Reader after the document is populated. XFA PDFs have partial support when they have \u201ccompatibility mode\u201d enabled. Encrypted PDFs cannot be populated. Some PDF documents are intended only for printing and have no data entry fields. These PDFs cannot be populated. A number of freely available PDF authoring tools on the web do not create compatible PDFs. Some PDF documents that are created or modified with these tools might appear to have direct text entry support but do not allow completion of fields. If a PDF has limitations that make it unusable for populating with data from Leap, you can still attach the PDF to the form and it is returned unmodified. This is useful if you want to return a static PDF containing detailed instructions. Populating fields in a signed PDF document results in a validation warning message that is displayed by the PDF Reader. The warning message tells users unsigned changes were added after the document was signed. When you work with languages that contain extended character sets, be sure to match the language of the Leap form with the Language/Font of the PDF item. Any character or glyph that is missing from a font is omitted from the value that is passed. The built-in PDF viewer on iOS/Safari does not properly render values of filled PDF's. This is an iOS/Safari limitation. Mapping information : Values can be mapped to PDF Text Fields that are marked as readonly. You can populate a PDF from values that are collected in the Leap form, while the PDF remains unmodifiable through direct entry. The design time exercise of creating a map to indicate how data moves from application to the PDF are made much easier when items on both sides are properly named. When you use the Leap mapping dialog, if items in the PDF do not have recognizable names, Adobe Acrobat Pro can be used to modify the PDF. Take care to understand the format and constraints of the item you are mapping to and from. In some cases, a poorly matched map results in a blank item in the PDF because no value is mapped. For example, mapping a Number into a PDF Date Text Field , or mapping multiple selections from a Select Many choice item into a PDF Radio Group . In other cases, a value appears in the PDF but might result in constraint violations within the PDF. For example, mapping an unconstrained Single-Line Entry into a PDF Field . Multi-lined values cannot be mapped to single lined text fields in a PDF. The Export Values for PDF choice type items can be determined by inspecting the PDF with an editing tool. The Export Values are also displayed as part of the Description property in the extra information hover text within the Leap mapping dialog. To see the Export Values , hover over the information icon next to any PDF item in the list to be mapped. For a successful map, the Saved Value for the Leap item should be adjusted to match the Export Value . To map choice items, the Saved Value for the selected choice must match the Export Value for the available choice in the PDF item. The Export Value is used as an indicator of whether a particular choice in the item is marked as selected, or turned \u201con\u201d. This note is applicable to Leap choice items such as Select One , Select Many , Drop Down , Survey , and Choice Slider . When you map a Check Box to a PDF Check Box , the Export Value is automatically determined so no special consideration needs to be made around matching the Export Value. Select Many A Select Many can be mapped into a PDF Radio Group . However, configure the Select Many with a constraint that allows only one choice selection so the constraints of the PDF Radio Group are not violated A Select Many should not be mapped to a cluster of PDF Check Boxes if the PDF Check Boxes do not have unique Export Values . In this case, the Leap form might need to be altered to replace the Select Many item with a cluster of individual Checkboxes . A Select Many maps well to a PDF List Box Multi-Select but can also be mapped to a cluster of PDF Check Boxes by creating multiple maps. One map from the Select Many to each Check Box in the cluster. When mapping from a Select Many to a PDF Check Box , the Saved Value of a selected choice must match the Export Value of the PDF Check Box for the PDF check box to be turned on. Each question in a Survey must be mapped separately, and must use the same rules for mapping as a Select One or Select Many . Leap tables are repeating rows of data and cannot be mapped directly into a PDF. Some Leap items that cannot be mapped are Image , HTML Fragments , Text , Button , Line , Media , Web Link , Attachment , Page Navigation , Section , and Tabbed Folder . Some PDF items that cannot be mapped are Button , Digital Signature , Image , and Text . Parent topic: Leap document integration","title":"Document integration usage details"},{"location":"ex_adding_ccs.html","text":"Adding customized CSS to your application You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Adding custom cascading style sheet (CSS) themes personalizes applications with the branding of your organization. Click the Style tab. Click Add file . The Add File or URL Link window opens. Select your custom style sheet: Add a file from your computer \u2013 Browse to the file location on your computer. Use a file on the internet \u2013 insert the URL of file location. Select whether you want to Import the file from the internet or Maintain a link to the file only . The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .css file extension remains. You can also enter a description of the file, which is useful if you have several similarly named style sheets. Click OK to save changes and close the window. To replace the built-in theme, select Replace built-in theme . You can use the built-in style sheets to complement your CSS, or you can replace them entirely with your CSS file with this option. After a style sheet is uploaded, you can select it from the drop-down menu. While you can upload many custom style sheets, you can select only one per application. Note: To see the style sheet that is applied to your application, either preview, or save and deploy the application. See Creating customized Cascading Style Sheets for information about creating your own custom CSS. Parent topic: Using custom style sheets","title":"Adding customized CSS to your application"},{"location":"ex_adding_ccs.html#addingcustomizedcascadingstylesheets","text":"You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Adding custom cascading style sheet (CSS) themes personalizes applications with the branding of your organization. Click the Style tab. Click Add file . The Add File or URL Link window opens. Select your custom style sheet: Add a file from your computer \u2013 Browse to the file location on your computer. Use a file on the internet \u2013 insert the URL of file location. Select whether you want to Import the file from the internet or Maintain a link to the file only . The name of the file is automatically entered into the Name field. You can change the name of the file, but ensure the .css file extension remains. You can also enter a description of the file, which is useful if you have several similarly named style sheets. Click OK to save changes and close the window. To replace the built-in theme, select Replace built-in theme . You can use the built-in style sheets to complement your CSS, or you can replace them entirely with your CSS file with this option. After a style sheet is uploaded, you can select it from the drop-down menu. While you can upload many custom style sheets, you can select only one per application. Note: To see the style sheet that is applied to your application, either preview, or save and deploy the application. See Creating customized Cascading Style Sheets for information about creating your own custom CSS. Parent topic: Using custom style sheets","title":"Adding customized CSS to your application"},{"location":"ex_css_toc.html","text":"Using custom style sheets HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. See Creating customized Cascading Style Sheets for information on how to create your own custom CSS. Adding customized CSS to your application You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Removing a custom style sheet The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Parent topic: Extending","title":"Using custom style sheets"},{"location":"ex_css_toc.html#usingcustomstylesheets","text":"HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. See Creating customized Cascading Style Sheets for information on how to create your own custom CSS. Adding customized CSS to your application You can add custom cascading style sheet (CSS) themes to your HCL Leap application. Removing a custom style sheet The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Parent topic: Extending","title":"Using custom style sheets"},{"location":"ex_removing_a_css.html","text":"Removing a custom style sheet The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Click the Settings tab, then click Files from the menu. A list of all uploaded files is shown. Locate the file that you want to delete and click Delete . A confirmation window is shown. Click Yes to delete the file. The file is removed from the list. Parent topic: Using custom style sheets","title":"Removing a custom style sheet"},{"location":"ex_removing_a_css.html#removingacustomstylesheet","text":"The following instructions describe how to remove a custom style sheet from the drop-down menu of available options. Click the Settings tab, then click Files from the menu. A list of all uploaded files is shown. Locate the file that you want to delete and click Delete . A confirmation window is shown. Click Yes to delete the file. The file is removed from the list. Parent topic: Using custom style sheets","title":"Removing a custom style sheet"},{"location":"ex_soa_service_transport.html","text":"Service Oriented Architecture \u2013 Service Transport HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Each Service Transport represents a single communication process. Leap provides a REST transport. Additional transports can be developed and integrated into Leap to allow you to access other Services than ones expressed as REST. Each transport is written in Java\u2122 as an OSGI bundle. Creating your own custom Service Transport By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. Parent topic: Adding services","title":"Service Oriented Architecture -\u2013 Service Transport"},{"location":"ex_soa_service_transport.html#soaservicetransport","text":"HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Each Service Transport represents a single communication process. Leap provides a REST transport. Additional transports can be developed and integrated into Leap to allow you to access other Services than ones expressed as REST. Each transport is written in Java\u2122 as an OSGI bundle. Creating your own custom Service Transport By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. Parent topic: Adding services","title":"Service Oriented Architecture \u2013 Service Transport"},{"location":"extending_toc.html","text":"Extending You can extend the functionality of HCL Leap through the use of customized cascading style sheets, Javascript APIs, and REST APIs, and Service Oriented Architecture modifications. Service Description: Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The Service Description provides a human-readable view on a service that uses a Service Transport. Service Descriptions are files stored on the server that make a service available toLeap when designing an application. For more information about creating a Service Description, see Service Oriented Architecture . JavaScript API: HCL Leap provides a JavaScript\u2122 API allowing designers to extend the customization provided by formulas, stages, rules, and services. The JavaScript is triggered on events tied to the user interface items in an application. The API has full access to the \u201cBusiness Object\u201d of the application. All JavaScript is covered by the security sandbox model. See the JavaScript API Reference document for full details on the available API methods, business object, security model, and event model. Data Access REST API: The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis. You might want to access the data directly for analysis and reporting. To allow this access, we provide a REST API that allows you access the data programmatically. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. For full details on this API, see Data access REST API . Using custom style sheets HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. Adding services The following topics describe how to add services to your Leap applications.","title":"Extending"},{"location":"extending_toc.html#extending","text":"You can extend the functionality of HCL Leap through the use of customized cascading style sheets, Javascript APIs, and REST APIs, and Service Oriented Architecture modifications. Service Description: Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The Service Description provides a human-readable view on a service that uses a Service Transport. Service Descriptions are files stored on the server that make a service available toLeap when designing an application. For more information about creating a Service Description, see Service Oriented Architecture . JavaScript API: HCL Leap provides a JavaScript\u2122 API allowing designers to extend the customization provided by formulas, stages, rules, and services. The JavaScript is triggered on events tied to the user interface items in an application. The API has full access to the \u201cBusiness Object\u201d of the application. All JavaScript is covered by the security sandbox model. See the JavaScript API Reference document for full details on the available API methods, business object, security model, and event model. Data Access REST API: The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis. You might want to access the data directly for analysis and reporting. To allow this access, we provide a REST API that allows you access the data programmatically. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. For full details on this API, see Data access REST API . Using custom style sheets HCL Leap allows the use of custom CSS themes that can be uploaded into an application to style the user interface to meet customer needs. Adding services The following topics describe how to add services to your Leap applications.","title":"Extending"},{"location":"get_overview.html","text":"What is HCL Leap, and how is it used? This document provides an overview of the three main activities that are involved in using Leap. There are three main activities that are involved in using Leap: Building forms Publishing applications Reviewing submissions Forms and Applications Throughout the Leap documentation, the words form and application are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather the submitted input and automatically store the submissions in a database. Building forms When you start Leap, you are shown a screen with two tabs on the Forms toolbar: Use and Manage. The Use tab shows a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. When Leap opens, you are shown the Manage tab, which displays any applications you created, or for which you have edit permissions. To create an application, click New Application , enter a descriptive application name, and select Create . A blank form is displayed. Drag items from the Palette and drop them onto the form. As you add items, you can change the default name of each item directly on the form. Click the name of the widget on the canvas to edit the name. A built-in grid automatically aligns items on the form, and expands vertically when you add items to the form. The default layout is two columns and two rows. However, you have flexibility when you build your form. You can stretch one form item to span across all columns, and you can add and delete columns and rows as needed. Click any border of a column or row to access a menu with options for expanding or contracting your form. When you click the Rules icon, you can create rules for form items or for other objects. You can set a rule to show or hide a form item, page, or other object that is based on user input. Some form items must be edited by changing their properties. For example, you can add the survey questions on the form, but the question titles can be edited only in the properties panel. When an item is selected the properties panel appears on the side of the screen. There are many tabs within the properties panel where you can set various functions. For example: Properties tab : Edit properties such as whether the title of a form item appears on the form. The properties that are displayed vary based on the form item. Event tab : Define an event that happens based on user input, such as when the user selects a particular option. Formula tab : Create mathematical expressions to calculate field values and validate form data. Adding workflow elements to a form There are many cases where adding separate steps and restricting user access to part of a form makes the form more useful. For example, you can create a vacation request form that requires the approval of a supervisor, or an award nomination form that requires the approval of both a supervisor and a nomination committee. In the survey form example, the results from the survey are useful feedback, but by adding workflow elements, the curriculum supervisor can review comments before sending them to the instructor. Adding workflow elements is done with Roles and Stages. Adding or editing Roles is done in the Access or Workflow tab. Adding stages is done in the Workflow tab. Roles \u2013 You can create various roles with different levels of access to different information within an application. For example, you can specify that only an administrator can change an application, managers can review submitted data, and users can complete and submit the form. After roles are defined, you can assign users to the roles. Each role can have as many or as few people assigned to it as needed. You can even assign groups to a role. For example, all supervisors are assigned to one role, and all managers are assigned to another role. In the Access tab, each role can either be Open or Closed. If you have a web service, which pre-populates the role information, select Open . For example, you want to use a web service to scan the company email directory and automatically populate the name of the manager. If you do not plan to use web services in your application, leave the role Closed . The user must enter the name of the manager manually when they complete the form. Stages \u2013 Stages are the steps that a form goes through in its lifecycle. For example, in one stage the user submits data. In the next stage, the manager reviews and approves or rejects the submitted data. An application can have as many stages as needed. Stages are also useful as they allow a submitter to save a draft version of the form. For example, on a census form that has multiple pages, the submitter might not have time to complete the whole form in one session. With the Draft button, the user can complete part of the census, save a draft, then return to complete the census later. A stage can hide or display information that is necessary for one user, but not required for another. For example, in our survey form, the curriculum supervisor must see the name of who submitted the feedback. However, to allow for anonymous feedback, the user's name is hidden when the feedback is forwarded from the curriculum supervisor to the course instructor. By default, every form has a Start and Submitted stage. The Start stage is the first stage of every form. The Submitted stage can be modified and other stages added. To create a workflow, add stages in the Workflow tab. You may hover over the stage and click the plus icon, or click on \u201c+ Add Stage\u201d in the properties pane. When a new stage is added, you can modify its properties to build the form workflow as needed. For example, you can add a stage to a survey that thanks the user for submitting feedback and sends the curriculum supervisor an email that indicates that new feedback is available. After the feedback is reviewed by the supervisor, another stage can be added to block the user's name and company information and then forward the feedback to the course instructor. At any time during the form building process, you can save and preview your work in a web browser by clicking Preview . Ensure that your browser does not block pop-up windows because the preview form opens in a new window. The Submit and Cancel buttons are automatically added to your form, and are displayed when you preview the form. Deploying your application When you complete building your form and adding workflow elements, you must deploy your application to make it available to users. Deploying applications is done in the Manage tab. To deploy your application, click Deploy . A menu of deployment options is available. You can set your application to have a specific start and end date, and provide a custom message to instruct users when the application is unavailable. After an application is deployed, you can provide the URL link to your users. You can also get the URL to the application by clicking Launch and copying the address in the web browser. If you must change a form after it is deployed, you can do so at any time. However, you must deploy the form again after you complete your changes. Reviewing submitted data responses When users access the application and submit results, the form author, administrator, or other roles with appropriate access can view the submitted results. In the Manage tab, each application has a View Data link. When the View Data link is clicked, you can choose to analyze submitted responses by viewing summary charts or response records. The Summary screen displays the survey results in customizable charts. The View Data screen displays all submitted responses in a table. You can sort the submitted results by clicking any of the column titles. Selecting a response displays the submitted data in a new window. Forms that have extra stages have extra buttons in the View Data screen. For example, the curriculum supervisor has a button to accept the feedback, which forwards the feedback to the course instructor. In another example, such as a vacation request form, the manager can either accept or reject the vacation request. If the manager accepts the request, the request is forwarded to Human Resources to log against the available vacation days. In all cases, an email with the decision of the supervisor is sent to the employee. You also can export all data to a spreadsheet program, such as Open Office, or Microsoft\u2122 Excel. Conclusion This overview described the three high-level steps for creating Leap applications: building the form and adding workflow elements, deploying your completed application, and reviewing the submission results. For more Leap information, see: Building a Survey application \u2013 Use Leap to design and publish a basic survey application. Creating and managing applications for more specific instructions on various parts of creating a Leap application. HCL Software U: Application development \u2013 a 7-minute video that walks you through the activities that are described in this overview. The video describes how to open a new application, add items to a form, publish an application, and review submitted results. Leap Starter Packs \u2013 a series of prebuilt forms you can import into Leap and modify for your own use.","title":"What is HCL Leap, and how is it used?"},{"location":"get_overview.html#what-is-hcl-leap-and-how-is-it-used","text":"This document provides an overview of the three main activities that are involved in using Leap. There are three main activities that are involved in using Leap: Building forms Publishing applications Reviewing submissions","title":"What is HCL Leap, and how is it used?"},{"location":"get_overview.html#forms-and-applications","text":"Throughout the Leap documentation, the words form and application are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather the submitted input and automatically store the submissions in a database.","title":"Forms and Applications"},{"location":"get_overview.html#building-forms","text":"When you start Leap, you are shown a screen with two tabs on the Forms toolbar: Use and Manage. The Use tab shows a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. When Leap opens, you are shown the Manage tab, which displays any applications you created, or for which you have edit permissions. To create an application, click New Application , enter a descriptive application name, and select Create . A blank form is displayed. Drag items from the Palette and drop them onto the form. As you add items, you can change the default name of each item directly on the form. Click the name of the widget on the canvas to edit the name. A built-in grid automatically aligns items on the form, and expands vertically when you add items to the form. The default layout is two columns and two rows. However, you have flexibility when you build your form. You can stretch one form item to span across all columns, and you can add and delete columns and rows as needed. Click any border of a column or row to access a menu with options for expanding or contracting your form. When you click the Rules icon, you can create rules for form items or for other objects. You can set a rule to show or hide a form item, page, or other object that is based on user input. Some form items must be edited by changing their properties. For example, you can add the survey questions on the form, but the question titles can be edited only in the properties panel. When an item is selected the properties panel appears on the side of the screen. There are many tabs within the properties panel where you can set various functions. For example: Properties tab : Edit properties such as whether the title of a form item appears on the form. The properties that are displayed vary based on the form item. Event tab : Define an event that happens based on user input, such as when the user selects a particular option. Formula tab : Create mathematical expressions to calculate field values and validate form data.","title":"Building forms"},{"location":"get_overview.html#adding-workflow-elements-to-a-form","text":"There are many cases where adding separate steps and restricting user access to part of a form makes the form more useful. For example, you can create a vacation request form that requires the approval of a supervisor, or an award nomination form that requires the approval of both a supervisor and a nomination committee. In the survey form example, the results from the survey are useful feedback, but by adding workflow elements, the curriculum supervisor can review comments before sending them to the instructor. Adding workflow elements is done with Roles and Stages. Adding or editing Roles is done in the Access or Workflow tab. Adding stages is done in the Workflow tab. Roles \u2013 You can create various roles with different levels of access to different information within an application. For example, you can specify that only an administrator can change an application, managers can review submitted data, and users can complete and submit the form. After roles are defined, you can assign users to the roles. Each role can have as many or as few people assigned to it as needed. You can even assign groups to a role. For example, all supervisors are assigned to one role, and all managers are assigned to another role. In the Access tab, each role can either be Open or Closed. If you have a web service, which pre-populates the role information, select Open . For example, you want to use a web service to scan the company email directory and automatically populate the name of the manager. If you do not plan to use web services in your application, leave the role Closed . The user must enter the name of the manager manually when they complete the form. Stages \u2013 Stages are the steps that a form goes through in its lifecycle. For example, in one stage the user submits data. In the next stage, the manager reviews and approves or rejects the submitted data. An application can have as many stages as needed. Stages are also useful as they allow a submitter to save a draft version of the form. For example, on a census form that has multiple pages, the submitter might not have time to complete the whole form in one session. With the Draft button, the user can complete part of the census, save a draft, then return to complete the census later. A stage can hide or display information that is necessary for one user, but not required for another. For example, in our survey form, the curriculum supervisor must see the name of who submitted the feedback. However, to allow for anonymous feedback, the user's name is hidden when the feedback is forwarded from the curriculum supervisor to the course instructor. By default, every form has a Start and Submitted stage. The Start stage is the first stage of every form. The Submitted stage can be modified and other stages added. To create a workflow, add stages in the Workflow tab. You may hover over the stage and click the plus icon, or click on \u201c+ Add Stage\u201d in the properties pane. When a new stage is added, you can modify its properties to build the form workflow as needed. For example, you can add a stage to a survey that thanks the user for submitting feedback and sends the curriculum supervisor an email that indicates that new feedback is available. After the feedback is reviewed by the supervisor, another stage can be added to block the user's name and company information and then forward the feedback to the course instructor. At any time during the form building process, you can save and preview your work in a web browser by clicking Preview . Ensure that your browser does not block pop-up windows because the preview form opens in a new window. The Submit and Cancel buttons are automatically added to your form, and are displayed when you preview the form.","title":"Adding workflow elements to a form"},{"location":"get_overview.html#deploying-your-application","text":"When you complete building your form and adding workflow elements, you must deploy your application to make it available to users. Deploying applications is done in the Manage tab. To deploy your application, click Deploy . A menu of deployment options is available. You can set your application to have a specific start and end date, and provide a custom message to instruct users when the application is unavailable. After an application is deployed, you can provide the URL link to your users. You can also get the URL to the application by clicking Launch and copying the address in the web browser. If you must change a form after it is deployed, you can do so at any time. However, you must deploy the form again after you complete your changes.","title":"Deploying your application"},{"location":"get_overview.html#reviewing-submitted-data-responses","text":"When users access the application and submit results, the form author, administrator, or other roles with appropriate access can view the submitted results. In the Manage tab, each application has a View Data link. When the View Data link is clicked, you can choose to analyze submitted responses by viewing summary charts or response records. The Summary screen displays the survey results in customizable charts. The View Data screen displays all submitted responses in a table. You can sort the submitted results by clicking any of the column titles. Selecting a response displays the submitted data in a new window. Forms that have extra stages have extra buttons in the View Data screen. For example, the curriculum supervisor has a button to accept the feedback, which forwards the feedback to the course instructor. In another example, such as a vacation request form, the manager can either accept or reject the vacation request. If the manager accepts the request, the request is forwarded to Human Resources to log against the available vacation days. In all cases, an email with the decision of the supervisor is sent to the employee. You also can export all data to a spreadsheet program, such as Open Office, or Microsoft\u2122 Excel.","title":"Reviewing submitted data responses"},{"location":"get_overview.html#conclusion","text":"This overview described the three high-level steps for creating Leap applications: building the form and adding workflow elements, deploying your completed application, and reviewing the submission results. For more Leap information, see: Building a Survey application \u2013 Use Leap to design and publish a basic survey application. Creating and managing applications for more specific instructions on various parts of creating a Leap application. HCL Software U: Application development \u2013 a 7-minute video that walks you through the activities that are described in this overview. The video describes how to open a new application, add items to a form, publish an application, and review submitted results. Leap Starter Packs \u2013 a series of prebuilt forms you can import into Leap and modify for your own use.","title":"Conclusion"},{"location":"gl_forms_experience_builder_globalization.html","text":"Globalization features The following information describes the languages formatting features supported by HCL Leap. Supported languages Leap supports the following languages: Arabic Catalan Chinese (Simplified) Chinese (Traditional) Croatian (Croatia) Czech (Czech Republic) Danish (Denmark) Dutch English Finnish (Finland) French German Greek Hebrew Hungarian (Hungary) Italian Japanese (Japan) Kazakh Korean (South Korea) Norwegian Bokm\u00e5l (Norway) Polish Portuguese (Brazil) Portuguese (Portugal) Romanian (Romania) Russian (Russian) Slovak Slovenian (Slovenia) Spanish Swedish (Sweden) Thai Turkish (Turkey) The default language for designing applications is based on your web browser locale, or WebSphere\u00ae Portal container. If you do not want to use your default language, you can change to a specific language, or select \u201cUser\u2019s Language\u201d so the application applies the user\u2019s web browser language settings when the application is opened. Formatting Form items, such as currency, date, and time, are based on the locale of the form. For example, if a currency item is set on a form with a locale of Germany, the currency is shown as Euros. It is important to note that no monetary conversion is done if the locale of the form changes. The format of the currency symbol on the form changes, but the amount entered is shown as entered. For example, if a user enters $100 into a currency field with a locale of United States, the currency is shown as $100 US on a form with a locale of Germany. You can edit the currency type, with the Currency field selected, in the Properties side panel. Locale settings can also affect dates. Countries can have specific requirements for how dates are written. For example, one country might want a date written month/day/year: 06/29/2012. While another country has a standard of day/month/date/year: Friday June 29, 2012. How the date is shown is determined by the locale of the form. You can manually change the date format, with the date field selected, in the Properties side panel. Setting a language The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. Parent topic: Creating and managing applications","title":"Globalization features"},{"location":"gl_forms_experience_builder_globalization.html#experiencebuilderglobalization","text":"The following information describes the languages formatting features supported by HCL Leap.","title":"Globalization features"},{"location":"gl_forms_experience_builder_globalization.html#supported-languages","text":"Leap supports the following languages: Arabic Catalan Chinese (Simplified) Chinese (Traditional) Croatian (Croatia) Czech (Czech Republic) Danish (Denmark) Dutch English Finnish (Finland) French German Greek Hebrew Hungarian (Hungary) Italian Japanese (Japan) Kazakh Korean (South Korea) Norwegian Bokm\u00e5l (Norway) Polish Portuguese (Brazil) Portuguese (Portugal) Romanian (Romania) Russian (Russian) Slovak Slovenian (Slovenia) Spanish Swedish (Sweden) Thai Turkish (Turkey) The default language for designing applications is based on your web browser locale, or WebSphere\u00ae Portal container. If you do not want to use your default language, you can change to a specific language, or select \u201cUser\u2019s Language\u201d so the application applies the user\u2019s web browser language settings when the application is opened.","title":"Supported languages"},{"location":"gl_forms_experience_builder_globalization.html#formatting","text":"Form items, such as currency, date, and time, are based on the locale of the form. For example, if a currency item is set on a form with a locale of Germany, the currency is shown as Euros. It is important to note that no monetary conversion is done if the locale of the form changes. The format of the currency symbol on the form changes, but the amount entered is shown as entered. For example, if a user enters $100 into a currency field with a locale of United States, the currency is shown as $100 US on a form with a locale of Germany. You can edit the currency type, with the Currency field selected, in the Properties side panel. Locale settings can also affect dates. Countries can have specific requirements for how dates are written. For example, one country might want a date written month/day/year: 06/29/2012. While another country has a standard of day/month/date/year: Friday June 29, 2012. How the date is shown is determined by the locale of the form. You can manually change the date format, with the date field selected, in the Properties side panel. Setting a language The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. Parent topic: Creating and managing applications","title":"Formatting"},{"location":"gl_setting_a_language.html","text":"Setting a language The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. To set a language for an application other than your default locale: Go to the Settings tab. Expand the Application Language menu and select either: a specific language from the list \u201cUser\u2019s Language\u201d Optional: Specify the language by expanding the Application Regional Options menu, and selecting a country where the language is used. If you want the language setting to apply to an application other than the one you are currently editing, enter the Application Name in the field. The field is automatically populated with the name of the current application. Click Save to apply the changes. Parent topic: Globalization features","title":"Setting a language"},{"location":"gl_setting_a_language.html#settingalanguage","text":"The default language for an application is based on the web browser locale. You can change the language of your HCL Leap application in the Settings tab. To set a language for an application other than your default locale: Go to the Settings tab. Expand the Application Language menu and select either: a specific language from the list \u201cUser\u2019s Language\u201d Optional: Specify the language by expanding the Application Regional Options menu, and selecting a country where the language is used. If you want the language setting to apply to an application other than the one you are currently editing, enter the Application Name in the field. The field is automatically populated with the name of the current application. Click Save to apply the changes. Parent topic: Globalization features","title":"Setting a language"},{"location":"guide_me.html","text":"Guide Me The learning materials designed in this section contain instructions to help you perform specific tasks. Some of the how-to guides might may include code samples, which will help you to complete the tasks from end-to-end.","title":"Guide Me"},{"location":"guide_me.html#guide-me","text":"The learning materials designed in this section contain instructions to help you perform specific tasks. Some of the how-to guides might may include code samples, which will help you to complete the tasks from end-to-end.","title":"Guide Me"},{"location":"helm_admin_customsecret.html","text":"Provide admin user a custom secret Instead of providing\u202fadminUser\u202fand\u202fadminPassword\u202ffor Leap directly in the custom values, a secret can be used to pass the credentials to the deployments. Create a secret that will be used to reference credentials, this secret should contain the required credential attributes (e.g. \"username\", \"password\"). kubectl create secret generic <secret-name> --from-literal=username=<your-username> --from- literal=password=<your-password> --namespace=<namespace> Reference the secret in the custom Helm values. When a secret is used, the\u202fadminUser\u202fand\u202fadminPassword\u202fvalues must be set to an empty string (\"\") or\u202fnull. Example configuration: security: leap: adminUser: \"\" adminPassword: \"\" customAdminSecret: \"my-custom-admin-secret\" Custom secrets Apart from the admin credentials there can be use cases where credentials, secrets or additional key files are required. To pass them to the deployment, the\u202fconfiguration.leap.customSecrets\u202fvalue can be used to reference additional\u202f Kubernetes Secrets . Secrets are both injected as environment variables and mounted as files in\u202f/mnt/customSecrets\u202fin a subfolder named like the referenced key. From there they can be referenced in the server configuration or the\u202fconfigOverrideFiles. All keys and values under\u202fcustomSecrets\u202fmust consist of lower-case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc').\u202fhelm install\u202fwill throw one of the following errors if this criterion is not met: \"configuration.leap.customSecrets: Additional property is not allowed\" \"configuration.leap.customSecrets.: Does not match pattern '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$'\" Using custom secrets for credentials The following is an example of creating a secret\u202f my-custom-db-credentials , which contains two entries\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD: kubectl create secret generic my-custom-db-credentials --from-literal=DB_USERNAME=<your-username> --from- literal=DB_PASSWORD=<your-password> --namespace=<namespace> The secret is referenced as\u202f db-credentials \u202fin the custom Helm values: configuration: leap: customSecrets: db-credentials: my-custom-db-credentials This will result in: The environment variables\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing injected into the Pod. The files\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing mounted in\u202f /mnt/customSecrets/db-credentials \u202finside the Pod each containing the values specified in the secret. The environment variables can then be referenced in any of the server configurations. For example, to extend the DB2 configuration: configuration: leap: configOverrideFiles: db2Override: | <server description=\"leapServer\"> <authData id=\"db2AuthAlias\" user=\"${DB_USERNAME}\" password=\"${DB_PASSWORD}\" /> <library id=\"jdbcDB2\" > ... </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\" statementCacheSize=\"30\" containerAuthDataRef=\"db2AuthAlias\"> ... </dataSource> </server> Using custom secrets as key file Below is an example of creating a secret\u202f my-custom-ltpa-key \u202f from an LTPA key file including the entry\u202fLTPA_KEY: kubectl create secret generic my-custom-ltpa-key --from-file=./ltpa.keys --namespace=<namespace> The secret is referenced as\u202f ltpa-key \u202fin the custom Helm values: configuration: leap: customSecrets: ltpa-key: my-custom-ltpa-key This will result in: The environment variables\u202f ltpa.keys \u202fbeing injected into the Pod. The file\u202f ltpa.keys \u202fbeing mounted in\u202f /mnt/customSecrets/ltpa-key \u202finside the Pod containing the same content as the input file. The file can then be referenced in any of the server configurations. For example, to use the LTPA key for the server: configuration: leap: configOverrideFiles: ltpaOverride: | <server description=\"leapServer\"> <ltpa keysFileName=\"/mnt/customSecrets/ltpa-key/ltpa.keys\" keysPassword=\"myLtpaKeyPassword\" /> </server> Parent topic: Preparation","title":"Provide admin user a custom secret"},{"location":"helm_admin_customsecret.html#helm_admin_customsecret","text":"Instead of providing\u202fadminUser\u202fand\u202fadminPassword\u202ffor Leap directly in the custom values, a secret can be used to pass the credentials to the deployments. Create a secret that will be used to reference credentials, this secret should contain the required credential attributes (e.g. \"username\", \"password\"). kubectl create secret generic <secret-name> --from-literal=username=<your-username> --from- literal=password=<your-password> --namespace=<namespace> Reference the secret in the custom Helm values. When a secret is used, the\u202fadminUser\u202fand\u202fadminPassword\u202fvalues must be set to an empty string (\"\") or\u202fnull. Example configuration: security: leap: adminUser: \"\" adminPassword: \"\" customAdminSecret: \"my-custom-admin-secret\"","title":"Provide admin user a custom secret"},{"location":"helm_admin_customsecret.html#section_gsj_vk4_hzb","text":"Apart from the admin credentials there can be use cases where credentials, secrets or additional key files are required. To pass them to the deployment, the\u202fconfiguration.leap.customSecrets\u202fvalue can be used to reference additional\u202f Kubernetes Secrets . Secrets are both injected as environment variables and mounted as files in\u202f/mnt/customSecrets\u202fin a subfolder named like the referenced key. From there they can be referenced in the server configuration or the\u202fconfigOverrideFiles. All keys and values under\u202fcustomSecrets\u202fmust consist of lower-case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc').\u202fhelm install\u202fwill throw one of the following errors if this criterion is not met: \"configuration.leap.customSecrets: Additional property is not allowed\" \"configuration.leap.customSecrets.: Does not match pattern '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$'\"","title":"Custom secrets"},{"location":"helm_admin_customsecret.html#section_nc2_1l4_hzb","text":"The following is an example of creating a secret\u202f my-custom-db-credentials , which contains two entries\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD: kubectl create secret generic my-custom-db-credentials --from-literal=DB_USERNAME=<your-username> --from- literal=DB_PASSWORD=<your-password> --namespace=<namespace> The secret is referenced as\u202f db-credentials \u202fin the custom Helm values: configuration: leap: customSecrets: db-credentials: my-custom-db-credentials This will result in: The environment variables\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing injected into the Pod. The files\u202fDB_USERNAME\u202fand\u202fDB_PASSWORD\u202fbeing mounted in\u202f /mnt/customSecrets/db-credentials \u202finside the Pod each containing the values specified in the secret. The environment variables can then be referenced in any of the server configurations. For example, to extend the DB2 configuration: configuration: leap: configOverrideFiles: db2Override: | <server description=\"leapServer\"> <authData id=\"db2AuthAlias\" user=\"${DB_USERNAME}\" password=\"${DB_PASSWORD}\" /> <library id=\"jdbcDB2\" > ... </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\" statementCacheSize=\"30\" containerAuthDataRef=\"db2AuthAlias\"> ... </dataSource> </server>","title":"Using custom secrets for credentials"},{"location":"helm_admin_customsecret.html#section_wc2_kl4_hzb","text":"Below is an example of creating a secret\u202f my-custom-ltpa-key \u202f from an LTPA key file including the entry\u202fLTPA_KEY: kubectl create secret generic my-custom-ltpa-key --from-file=./ltpa.keys --namespace=<namespace> The secret is referenced as\u202f ltpa-key \u202fin the custom Helm values: configuration: leap: customSecrets: ltpa-key: my-custom-ltpa-key This will result in: The environment variables\u202f ltpa.keys \u202fbeing injected into the Pod. The file\u202f ltpa.keys \u202fbeing mounted in\u202f /mnt/customSecrets/ltpa-key \u202finside the Pod containing the same content as the input file. The file can then be referenced in any of the server configurations. For example, to use the LTPA key for the server: configuration: leap: configOverrideFiles: ltpaOverride: | <server description=\"leapServer\"> <ltpa keysFileName=\"/mnt/customSecrets/ltpa-key/ltpa.keys\" keysPassword=\"myLtpaKeyPassword\" /> </server> Parent topic: Preparation","title":"Using custom secrets as key file"},{"location":"helm_certificates.html","text":"Certificates The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore. Parent topic: Preparation","title":"Certificates"},{"location":"helm_certificates.html#helm_certificates","text":"The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore. Parent topic: Preparation","title":"Certificates"},{"location":"helm_changing_log_level.html","text":"Changing the log level Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest Parent topic: Preparation","title":"Changing the log level"},{"location":"helm_changing_log_level.html#helm_changing_log_level","text":"Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest Parent topic: Preparation","title":"Changing the log level"},{"location":"helm_extending_image.html","text":"Enabling additional Open Liberty features Learn how to install additional Open Liberty server features by extending the Leap image. The Leap image is shipped with the following server features: adminCenter-1.0 appSecurity-3.0 federatedRegistry-1.0 javaMail-1.6 jdbc-4.2 jndi-1.0 jpa-2.2 jwtSso-1.0 ldapRegistry-3.0 localConnector-1.0 mpJwt-2.1 openidConnectClient-1.0 passwordUtilities-1.0 restConnector-2.0 servlet-4.0 transportSecurity-1.0 Open Liberty has many features that can be enabled. Some features have dependencies on other features, which will be installed automatically. For more information, see the Open Liberty documentation . If you require a different feature to be installed, you may extend our image. This can be accomplished by creating a Dockerfile. See the following example: FROM <image-repo> RUN /opt/openliberty/wlp/bin/featureUtility installFeature <feature-to-install> After creating a Dockerfile, build the new docker image: With docker engine running, open command prompt. Execute the following command: cd <to-path-of-docker-file> Execute the following command: docker build . A new image with the specified feature is installed. Use this extended image when running helm. Note: This is the only supported mechanism for enabling Open Liberty features. There are many features that can be added that have not been tested by HCL and you do so at your own risk. HCL will provide best-effort support for added features as it pertains to Leap.","title":"Enabling additional Open Liberty features"},{"location":"helm_extending_image.html#helm_extending_image","text":"Learn how to install additional Open Liberty server features by extending the Leap image. The Leap image is shipped with the following server features: adminCenter-1.0 appSecurity-3.0 federatedRegistry-1.0 javaMail-1.6 jdbc-4.2 jndi-1.0 jpa-2.2 jwtSso-1.0 ldapRegistry-3.0 localConnector-1.0 mpJwt-2.1 openidConnectClient-1.0 passwordUtilities-1.0 restConnector-2.0 servlet-4.0 transportSecurity-1.0 Open Liberty has many features that can be enabled. Some features have dependencies on other features, which will be installed automatically. For more information, see the Open Liberty documentation . If you require a different feature to be installed, you may extend our image. This can be accomplished by creating a Dockerfile. See the following example: FROM <image-repo> RUN /opt/openliberty/wlp/bin/featureUtility installFeature <feature-to-install> After creating a Dockerfile, build the new docker image: With docker engine running, open command prompt. Execute the following command: cd <to-path-of-docker-file> Execute the following command: docker build . A new image with the specified feature is installed. Use this extended image when running helm. Note: This is the only supported mechanism for enabling Open Liberty features. There are many features that can be added that have not been tested by HCL and you do so at your own risk. HCL will provide best-effort support for added features as it pertains to Leap.","title":"Enabling additional Open Liberty features"},{"location":"helm_install_commands.html","text":"Install commads to deploy This topic details install commands that are used to deploy HCL Leap Helm Charts. Install commands Important: Modification to any files (chart.yaml, templates, etc) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported. To run the installation of your prepared configurations using Helm, use the following command: # Helm install command helm install -n my-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl-leap- deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The my-namespace is the namespace where your HCL Leap deployment is installed to. The -f path/to/your/custom-values.yaml must point to the custom-values.yaml you have created, which contains all deployment configuration. your-release-name is the Helm release name and prefixes all resources created in that installation, such as Pods, Services, and others. path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you have extracted as described earlier in the planning and preparation steps. After a successful deployment, Helm responds with the following message: NAME: leap LAST DEPLOYED: Thu Jun 17 14:27:58 2023 NAMESPACE: my-namespace STATUS: deployed REVISION: 1 TEST SUITE: None Default URLs post installation During the configuration process, you might need the following URLs to access different user interfaces. Use the following default URLs to access HCL Leap and OpenLiberty Console: HCL Leap http://yourserver/apps HCL Leap Rest API http://yourserver/apps-basic There are a few endpoints that can be helpful for identifying and debugging datasource connections: View DataSource Configuration https://yourserver/ibm/api/config/dataSource/<datasourceId> The result is an html page that shows a json output of the configuration that is known by the server. Validate DataSource Connection https://yourserver/ibm/api/validation/dataSource/<dataSourceId> Endpoint attempts to make a database connection, the result is a json output that shows the result. If the connection fails, the output may contain more detail to assist in the troubleshooting. Parent topic: Kubernetes Helm deployment","title":"Install commads to deploy"},{"location":"helm_install_commands.html#helm_install_commands","text":"This topic details install commands that are used to deploy HCL Leap Helm Charts.","title":"Install commads to deploy"},{"location":"helm_install_commands.html#section_ogm_n44_hzb","text":"Important: Modification to any files (chart.yaml, templates, etc) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported. To run the installation of your prepared configurations using Helm, use the following command: # Helm install command helm install -n my-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl-leap- deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The my-namespace is the namespace where your HCL Leap deployment is installed to. The -f path/to/your/custom-values.yaml must point to the custom-values.yaml you have created, which contains all deployment configuration. your-release-name is the Helm release name and prefixes all resources created in that installation, such as Pods, Services, and others. path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you have extracted as described earlier in the planning and preparation steps. After a successful deployment, Helm responds with the following message: NAME: leap LAST DEPLOYED: Thu Jun 17 14:27:58 2023 NAMESPACE: my-namespace STATUS: deployed REVISION: 1 TEST SUITE: None","title":"Install commands"},{"location":"helm_install_commands.html#section_hyj_w44_hzb","text":"During the configuration process, you might need the following URLs to access different user interfaces. Use the following default URLs to access HCL Leap and OpenLiberty Console: HCL Leap http://yourserver/apps HCL Leap Rest API http://yourserver/apps-basic There are a few endpoints that can be helpful for identifying and debugging datasource connections: View DataSource Configuration https://yourserver/ibm/api/config/dataSource/<datasourceId> The result is an html page that shows a json output of the configuration that is known by the server. Validate DataSource Connection https://yourserver/ibm/api/validation/dataSource/<dataSourceId> Endpoint attempts to make a database connection, the result is a json output that shows the result. If the connection fails, the output may contain more detail to assist in the troubleshooting. Parent topic: Kubernetes Helm deployment","title":"Default URLs post installation"},{"location":"helm_jvm_options.html","text":"JVM options JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\" Parent topic: Preparation","title":"JVM options"},{"location":"helm_jvm_options.html#helm_jvn_options","text":"JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\" Parent topic: Preparation","title":"JVM options"},{"location":"helm_leap_properties.html","text":"Leap properties The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo = <div>Welcome to <b>HCL Leap 9.3.2</b> in Kubernetes!</div> ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties . Parent topic: Preparation","title":"Leap properties"},{"location":"helm_leap_properties.html#helm_leap_properties","text":"The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo = <div>Welcome to <b>HCL Leap 9.3.2</b> in Kubernetes!</div> ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties . Parent topic: Preparation","title":"Leap properties"},{"location":"helm_load_images.html","text":"Load images This section presents how to load the Leap Container or later images into your container image repository, tag them to fit your repository structure, and push them to your repository, so that all Nodes in your Kubernetes or OpenShift cluster can deploy HCL Leap Pods. To use HCL Leap in your Kubernetes or OpenShift cluster, you have to make the container images available to all nodes of your cluster. Usually this is done by providing them through a container image repository. Depending on your cloud provider, there may be different types of default container image repositories already configured. Refer to the documentation of your cloud provider for setup and use of such platform container image repository. It is assumed that you have a repository configured and running, and is reachable from all your Kubernetes or OpenShift cluster nodes. In the following guidance, the docker CLI is used as a command reference. Tools like Podman may also be used, but are not described in this documentation. The procedure for the use of such tools are the same. Retrieving container images The HCL Leap Container package is provided in a compressed .zip file, that can easily be unzipped using a utility of your choice. Download the HCL Leap package from FlexNet, unpack it locally and load the image into your container registry. To load the image file, you may use the following command: # Command to load container image into local repository # docker load < image-file-name.tar.gz docker load < hcl-leap-image_vXXX_XXX_XXXXXXXX-XXXX.tar.gz The custom-values.yaml must then reference the image tag: images: # Image tag for each application tags: leap: v1.0.0_20231010-0638_Leap_v9.3.3.40_pjs_release_leap-9.3.3 Parent topic: Preparation","title":"Load images"},{"location":"helm_load_images.html#helm_load_images","text":"This section presents how to load the Leap Container or later images into your container image repository, tag them to fit your repository structure, and push them to your repository, so that all Nodes in your Kubernetes or OpenShift cluster can deploy HCL Leap Pods. To use HCL Leap in your Kubernetes or OpenShift cluster, you have to make the container images available to all nodes of your cluster. Usually this is done by providing them through a container image repository. Depending on your cloud provider, there may be different types of default container image repositories already configured. Refer to the documentation of your cloud provider for setup and use of such platform container image repository. It is assumed that you have a repository configured and running, and is reachable from all your Kubernetes or OpenShift cluster nodes. In the following guidance, the docker CLI is used as a command reference. Tools like Podman may also be used, but are not described in this documentation. The procedure for the use of such tools are the same.","title":"Load images"},{"location":"helm_load_images.html#section_gnq_z34_hzb","text":"The HCL Leap Container package is provided in a compressed .zip file, that can easily be unzipped using a utility of your choice. Download the HCL Leap package from FlexNet, unpack it locally and load the image into your container registry. To load the image file, you may use the following command: # Command to load container image into local repository # docker load < image-file-name.tar.gz docker load < hcl-leap-image_vXXX_XXX_XXXXXXXX-XXXX.tar.gz The custom-values.yaml must then reference the image tag: images: # Image tag for each application tags: leap: v1.0.0_20231010-0638_Leap_v9.3.3.40_pjs_release_leap-9.3.3 Parent topic: Preparation","title":"Retrieving container images"},{"location":"helm_oidc_config.html","text":"Configuring Leap with OIDC This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider. Configuring Leap with OIDC Leap can be configured to leverage OpenID Connect (OIDC) as the primary authentication mechanism. This means that Leap will be turned into a Relying Party (RP) to the specified identify provider (IDP). When OIDC is used, the user and group lookup feature of Leap is not available and must be disabled as part of the configuration. The following tasks must be completed to establish this configuration: Configure the OIDC identity provider. Create a secret in Kubernetes container from the IDP server certificate. Add an OIDC definition as a server customization. Add configuration properties related to the OIDC configuration. Restart the pod. Configure OIDC identity Provider Many different identity providers offer OIDC capability. Refer to your chosen identity provider's documentation for more details on configuration. Create a secret in Kubernetes container from the IDP certificate As part of the configuration process for your identify provider, you will have created or obtained a digital certificate for configuring HTTPS. This certificate will also need to be deployed to Leap so that the two servers can communicate with each other. Note: The SSL certificate (.crt) and public key (.key) should be in PKCS12 format. After copying the .key and .crt to the kubernetes image, create a secret using the following command: kubectl -n myns create secret tls oidccert --key=\"/tmp/oidc.key\" --cert=\"/tmp/oidc.crt\" Next, this secret can be referenced in the yaml file: configuration: leap: customCertificateSecrets: keycloakCert: \"keycloakcert\" For more information, see to helm_admin_customsecret.md . Add OIDC definition as a server customization The properties that you need to specify may differ based on your identify provider. For additional information, see the Open Liberty documentation on OpenID Connect . Before moving on from this step: Verify that the discoveryEndpointURL is valid by opening it in a browser prior to entering it in the yaml file. Update the clientSecret with the proper value obtained from your IDP The following snippet is an example of an OIDC definition: configOverrideFiles: openIdConnect: | <server description=\"leapServer\"> <openidConnectClient id=\"oidc\" clientId=\"hcl-leap-oidc-client\" clientSecret=\"clientSecretHash\" signatureAlgorithm=\"RS256\" authFilterRef=\"interceptedAuthFilter\" mapIdentityToRegistryUser=\"false\" httpsRequired=\"true\" scope=\"openid\" userIdentityToCreateSubject=\"preferred_username\" discoveryEndpointUrl=\"https://myoidcserver:8443/realms/Leapdev/.well-known/openid-configuration\"> </openidConnectClient> <authFilter id=\"interceptedAuthFilter\"> <requestUrl id=\"authRequestUrl\" matchType=\"contains\" urlPattern=\"/apps/secure|/apps/secured\"/> </authFilter> <httpEndpoint id=\"defaultHttpEndpoint\" host=\"*\" httpPort=\"9080\" httpsPort=\"9443\"> <samesite none=\"*\" /> </server> For more details on defining a server customization, see helm_open_liberty_custom.md . Add config properties related to OIDC config The following properties must be set to complete the OIDC configuration: hasUserLookups - By setting this to false it will disable user lookups, which is not available when configured with OIDC. hasUserGroups - By setting this to false it will disable group lookups, which is not available when configured with OIDC. postLogoutRedirectURL - This is the URL to which Leap will redirect the browser after a user chooses to log out. This is necessary to complete the loop with the OIDC IDP. configuration: leap: leapProperties: | ibm.nitro.NitroConfig.hasUserLookup=false ibm.nitro.NitroConfig.hasUserGroups=false ibm.nitro.LogoutServlet.postLogoutRedirectURL=https://myOIDCServer.com/realms/Leap/protocol/openid- connect/logout?client_id=hcl-leap-oidc-client&post_logout_redirect_uri=https://myLeapServer.com/apps/secure/org/ide/manager.html For more details on setting Leap properties, see helm_leap_properties.md . Restart the pod After restarting the Leap pod, accessing Leap should redirect you to authenticate using your OIDC IDP.","title":"Configuring Leap with OIDC"},{"location":"helm_oidc_config.html#helm_oidc_config","text":"This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider.","title":"Configuring Leap with OIDC"},{"location":"helm_oidc_config.html#section_lmm_5mt_b1c","text":"Leap can be configured to leverage OpenID Connect (OIDC) as the primary authentication mechanism. This means that Leap will be turned into a Relying Party (RP) to the specified identify provider (IDP). When OIDC is used, the user and group lookup feature of Leap is not available and must be disabled as part of the configuration. The following tasks must be completed to establish this configuration: Configure the OIDC identity provider. Create a secret in Kubernetes container from the IDP server certificate. Add an OIDC definition as a server customization. Add configuration properties related to the OIDC configuration. Restart the pod.","title":"Configuring Leap with OIDC"},{"location":"helm_oidc_config.html#section_zj4_xmt_b1c","text":"Many different identity providers offer OIDC capability. Refer to your chosen identity provider's documentation for more details on configuration.","title":"Configure OIDC identity Provider"},{"location":"helm_oidc_config.html#section_cch_1nt_b1c","text":"As part of the configuration process for your identify provider, you will have created or obtained a digital certificate for configuring HTTPS. This certificate will also need to be deployed to Leap so that the two servers can communicate with each other. Note: The SSL certificate (.crt) and public key (.key) should be in PKCS12 format. After copying the .key and .crt to the kubernetes image, create a secret using the following command: kubectl -n myns create secret tls oidccert --key=\"/tmp/oidc.key\" --cert=\"/tmp/oidc.crt\" Next, this secret can be referenced in the yaml file: configuration: leap: customCertificateSecrets: keycloakCert: \"keycloakcert\" For more information, see to helm_admin_customsecret.md .","title":"Create a secret in Kubernetes container from the IDP certificate"},{"location":"helm_oidc_config.html#section_vxv_fnt_b1c","text":"The properties that you need to specify may differ based on your identify provider. For additional information, see the Open Liberty documentation on OpenID Connect . Before moving on from this step: Verify that the discoveryEndpointURL is valid by opening it in a browser prior to entering it in the yaml file. Update the clientSecret with the proper value obtained from your IDP The following snippet is an example of an OIDC definition: configOverrideFiles: openIdConnect: | <server description=\"leapServer\"> <openidConnectClient id=\"oidc\" clientId=\"hcl-leap-oidc-client\" clientSecret=\"clientSecretHash\" signatureAlgorithm=\"RS256\" authFilterRef=\"interceptedAuthFilter\" mapIdentityToRegistryUser=\"false\" httpsRequired=\"true\" scope=\"openid\" userIdentityToCreateSubject=\"preferred_username\" discoveryEndpointUrl=\"https://myoidcserver:8443/realms/Leapdev/.well-known/openid-configuration\"> </openidConnectClient> <authFilter id=\"interceptedAuthFilter\"> <requestUrl id=\"authRequestUrl\" matchType=\"contains\" urlPattern=\"/apps/secure|/apps/secured\"/> </authFilter> <httpEndpoint id=\"defaultHttpEndpoint\" host=\"*\" httpPort=\"9080\" httpsPort=\"9443\"> <samesite none=\"*\" /> </server> For more details on defining a server customization, see helm_open_liberty_custom.md .","title":"Add OIDC definition as a server customization"},{"location":"helm_oidc_config.html#section_r3z_knt_b1c","text":"The following properties must be set to complete the OIDC configuration: hasUserLookups - By setting this to false it will disable user lookups, which is not available when configured with OIDC. hasUserGroups - By setting this to false it will disable group lookups, which is not available when configured with OIDC. postLogoutRedirectURL - This is the URL to which Leap will redirect the browser after a user chooses to log out. This is necessary to complete the loop with the OIDC IDP. configuration: leap: leapProperties: | ibm.nitro.NitroConfig.hasUserLookup=false ibm.nitro.NitroConfig.hasUserGroups=false ibm.nitro.LogoutServlet.postLogoutRedirectURL=https://myOIDCServer.com/realms/Leap/protocol/openid- connect/logout?client_id=hcl-leap-oidc-client&post_logout_redirect_uri=https://myLeapServer.com/apps/secure/org/ide/manager.html For more details on setting Leap properties, see helm_leap_properties.md .","title":"Add config properties related to OIDC config"},{"location":"helm_oidc_config.html#section_zq2_vmt_b1c","text":"After restarting the Leap pod, accessing Leap should redirect you to authenticate using your OIDC IDP.","title":"Restart the pod"},{"location":"helm_open_liberty_custom.html","text":"Open Liberty server customizations The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | <server description=\"leapServer\"> <basicregistry id=\"leapRegistry\" realm=\"basicRealm\"> <user name=\"newuser1\" password=\"passw0rd\" </basicRegistry> </server> There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details. Connecting to a DB2 Instance The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <authData id=\"db2AuthAlias\" user=\"db2inst1\" password=\"diet4coke\" /> <library id=\"jdbcDB2\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"db2jcc4.jar db2jcc_license_cu.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\" statementCacheSize=\"30\" containerAuthDataRef=\"db2AuthAlias\"> <properties.db2.jcc databaseName=\"LEAPDB\" driverType=\"4\" serverName=\"db2server.acme.com\" portNumber=\"50000\" fullyMaterializeLobData=\"false\" progressiveStreaming=\"2\" sslConnection=\"true\" streamBufferSize=\"2097152\" isolationLevel=\"2\" /> <jdbcDriver libraryRef=\"jdbcDB2\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"10\" minPoolSize=\"1\" reapTime=\"180\" maxIdleTime=\"1800\" agedTimeout=\"7200\" purgePolicy=\"EntirePool\"/> </dataSource> </server> Connecting to an Oracle Instance The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcOracle\" > <fileset dir=\"${server.config.dir}/lib\" includes='ojdbc8.jar' /> </library> <dataSource id=\"leapDataSource\" jndiName=\"jdbc/BuilderDataSource\" containerAuthDataRef=\"oracleAuthAlias\"> <jdbcDriver libraryRef=\"jdbcOracle\"/> <properties.oracle URL=\"jdbc:oracle:thin:@leap-oracle-db.example.com:1521/orclpdb1\"/> <connectionManager minPoolSize=\"0\" maxPoolSize=\"10\" maxIdleTime=\"10m\" purgePolicy=\"ValidateAllConnections\" /> </dataSource> <authData id=\"oracleAuthAlias\" user=\"leap_admin\" password=\"{xor}KDozPDAyOm5tbA==\" /> </server> Connecting to a PostgreSQL database The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcPostgreSQL\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"postgresql-42.6.0.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\"> <properties.postgresql serverName=\"postgresql.acme.com\" databaseName=\"leapDB\" portNumber=\"5432\" user=\"dbuser\" password=\"dbpassword\" /> <jdbcDriver libraryRef=\"jdbcPostgreSQL\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"100\" minPoolSize=\"1\" numConnectionsPerThreadLocal=\"1\" /> </dataSource> </server> Connecting to an SMTP Server Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | <server description=\"leapServer\"> <mailSession id=\"leapMail\" host=\"smtphost.com\" from=\"no-reply@smtphost.com\" jndiName=\"mail/BuilderMailSession\" description=\"Leap MailSession\" mailSessionID=\"leapMail\" user=\"smtpUser\" password=\"smtpPassword\"> <property name=\"mail.smtp.auth\" value=\"false\" /> <property name=\"mail.smtp.port\" value=\"25\" /> </mailSession> </server> Connecting to an LDAP Server Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | <server description=\"leapServer\"> <federatedRepository id=\"fedrepo\"> <primaryRealm name=\"FEDREALM\"> <participatingBaseEntry name=\"dc=Acme\"/> <userSecurityNameMapping outputProperty=\"mail\" /> <groupSecurityNameMapping outputProperty=\"cn\" /> </primaryRealm> </federatedRepository> <ldapRegistry id=\"OpenLdap\" name=\"dc=Acme\" ldapType=\"Custom\" host=\"ldaphost.acme.com\" port=\"389\" baseDN=\"dc=Acme\" searchTimeout=\"8m\" ignoreCase=\"true\" bindDN=\"cn=Manager,dc=Acme\" bindPassword=\"secret\" sslEnabled=\"false\" derefAliases=\"never\"> <loginProperty name=\"mail\"></loginProperty> <ldapEntityType name=\"PersonAccount\"> <objectClass>inetOrgPerson</objectClass> <searchBase>ou=People,dc=Acme</searchBase> </ldapEntityType> <ldapEntityType name=\"Group\"> <objectClass>groupOfUniqueNames</objectClass> <searchBase>ou=Groups,dc=Acme</searchBase> </ldapEntityType> <customFilters userIdMap=\"*:mail\" groupIdMap=\"*:cn\" groupMemberIdMap=\"*:uniqueMember\" userFilter=\"(&(mail=%v)(objectclass=inetOrgPerson))\" groupFilter=\"(&(cn=%v)(objectclass=groupOfUniqueNames))\"/> </ldapRegistry> </server> Configure SSL behavior The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | <ssl id=\"defaultSSLConfig\" trustDefaultCerts=\"true\" /> Parent topic: Preparation","title":"Open Liberty server customizations"},{"location":"helm_open_liberty_custom.html#helm_open_liberty_custom","text":"The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | <server description=\"leapServer\"> <basicregistry id=\"leapRegistry\" realm=\"basicRealm\"> <user name=\"newuser1\" password=\"passw0rd\" </basicRegistry> </server> There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details.","title":"Open Liberty server customizations"},{"location":"helm_open_liberty_custom.html#section_z4t_ckh_jzb","text":"The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <authData id=\"db2AuthAlias\" user=\"db2inst1\" password=\"diet4coke\" /> <library id=\"jdbcDB2\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"db2jcc4.jar db2jcc_license_cu.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\" statementCacheSize=\"30\" containerAuthDataRef=\"db2AuthAlias\"> <properties.db2.jcc databaseName=\"LEAPDB\" driverType=\"4\" serverName=\"db2server.acme.com\" portNumber=\"50000\" fullyMaterializeLobData=\"false\" progressiveStreaming=\"2\" sslConnection=\"true\" streamBufferSize=\"2097152\" isolationLevel=\"2\" /> <jdbcDriver libraryRef=\"jdbcDB2\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"10\" minPoolSize=\"1\" reapTime=\"180\" maxIdleTime=\"1800\" agedTimeout=\"7200\" purgePolicy=\"EntirePool\"/> </dataSource> </server>","title":"Connecting to a DB2 Instance"},{"location":"helm_open_liberty_custom.html#section_p2d_3kh_jzb","text":"The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcOracle\" > <fileset dir=\"${server.config.dir}/lib\" includes='ojdbc8.jar' /> </library> <dataSource id=\"leapDataSource\" jndiName=\"jdbc/BuilderDataSource\" containerAuthDataRef=\"oracleAuthAlias\"> <jdbcDriver libraryRef=\"jdbcOracle\"/> <properties.oracle URL=\"jdbc:oracle:thin:@leap-oracle-db.example.com:1521/orclpdb1\"/> <connectionManager minPoolSize=\"0\" maxPoolSize=\"10\" maxIdleTime=\"10m\" purgePolicy=\"ValidateAllConnections\" /> </dataSource> <authData id=\"oracleAuthAlias\" user=\"leap_admin\" password=\"{xor}KDozPDAyOm5tbA==\" /> </server>","title":"Connecting to an Oracle Instance"},{"location":"helm_open_liberty_custom.html#section_cll_jkh_jzb","text":"The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcPostgreSQL\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"postgresql-42.6.0.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\"> <properties.postgresql serverName=\"postgresql.acme.com\" databaseName=\"leapDB\" portNumber=\"5432\" user=\"dbuser\" password=\"dbpassword\" /> <jdbcDriver libraryRef=\"jdbcPostgreSQL\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"100\" minPoolSize=\"1\" numConnectionsPerThreadLocal=\"1\" /> </dataSource> </server>","title":"Connecting to a PostgreSQL database"},{"location":"helm_open_liberty_custom.html#section_t4v_kkh_jzb","text":"Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | <server description=\"leapServer\"> <mailSession id=\"leapMail\" host=\"smtphost.com\" from=\"no-reply@smtphost.com\" jndiName=\"mail/BuilderMailSession\" description=\"Leap MailSession\" mailSessionID=\"leapMail\" user=\"smtpUser\" password=\"smtpPassword\"> <property name=\"mail.smtp.auth\" value=\"false\" /> <property name=\"mail.smtp.port\" value=\"25\" /> </mailSession> </server>","title":"Connecting to an SMTP Server"},{"location":"helm_open_liberty_custom.html#section_fwn_mkh_jzb","text":"Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | <server description=\"leapServer\"> <federatedRepository id=\"fedrepo\"> <primaryRealm name=\"FEDREALM\"> <participatingBaseEntry name=\"dc=Acme\"/> <userSecurityNameMapping outputProperty=\"mail\" /> <groupSecurityNameMapping outputProperty=\"cn\" /> </primaryRealm> </federatedRepository> <ldapRegistry id=\"OpenLdap\" name=\"dc=Acme\" ldapType=\"Custom\" host=\"ldaphost.acme.com\" port=\"389\" baseDN=\"dc=Acme\" searchTimeout=\"8m\" ignoreCase=\"true\" bindDN=\"cn=Manager,dc=Acme\" bindPassword=\"secret\" sslEnabled=\"false\" derefAliases=\"never\"> <loginProperty name=\"mail\"></loginProperty> <ldapEntityType name=\"PersonAccount\"> <objectClass>inetOrgPerson</objectClass> <searchBase>ou=People,dc=Acme</searchBase> </ldapEntityType> <ldapEntityType name=\"Group\"> <objectClass>groupOfUniqueNames</objectClass> <searchBase>ou=Groups,dc=Acme</searchBase> </ldapEntityType> <customFilters userIdMap=\"*:mail\" groupIdMap=\"*:cn\" groupMemberIdMap=\"*:uniqueMember\" userFilter=\"(&(mail=%v)(objectclass=inetOrgPerson))\" groupFilter=\"(&(cn=%v)(objectclass=groupOfUniqueNames))\"/> </ldapRegistry> </server>","title":"Connecting to an LDAP Server"},{"location":"helm_open_liberty_custom.html#section_zlv_nkh_jzb","text":"The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | <ssl id=\"defaultSSLConfig\" trustDefaultCerts=\"true\" /> Parent topic: Preparation","title":"Configure SSL behavior"},{"location":"helm_persistent_volume.html","text":"PersistentVolumeClaims Defining persistent volumes (PVs) for Leap is optional and dependent on your needs. The 3 volumes that may be required to operate Leap: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. In order to pass custom extensions to Leap, create an \"extensions\" directory in this volume. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/extensions. Note: If files are added to this volume while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage and is labeled \u201clog\u201d in the .yaml file. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database and is labelled \u201crwo\u201d in the .yaml file. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system, or a location supplied by a cloud provider. Persistent volume types Important: Ensure that your PersistentVolumes (PVs) are created with the Reclaim Policy set to RETAIN. This allows for the reuse of PVs after a PersistentVolumeClaim (PVC) is deleted. This is important to keep data persisted, for example, between deployments or tests. Refrain from using the Reclaim Policy DELETE unless you have the experience in managing these operations successfully, to avoid unpredictable results. This is not recommended in production use, as deleting PVCs causes the Kubernetes or OpenShift cluster to delete the bound PV as well, thus, deleting all the data on it. ReadWriteOnce (RWO) ReadWriteOnce PVs allow only one pod per volume to perform reading and writing transactions. This means that the data on that PV cannot be shared with other pods and is linked to one pod at a time. ReadWriteMany (RWX) ReadWriteMany PVs support read and write operations by multiple pods. This means the data on that PV can be shared with other pods and can be linked to multiple pods at a time. Configuration parameters To access the PersistentVolumes (PVs) on your cluster, the HCL Leap Kubernetes or OpenShift deployment using Helm creates PersistentVolumeClaims (PVCs) that binds the PVs to the corresponding pods. Each PVC that Leap requires allows you to configure the following parameters, as shown below. For a PVC of the Leap application: # Persistent Volume Setup volumes: # Persistent Volumes for Leap leap: # RWX PVC shared by all Leap pods - RWX. Used to pass auxiliary binary files to all Pods on startup rwx: storageClassName: \"manual\" requests: storage: \"50Mi\" # Optional volume name to specifically map to volumeName: StorageClassName Depending on your Cluster configuration, you may have configured a specific StorageClass that should be used for your PVs and the PVCs of HCL Leap. This property allows you to enter the name of the StorageClass you want the deployment to use. PVCs then only accepts PVs that match the StorageClassName you have defined in the configuration. If there are no PVs that match, the pods remain pending and do not start until a fitting PV is provided by the cluster. If you enter an empty StorageClassName, Kubernetes falls back to the default StorageClass configured in your Cluster. Refer to your cloud provider for additional information about your default StorageClass, since this depends on your Kubernetes or OpenShift environment. Reference the original values.yaml file you have extracted as outlined in the Prepare configuration topic for all configurable PVCs. Requests Storage. Storage allows you to define the amount of space that is required by the PVC. Once defined, it only accepts PVs that have the same or more storage capacity as requested. If there are no PVs matching the definitions, the pods remain pending and do not start until a properly-sized PV is provided by the cluster. Selector If you want your deployment to pick up specific PVs that you have created, the selector option can be used to match PVs by their labels. A detailed description on how to use the selector can be found in the official Kubernetes documentation. A PVC will only match with a PV satisfying the selector and all the other requirements such as type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. VolumeName If you want your deployment to pick up a specific PV that you have created, use of the VolumeName can define that instruction. Ensure that the PV you created has a unique name. Then, add that name as a configuration parameter for the PVC. The PVCs only matches with a PV of that name, matching the other requirements-like type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. As a single persistent Volume is assigned using the volumeName, this should only be used for RWX claims or for Pods that are only ever scaled to one replica. If a second PersistentVolumeClaim is created with the same volumeName, it can never be fulfilled as the names for Volumes are unique. Please refer to the Selector section to select specific PersistentVolumes for multiple claims. Sample PVC configurations The following are some examples for configuration of the PersistentVolumeClaims (PVCs) using your custom-values.yaml: Specific volume names Specifying a name ensures that Kubernetes or OpenShift only assigns PVs with the matching name to the PVCs created for the applications: # Persistent Volume Setup volumes: leap: rwx: volumeName: \u201cleap-binaries\u201d Adjusted volume size for PVCs You may override the default sizes for PVCs by adjusting the storage requests: volumes: leap: rwx: requests: storage: \"500Mi\" rwo: requests: storage: \"50Mi\" log: requests: storage: \"250Mi\" Parent topic: Preparation","title":"PersistentVolumeClaims"},{"location":"helm_persistent_volume.html#helm_persistant_volume","text":"Defining persistent volumes (PVs) for Leap is optional and dependent on your needs. The 3 volumes that may be required to operate Leap: A volume specified as \u201cReadWriteMany\u201d. This will be used to pass database drivers or LTPA key files to be used by Leap. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/misc. To reference files in this directory within your configuration snippets, use ${SERVER_CONFIG_DIR}/misc. In order to pass custom extensions to Leap, create an \"extensions\" directory in this volume. When the container is started, any files in this directory are copied into /opt/openliberty/wlp/usr/servers/defaultServer/extensions. Note: If files are added to this volume while the system is running then it will need to be restarted. A volume specified as \u201cReadWriteOnce\u201d. This will be used for log storage and is labeled \u201clog\u201d in the .yaml file. A volume specified as \u201cReadWriteOnce\u201d. This will be used for the derby database and is labelled \u201crwo\u201d in the .yaml file. If not using derby, this volume is optional. These volumes can be directories in your Kubernetes operating system, or a location supplied by a cloud provider.","title":"PersistentVolumeClaims"},{"location":"helm_persistent_volume.html#section_bbh_5j4_hzb","text":"Important: Ensure that your PersistentVolumes (PVs) are created with the Reclaim Policy set to RETAIN. This allows for the reuse of PVs after a PersistentVolumeClaim (PVC) is deleted. This is important to keep data persisted, for example, between deployments or tests. Refrain from using the Reclaim Policy DELETE unless you have the experience in managing these operations successfully, to avoid unpredictable results. This is not recommended in production use, as deleting PVCs causes the Kubernetes or OpenShift cluster to delete the bound PV as well, thus, deleting all the data on it. ReadWriteOnce (RWO) ReadWriteOnce PVs allow only one pod per volume to perform reading and writing transactions. This means that the data on that PV cannot be shared with other pods and is linked to one pod at a time. ReadWriteMany (RWX) ReadWriteMany PVs support read and write operations by multiple pods. This means the data on that PV can be shared with other pods and can be linked to multiple pods at a time.","title":"Persistent volume types"},{"location":"helm_persistent_volume.html#section_hpf_xj4_hzb","text":"To access the PersistentVolumes (PVs) on your cluster, the HCL Leap Kubernetes or OpenShift deployment using Helm creates PersistentVolumeClaims (PVCs) that binds the PVs to the corresponding pods. Each PVC that Leap requires allows you to configure the following parameters, as shown below. For a PVC of the Leap application: # Persistent Volume Setup volumes: # Persistent Volumes for Leap leap: # RWX PVC shared by all Leap pods - RWX. Used to pass auxiliary binary files to all Pods on startup rwx: storageClassName: \"manual\" requests: storage: \"50Mi\" # Optional volume name to specifically map to volumeName: StorageClassName Depending on your Cluster configuration, you may have configured a specific StorageClass that should be used for your PVs and the PVCs of HCL Leap. This property allows you to enter the name of the StorageClass you want the deployment to use. PVCs then only accepts PVs that match the StorageClassName you have defined in the configuration. If there are no PVs that match, the pods remain pending and do not start until a fitting PV is provided by the cluster. If you enter an empty StorageClassName, Kubernetes falls back to the default StorageClass configured in your Cluster. Refer to your cloud provider for additional information about your default StorageClass, since this depends on your Kubernetes or OpenShift environment. Reference the original values.yaml file you have extracted as outlined in the Prepare configuration topic for all configurable PVCs. Requests Storage. Storage allows you to define the amount of space that is required by the PVC. Once defined, it only accepts PVs that have the same or more storage capacity as requested. If there are no PVs matching the definitions, the pods remain pending and do not start until a properly-sized PV is provided by the cluster. Selector If you want your deployment to pick up specific PVs that you have created, the selector option can be used to match PVs by their labels. A detailed description on how to use the selector can be found in the official Kubernetes documentation. A PVC will only match with a PV satisfying the selector and all the other requirements such as type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. VolumeName If you want your deployment to pick up a specific PV that you have created, use of the VolumeName can define that instruction. Ensure that the PV you created has a unique name. Then, add that name as a configuration parameter for the PVC. The PVCs only matches with a PV of that name, matching the other requirements-like type (RWO/RWX, as defined by the deployment itself), storage capacity, and StorageClassName. As a single persistent Volume is assigned using the volumeName, this should only be used for RWX claims or for Pods that are only ever scaled to one replica. If a second PersistentVolumeClaim is created with the same volumeName, it can never be fulfilled as the names for Volumes are unique. Please refer to the Selector section to select specific PersistentVolumes for multiple claims.","title":"Configuration parameters"},{"location":"helm_persistent_volume.html#section_i4t_hk4_hzb","text":"The following are some examples for configuration of the PersistentVolumeClaims (PVCs) using your custom-values.yaml: Specific volume names Specifying a name ensures that Kubernetes or OpenShift only assigns PVs with the matching name to the PVCs created for the applications: # Persistent Volume Setup volumes: leap: rwx: volumeName: \u201cleap-binaries\u201d Adjusted volume size for PVCs You may override the default sizes for PVCs by adjusting the storage requests: volumes: leap: rwx: requests: storage: \"500Mi\" rwo: requests: storage: \"50Mi\" log: requests: storage: \"250Mi\" Parent topic: Preparation","title":"Sample PVC configurations"},{"location":"helm_preparation.html","text":"Preparation This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported. Mandatory Prepare a namespace Prepare configuration Load images PersistentVolumeClaims Provide admin user a custom secret Optional Probes configuration in values.yaml file SAML configuration Certificates Open Liberty server customizations Service Catalog Leap properties JVM options Changing the log level Enabling additional Open Liberty features Parent topic: Kubernetes Helm deployment","title":"Preparation"},{"location":"helm_preparation.html#helm_preparation","text":"This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported.","title":"Preparation"},{"location":"helm_preparation.html#section_rkz_1h4_hzb","text":"Prepare a namespace Prepare configuration Load images PersistentVolumeClaims Provide admin user a custom secret","title":"Mandatory"},{"location":"helm_preparation.html#section_bwh_bh4_hzb","text":"Probes configuration in values.yaml file SAML configuration Certificates Open Liberty server customizations Service Catalog Leap properties JVM options Changing the log level Enabling additional Open Liberty features Parent topic: Kubernetes Helm deployment","title":"Optional"},{"location":"helm_prepare_namespace.html","text":"Prepare a namespace You need to create a namespace in your Kubernetes cluster that contains all the resources related to your HCL Leap Container deployment. It is recommended that the namespace is created before the deployment. Identify a name for your namespace and create it using the following syntax: On Kubernetes platforms: Kubectl # Command to create a namespace using kubectl # This example creates a namespace called \"my-namespace\" kubectl create ns my-namespace OpenShift: For OpenShift, you must create a namespace with specific settings. Use the following namespace definition and save it as namespace.yaml. You must replace my-namespace in the template with the name of the namespace you are using: apiVersion: v1 kind: Namespace metadata: name: my-namespace annotations: openshift.io/sa.scc.mcs: \"s0:c24,c4\" openshift.io/sa.scc.supplemental-groups: \"1001/10000\" openshift.io/sa.scc.uid-range: \"1000/10000\" OpenShift client: # Command to create namespace from template file oc apply -f namespace.yaml Parent topic: Preparation","title":"Prepare a namespace"},{"location":"helm_prepare_namespace.html#helm_prepare_namespace","text":"You need to create a namespace in your Kubernetes cluster that contains all the resources related to your HCL Leap Container deployment. It is recommended that the namespace is created before the deployment. Identify a name for your namespace and create it using the following syntax: On Kubernetes platforms: Kubectl # Command to create a namespace using kubectl # This example creates a namespace called \"my-namespace\" kubectl create ns my-namespace OpenShift: For OpenShift, you must create a namespace with specific settings. Use the following namespace definition and save it as namespace.yaml. You must replace my-namespace in the template with the name of the namespace you are using: apiVersion: v1 kind: Namespace metadata: name: my-namespace annotations: openshift.io/sa.scc.mcs: \"s0:c24,c4\" openshift.io/sa.scc.supplemental-groups: \"1001/10000\" openshift.io/sa.scc.uid-range: \"1000/10000\" OpenShift client: # Command to create namespace from template file oc apply -f namespace.yaml Parent topic: Preparation","title":"Prepare a namespace"},{"location":"helm_probes_config_valuesfile.html","text":"Probes configuration in values.yaml file The liveness and readiness probes such as the status thresholds and time values can be modified. # Liveness probe using the applications HTTP probe endpoint livenessProbe: failureThreshold: 4 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 # Readiness probe using the applications HTTP probe endpoint readinessProbe: failureThreshold: 2 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 Information about the configuration options can be found in the Kubernetes documentation . Parent topic: Preparation","title":"Probes configuration in values.yaml file"},{"location":"helm_probes_config_valuesfile.html#helm_probes_config_valuesfile","text":"The liveness and readiness probes such as the status thresholds and time values can be modified. # Liveness probe using the applications HTTP probe endpoint livenessProbe: failureThreshold: 4 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 # Readiness probe using the applications HTTP probe endpoint readinessProbe: failureThreshold: 2 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 30 Information about the configuration options can be found in the Kubernetes documentation . Parent topic: Preparation","title":"Probes configuration in values.yaml file"},{"location":"helm_saml_config.html","text":"SAML configuration The Leap Helm chart and container offer a basic SAML configuration through the Helm values. To enable SAML you must pass the IdP Metadata of the identity provider. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. Example: security: leap: saml: idpMetadata: | <EntityDescriptor xmlns=\"urn:oasis:names:tc:SAML:2.0:metadata\" ID=\"SAMLtestIdP\" entityID=\"https://samltest.id/saml/idp\"> <IDPSSODescriptor protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol urn:mace:shibboleth:1.0\"> ... </IDPSSODescriptor> </EntityDescriptor> Parent topic: Preparation","title":"SAML configuration"},{"location":"helm_saml_config.html#helm_saml_config","text":"The Leap Helm chart and container offer a basic SAML configuration through the Helm values. To enable SAML you must pass the IdP Metadata of the identity provider. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. Example: security: leap: saml: idpMetadata: | <EntityDescriptor xmlns=\"urn:oasis:names:tc:SAML:2.0:metadata\" ID=\"SAMLtestIdP\" entityID=\"https://samltest.id/saml/idp\"> <IDPSSODescriptor protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol urn:mace:shibboleth:1.0\"> ... </IDPSSODescriptor> </EntityDescriptor> Parent topic: Preparation","title":"SAML configuration"},{"location":"helm_service_catalog.html","text":"Service Catalog The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>sample-service-description</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Sample service Description</name> <description xml:lang=\"en\"></description> . . . </serviceDescription> Parent topic: Preparation","title":"Service Catalog"},{"location":"helm_service_catalog.html#helm_service_catalog","text":"The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>sample-service-description</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Sample service Description</name> <description xml:lang=\"en\"></description> . . . </serviceDescription> Parent topic: Preparation","title":"Service Catalog"},{"location":"helm_uninstall.html","text":"Uninstall Helm deployment To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall. Uninstall command To run the uninstall, use the following command as shown in this example: # Helm uninstall command helm uninstall your-release-name -n my-namespace Where my-namespace is the namespace where your HCL Leap deployment is installed to and your-release-name is the Helm release name you selected during installation. After a successful deployment, Helm responds with the following message: release \"your-release-name\" uninstalled Parent topic: Kubernetes Helm deployment","title":"Uninstall Helm deployment"},{"location":"helm_uninstall.html#helm_uninstall","text":"To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall.","title":"Uninstall Helm deployment"},{"location":"helm_uninstall.html#section_m4v_cp4_hzb","text":"To run the uninstall, use the following command as shown in this example: # Helm uninstall command helm uninstall your-release-name -n my-namespace Where my-namespace is the namespace where your HCL Leap deployment is installed to and your-release-name is the Helm release name you selected during installation. After a successful deployment, Helm responds with the following message: release \"your-release-name\" uninstalled Parent topic: Kubernetes Helm deployment","title":"Uninstall command"},{"location":"helm_update_install.html","text":"Update the settings of an existing installation This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. This section assumes that you prepared your cluster and your custom-values.yaml file, using guidance provided in the Preparation before installing Leap and using Helm topic, and then installed your deployment using the instructions in the Install topic. Overview of Helm configuration updates Once an HCL Leap deployment is installed, it is possible to update its configuration directly using the standard Kubernetes or OpenShift commands (for example, by updating values in the various config maps). However, this is NOT the recommended approach. Some of the configuration parameters have interdependencies, as outlined in the Preparation before installing Leap using Helm topic. These require knowledgeable management to make changes that are compatible with interdependency requirements. The recommended approach for configuration changes is to update the custom-values.yaml file used to install the deployment, and then run a Helm upgrade. This has the added benefit that your custom-values.yaml file remains an up-to-date description of the configuration of your environment. Helm upgrade configuration command After making the needed changes to your custom-values.yaml file, use the following command: # Helm upgrade command helm upgrade -n your-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl -leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The your-namespace is the namespace in which your HCL Leap deployment is installed and your-release-name is the Helm release name you used when installing. The -f path/to/your/custom-values.yaml parameter must point to the custom-values.yaml you have updated. The path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you extracted in the preparation steps. Parent topic: Kubernetes Helm deployment","title":"Update the settings of an existing installation"},{"location":"helm_update_install.html#helm_update_install","text":"This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. This section assumes that you prepared your cluster and your custom-values.yaml file, using guidance provided in the Preparation before installing Leap and using Helm topic, and then installed your deployment using the instructions in the Install topic.","title":"Update the settings of an existing installation"},{"location":"helm_update_install.html#section_vrr_mp4_hzb","text":"Once an HCL Leap deployment is installed, it is possible to update its configuration directly using the standard Kubernetes or OpenShift commands (for example, by updating values in the various config maps). However, this is NOT the recommended approach. Some of the configuration parameters have interdependencies, as outlined in the Preparation before installing Leap using Helm topic. These require knowledgeable management to make changes that are compatible with interdependency requirements. The recommended approach for configuration changes is to update the custom-values.yaml file used to install the deployment, and then run a Helm upgrade. This has the added benefit that your custom-values.yaml file remains an up-to-date description of the configuration of your environment.","title":"Overview of Helm configuration updates"},{"location":"helm_update_install.html#section_ixp_4p4_hzb","text":"After making the needed changes to your custom-values.yaml file, use the following command: # Helm upgrade command helm upgrade -n your-namespace -f path/to/your/custom-values.yaml your-release-name path/to/hcl -leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz The your-namespace is the namespace in which your HCL Leap deployment is installed and your-release-name is the Helm release name you used when installing. The -f path/to/your/custom-values.yaml parameter must point to the custom-values.yaml you have updated. The path/to/hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is the HCL Leap Helm Chart that you extracted in the preparation steps. Parent topic: Kubernetes Helm deployment","title":"Helm upgrade configuration command"},{"location":"in_basic_architecture.html","text":"Basic Architecture Leap relies on two central components: the application server and the database. Leap relies on two central components: the application server and the database. The following diagram shows how these components are set up in a typical installation: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere\u00ae Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. If you plan to use Leap with WebSphere Portal, the following diagram describes the basic architecture: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. Leap Portlet: When installed and configured to point at the Leap server, it enables content to be rendered within a WebSphere Portal environment. User registry : Leap relies on a user registry, such as an LDAP, to manage access to the system. This is connected to the Leap application server. For more information on supported user registries, see Leap system requirements . Note: The detailed system requirements page displays Leap 8.6.0 requirements. In the upper left corner of the page, there is a menu from which you can select version 9.3. Email server : Leap can optionally send emails when configured with a proper email relay. Parent topic: Deploying to a traditional platform Related information Manually deploying to WebSphere Application Server","title":"Basic Architecture"},{"location":"in_basic_architecture.html#feb_basic_architecture","text":"Leap relies on two central components: the application server and the database. Leap relies on two central components: the application server and the database. The following diagram shows how these components are set up in a typical installation: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere\u00ae Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. If you plan to use Leap with WebSphere Portal, the following diagram describes the basic architecture: The components perform the following functions: Leap : The environment in which you create, deploy and launch applications. IBM HTTP Server : A standard component of WebSphere Application Server that interacts with the application server. Leap Database : The Leap database which contains all applications and data that exist within the Leap environment. Leap Portlet: When installed and configured to point at the Leap server, it enables content to be rendered within a WebSphere Portal environment. User registry : Leap relies on a user registry, such as an LDAP, to manage access to the system. This is connected to the Leap application server. For more information on supported user registries, see Leap system requirements . Note: The detailed system requirements page displays Leap 8.6.0 requirements. In the upper left corner of the page, there is a menu from which you can select version 9.3. Email server : Leap can optionally send emails when configured with a proper email relay. Parent topic: Deploying to a traditional platform Related information Manually deploying to WebSphere Application Server","title":"Basic Architecture"},{"location":"in_create_db.html","text":"Create a Database This section describes how to prepare a database for Leap. Leap is compatible with a DB2 or an Oracle database. Creating a DB2 database The following instructions describe how to manually create the DB2\u00ae database for Leap. Creating an Oracle database The following steps describe how to manually create an Oracle database for use with Leap. Creating a PostgreSQL database The following instructions describe how to manually create the PostgreSQL database for Leap. Parent topic: Preparing to deploy","title":"Create a Database"},{"location":"in_create_db.html#createdb","text":"This section describes how to prepare a database for Leap. Leap is compatible with a DB2 or an Oracle database. Creating a DB2 database The following instructions describe how to manually create the DB2\u00ae database for Leap. Creating an Oracle database The following steps describe how to manually create an Oracle database for use with Leap. Creating a PostgreSQL database The following instructions describe how to manually create the PostgreSQL database for Leap. Parent topic: Preparing to deploy","title":"Create a Database"},{"location":"in_create_db2.html","text":"Creating a DB2 database The following instructions describe how to manually create the DB2\u00ae database for Leap. In a production environment, you must create DB2 database before you install HCL Leap to WebSphere\u00ae Application Server. Note: Do not create a database if you want to continue using the same database with the existing user content. To set up the DB2 database: Create an empty DB2 database with a maximum database name of 8 characters, and a maximum page size of 32768. Connect to the database and create a User Temporary table space. Use the following settings for the temporary table space: Large_usertemp pagesize 32K Managed by automatic storage extentsize 16 <bufferpool-name> is the name of your DB2 large buffer pool. Each DB2 server can have a different name. db2 \"CREATE DB FEBDB using codeset UTF-8 territory us PAGESIZE 32768\" db2 connect to FEBDB db2 \"CREATE BUFFERPOOL bufferpool-name IMMEDIATE SIZE 250 PAGESIZE 32K\" db2 \"CREATE USER TEMPORARY TABLESPACE LARGE_USERTEMP PAGESIZE 32k MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 16 PREFETCHSIZE 16 BUFFERPOOL bufferpool-name\" Parent topic: Create a Database","title":"Creating a DB2 database"},{"location":"in_create_db2.html#settingupwas","text":"The following instructions describe how to manually create the DB2\u00ae database for Leap. In a production environment, you must create DB2 database before you install HCL Leap to WebSphere\u00ae Application Server. Note: Do not create a database if you want to continue using the same database with the existing user content. To set up the DB2 database: Create an empty DB2 database with a maximum database name of 8 characters, and a maximum page size of 32768. Connect to the database and create a User Temporary table space. Use the following settings for the temporary table space: Large_usertemp pagesize 32K Managed by automatic storage extentsize 16 <bufferpool-name> is the name of your DB2 large buffer pool. Each DB2 server can have a different name. db2 \"CREATE DB FEBDB using codeset UTF-8 territory us PAGESIZE 32768\" db2 connect to FEBDB db2 \"CREATE BUFFERPOOL bufferpool-name IMMEDIATE SIZE 250 PAGESIZE 32K\" db2 \"CREATE USER TEMPORARY TABLESPACE LARGE_USERTEMP PAGESIZE 32k MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 16 PREFETCHSIZE 16 BUFFERPOOL bufferpool-name\" Parent topic: Create a Database","title":"Creating a DB2 database"},{"location":"in_deploying_was.html","text":"Manually deploying to WebSphere Application Server The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Prior to deploying HCL Leap to WebSphere Application Server, you must create a new DB2\u00ae , or Oracle 12c database. Set up your database. To set up the DB2 database, see Creating a DB2 database . To set up an Oracle database, see Creating an Oracle database To set up a PostgreSQL database, see Creating a PostgreSQL database . To deploy Leap to WebSphere Application Server, open the WebSphere Application Server Administrative console. Configure the data sources. Depending on your version of WebSphere Application Server, go to either: Resources or Application server Expand the JDBC tree, and go to Data sources . Create a new data source Provide the host name, port, database name (PDB database service name must be used for Oracle 12c), connection ID, and password. The connection ID must have dbadmin access granted for the database. If you are connecting to a DB2 database with WebSphere Application Server 8.0 Connection pool data source, ensure that you select a non-XA DB2 JDBC provider, and use a Type 4 driver when configuring the data source. Click Test connection to ensure that the connection is made. You must set additional properties for the created data source. Click the name link for the created data source, then click Custom Properties . DB2 only - Locate fullyMaterializeLobData, and change the value to false . DB2 only - Add a property called progressiveStreaming, and set the value to 2. DB2 only - Set streamBufferSize to 2097152 (2MB). Add this property if it doesn't exist. Set the webSphereDefaultIsolationLevel to 2 Go to Mail > Mail sessions . Select the correct scope and choose New . Choose Built-in Mail Provider . Provide a name, and a JNDI Name. Depending on your version of WebSphere Application Server, you might need to click Apply before setting the following properties. Complete the Outgoing Mail Properties . Set the Server , and Return email address fields. Click OK Go to Application Servers > server1 > Java and Process Management > Process definition > Java Virtual Machine , and set the default maximum heap size to at least 1024 MB. Deploy the Leap EAR: Go to Applications > Application Types > WebSphere Enterprise Applications . Select Install . Select Local file system , provide the location of the EAR file, and click Next . For example: <Installation Directory>/deploy/hcl-leap.ear. From the \u201cHow do you want to install the application?\u201d options, select Detailed , then click Next . Accept the defaults presented by clicking Next for all steps until Map resource references to resource . On Map resource references to resource : In the javax.mail.Session section, go to Target Resource JNDI Name , and select the mail source. In the javax.sql.DataSource section, go to Target Resource JNDI Name , and select the data source. Click Next . Accept the defaults for the next step and click Next . On Map context roots for web modules use the default context roots, and click Next . On Map security roles to users or groups : Select the SuperAdminUsers role, and click Map Users... or Map Groups... . Select the super administrative users or groups to map to the role. Select the EditApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Select the AdministrativeUsers role, and click Map Users... or Map Groups... . Select the administrative users or groups to map to the role. Select the UseApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Additional information about available roles: SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process as described in Completing the installation . A sample setting is: \u201cSpecial subject: None, Mapped users, admin_user_name \u201d. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. A sample setting is: \u201cSpecial subject: All authenticated in Application's Realms\u201d. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers , and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers , and EditApplicationUsers roles. Otherwise, leave this role unmapped. A sample setting, if you must map the role, is: \u201cSpecial subject: All authenticated in Trusted Realms\u201d. You must map Administrative users and Edit Application users to an appropriate realm. Continue to the summary page. Click Finish to deploy the ear file. Set the class loading and update detection: Go to Enterprise Applications > Leap > Class loader . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d. Go to Enterprise Applications > Leap > Manage Modules > HCL Leap xxx.war . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d Click Apply to apply changes. Enabling security: Expand the Security tree and select Global security . In the Administrative security section, select the check box beside Enable administrative security . In the Application security section, select the check box beside Enable application security . In the User Account Repository , ensure Current Realm Definition is set to Federated repositories. Click Apply to apply your changes. Configure user accounts: Go to Users and Groups > Manage Users . For more information about configuring accounts, see the WebSphere Application Server documentation. Configure VMM J2C Alias: Go to Security > Global Security > Authentication > Java Authentication and Authorization Service > J2C authentication data . Click New... Enter the following information Alias : vmmAdmin User Id : websphere_admin_user_id Password : websphere_admin_user_password Click Apply to apply your changes. Parent topic: Deploying to a traditional platform Related information Basic Architecture","title":"Manually deploying to WebSphere Application Server"},{"location":"in_deploying_was.html#settingupwas","text":"The following instructions describe how to manually deploy HCL Leap to WebSphere\u00ae Application Server. Prior to deploying HCL Leap to WebSphere Application Server, you must create a new DB2\u00ae , or Oracle 12c database. Set up your database. To set up the DB2 database, see Creating a DB2 database . To set up an Oracle database, see Creating an Oracle database To set up a PostgreSQL database, see Creating a PostgreSQL database . To deploy Leap to WebSphere Application Server, open the WebSphere Application Server Administrative console. Configure the data sources. Depending on your version of WebSphere Application Server, go to either: Resources or Application server Expand the JDBC tree, and go to Data sources . Create a new data source Provide the host name, port, database name (PDB database service name must be used for Oracle 12c), connection ID, and password. The connection ID must have dbadmin access granted for the database. If you are connecting to a DB2 database with WebSphere Application Server 8.0 Connection pool data source, ensure that you select a non-XA DB2 JDBC provider, and use a Type 4 driver when configuring the data source. Click Test connection to ensure that the connection is made. You must set additional properties for the created data source. Click the name link for the created data source, then click Custom Properties . DB2 only - Locate fullyMaterializeLobData, and change the value to false . DB2 only - Add a property called progressiveStreaming, and set the value to 2. DB2 only - Set streamBufferSize to 2097152 (2MB). Add this property if it doesn't exist. Set the webSphereDefaultIsolationLevel to 2 Go to Mail > Mail sessions . Select the correct scope and choose New . Choose Built-in Mail Provider . Provide a name, and a JNDI Name. Depending on your version of WebSphere Application Server, you might need to click Apply before setting the following properties. Complete the Outgoing Mail Properties . Set the Server , and Return email address fields. Click OK Go to Application Servers > server1 > Java and Process Management > Process definition > Java Virtual Machine , and set the default maximum heap size to at least 1024 MB. Deploy the Leap EAR: Go to Applications > Application Types > WebSphere Enterprise Applications . Select Install . Select Local file system , provide the location of the EAR file, and click Next . For example: <Installation Directory>/deploy/hcl-leap.ear. From the \u201cHow do you want to install the application?\u201d options, select Detailed , then click Next . Accept the defaults presented by clicking Next for all steps until Map resource references to resource . On Map resource references to resource : In the javax.mail.Session section, go to Target Resource JNDI Name , and select the mail source. In the javax.sql.DataSource section, go to Target Resource JNDI Name , and select the data source. Click Next . Accept the defaults for the next step and click Next . On Map context roots for web modules use the default context roots, and click Next . On Map security roles to users or groups : Select the SuperAdminUsers role, and click Map Users... or Map Groups... . Select the super administrative users or groups to map to the role. Select the EditApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Select the AdministrativeUsers role, and click Map Users... or Map Groups... . Select the administrative users or groups to map to the role. Select the UseApplicationUsers role, and click Map Special Subjects . Select either All authenticated in Application's Realms, or All authenticated in Trusted Realms to map the value to the role. If both options are available, select All authenticated in Trusted Realms. Additional information about available roles: SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process as described in Completing the installation . A sample setting is: \u201cSpecial subject: None, Mapped users, admin_user_name \u201d. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. A sample setting is: \u201cSpecial subject: All authenticated in Application's Realms\u201d. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers , and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers , and EditApplicationUsers roles. Otherwise, leave this role unmapped. A sample setting, if you must map the role, is: \u201cSpecial subject: All authenticated in Trusted Realms\u201d. You must map Administrative users and Edit Application users to an appropriate realm. Continue to the summary page. Click Finish to deploy the ear file. Set the class loading and update detection: Go to Enterprise Applications > Leap > Class loader . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d. Go to Enterprise Applications > Leap > Manage Modules > HCL Leap xxx.war . Go to Class loader order and select \u201cClasses loaded with local class loader first (parent last)\u201d Click Apply to apply changes. Enabling security: Expand the Security tree and select Global security . In the Administrative security section, select the check box beside Enable administrative security . In the Application security section, select the check box beside Enable application security . In the User Account Repository , ensure Current Realm Definition is set to Federated repositories. Click Apply to apply your changes. Configure user accounts: Go to Users and Groups > Manage Users . For more information about configuring accounts, see the WebSphere Application Server documentation. Configure VMM J2C Alias: Go to Security > Global Security > Authentication > Java Authentication and Authorization Service > J2C authentication data . Click New... Enter the following information Alias : vmmAdmin User Id : websphere_admin_user_id Password : websphere_admin_user_password Click Apply to apply your changes. Parent topic: Deploying to a traditional platform Related information Basic Architecture","title":"Manually deploying to WebSphere Application Server"},{"location":"in_migrating_feb.html","text":"Migrating from IBM Forms Experience Builder The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap. The process of upgrading from IBM Forms Experience Builder to HCL Leap is very similar to the instructions given in Upgrading Leap on a traditional platform . However, the default web module context roots have changed from /forms and /forms-basic to /apps and /apps-basic respectively. When upgrading to Leap you will want to ensure that you retain the same URLs used with IBM Forms Experience Builder. When upgrading the EAR in the WebSphere Application Server Administrative console, choose the Detailed option for \u201cHow do you want to install the application?\u201d. When you reach the Map context roots for Web modules step, ensure the Context Root values are the same as what you had previously. Parent topic: Deploying Leap","title":"Migrating from IBM Forms Experience Builder"},{"location":"in_migrating_feb.html#migratingformsexperiencebuilder","text":"The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap. The process of upgrading from IBM Forms Experience Builder to HCL Leap is very similar to the instructions given in Upgrading Leap on a traditional platform . However, the default web module context roots have changed from /forms and /forms-basic to /apps and /apps-basic respectively. When upgrading to Leap you will want to ensure that you retain the same URLs used with IBM Forms Experience Builder. When upgrading the EAR in the WebSphere Application Server Administrative console, choose the Detailed option for \u201cHow do you want to install the application?\u201d. When you reach the Map context roots for Web modules step, ensure the Context Root values are the same as what you had previously. Parent topic: Deploying Leap","title":"Migrating from IBM Forms Experience Builder"},{"location":"in_oracle_creating_db.html","text":"Creating an Oracle database The following steps describe how to manually create an Oracle database for use with Leap. To set up an Oracle database: Log into Oracle SQLPlus using the SYS DBA role. For example, sqlplus / as sysdba. Create three users. Each user is mapped to a schema, where Leap will create tables. ALTER SESSION SET CONTAINER = <Pluggable Database Name>; CREATE USER FREEDOM IDENTIFIED BY <password>; CREATE USER IF\\_CMIS IDENTIFIED BY <password>; CREATE USER APP\\_DATA IDENTIFIED BY <password>; Where <password> is an Oracle accepted password you create. Create the administrator role. Leap accesses the Oracle database through a data source. An administrator is required to establish the connection to the database. CREATE USER <admin> IDENTIFIED BY <password>; Where <admin> is an administrator's user name, and <password> is the administrator's password you create. Set the permissions for the administrative user. The following commands grant all permissions and privileges so the administrative user can access the database. GRANT ALL PRIVILEGES TO <admin>; GRANT EXECUTE ANY PROCEDURE TO <admin>; Set table space quotas for the three users of the schemas. GRANT UNLIMITED TABLESPACE TO FREEDOM; GRANT UNLIMITED TABLESPACE TO IF\\_CMIS; GRANT UNLIMITED TABLESPACE TO APP\\_DATA; GRANT UNLIMITED TABLESPACE TO <admin\\>; The Oracle database is created. Parent topic: Create a Database","title":"Creating an Oracle database"},{"location":"in_oracle_creating_db.html#Creating_Oracle_db","text":"The following steps describe how to manually create an Oracle database for use with Leap. To set up an Oracle database: Log into Oracle SQLPlus using the SYS DBA role. For example, sqlplus / as sysdba. Create three users. Each user is mapped to a schema, where Leap will create tables. ALTER SESSION SET CONTAINER = <Pluggable Database Name>; CREATE USER FREEDOM IDENTIFIED BY <password>; CREATE USER IF\\_CMIS IDENTIFIED BY <password>; CREATE USER APP\\_DATA IDENTIFIED BY <password>; Where <password> is an Oracle accepted password you create. Create the administrator role. Leap accesses the Oracle database through a data source. An administrator is required to establish the connection to the database. CREATE USER <admin> IDENTIFIED BY <password>; Where <admin> is an administrator's user name, and <password> is the administrator's password you create. Set the permissions for the administrative user. The following commands grant all permissions and privileges so the administrative user can access the database. GRANT ALL PRIVILEGES TO <admin>; GRANT EXECUTE ANY PROCEDURE TO <admin>; Set table space quotas for the three users of the schemas. GRANT UNLIMITED TABLESPACE TO FREEDOM; GRANT UNLIMITED TABLESPACE TO IF\\_CMIS; GRANT UNLIMITED TABLESPACE TO APP\\_DATA; GRANT UNLIMITED TABLESPACE TO <admin\\>; The Oracle database is created. Parent topic: Create a Database","title":"Creating an Oracle database"},{"location":"in_overview.html","text":"Deploying Leap This section describes the steps required to upgrade HCL Leap, and the Leap Portlet for use with WebSphere\u00ae Portal. Preparing to deploy This section describes how to prepare to deploy Leap. Kubernetes Helm deployment The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Deploying to a traditional platform The following topics describe how to deploy Leap to a traditional platform. Completing the post-deployment tasks After you run the HCL Leap installer for WebSphere Application Server, you must complete the deployment by setting up the Leap environment. Upgrading The following topics describe how to upgrade Leap. Migrating from IBM Forms Experience Builder The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap.","title":"Deploying"},{"location":"in_overview.html#installingoverview","text":"This section describes the steps required to upgrade HCL Leap, and the Leap Portlet for use with WebSphere\u00ae Portal. Preparing to deploy This section describes how to prepare to deploy Leap. Kubernetes Helm deployment The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Deploying to a traditional platform The following topics describe how to deploy Leap to a traditional platform. Completing the post-deployment tasks After you run the HCL Leap installer for WebSphere Application Server, you must complete the deployment by setting up the Leap environment. Upgrading The following topics describe how to upgrade Leap. Migrating from IBM Forms Experience Builder The following instructions describe how to upgrade from IBM Forms Experience Builder to HCL Leap.","title":"Deploying Leap"},{"location":"in_portlet_selecting_application_using_edit_shared_setting.html","text":"Selecting an application using Edit Shared Setting You can add an HCL Leap application to a WebSphere\u00ae Portal page with the Edit Shared Settings menu option. To permanently set which application is displayed in the Leap Portlet, use the following instructions. To dynamically set the application displayed at run time, see Leap Portlet parameters . To select an application for a WebSphere Portal page, you must have Edit privileges for both the WebSphere Portal page, and the Leap Portlet. Ensure the WebSphere Portal page is in Edit mode. Click the menu icon for the portlet name, and select Edit Shared Settings . The Shared Settings page opens. Update the values on the Edit Shared Settings page: Application URL : Enter the full URL to the application either by typing in the URL, or by clicking Browse and selecting the URL from a list of deployed applications. Preferred Security Mode : The preferred authentication mode to use for applications that support both anonymous and authenticated users. Anonymous only or Authenticated only applications are not affected, and use the authentication mechanism that is supported by the application. The default is to open the application anonymously. The page shows a selected check box for \u201cUse anonymous access when supported by the application\u201d. To open an application with the authentication credential of the current WebSphere Portal user, clear the check box for \u201cUse anonymous access when supported by the application\u201d. Page refesh setting : This setting determines whether the portal page is refreshed when the form is submitted. If your portal page depends on portlet wires, then you must have the page refresh upon form submission. The default is to not refresh the portal page when the form is submitted. Click OK to save your changes.","title":"Selecting an application using Edit Shared Setting {#selectingapplicationsharedsetting .task}"},{"location":"in_portlet_selecting_application_using_edit_shared_setting.html#selectingapplicationsharedsetting","text":"You can add an HCL Leap application to a WebSphere\u00ae Portal page with the Edit Shared Settings menu option. To permanently set which application is displayed in the Leap Portlet, use the following instructions. To dynamically set the application displayed at run time, see Leap Portlet parameters . To select an application for a WebSphere Portal page, you must have Edit privileges for both the WebSphere Portal page, and the Leap Portlet. Ensure the WebSphere Portal page is in Edit mode. Click the menu icon for the portlet name, and select Edit Shared Settings . The Shared Settings page opens. Update the values on the Edit Shared Settings page: Application URL : Enter the full URL to the application either by typing in the URL, or by clicking Browse and selecting the URL from a list of deployed applications. Preferred Security Mode : The preferred authentication mode to use for applications that support both anonymous and authenticated users. Anonymous only or Authenticated only applications are not affected, and use the authentication mechanism that is supported by the application. The default is to open the application anonymously. The page shows a selected check box for \u201cUse anonymous access when supported by the application\u201d. To open an application with the authentication credential of the current WebSphere Portal user, clear the check box for \u201cUse anonymous access when supported by the application\u201d. Page refesh setting : This setting determines whether the portal page is refreshed when the form is submitted. If your portal page depends on portlet wires, then you must have the page refresh upon form submission. The default is to not refresh the portal page when the form is submitted. Click OK to save your changes.","title":"Selecting an application using Edit Shared Setting"},{"location":"in_prep.html","text":"Preparing to deploy This section describes how to prepare to deploy Leap. A database will have to be created and connected to Leap for data storage. Create a Database This section describes how to prepare a database for Leap. Parent topic: Deploying Leap","title":"Preparing to deploy"},{"location":"in_prep.html#installprep","text":"This section describes how to prepare to deploy Leap. A database will have to be created and connected to Leap for data storage. Create a Database This section describes how to prepare a database for Leap. Parent topic: Deploying Leap","title":"Preparing to deploy"},{"location":"in_setting_up_environment.html","text":"Completing the post-deployment tasks After you run the HCL Leap installer for WebSphere\u00ae Application Server, you must complete the deployment by setting up the Leap environment. Ensure that you have the Administrative user ID and password for deployment. WebSphere Application Server installations: The Administrative user ID and Password of your WebSphere Application Server. When you attempt to log in to Leap for the first time, you are shown a setup screen. Following the steps on the setup screen completes the Leap installation. There are two phases to set up the Leap environment: Phase 1 - Basic Environment Setup Phase 2 - Secured Environment Setup Note: To disable this setup page and required admin interaction, add the following property to the Leap_config.properties: ibm.nitro.SetupAll.setupStatus = start Go to the location of your Leap installation. Open a web browser and enter http://hostname:port/apps/ The web browser shows the following message: \u201c HCL Leap is not set up. Until that occurs, all normal requests are disabled. Click Setup to start the setup process.\u201d Click Setup . The Leap setup window opens and automatically runs Phase 1: Basic Environment Setup. To begin Phase 2- Secured Environment Setup, click Continue to Secured Setup . You are shown the Leap log in screen. Log in using the Administrative user ID and Password for WebSphere Application Server After you log in, you are returned to the Leap setup page, and the Secured Setup continues automatically. When the Secured Setup is complete, click Continue to Manager . Leap is now ready to use. If there are any upgrades that must be done, a Fix button is shown. Click Fix to run the required upgrades. Once the upgrades have started, read the on-screen instructions and click Continue to Manager to begin working with Leap. After you have verified that Leap is working, create the these extra table spaces to minimize the database size as applications are created. Connect to the Leap DB2\u00ae as a DB2 administrator. Enter the following commands: CREATE BUFFERPOOL FEB4KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 4 K CREATE LARGE TABLESPACE USERSPACE4K PAGESIZE 4 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB4KBP CREATE BUFFERPOOL FEB8KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 8 K CREATE LARGE TABLESPACE USERSPACE8K PAGESIZE 8 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB8KBP CREATE BUFFERPOOL FEB16KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 16 K CREATE LARGE TABLESPACE USERSPACE16K PAGESIZE 16 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB16KBP Note: This is for DB2 databases only. Parent topic: Deploying Leap Related information Configuring the properties file","title":"Completing the post-deployment tasks"},{"location":"in_setting_up_environment.html#settingupthefebenvironment","text":"After you run the HCL Leap installer for WebSphere\u00ae Application Server, you must complete the deployment by setting up the Leap environment. Ensure that you have the Administrative user ID and password for deployment. WebSphere Application Server installations: The Administrative user ID and Password of your WebSphere Application Server. When you attempt to log in to Leap for the first time, you are shown a setup screen. Following the steps on the setup screen completes the Leap installation. There are two phases to set up the Leap environment: Phase 1 - Basic Environment Setup Phase 2 - Secured Environment Setup Note: To disable this setup page and required admin interaction, add the following property to the Leap_config.properties: ibm.nitro.SetupAll.setupStatus = start Go to the location of your Leap installation. Open a web browser and enter http://hostname:port/apps/ The web browser shows the following message: \u201c HCL Leap is not set up. Until that occurs, all normal requests are disabled. Click Setup to start the setup process.\u201d Click Setup . The Leap setup window opens and automatically runs Phase 1: Basic Environment Setup. To begin Phase 2- Secured Environment Setup, click Continue to Secured Setup . You are shown the Leap log in screen. Log in using the Administrative user ID and Password for WebSphere Application Server After you log in, you are returned to the Leap setup page, and the Secured Setup continues automatically. When the Secured Setup is complete, click Continue to Manager . Leap is now ready to use. If there are any upgrades that must be done, a Fix button is shown. Click Fix to run the required upgrades. Once the upgrades have started, read the on-screen instructions and click Continue to Manager to begin working with Leap. After you have verified that Leap is working, create the these extra table spaces to minimize the database size as applications are created. Connect to the Leap DB2\u00ae as a DB2 administrator. Enter the following commands: CREATE BUFFERPOOL FEB4KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 4 K CREATE LARGE TABLESPACE USERSPACE4K PAGESIZE 4 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB4KBP CREATE BUFFERPOOL FEB8KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 8 K CREATE LARGE TABLESPACE USERSPACE8K PAGESIZE 8 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB8KBP CREATE BUFFERPOOL FEB16KBP IMMEDIATE SIZE 250 AUTOMATIC PAGESIZE 16 K CREATE LARGE TABLESPACE USERSPACE16K PAGESIZE 16 K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL FEB16KBP Note: This is for DB2 databases only. Parent topic: Deploying Leap Related information Configuring the properties file","title":"Completing the post-deployment tasks"},{"location":"in_upgrading.html","text":"Upgrading Leap on a traditional platform The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Download the upgrade package from HCL License Portal. Back up your existing installation prior to installing the update. Back up your DB2\u00ae or Oracle database before you install the update. To back up your current Leap installation: Export the Leap EAR file. Open the WebSphere Application Server Administrative console. Go to Applications > Application Types > WebSphere enterprise applications . Select Leap. Click Export . Click Leap.ear to download the installation file as a backup. After the backup is complete, use the following instructions to install the upgrade file. Stop the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap, and click Stop . Check the version of your currently installed Leap. You need the version number in step 4c. Go to Modules > Display module build Ids . Check the version for the HCL Leap WAR. An example module version is \u201cLeap 9.0.0.0 GA\u201d. Update the Leap installation. Return to Applications > Application Types > WebSphere enterprise applications > Leap , and click Update . In the Application update options , select Replace the entire application . In Specify the path to the replacement ear file , select Local file system , and provide the location of the EAR file you downloaded from HCL License Portal. Click Next . In Preparing for the application update , click Next . Do not change the default settings on the page. On the Install New Application page, go to Step 3: Map resource references to resources . In the javax.mail.Session table, set the Target Resource JDMI Name . Click Browse and select <Leap Mail Session>. In the javax.sql.DataSource table, set the Target Resource JDMI Name . Click Browse and select <Leap Data Source>. Click Next . Go to Step 4: Map virtual hosts for Web modules to validate that both Virtual host names are identical and correct, then click Next . Click Finish to save the update. If Leap is running on nodes that are managed by Deployment Manager, you must synchronize all nodes where Leap is installed. Open the WebSphere Application Server Administrative console. Go to System Administration > Nodes . Select all nodes where Leap is installed. Click Synchronize . When the upgrade is complete, restart the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap. Click Start . If you use Leap with WebSphere Portal, you must update the Leap Portlet. Log in to WebSphere Portal as an administrative user. Go to Portlet Management > Web Modules and locate LeapPortlet.war. Click the Update Web module icon. The Update Web module icon is located to the right of the Web module properties icon. Click Browse to select the updated version of the Leap Portlet, and click Next . Review your changes and click Finish . Parent topic: Upgrading","title":"Upgrading Leap on a traditional platform"},{"location":"in_upgrading.html#upgradingformsexperiencebuilder","text":"The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Download the upgrade package from HCL License Portal. Back up your existing installation prior to installing the update. Back up your DB2\u00ae or Oracle database before you install the update. To back up your current Leap installation: Export the Leap EAR file. Open the WebSphere Application Server Administrative console. Go to Applications > Application Types > WebSphere enterprise applications . Select Leap. Click Export . Click Leap.ear to download the installation file as a backup. After the backup is complete, use the following instructions to install the upgrade file. Stop the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap, and click Stop . Check the version of your currently installed Leap. You need the version number in step 4c. Go to Modules > Display module build Ids . Check the version for the HCL Leap WAR. An example module version is \u201cLeap 9.0.0.0 GA\u201d. Update the Leap installation. Return to Applications > Application Types > WebSphere enterprise applications > Leap , and click Update . In the Application update options , select Replace the entire application . In Specify the path to the replacement ear file , select Local file system , and provide the location of the EAR file you downloaded from HCL License Portal. Click Next . In Preparing for the application update , click Next . Do not change the default settings on the page. On the Install New Application page, go to Step 3: Map resource references to resources . In the javax.mail.Session table, set the Target Resource JDMI Name . Click Browse and select <Leap Mail Session>. In the javax.sql.DataSource table, set the Target Resource JDMI Name . Click Browse and select <Leap Data Source>. Click Next . Go to Step 4: Map virtual hosts for Web modules to validate that both Virtual host names are identical and correct, then click Next . Click Finish to save the update. If Leap is running on nodes that are managed by Deployment Manager, you must synchronize all nodes where Leap is installed. Open the WebSphere Application Server Administrative console. Go to System Administration > Nodes . Select all nodes where Leap is installed. Click Synchronize . When the upgrade is complete, restart the Leap server. Go to Applications > Application Types > WebSphere enterprise applications Select Leap. Click Start . If you use Leap with WebSphere Portal, you must update the Leap Portlet. Log in to WebSphere Portal as an administrative user. Go to Portlet Management > Web Modules and locate LeapPortlet.war. Click the Update Web module icon. The Update Web module icon is located to the right of the Web module properties icon. Click Browse to select the updated version of the Leap Portlet, and click Next . Review your changes and click Finish . Parent topic: Upgrading","title":"Upgrading Leap on a traditional platform"},{"location":"kubernetes_helm_deployment.html","text":"Kubernetes Helm deployment The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Learn how to deploy HCL Leap to a Kubernetes-friendly container platform using Helm. This section provides administrators with all Helm-based deployment tasks to deploy HCL Leap and later releases to supported Kubernetes platforms. This includes preparation, installation, and uninstallation of the deployments using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported. Originally designed by Google, now governed by the Cloud Native Computing Foundation (CNCF) and developed by Google, Red Hat, and many others, Kubernetes is now widely used by organizations of various sizes to run containers in a cloud environment. Preparation This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Install commads to deploy This topic details install commands that are used to deploy HCL Leap Helm Charts. Uninstall Helm deployment To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall. Update the settings of an existing installation This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. Configuring Leap with OIDC This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider. Migrating From WebSphere to Liberty It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. Parent topic: Deploying Leap","title":"Kubernetes Helm deployment"},{"location":"kubernetes_helm_deployment.html#kubernetes_helm_deployment","text":"The Kubernetes container platform allows orchestration features for the automated deployment, coordination, scaling, and management of containerized applications. This deployment mechanism leverages Helm to establish a reliable and repeatable containerized solution. Learn how to deploy HCL Leap to a Kubernetes-friendly container platform using Helm. This section provides administrators with all Helm-based deployment tasks to deploy HCL Leap and later releases to supported Kubernetes platforms. This includes preparation, installation, and uninstallation of the deployments using Helm. Note: Deploying the Leap image without using our provided Helm chart is not recommended and not currently supported. Originally designed by Google, now governed by the Cloud Native Computing Foundation (CNCF) and developed by Google, Red Hat, and many others, Kubernetes is now widely used by organizations of various sizes to run containers in a cloud environment. Preparation This section outlines mandatory and optional tasks that need to be done before installation of the HCL Leap Container and later releases using Helm. Install commads to deploy This topic details install commands that are used to deploy HCL Leap Helm Charts. Uninstall Helm deployment To remove your HCL Leap deployment from your server deployed using Helm, it is recommended that you use Helm uninstall. Update the settings of an existing installation This section describes how to update the configuration of an HCL Leap or later deployment to Kubernetes or OpenShift installed using Helm. Configuring Leap with OIDC This topic describes how to configure an HCL Leap server that was deployed using Helm with an OpenID Connect identity provider. Migrating From WebSphere to Liberty It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. Parent topic: Deploying Leap","title":"Kubernetes Helm deployment"},{"location":"leap_strict_csp.html","text":"Strict CSP HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Strict CSP mode can be enabled using the ibm.nitro.NitroConfig.runtimeCSP configuration parameter. For example: ibm.nitro.NitroConfig.runtimeCSP=script-src 'self' https://trusted.example.com 'nonce-{nonce}'; object-src 'none'; base-uri 'none'; style-src 'self' https://trusted.example.com 'nonce-{nonce}'; The {nonce} token is replaced with a generated, cryptographically strong random nonce when serving up the Leap form\u2019s HTML page. The nonce is applied as an attribute to all <script> and <style> tags on the page. When using the Embedding API , the product is not in control of the page and therefore needs to be informed of the nonce value in the data-leap-config attribute so that it can load the product\u2019s scripts in a secure manner. Furthermore, the value of the data-leap-config attribute must be valid JSON syntax. For example: <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"{ "cspNonce": "ABC123DEF456" "launch": { "appId": "e9ec1ed3-c12b-4b5c-8f5e- 7a6ff4800a55", "formId": "F_Form1", "targetId": "myLeapDiv" } }\"> </script> Limitations Strict CSP only covers the rendering of Leap Forms. This includes fill and submit of a new record, and the update of existing records: As a stand-alone HTML page Embedded within an IFRAME Embedded with the non-IFRAME Embedding API Strict CSP is not applied to any other runtime pages or scenarios, such as App Pages, View Data, or Summary Charts. Strict CSP is not applied to any aspects of Leap\u2019s authoring environment. When using the Embedding API, if you want a callback function to be called after the form has been launched, it cannot be specified in the data-leap-config attribute. It must be supplied by providing as a parameter to Leap.launch() function. JavaScript (.js) files contained in the application will no longer be evaluated in context, therefore the app variable will not be available. The global NitroApplication variable should be used instead. All existing applications must be redeployed if the ibm.nitro.NitroConfig.runtimeCSP config value contains the {nonce} token. In rare cases, some forms may fail to render when Strict CSP is enabled and JavaScript security is enabled (ie. when ibm.nitro.ApplicationCompilerService.secureJS=false is enabled or unset). This depends on the exact product features being used. Errors regarding inline styles will appear in the browser console, however effort has to been made to ensure there are no noticeable side-effects for end-users, with the following exceptions: Styles applied to the content of the Text widget might not be preserved - these would be inline-styles and therefore not allowed by the browser in Strict CSP mode. The Rich Text Entry and Data Grid items will not render with Strict CSP enabled, because of limitations in 3rd-party libraries. Known risks As mentioned above, the non-IFRAME Embedding API does not have control of the page, and therefore needs to be informed of the nonce token by the hosting page. The Embedding API will nullify the cspNonce value once the form launch is complete; however, there will be a short period of time where the nonce is available to other scripts running on the page. It is the responsibility of the customer to ensure that this temporary exposure of the nonce cannot be exploited. As mentioned above, Strict CSP only applies to the rendering of Leap Forms. It is the responsibility of the customer to ensure other product pages (ex. App Pages) are not exposed to an audience that is meant to be protected by Strict CSP. Not all browsers may support CSP equally. It is the responsibility of the customer to ensure the CSP header is configured with suitable fallbacks, if necessary for their user-base. Parent topic: Administering Leap","title":"Strict CSP"},{"location":"leap_strict_csp.html#leap_strict_csp","text":"HCL Leap 9.3.1 has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. Strict CSP mode can be enabled using the ibm.nitro.NitroConfig.runtimeCSP configuration parameter. For example: ibm.nitro.NitroConfig.runtimeCSP=script-src 'self' https://trusted.example.com 'nonce-{nonce}'; object-src 'none'; base-uri 'none'; style-src 'self' https://trusted.example.com 'nonce-{nonce}'; The {nonce} token is replaced with a generated, cryptographically strong random nonce when serving up the Leap form\u2019s HTML page. The nonce is applied as an attribute to all <script> and <style> tags on the page. When using the Embedding API , the product is not in control of the page and therefore needs to be informed of the nonce value in the data-leap-config attribute so that it can load the product\u2019s scripts in a secure manner. Furthermore, the value of the data-leap-config attribute must be valid JSON syntax. For example: <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"{ "cspNonce": "ABC123DEF456" "launch": { "appId": "e9ec1ed3-c12b-4b5c-8f5e- 7a6ff4800a55", "formId": "F_Form1", "targetId": "myLeapDiv" } }\"> </script>","title":"Strict CSP"},{"location":"leap_strict_csp.html#section_gb5_qp3_rvb","text":"Strict CSP only covers the rendering of Leap Forms. This includes fill and submit of a new record, and the update of existing records: As a stand-alone HTML page Embedded within an IFRAME Embedded with the non-IFRAME Embedding API Strict CSP is not applied to any other runtime pages or scenarios, such as App Pages, View Data, or Summary Charts. Strict CSP is not applied to any aspects of Leap\u2019s authoring environment. When using the Embedding API, if you want a callback function to be called after the form has been launched, it cannot be specified in the data-leap-config attribute. It must be supplied by providing as a parameter to Leap.launch() function. JavaScript (.js) files contained in the application will no longer be evaluated in context, therefore the app variable will not be available. The global NitroApplication variable should be used instead. All existing applications must be redeployed if the ibm.nitro.NitroConfig.runtimeCSP config value contains the {nonce} token. In rare cases, some forms may fail to render when Strict CSP is enabled and JavaScript security is enabled (ie. when ibm.nitro.ApplicationCompilerService.secureJS=false is enabled or unset). This depends on the exact product features being used. Errors regarding inline styles will appear in the browser console, however effort has to been made to ensure there are no noticeable side-effects for end-users, with the following exceptions: Styles applied to the content of the Text widget might not be preserved - these would be inline-styles and therefore not allowed by the browser in Strict CSP mode. The Rich Text Entry and Data Grid items will not render with Strict CSP enabled, because of limitations in 3rd-party libraries.","title":"Limitations"},{"location":"leap_strict_csp.html#section_zbc_jq3_rvb","text":"As mentioned above, the non-IFRAME Embedding API does not have control of the page, and therefore needs to be informed of the nonce token by the hosting page. The Embedding API will nullify the cspNonce value once the form launch is complete; however, there will be a short period of time where the nonce is available to other scripts running on the page. It is the responsibility of the customer to ensure that this temporary exposure of the nonce cannot be exploited. As mentioned above, Strict CSP only applies to the rendering of Leap Forms. It is the responsibility of the customer to ensure other product pages (ex. App Pages) are not exposed to an audience that is meant to be protected by Strict CSP. Not all browsers may support CSP equally. It is the responsibility of the customer to ensure the CSP header is configured with suitable fallbacks, if necessary for their user-base. Parent topic: Administering Leap","title":"Known risks"},{"location":"migrating_websphere_liberty.html","text":"Migrating From WebSphere to Liberty It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. The most common parts of a Leap deployment are the following: Database LDAP Mail server Each of these three parts are external to Leap and will be configured in the deploy-values.yaml file as described in Customized deployment . Since the database contains all the Leap applications, once it is connected to Leap 9.3.2 on Open Liberty they will be accessible. Note: Once the database has been connected to version 9.3.2, it will no longer work for Leap 9.3.1. Leap on Open Liberty works best if the login attribute is set to the 'mail' attribute. If your existing WebSphere deployment is using a different login attribute then some additional steps will need to be taken. All of the Leap users are identified by their login id, if the attribute for that login id changes then when a user authenticates with Leap on Open Liberty for the first time (using their mail attribute) they would be seen as a new user and not automatically associated with their previous account. In this case you will need to manually update all the users in the FREEDOM.USERS table (before allowing them to access the system), changing their LOGIN_ID value to the value of their email address. The SQL statement looks like the following: UPDATE FREEDOM.USERS SET LOGIN_ID = '<email of user>' WHERE LOGIN_ID = '<old login attribute>'; The new Open Liberty image and associated Helm charts for Leap 9.3.2 are not backward-compatible with Leap 9.3.1. Do not use the same values.yaml file for Helm that you may have used with Leap 9.3.1. Customizations applied through the WebSphere Application Server admin console, may need to be reapplied using snippets of XML according to Open Liberty's configuration technique (see https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html .)). This additional configuration can be supplied as \"overrides\" in Leap 9.3.2's Helm charts. For more information, see Customized deployment . The persistent volumes defined for use with the Leap 9.3.1 container are not the same for Leap 9.3.2. When upgrading to Leap 9.3.2, create new persistent volumes. For more information, see Prerequisite - Specifying persistant volumes . Parent topic: Kubernetes Helm deployment","title":"Migrating From WebSphere to Liberty"},{"location":"migrating_websphere_liberty.html#migrating_websphere_liberty","text":"It is possible to migrate from Leap on a WebSphere platform to Leap on Open Liberty. The most common parts of a Leap deployment are the following: Database LDAP Mail server Each of these three parts are external to Leap and will be configured in the deploy-values.yaml file as described in Customized deployment . Since the database contains all the Leap applications, once it is connected to Leap 9.3.2 on Open Liberty they will be accessible. Note: Once the database has been connected to version 9.3.2, it will no longer work for Leap 9.3.1. Leap on Open Liberty works best if the login attribute is set to the 'mail' attribute. If your existing WebSphere deployment is using a different login attribute then some additional steps will need to be taken. All of the Leap users are identified by their login id, if the attribute for that login id changes then when a user authenticates with Leap on Open Liberty for the first time (using their mail attribute) they would be seen as a new user and not automatically associated with their previous account. In this case you will need to manually update all the users in the FREEDOM.USERS table (before allowing them to access the system), changing their LOGIN_ID value to the value of their email address. The SQL statement looks like the following: UPDATE FREEDOM.USERS SET LOGIN_ID = '<email of user>' WHERE LOGIN_ID = '<old login attribute>'; The new Open Liberty image and associated Helm charts for Leap 9.3.2 are not backward-compatible with Leap 9.3.1. Do not use the same values.yaml file for Helm that you may have used with Leap 9.3.1. Customizations applied through the WebSphere Application Server admin console, may need to be reapplied using snippets of XML according to Open Liberty's configuration technique (see https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html .)). This additional configuration can be supplied as \"overrides\" in Leap 9.3.2's Helm charts. For more information, see Customized deployment . The persistent volumes defined for use with the Leap 9.3.1 container are not the same for Leap 9.3.2. When upgrading to Leap 9.3.2, create new persistent volumes. For more information, see Prerequisite - Specifying persistant volumes . Parent topic: Kubernetes Helm deployment","title":"Migrating From WebSphere to Liberty"},{"location":"openliberty_customized_deploy.html","text":"Customized deployment The following are the most common changes needed for a production deployment: Specify persistent volumes Change admin credentials Configure a database Configure an SMTP server Configure an LDAP Define Custom Service Configurations Modify Leap properties Encoding passwords All passwords passed in the .yaml file should be encoded. You can encode a password using a utility provided by Open Liberty. To access this utility in your kubernetes environment use the command: kubectl -n dxns exec -it leap-deployment-leap-0 -- /opt/openliberty/wlp/bin/securityUtility encode <thePassword> The result of the command will be a string value like {xor}Kzc6Dz4sLCgwLTs= . Use this encoded value when specifying a password. Change server Admin credentials This is optional. The credentials supplied below are used in the container startup to run configuration tasks and setup Leap. The default credentials are set to leapadmin for username and password. To change the default admin, add this snippet to your .yaml file and update the adminUser and adminPassword properties. security: leap: adminUser: \"leapadmin\" adminPassword: \"leapadmin\" SAML configuration The Leap Helm chart and container offer a basic SAML configuration through the Helm values. This can be used to enable SAML, deploy the WebSphereSamlSP.ear, configure the ACS URL, pass the IdP Metadata of the identity provider and add trusted realms. Note: Please note that this configuration can currently only be used to enable the SAML TAI SSO. To disable it, please set the enabled flag to false and remove the Trust Association manually in WebSphere. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. The ssoId9999 is used to create the SAML TAI SSO.Example configuration: security: leap: saml: enabled: true acsUrl: \"https://native-kube-kevin.team-q-dev.com:9443/samlsps/acs\" idpMetadata: | <EntityDescriptor xmlns=\"urn:oasis:names:tc:SAML:2.0:metadata\" ID=\"SAMLtestIdP\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:shibmd=\"urn:mace:shibboleth:metadata:1.0\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:mdui=\"urn:oasis:names:tc:SAML:metadata:ui\" validUntil=\"2100-01-01T00:00:42Z\" entityID=\"https://samltest.id/saml/idp\"> <IDPSSODescriptor protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol urn:mace:shibboleth:1.0\"> <Extensions> <shibmd:Scope regexp=\"false\">samltest.id</shibmd:Scope> <mdui:UIInfo> <mdui:DisplayName xml:lang=\"en\">SAMLtest IdP</mdui:DisplayName> <mdui:Description xml:lang=\"en\">A free and basic IdP for testing SAML deployments</mdui:Description> <mdui:Logo height=\"90\" width=\"225\">https://samltest.id/saml/logo.png</mdui:Logo> </mdui:UIInfo> </Extensions> <KeyDescriptor use=\"signing\"> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate> ... </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </KeyDescriptor> <ArtifactResolutionService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:SOAP\" Location=\"https://samltest.id/idp/profile/SAML2/SOAP/ArtifactResolution\" index=\"1\" /> <SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://samltest.id/idp/profile/SAML2/Redirect/SLO\"/> <SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://samltest.id/idp/profile/SAML2/POST/SLO\"/> <SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign\" Location=\"https://samltest.id/idp/profile/SAML2/POST-SimpleSign/SLO\"/> <SingleSignOnService Binding=\"urn:mace:shibboleth:1.0:profiles:AuthnRequest\" Location=\"https://samltest.id/idp/profile/Shibboleth/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://samltest.id/idp/profile/SAML2/POST/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign\" Location=\"https://samltest.id/idp/profile/SAML2/POST-SimpleSign/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://samltest.id/idp/profile/SAML2/Redirect/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:SOAP\" Location=\"https://samltest.id/idp/profile/SAML2/SOAP/ECP\"/> </IDPSSODescriptor> </EntityDescriptor> Certificates The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore. Open Liberty server customizations The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | <server description=\"leapServer\"> <basicregistry id=\"leapRegistry\" realm=\"basicRealm\"> <user name=\"newuser1\" password=\"passw0rd\" </basicRegistry> </server> There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details. Connecting to a DB2 Instance The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <authData id=\"db2AuthAlias\" user=\"db2inst1\" password=\"diet4coke\" /> <library id=\"jdbcDB2\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"db2jcc4.jar db2jcc_license_cu.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\" statementCacheSize=\"30\" containerAuthDataRef=\"db2AuthAlias\"> <properties.db2.jcc databaseName=\"LEAPDB\" driverType=\"4\" serverName=\"db2server.acme.com\" portNumber=\"50000\" fullyMaterializeLobData=\"false\" progressiveStreaming=\"2\" sslConnection=\"true\" streamBufferSize=\"2097152\" isolationLevel=\"2\" /> <jdbcDriver libraryRef=\"jdbcDB2\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"10\" minPoolSize=\"1\" reapTime=\"180\" maxIdleTime=\"1800\" agedTimeout=\"7200\" purgePolicy=\"EntirePool\"/> </dataSource> </server> Connecting to an Oracle Instance The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcOracle\" > <fileset dir=\"${server.config.dir}/lib\" includes='ojdbc8.jar' /> </library> <dataSource id=\"leapDataSource\" jndiName=\"jdbc/BuilderDataSource\" containerAuthDataRef=\"oracleAuthAlias\"> <jdbcDriver libraryRef=\"jdbcOracle\"/> <properties.oracle URL=\"jdbc:oracle:thin:@leap-oracle-db.example.com:1521/orclpdb1\"/> <connectionManager minPoolSize=\"0\" maxPoolSize=\"10\" maxIdleTime=\"10m\" purgePolicy=\"ValidateAllConnections\" /> </dataSource> <authData id=\"oracleAuthAlias\" user=\"leap_admin\" password=\"{xor}KDozPDAyOm5tbA==\" /> </server> Connecting to a PostgreSQL database The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcPostgreSQL\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"postgresql-42.6.0.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\"> <properties.postgresql serverName=\"postgresql.acme.com\" databaseName=\"leapDB\" portNumber=\"5432\" user=\"dbuser\" password=\"dbpassword\" /> <jdbcDriver libraryRef=\"jdbcPostgreSQL\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"100\" minPoolSize=\"1\" numConnectionsPerThreadLocal=\"1\" /> </dataSource> </server> Connecting to an STMP Server Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | <server description=\"leapServer\"> <mailSession host=\"smtphost.com\" from=\"no-reply@smtphost.com\" jndiName=\"mail/BuilderMailSession\" description=\"Leap MailSession\" mailSessionID=\"leapMail\" user=\"smtpUser\" password=\"smtpPassword\"> <property name=\"mail.smtp.auth\" value=\"false\" /> <property name=\"mail.smtp.port\" value=\"25\" /> </mailSession> </server> Connecting to an LDAP Server Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | <server description=\"leapServer\"> <federatedRepository id=\"fedrepo\"> <primaryRealm name=\"FEDREALM\"> <participatingBaseEntry name=\"dc=Acme\"/> <userSecurityNameMapping outputProperty=\"mail\" /> <groupSecurityNameMapping outputProperty=\"cn\" /> </primaryRealm> </federatedRepository> <ldapRegistry id=\"OpenLdap\" name=\"dc=Acme\" ldapType=\"Custom\" host=\"ldaphost.acme.com\" port=\"389\" baseDN=\"dc=Acme\" searchTimeout=\"8m\" ignoreCase=\"true\" bindDN=\"cn=Manager,dc=Acme\" bindPassword=\"secret\" sslEnabled=\"false\" derefAliases=\"never\"> <loginProperty name=\"mail\"></loginProperty> <ldapEntityType name=\"PersonAccount\"> <objectClass>inetOrgPerson</objectClass> <searchBase>ou=People,dc=Acme</searchBase> </ldapEntityType> <ldapEntityType name=\"Group\"> <objectClass>groupOfUniqueNames</objectClass> <searchBase>ou=Groups,dc=Acme</searchBase> </ldapEntityType> <customFilters userIdMap=\"*:mail\" groupIdMap=\"*:cn\" groupMemberIdMap=\"*:uniqueMember\" userFilter=\"(&(mail=%v)(objectclass=inetOrgPerson))\" groupFilter=\"(&(cn=%v)(objectclass=groupOfUniqueNames))\"/> </ldapRegistry> </server> Configure SSL behavior The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | <ssl id=\"defaultSSLConfig\" trustDefaultCerts=\"true\" /> Service Catalog The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>sample-service-description</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Sample service Description</name> <description xml:lang=\"en\"></description> . . . </serviceDescription> Leap Properties The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo = <div>Welcome to <b>HCL Leap 9.3.2</b> in Kubernetes!</div> ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties . JVM options JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\" Changing the log level Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest Assigning User's to Leap Roles Leap has several application-level roles that control who can access different features. You must map Administrative users and Edit Application users to an appropriate realm. SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers, and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers, and EditApplicationUsers roles. Otherwise, leave this role unmapped. configuration: leap: roleMapping: SuperAdminUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] EditApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] AdministrativeUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] UseApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: [] MappedGroups: [] AllAuthenticatedInTrustedRealms: true MappedUsersAccessIDs: [] MappedGroupsAccessIDs: []","title":"Customized deployment {#openliberty_customized_deploy .concept}"},{"location":"openliberty_customized_deploy.html#openliberty_customized_deploy","text":"The following are the most common changes needed for a production deployment: Specify persistent volumes Change admin credentials Configure a database Configure an SMTP server Configure an LDAP Define Custom Service Configurations Modify Leap properties","title":"Customized deployment"},{"location":"openliberty_customized_deploy.html#section_ev2_553_hxb","text":"All passwords passed in the .yaml file should be encoded. You can encode a password using a utility provided by Open Liberty. To access this utility in your kubernetes environment use the command: kubectl -n dxns exec -it leap-deployment-leap-0 -- /opt/openliberty/wlp/bin/securityUtility encode <thePassword> The result of the command will be a string value like {xor}Kzc6Dz4sLCgwLTs= . Use this encoded value when specifying a password.","title":"Encoding passwords"},{"location":"openliberty_customized_deploy.html#section_edb_2js_gxb","text":"This is optional. The credentials supplied below are used in the container startup to run configuration tasks and setup Leap. The default credentials are set to leapadmin for username and password. To change the default admin, add this snippet to your .yaml file and update the adminUser and adminPassword properties. security: leap: adminUser: \"leapadmin\" adminPassword: \"leapadmin\"","title":"Change server Admin credentials"},{"location":"openliberty_customized_deploy.html#section_g5g_x5s_gxb","text":"The Leap Helm chart and container offer a basic SAML configuration through the Helm values. This can be used to enable SAML, deploy the WebSphereSamlSP.ear, configure the ACS URL, pass the IdP Metadata of the identity provider and add trusted realms. Note: Please note that this configuration can currently only be used to enable the SAML TAI SSO. To disable it, please set the enabled flag to false and remove the Trust Association manually in WebSphere. The idpMetadata accepts IdP Metadata in xml format. Please use the multiline string feature of Helm to pass this value. The ssoId9999 is used to create the SAML TAI SSO.Example configuration: security: leap: saml: enabled: true acsUrl: \"https://native-kube-kevin.team-q-dev.com:9443/samlsps/acs\" idpMetadata: | <EntityDescriptor xmlns=\"urn:oasis:names:tc:SAML:2.0:metadata\" ID=\"SAMLtestIdP\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:shibmd=\"urn:mace:shibboleth:metadata:1.0\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:mdui=\"urn:oasis:names:tc:SAML:metadata:ui\" validUntil=\"2100-01-01T00:00:42Z\" entityID=\"https://samltest.id/saml/idp\"> <IDPSSODescriptor protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol urn:mace:shibboleth:1.0\"> <Extensions> <shibmd:Scope regexp=\"false\">samltest.id</shibmd:Scope> <mdui:UIInfo> <mdui:DisplayName xml:lang=\"en\">SAMLtest IdP</mdui:DisplayName> <mdui:Description xml:lang=\"en\">A free and basic IdP for testing SAML deployments</mdui:Description> <mdui:Logo height=\"90\" width=\"225\">https://samltest.id/saml/logo.png</mdui:Logo> </mdui:UIInfo> </Extensions> <KeyDescriptor use=\"signing\"> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate> ... </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </KeyDescriptor> <ArtifactResolutionService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:SOAP\" Location=\"https://samltest.id/idp/profile/SAML2/SOAP/ArtifactResolution\" index=\"1\" /> <SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://samltest.id/idp/profile/SAML2/Redirect/SLO\"/> <SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://samltest.id/idp/profile/SAML2/POST/SLO\"/> <SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign\" Location=\"https://samltest.id/idp/profile/SAML2/POST-SimpleSign/SLO\"/> <SingleSignOnService Binding=\"urn:mace:shibboleth:1.0:profiles:AuthnRequest\" Location=\"https://samltest.id/idp/profile/Shibboleth/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://samltest.id/idp/profile/SAML2/POST/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign\" Location=\"https://samltest.id/idp/profile/SAML2/POST-SimpleSign/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://samltest.id/idp/profile/SAML2/Redirect/SSO\"/> <SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:SOAP\" Location=\"https://samltest.id/idp/profile/SAML2/SOAP/ECP\"/> </IDPSSODescriptor> </EntityDescriptor>","title":"SAML configuration"},{"location":"openliberty_customized_deploy.html#section_x5j_x5s_gxb","text":"The customCertificateSecrets parameter can be used to reference certificates or keys that might be required for SSL communication to the Leap server, the LDAP server, the database, or other services. Changes to the keystores require a restart of the container. The following is an example of creating a new Secret from TLS Key and Certificate files: kubectl create secret tls myTlsCertSecret --key=\"certificate.key\" --cert=\"certificate.crt\" The following is an example of adding a DB2 SSL certificate to another Secret: kubectl create secret generic myDb2SslSecret --from-file=mydbservercert.arm configuration: leap: customCertificateSecrets: myTlsCertSecret: \"myTlsCertSecret\" myDb2SslSecret: \"myDb2SslSecret\" This adds the certificates and key to the keystore with the id\u202fdefaultKeyStore\u202fwhich can then be referenced in the\u202fserver.xml\u202for any overrides. The\u202fdefaultKeyStore\u202fis also used as the default by many configuration elements in Open Liberty that require a keystore.","title":"Certificates"},{"location":"openliberty_customized_deploy.html#section_pqj_3ts_gxb","text":"The configOverrideFiles parameter allows configuration snippets to be passed to the Leap server. The snippets are merged into the Open Liberty server.xml. After making changes to the .yaml, apply them using the helm upgrade ... command. Changes are picked up by Open Liberty and applied at runtime - this does not require a restart. Note: The name of the customization (myCustomOverride1 in the following snippet) can be any string, but you may want it to be descriptive of what is being provided. configuration: leap: configOverrideFiles: myCustomOverride1: | <server description=\"leapServer\"> <basicregistry id=\"leapRegistry\" realm=\"basicRealm\"> <user name=\"newuser1\" password=\"passw0rd\" </basicRegistry> </server> There are several configuration changes that you may need to add to complete your deployment: SMTP, Database, LDAP. Sample snippets have been provided, which will need to be updated with your specific details. Connecting to a DB2 Instance The DB2 jdbc driver has been included and can be found at ${server.config.dir}/lib. configuration: leap: configOverrideFiles: db2Override: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <authData id=\"db2AuthAlias\" user=\"db2inst1\" password=\"diet4coke\" /> <library id=\"jdbcDB2\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"db2jcc4.jar db2jcc_license_cu.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\" statementCacheSize=\"30\" containerAuthDataRef=\"db2AuthAlias\"> <properties.db2.jcc databaseName=\"LEAPDB\" driverType=\"4\" serverName=\"db2server.acme.com\" portNumber=\"50000\" fullyMaterializeLobData=\"false\" progressiveStreaming=\"2\" sslConnection=\"true\" streamBufferSize=\"2097152\" isolationLevel=\"2\" /> <jdbcDriver libraryRef=\"jdbcDB2\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"10\" minPoolSize=\"1\" reapTime=\"180\" maxIdleTime=\"1800\" agedTimeout=\"7200\" purgePolicy=\"EntirePool\"/> </dataSource> </server> Connecting to an Oracle Instance The oracle jdbc driver has been included and can be found at ${server.config.dir}/lib. Note: To connect over SSL, complete the following steps: change the URL to: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(PORT=2484)(HOST=leap-oracle-db.example.com))(CONNECT_DATA=(SERVICE_NAME=orclpdb1))) You will need to update the host and service name for your database instance. Create a secret for the SSL certificate used by the Oracle instance. Specify the connection properties that point to the trust or key store that contain the certificate used by your Oracle instance ${shared.resource.dir}/security/key.p12 Below is an example snippet for configuring the Leap application to use an Oracle database. configuration: leap: configOverrideFiles: oracleOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcOracle\" > <fileset dir=\"${server.config.dir}/lib\" includes='ojdbc8.jar' /> </library> <dataSource id=\"leapDataSource\" jndiName=\"jdbc/BuilderDataSource\" containerAuthDataRef=\"oracleAuthAlias\"> <jdbcDriver libraryRef=\"jdbcOracle\"/> <properties.oracle URL=\"jdbc:oracle:thin:@leap-oracle-db.example.com:1521/orclpdb1\"/> <connectionManager minPoolSize=\"0\" maxPoolSize=\"10\" maxIdleTime=\"10m\" purgePolicy=\"ValidateAllConnections\" /> </dataSource> <authData id=\"oracleAuthAlias\" user=\"leap_admin\" password=\"{xor}KDozPDAyOm5tbA==\" /> </server> Connecting to a PostgreSQL database The PostgreSQL jdbc driver has been included and can be found at ${server.config.dir}/lib. leap: configOverrideFiles: postgreSQLOverride: | <server description=\"leapServer\"> <!-- Disable the hard-coded derby datasource --> <dataSource id=\"leapDerbyDatasource\" jndiName=\"disabled\" statementCacheSize=\"10\" /> <library id=\"jdbcPostgreSQL\" > <fileset dir =\"${server.config.dir}/lib\" includes=\"postgresql-42.6.0.jar\" /> </library> <dataSource id=\"febDataSource\" jndiName=\"jdbc/BuilderDataSource\"> <properties.postgresql serverName=\"postgresql.acme.com\" databaseName=\"leapDB\" portNumber=\"5432\" user=\"dbuser\" password=\"dbpassword\" /> <jdbcDriver libraryRef=\"jdbcPostgreSQL\"/> <connectionManager connectionTimeout=\"180\" maxPoolSize=\"100\" minPoolSize=\"1\" numConnectionsPerThreadLocal=\"1\" /> </dataSource> </server> Connecting to an STMP Server Below is an example snippet of configuring Leap to use a mail server. The smtphost will need to be replaced with the proper hostname of the mail server. If authentication is required to communicate with the mail server then replace smtpUser and smtpPassword with the correct values, otherwise remove those likes from the snippet. configuration: leap: configOverrideFiles: mailOverride: | <server description=\"leapServer\"> <mailSession host=\"smtphost.com\" from=\"no-reply@smtphost.com\" jndiName=\"mail/BuilderMailSession\" description=\"Leap MailSession\" mailSessionID=\"leapMail\" user=\"smtpUser\" password=\"smtpPassword\"> <property name=\"mail.smtp.auth\" value=\"false\" /> <property name=\"mail.smtp.port\" value=\"25\" /> </mailSession> </server> Connecting to an LDAP Server Below is an example snippet of configuring Leap to use an LDAP server as part of a federated repository. The baseDN, bindDN and bindPassword will need to be replaced with the proper values. The searchBase for the ldap entity types will also need to be updated. The participatingBaseEntry will need to match the baseDN defined in the LDAP server snippet. Note: The userSecurityNameMapping and groupSecurityNameMapping are required. These properties control how users and groups are displayed while using Leap. Note: For Leap to be able to send mail the loginProperty must be set to mail. configuration: leap: configOverrideFiles: ldapOverride: | <server description=\"leapServer\"> <federatedRepository id=\"fedrepo\"> <primaryRealm name=\"FEDREALM\"> <participatingBaseEntry name=\"dc=Acme\"/> <userSecurityNameMapping outputProperty=\"mail\" /> <groupSecurityNameMapping outputProperty=\"cn\" /> </primaryRealm> </federatedRepository> <ldapRegistry id=\"OpenLdap\" name=\"dc=Acme\" ldapType=\"Custom\" host=\"ldaphost.acme.com\" port=\"389\" baseDN=\"dc=Acme\" searchTimeout=\"8m\" ignoreCase=\"true\" bindDN=\"cn=Manager,dc=Acme\" bindPassword=\"secret\" sslEnabled=\"false\" derefAliases=\"never\"> <loginProperty name=\"mail\"></loginProperty> <ldapEntityType name=\"PersonAccount\"> <objectClass>inetOrgPerson</objectClass> <searchBase>ou=People,dc=Acme</searchBase> </ldapEntityType> <ldapEntityType name=\"Group\"> <objectClass>groupOfUniqueNames</objectClass> <searchBase>ou=Groups,dc=Acme</searchBase> </ldapEntityType> <customFilters userIdMap=\"*:mail\" groupIdMap=\"*:cn\" groupMemberIdMap=\"*:uniqueMember\" userFilter=\"(&(mail=%v)(objectclass=inetOrgPerson))\" groupFilter=\"(&(cn=%v)(objectclass=groupOfUniqueNames))\"/> </ldapRegistry> </server> Configure SSL behavior The default behavior of Open Liberty is that it will not trust any default certificates, which are typically included in all mainstream browsers. By providing this config setting, the default certificates will be trusted enabling communication with third-party services. configuration: leap: configOverrideFiles: sslOverride: | <ssl id=\"defaultSSLConfig\" trustDefaultCerts=\"true\" />","title":"Open Liberty server customizations"},{"location":"openliberty_customized_deploy.html#section_jbb_r5s_gxb","text":"The serviceCatalog parameter can be used to pass service descriptions to Leap, which will be picked up by Leap automatically. Each service definition in the .yaml is made up of a label and the xml content of the service description. The XML content will be copied into a file and placed in the service catalog. For more information on creating service descriptions, see Service Description . Example: configuration: leap: serviceCatalog: sampleServiceDescription.xml: | <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>sample-service-description</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Sample service Description</name> <description xml:lang=\"en\"></description> . . . </serviceDescription>","title":"Service Catalog"},{"location":"openliberty_customized_deploy.html#section_ynm_t5s_gxb","text":"The leapProperties parameter can be used to add or modify properties to Leap. Note: The property ibm.nitro.NitroConfig.loginIdIsEmail must be added and set to true. Below is an example snippet of setting leap-specific properties: configuration: leap: leapProperties: | ibm.nitro.InfoEntryPoint.dailyInfo = <div>Welcome to <b>HCL Leap 9.3.2</b> in Kubernetes!</div> ibm.nitro.NitroConfig.serverURI=http://myleapserver.example.com ibm.nitro.NitroConfig.loginIdIsEmail = true For more information, see Configuration properties .","title":"Leap Properties"},{"location":"openliberty_customized_deploy.html#section_dc2_rjz_gxb","text":"JVM options can be specified by passing them as environment variables. The snippet below sets the maximum jvm memory usage to 2GB. environment: pod: leap: name: JVM_MAX value: \"-Xmx2048m\"","title":"JVM options"},{"location":"openliberty_customized_deploy.html#section_nfl_hhh_hxb","text":"Sometimes you may need to increase the log level to troubleshoot unexpected behavior. Below is an example of how to change the log level. logging: leap: level: Leap:*=detail:com.ibm.form.nitro.*=finest","title":"Changing the log level"},{"location":"openliberty_customized_deploy.html#section_tm4_n53_hxb","text":"Leap has several application-level roles that control who can access different features. You must map Administrative users and Edit Application users to an appropriate realm. SuperAdminUsers - Super Administrative Users are users, or groups, with administrator privileges for all Leap applications without explicit security settings. AdministrativeUsers - Administrative users are able to set up the Leap server. You must have an Administrative User to complete the installation process. EditApplicationUsers - Authenticated users that can design, deploy, and use Leap applications. UseApplicationsUsers - Authenticated users that can use deployed Leap applications. All users in the AdministrativeUsers, and EditApplicationUsers automatically have access to use deployed applications. Only adjust this setting if you want to allow a broader set of users than those listed in the AdministrativeUsers, and EditApplicationUsers roles. Otherwise, leave this role unmapped. configuration: leap: roleMapping: SuperAdminUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] EditApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] AdministrativeUsers: Everyone: false AllAuthenticated: false MappedUsers: - leapadmin MappedGroups: [] AllAuthenticatedInTrustedRealms: false MappedUsersAccessIDs: [] MappedGroupsAccessIDs: [] UseApplicationsUsers: Everyone: false AllAuthenticated: false MappedUsers: [] MappedGroups: [] AllAuthenticatedInTrustedRealms: true MappedUsersAccessIDs: [] MappedGroupsAccessIDs: []","title":"Assigning User's to Leap Roles"},{"location":"ovr_overview.html","text":"Overview HCL Leap builds dynamic forms and applications with a web-based interface. From a single interface, you can design a form, define access privileges, create workflow stages, deploy the application, and review submitted results. Leap makes creating forms easier than before by dramatically reducing the time and effort that is required to deliver compelling, interactive applications. The simple web-based user interface allows a web designer to quickly assemble a series of application screens for web forms. You can also capture data into a relational database and orchestrate notifications with an integrated workflow. Data that is captured in Leap is easily integrated into existing line-of-business systems with a drag-and-drop web service interface. When users submit forms, you can view summary charts, inspect collected responses, or export data records to a spreadsheet program for detailed analysis.","title":"Overview"},{"location":"ovr_overview.html#overview","text":"HCL Leap builds dynamic forms and applications with a web-based interface. From a single interface, you can design a form, define access privileges, create workflow stages, deploy the application, and review submitted results. Leap makes creating forms easier than before by dramatically reducing the time and effort that is required to deliver compelling, interactive applications. The simple web-based user interface allows a web designer to quickly assemble a series of application screens for web forms. You can also capture data into a relational database and orchestrate notifications with an integrated workflow. Data that is captured in Leap is easily integrated into existing line-of-business systems with a drag-and-drop web service interface. When users submit forms, you can view summary charts, inspect collected responses, or export data records to a spreadsheet program for detailed analysis.","title":"Overview"},{"location":"ovr_release_notes.html","text":"Leap release notes These release notes provide a summary of new features, installation information, and descriptions of known limitations, problems, and workarounds. Category Description Link About this release New features What's New System requirements System requirements Leap system requirements Installation, migration, upgrade, and configuration information Installation instructions Deploying Leap Known limitations, problems, and workarounds Troubleshooting, Limitations, problems, and workarounds Troubleshooting Contacting customer support Customer support Leap flashes, alerts, and bulletins","title":"Release Notes"},{"location":"ovr_release_notes.html#releasenotes","text":"These release notes provide a summary of new features, installation information, and descriptions of known limitations, problems, and workarounds. Category Description Link About this release New features What's New System requirements System requirements Leap system requirements Installation, migration, upgrade, and configuration information Installation instructions Deploying Leap Known limitations, problems, and workarounds Troubleshooting, Limitations, problems, and workarounds Troubleshooting Contacting customer support Customer support Leap flashes, alerts, and bulletins","title":"Leap release notes"},{"location":"prepare_config_helm.html","text":"Prepare configuration Create a configuration file that fits the needs of your target HCL Leap Container deployment. The configuration file is the heart of your deployment using Helm. It defines how HCL Leap is deployed to supported platforms, and how it behaves during runtime operations. This section explains how to create your own configuration file and how to leverage the existing values.yaml inside the Helm Chart. It also explains how to optionally overwrite settings in case the default set may not be sufficient. Note: Modification to any files (chart.yaml, templates) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported. The configuration flow Helm provides multiple ways to define values that can be processed to run an installation. Processing involves a three-step approach, that is ordered sequentially within a hierarchy. Helm Chart values.yaml Every Helm Chart contains a values.yaml file. It defines all configurable parameters that a Helm Chart accepts and the default values that are used during an installation. If you do not provide any other configuration during an installation, Helm extracts all deployment information from the values.yaml file inside the Helm Chart. All parameters that were not overwritten using any other configuration methods return to their default values from the values.yaml file inside the Helm Chart. Custom value file Helm provides you with a way to maintain your own custom values files. You can specify a custom values file you want to use when running an installation. This custom values file only needs to contain the parameters that you want to overwrite with your preferred settings. Note: There is no need to have the same complete set of parameters inside your custom values file, as there are available by default in the Helm Chart values.yaml. As outlined previously in this section, everything that is not defined in your custom values file are applied using the defaults from values.yaml inside the Helm Charts. Be aware that the parameters you can configure using your custom values file need to exactly align with those provided by the Helm Charts own values.yaml. You cannot configure anything that is not exposed in the values.yaml definition. Override parameters It is possible to define values using a --set parameter in the Helm CLI during the installation of a Helm Chart. Since there are many values that can be configured in the HCL Leap deployment, we do not recommend this technique, since it makes installation commands very large and confusing. The default HCL Leap Container values.yaml file HCL Leap Helm Chart provides a default values.yaml, which contains all possible configuration parameters. To access this file, you may use the following command when you have the HCL Leap or later Helm Chart tar.gz file on hand: # Command to show values from Helm Chart helm show values hcl-leap-deployment.tar.gz What appears in the console is all the configurable parameters and their default values. A custom configuration file Helm allows you to provide a custom configuration file during the installation or upgrade process. That file only overwrites settings that are defined within it. For parts of the configuration that are not defined in your custom configuration file, Helm returns to the default values in the values.yaml file inside the Leap Helm Chart. This allows you to keep the overall size of your configuration file small and the maintainability high. This documentation refers to the custom configuration file as custom-values.yaml. You may name your custom configuration file as preferred. Note: Including all of the parameters from the values.yaml is not necessary and may bloat your configuration file with values that are already present in the Leap Helm Chart. Only specify what you want to change from its default value. Parent topic: Preparation","title":"Prepare configuration"},{"location":"prepare_config_helm.html#prepare_config_helm","text":"Create a configuration file that fits the needs of your target HCL Leap Container deployment. The configuration file is the heart of your deployment using Helm. It defines how HCL Leap is deployed to supported platforms, and how it behaves during runtime operations. This section explains how to create your own configuration file and how to leverage the existing values.yaml inside the Helm Chart. It also explains how to optionally overwrite settings in case the default set may not be sufficient. Note: Modification to any files (chart.yaml, templates) in hcl-leap-deployment-vX.X.X_XXXXXXXX-XXXX.tar.gz is not supported.","title":"Prepare configuration"},{"location":"prepare_config_helm.html#section_imf_zh4_hzb","text":"Helm provides multiple ways to define values that can be processed to run an installation. Processing involves a three-step approach, that is ordered sequentially within a hierarchy.","title":"The configuration flow"},{"location":"prepare_config_helm.html#section_mkj_134_hzb","text":"Every Helm Chart contains a values.yaml file. It defines all configurable parameters that a Helm Chart accepts and the default values that are used during an installation. If you do not provide any other configuration during an installation, Helm extracts all deployment information from the values.yaml file inside the Helm Chart. All parameters that were not overwritten using any other configuration methods return to their default values from the values.yaml file inside the Helm Chart.","title":"Helm Chart values.yaml"},{"location":"prepare_config_helm.html#section_rmd_d34_hzb","text":"Helm provides you with a way to maintain your own custom values files. You can specify a custom values file you want to use when running an installation. This custom values file only needs to contain the parameters that you want to overwrite with your preferred settings. Note: There is no need to have the same complete set of parameters inside your custom values file, as there are available by default in the Helm Chart values.yaml. As outlined previously in this section, everything that is not defined in your custom values file are applied using the defaults from values.yaml inside the Helm Charts. Be aware that the parameters you can configure using your custom values file need to exactly align with those provided by the Helm Charts own values.yaml. You cannot configure anything that is not exposed in the values.yaml definition.","title":"Custom value file"},{"location":"prepare_config_helm.html#section_e5x_h34_hzb","text":"It is possible to define values using a --set parameter in the Helm CLI during the installation of a Helm Chart. Since there are many values that can be configured in the HCL Leap deployment, we do not recommend this technique, since it makes installation commands very large and confusing.","title":"Override parameters"},{"location":"prepare_config_helm.html#section_ftl_k34_hzb","text":"HCL Leap Helm Chart provides a default values.yaml, which contains all possible configuration parameters. To access this file, you may use the following command when you have the HCL Leap or later Helm Chart tar.gz file on hand: # Command to show values from Helm Chart helm show values hcl-leap-deployment.tar.gz What appears in the console is all the configurable parameters and their default values.","title":"The default HCL Leap Container values.yaml file"},{"location":"prepare_config_helm.html#section_z5g_434_hzb","text":"Helm allows you to provide a custom configuration file during the installation or upgrade process. That file only overwrites settings that are defined within it. For parts of the configuration that are not defined in your custom configuration file, Helm returns to the default values in the values.yaml file inside the Leap Helm Chart. This allows you to keep the overall size of your configuration file small and the maintainability high. This documentation refers to the custom configuration file as custom-values.yaml. You may name your custom configuration file as preferred. Note: Including all of the parameters from the values.yaml is not necessary and may bloat your configuration file with values that are already present in the Leap Helm Chart. Only specify what you want to change from its default value. Parent topic: Preparation","title":"A custom configuration file"},{"location":"ref_application_object.html","text":"Application objects Table 1. Application Object (app) The Leap application object provides access to information relevant to the whole application. Object Description Example app.getAppPage\\(appPageId\\) Returns the user interface app page object for the provided var myAppPage = app.getAppPage(\u201cAP_Welcome\u201d); app.getAppPageURL(appPageId, appUid) Returns the URL for navigating directly to the app page for the provided app page id and application uid. Note: The appUid parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. app.getAppURL\\(\\) Returns the URL for navigating directly to the application. Note: The application will load the form or app page defined in the \u201cHome Page\u201d field on the Settings tab. app.getChartsURL\\(formId, appUid\\) Returns the URL for navigating directly to the charts page of the form for the provided form uid and application uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getChartsURL(form.getId(), app.getUID()); app.getCurrentUser\\(\\) Returns the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. To populate the current user's login name into a field in the form, place the following statement in the onLoad event of the form: Note: The following code must be entered as a single line. //change F_SingleLine to the ID of the desired field BO.F_SingleLine.setValue(app.getCurrentUser()); app.getCurrentUserId\\(\\) Returns the user's \"identifier\" - the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. app.getCurrentUserEmail\\(\\) Returns the user's email. app.getCurrentUserDisplayName\\(\\) |Returns the user's full display name. Ex. \"Eduardo Ram\u00edrez L\u00f3pez\". app.getCurrentUserInfo\\(\\) Returns the object containing the attributes of the current user. For example: {id: \"pflorez123\", email: \"Pedro.Flores@example.com\", displayName: \"Pedro Flores\", userType: \"owner\"} Note: Not all attributes are available in all deployments. In that case, some of these values will be null. userType ** \u2013 possible values: \"owner\" \u2013 if current user is the app owner \"guest\" \u2013 if the current user is anonymous \"\" \\(empty string\\) \u2013 in all other cases app.getCurrentUserRoles Returns a comma-separated list of all the roles for which the current user is a member. For example: item.setValue(app.getCurrentUserRoles()); app.getFileBaseURL\\(\\) Returns the relative URL to the current browser page where all files that are uploaded into the application at design time are stored. This does not include images and CSS files. All files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/files/ app.getForm\\(formID\\) Returns the user interface form object for the provided formID. If used to return a form that is not shown or loaded, then the object that is returned is not fully operational and should be used for hooking up dynamic event handlers only. Register an event listener to a service in order to do something when it returns: var form = app.getForm('F_Form1'); var service = form.getServiceConfiguration('SC_ServiceConfig0'); service.connectEvent('onCallFinished', function(pSuccess) { alert('call finished'); }); app.getFormLaunchURL\\(formId, appUid\\) Returns the URL for navigating directly to the form for the provided application uid and form uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getFormLaunchURL(); var url = app.getFormLaunchURL(form.getId()); var url = app.getFormLaunchURL(form.getId(), app.getUID()); app.getImageBaseURL\\(\\) Returns the relative URL to the current browser page where all images that are uploaded into the application at design time are stored. All images are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/image/ app.getLocale\\(\\) Returns the current locale of the application, according to the application's settings or the current user's preferences. The returned value is a locale code, in accordance with [Tags for the Identification of Languages \\(RFC 3066\\)](https://www.ietf.org/rfc/rfc3066.txt). app.getLocation\\(callbackFunction, highAccuracy\\) Allows the form designer to get the current user's location. callbackFunction - the callback that occurs after the location request finishes. The designer must define the function to have one argument which will be assigned a Position object if the location request was successful, or null if the request was unsuccessful. Inside the function the designer can assign location attributes to different fields. Five values can be accessed: position.coords.latitude position.coords.longitude position.coords.accuracy position.coords.altitude position.coords.altitudeAccuracy More information in [https://developer.mozilla.org/en-US/docs/Web/API/Position/](https://developer.mozilla.org/en-US/docs/Web/API/Position/). highAccuracy - a boolean value that requests a high accuracy location from the browser if true. See [https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy). Set the value of F\\_SingleLine1 to the current location: ``` var highAccuracy = true; var myCallbackFunction = function (position) { if (position !== null) { BO.F_SingleLine1.setValue(position.coords.latitude+\", \"+position.coords.longitude); } else { alert(\"Location request failed\"); } }; app.getLocation(myCallbackFunction,highAccuracy); </tr> <tr> <td>app.getProductBaseURL\\(\\) <td>Returns the host and context of the Leap server. <td> var url = app.getProductBaseURL(); </tr> <td>app.getRecordURL\\(recordUid, formId, appUid\\) <td>Returns the URL for navigating directly to the record. <b>Note:</b> All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. <td> var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId()); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId(), app.getUID()); </tr> </table> |app.getSharedData\\(\\)|Returns a JavaScript\u2122 object that can be easily accessed from all custom JavaScript code on the form, and is the suggested location to share data, or create reusable functions.|Create some data and functions to be used later:``` app.getSharedData().titleToShow = 'Welcome Form'; app.getSharedData().addTwoValues = function(v1,v2) { return v1 + v2; }; Example of referencing the established variable and function:``` BO.F_SingleLine.setValue(app.getSharedData().titleToShow); BO.F_Number.setValue(app.getSharedData().addTwoValues(5, 5)); | |app.getStyleBaseURL\\(\\)|Returns the relative URL to the current browser page where all CSS style files that are uploaded into the application at design time are stored. All css files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/styles/| | |app.getSuppressWarning\\(\\)|Gets the current set value for suppressing the warning. See setSuppressWarning for information.|``` var suppressWarning = app.getSuppressWarning(); if(suppressWarning === false) app.setSuppressWarning(true); | |app.getUID\\(\\)|The UID of the application|Can be used to create a link to another form ``` page.F_StaticWebLink.setLinkValue(BO.F_ServerURL.getValue() + '/apps/secure/1/app/' + app.getUID() + '/launch/index.html?form=F_Form2')); | |app.getUrlParameter\\(parm\\)|Looks up a single parameter.|``` var param= app.getUrlParameter('debug') if(param === 'true') alert('Shown only when debug param is present'); | |app.getUrlParameters\\(\\)|Returns an object with all URL parameters.|``` var params = app.getUrlParameters(); if(params.CustomWarning) alert(params.CustomWarning); | |app.getViewDataURL\\(appUid\\)|Returns the URL for navigating directly to the View Data page. **Note:** The parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. |``` var url = app.getViewDataURL(); var url = app.getViewDataURL(app.getUID()); | |app.isCurrentUserInRole\\(roleName\\)|Returns true if the current user is a member of the provided role, otherwise false.**Note:** The function does not validate the role with the provided roleName, therefore if the role does not exist false is returned. |For example:``` item.setValue(app.isCurrentUserInRole(\"Manager\")); | |app.isSingleFormView\\(\\)|Returns true if the form is shown by itself in the browser and false if it is shown in view data.| | |app.openApp\\(appUid, newTab\\)|Opens the home page of an application. The current app is used if you do not supply an app id. If \u201cnewTab\u201d is \u201ctrue\u201d, the app is presented in a new browser tab. The default behavior is for the application to be opened in a new tab. |``` app.openApp(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); app.openApp (\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, true); app.openApp (app.getUID(), false); | |app.openAppPage\\(appPageId, appUid, newTab\\)|Opens the app page of an application that matches the provided *appPageid*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openAppPage(\u2018AP_Page1\u2019); app.openAppPage (\u2018AP_Page1\u2019, true); app.openAppPage (\u2018AP_Page1\u2019, false); | |app.openForm\\(formId, appUid, newTab\\)|Opens the form of an application that matches the provided *formId*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openForm(\u2018F_Form1\u2019); app.openForm(\u2018F_Form1\u2019, true); app.openForm (\u2018F_Form1\u2019, false); | |openRecord\\(recordUid, formId, appUid, newTab\\)|Opens the record of a form that matches the provided *recordId* and *formId*. **Note:** formId, appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, true); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, \u2018zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz\u2019, false); | |app.setSuppressWarning\\(pSuppress\\)|If a user interacts with a form, or JavaScript, they are prompted with a warning message whenever the current browser page tries to navigate to a different URL. This function allows the suppression of that warning. When set to true the message is suppressed until it is set to false again|Can be used at any scope, for example in the application onStart, form onLoad, onItemChange, etc.``` app.setSuppressWarning(true); | |app.showMessage\\(title, message, type, subtitle\\) |Allow usage of a built-in dialog for end-user messages. title: The title to display in the dialog title bar. message: The message text to display. type \\(optional\\): can be one of \"info\", \"success\", \"warn\", or \"error\" and results in appropriate icon being displayed. If type is absent or not one of these values, then no icon will be displayed. subtitle \\(optional\\): Heading text for the message. |``` app.showMessage (\"Error found in data\", \"The booking date cannot be after the event.\", \"error\", \"Please change the booking or event date, then re-submit.\"); ``` | **Parent topic: **[Interface objects](ref_jsapi_user_interface_objects.md)","title":"Application objects"},{"location":"ref_application_object.html#application-objects","text":"Table 1. Application Object (app) The Leap application object provides access to information relevant to the whole application. Object Description Example app.getAppPage\\(appPageId\\) Returns the user interface app page object for the provided var myAppPage = app.getAppPage(\u201cAP_Welcome\u201d); app.getAppPageURL(appPageId, appUid) Returns the URL for navigating directly to the app page for the provided app page id and application uid. Note: The appUid parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. app.getAppURL\\(\\) Returns the URL for navigating directly to the application. Note: The application will load the form or app page defined in the \u201cHome Page\u201d field on the Settings tab. app.getChartsURL\\(formId, appUid\\) Returns the URL for navigating directly to the charts page of the form for the provided form uid and application uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getChartsURL(form.getId(), app.getUID()); app.getCurrentUser\\(\\) Returns the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. To populate the current user's login name into a field in the form, place the following statement in the onLoad event of the form: Note: The following code must be entered as a single line. //change F_SingleLine to the ID of the desired field BO.F_SingleLine.setValue(app.getCurrentUser()); app.getCurrentUserId\\(\\) Returns the user's \"identifier\" - the identifying name of the currently logged in user. The identifying name is the property as defined by the ibm.was.MemberManager.userProps.id property that is located in the Leap\\_config.properties file. For example, uid , cn , mail , displayName . If the Initiator Role is set to Anonymous User , then the function returns the string \u201cAnonymous Guest User\u201d. app.getCurrentUserEmail\\(\\) Returns the user's email. app.getCurrentUserDisplayName\\(\\) |Returns the user's full display name. Ex. \"Eduardo Ram\u00edrez L\u00f3pez\". app.getCurrentUserInfo\\(\\) Returns the object containing the attributes of the current user. For example: {id: \"pflorez123\", email: \"Pedro.Flores@example.com\", displayName: \"Pedro Flores\", userType: \"owner\"} Note: Not all attributes are available in all deployments. In that case, some of these values will be null. userType ** \u2013 possible values: \"owner\" \u2013 if current user is the app owner \"guest\" \u2013 if the current user is anonymous \"\" \\(empty string\\) \u2013 in all other cases app.getCurrentUserRoles Returns a comma-separated list of all the roles for which the current user is a member. For example: item.setValue(app.getCurrentUserRoles()); app.getFileBaseURL\\(\\) Returns the relative URL to the current browser page where all files that are uploaded into the application at design time are stored. This does not include images and CSS files. All files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/files/ app.getForm\\(formID\\) Returns the user interface form object for the provided formID. If used to return a form that is not shown or loaded, then the object that is returned is not fully operational and should be used for hooking up dynamic event handlers only. Register an event listener to a service in order to do something when it returns: var form = app.getForm('F_Form1'); var service = form.getServiceConfiguration('SC_ServiceConfig0'); service.connectEvent('onCallFinished', function(pSuccess) { alert('call finished'); }); app.getFormLaunchURL\\(formId, appUid\\) Returns the URL for navigating directly to the form for the provided application uid and form uid. Note: All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. var url = app.getFormLaunchURL(); var url = app.getFormLaunchURL(form.getId()); var url = app.getFormLaunchURL(form.getId(), app.getUID()); app.getImageBaseURL\\(\\) Returns the relative URL to the current browser page where all images that are uploaded into the application at design time are stored. All images are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/image/ app.getLocale\\(\\) Returns the current locale of the application, according to the application's settings or the current user's preferences. The returned value is a locale code, in accordance with [Tags for the Identification of Languages \\(RFC 3066\\)](https://www.ietf.org/rfc/rfc3066.txt). app.getLocation\\(callbackFunction, highAccuracy\\) Allows the form designer to get the current user's location. callbackFunction - the callback that occurs after the location request finishes. The designer must define the function to have one argument which will be assigned a Position object if the location request was successful, or null if the request was unsuccessful. Inside the function the designer can assign location attributes to different fields. Five values can be accessed: position.coords.latitude position.coords.longitude position.coords.accuracy position.coords.altitude position.coords.altitudeAccuracy More information in [https://developer.mozilla.org/en-US/docs/Web/API/Position/](https://developer.mozilla.org/en-US/docs/Web/API/Position/). highAccuracy - a boolean value that requests a high accuracy location from the browser if true. See [https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy). Set the value of F\\_SingleLine1 to the current location: ``` var highAccuracy = true; var myCallbackFunction = function (position) { if (position !== null) { BO.F_SingleLine1.setValue(position.coords.latitude+\", \"+position.coords.longitude); } else { alert(\"Location request failed\"); } }; app.getLocation(myCallbackFunction,highAccuracy); </tr> <tr> <td>app.getProductBaseURL\\(\\) <td>Returns the host and context of the Leap server. <td> var url = app.getProductBaseURL(); </tr> <td>app.getRecordURL\\(recordUid, formId, appUid\\) <td>Returns the URL for navigating directly to the record. <b>Note:</b> All parameters are optional. If you do not supply a parameter, it will be set to the object in the current scope. <td> var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId()); var url = app.getRecordURL(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, form.getId(), app.getUID()); </tr> </table> |app.getSharedData\\(\\)|Returns a JavaScript\u2122 object that can be easily accessed from all custom JavaScript code on the form, and is the suggested location to share data, or create reusable functions.|Create some data and functions to be used later:``` app.getSharedData().titleToShow = 'Welcome Form'; app.getSharedData().addTwoValues = function(v1,v2) { return v1 + v2; }; Example of referencing the established variable and function:``` BO.F_SingleLine.setValue(app.getSharedData().titleToShow); BO.F_Number.setValue(app.getSharedData().addTwoValues(5, 5)); | |app.getStyleBaseURL\\(\\)|Returns the relative URL to the current browser page where all CSS style files that are uploaded into the application at design time are stored. All css files are saved as anonymous resources that can be viewed by anyone. An example url is ../../../../../anon/1/content/8.6.0.363/97eeb588-2fff-49a7-89c1-5000885dafb4/1421171344944-2/desktop/en/en/en/desktop/styles/| | |app.getSuppressWarning\\(\\)|Gets the current set value for suppressing the warning. See setSuppressWarning for information.|``` var suppressWarning = app.getSuppressWarning(); if(suppressWarning === false) app.setSuppressWarning(true); | |app.getUID\\(\\)|The UID of the application|Can be used to create a link to another form ``` page.F_StaticWebLink.setLinkValue(BO.F_ServerURL.getValue() + '/apps/secure/1/app/' + app.getUID() + '/launch/index.html?form=F_Form2')); | |app.getUrlParameter\\(parm\\)|Looks up a single parameter.|``` var param= app.getUrlParameter('debug') if(param === 'true') alert('Shown only when debug param is present'); | |app.getUrlParameters\\(\\)|Returns an object with all URL parameters.|``` var params = app.getUrlParameters(); if(params.CustomWarning) alert(params.CustomWarning); | |app.getViewDataURL\\(appUid\\)|Returns the URL for navigating directly to the View Data page. **Note:** The parameter is optional. If you do not supply a parameter, it will be set to the object in the current scope. |``` var url = app.getViewDataURL(); var url = app.getViewDataURL(app.getUID()); | |app.isCurrentUserInRole\\(roleName\\)|Returns true if the current user is a member of the provided role, otherwise false.**Note:** The function does not validate the role with the provided roleName, therefore if the role does not exist false is returned. |For example:``` item.setValue(app.isCurrentUserInRole(\"Manager\")); | |app.isSingleFormView\\(\\)|Returns true if the form is shown by itself in the browser and false if it is shown in view data.| | |app.openApp\\(appUid, newTab\\)|Opens the home page of an application. The current app is used if you do not supply an app id. If \u201cnewTab\u201d is \u201ctrue\u201d, the app is presented in a new browser tab. The default behavior is for the application to be opened in a new tab. |``` app.openApp(\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019); app.openApp (\u2018d1f6eb71-9483-479c-8d47-dd30bd7e9de9\u2019, true); app.openApp (app.getUID(), false); | |app.openAppPage\\(appPageId, appUid, newTab\\)|Opens the app page of an application that matches the provided *appPageid*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openAppPage(\u2018AP_Page1\u2019); app.openAppPage (\u2018AP_Page1\u2019, true); app.openAppPage (\u2018AP_Page1\u2019, false); | |app.openForm\\(formId, appUid, newTab\\)|Opens the form of an application that matches the provided *formId*. **Note:** appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openForm(\u2018F_Form1\u2019); app.openForm(\u2018F_Form1\u2019, true); app.openForm (\u2018F_Form1\u2019, false); | |openRecord\\(recordUid, formId, appUid, newTab\\)|Opens the record of a form that matches the provided *recordId* and *formId*. **Note:** formId, appUid and newTab are optional. If you do not supply a parameter, it will be set to the object in the current scope. The default behavior is for the application to be opened in a new tab. |``` app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, true); app.openRecord(\u2018xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\u2019, \u2018yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy\u2019, \u2018zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz\u2019, false); | |app.setSuppressWarning\\(pSuppress\\)|If a user interacts with a form, or JavaScript, they are prompted with a warning message whenever the current browser page tries to navigate to a different URL. This function allows the suppression of that warning. When set to true the message is suppressed until it is set to false again|Can be used at any scope, for example in the application onStart, form onLoad, onItemChange, etc.``` app.setSuppressWarning(true); | |app.showMessage\\(title, message, type, subtitle\\) |Allow usage of a built-in dialog for end-user messages. title: The title to display in the dialog title bar. message: The message text to display. type \\(optional\\): can be one of \"info\", \"success\", \"warn\", or \"error\" and results in appropriate icon being displayed. If type is absent or not one of these values, then no icon will be displayed. subtitle \\(optional\\): Heading text for the message. |``` app.showMessage (\"Error found in data\", \"The booking date cannot be after the event.\", \"error\", \"Please change the booking or event date, then re-submit.\"); ``` | **Parent topic: **[Interface objects](ref_jsapi_user_interface_objects.md)","title":"Application objects"},{"location":"ref_customized_css.html","text":"Creating customized Cascading Style Sheets You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Elements are assigned specific class names, prefaced by lf in the custom theme. The following code is an example of a Leap custom theme. /* Form - centered with a drop shadow*/ .lfMn .lfAppFormArea .lfFormBox { -moz-box-shadow: 5px 5px 12px #AEA4A4; -webkit-box-shadow: 5px 5px 12px #AEA4A4; box-shadow: 5px 5px 12px #AEA4A4; margin-right: auto; margin-left: auto; } /* Text (item titles) - medium blue */ .lfMn .lfFormLabel { color: #094291 !important; } /* Section - title bar red background and white text */ .lfMn .lfFormFieldSectionTitle { background: #cd111f !important; color: white !important; font-size: 13px !important; font-weight: bold !important; } .lfMn .lfFormFieldSectionTitle .lfFormLabel { color: white !important; } /* Tabs - dark-blue background with white text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTab { background:#1556a8; border-top-color:#666; border-right-color:#666; border-left-color:#666; } .lfMn .lfFormFieldTabFolder .lfFormFieldTab * { color: white; } /* Tabs (selected) - white background with black text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedHover, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedError { background: white; border-top-color:#ccc; border-right-color:#ccc; border-left-color:#ccc; } .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked * { color: #222 !important; } /* Button (Submit) - light blue background */ .lfMn .lfFormBtn.lfFormActionSubmitBtn { font-size: 12px; background: #93bef3; border: 1px solid #222; font-weight: bold; } .lfMn .lfFormBtn.lfFormActionSubmitBtn * { font-weight: bold; } /* Button (Page Navigation) - dark blue background with white text*/ .lfMn .lfPageNavigation .lfFormBtn { background: #1556a8 !important; border: 1px solid #222; } .lfMn .lfPageNavigation .lfFormBtn *, .lfMn .lfPageNavigation .lfFormBtn * { color: white !important; font-weight: bold; } Class Names View Data layout Class names for the View Data layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfAppOverviewArea .lfBanner .lfFormTitleBar .lfMn.lfAppArea The following graphic shows where the class names for various parts of the View Data section are located. Single form launch layout Class names for the Single form launch layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfBanner .lfFormBody .lfFormBox .lfFormFooter .lfFormTitleBar .lfMn.lfSingleFormArea The following graphic shows where the class names for various parts of the Single form launch layout are located. Form items - general General class names are: .lfFormField .lfFormFieldError .lfFormFieldHint .lfFormFieldRequiredMarker .lfFormLabel The following graphic shows where the class names for general form items are located. In addition to the general lfFormField class, each form item has a unique class name: Attachment \u2013 lfFormFieldAttachment Button \u2013 lfFormFieldButton Check box \u2013 lfFormFieldCheckBox Choice Slider - lfFormFieldChoiceSlider Currency \u2013 lfFormFieldCurrency Date \u2013 lfFormFieldDate Drop-down \u2013 lfFormFieldDropDown Email \u2013 lfFormFieldEmail HTML fragment \u2013 lfFormFieldHTML Image \u2013 lfFormFieldImage Line \u2013 lfFormFieldHorizontalLine Media \u2013 lfFormFieldMedia Multi-line entry \u2013 lfFormFieldParagraph Number \u2013 lfFormFieldNumber Numeric Slider - lfFormFieldHorizontalSlider Page navigator \u2013 lfFormFieldPageNavigator Password \u2013 lfFormFieldPassword Text \u2013 lfFormFieldRichText Section \u2013 lfFormFieldSection Select many \u2013 lfFormFieldSelectMany Select one \u2013 lfFormFieldSelectOne Single-line entry \u2013 lfFormFieldSingleLine Survey \u2013 lfFormFieldSurvey Tabbed folder \u2013 lfFormFieldTabFolder Table \u2013 lfFormFieldTable Time \u2013 lfFormFieldTime Time stamp \u2013 lfFormFieldTimestamp Web link \u2013 lfFormFieldStaticWeblink Website \u2013 lfFormFieldWebSiteAddress Required form items also have an extra lfFormFieldRequired class. The lfFormFieldInvalid class is added to form items that are invalid. Section Class names for Section are: .lfFormFieldSection .lfFormFieldSectionBody .lfFormFieldSectionTitle The following graphic shows where the class names used in creating a Section are located. Survey Class names for Survey are: .lfFormFieldSurvey .lfFormFieldSurveyQuestion .lfFormFieldSurveyQuestionText .lfFormFieldSurveyTable .lfFormFieldSurveyTitle .lfFormRequired The following graphic shows where the class names used in creating a Survey are located. Tabbed Folder Class names for Tabbed Folder are: .lfFormFieldTab .lfFormFieldTabChecked .lfFormFieldTabContent .lfFormFieldTabFolder The following graphic shows where the class names used in creating a Tabbed Folder are located. Buttons Class names for Buttons are: .lfFormBtn .lfFormActionBtn .lfFormActionCancelBtn .lfFormActionSubmitBtn .lfFormBackBtn .lfFormFieldButton .lfFormNextBtn .lfPageNavigation The following graphic shows where the class names for creating buttons on a form are located. Dialogs Class names for Dialogs are: .lfDialog .lfDialogContent .lfDialogFooter .lfDialogTitle The following graphic shows where the class names for creating dialog windows are located. Usage details Your custom CSS is the last style sheet that is applied in an application. However, you must ensure that your CSS rules are more specific (higher weighted) than the ones already specified in the base CSS rules. In some cases, you must append the !important declaration to your rules to override the Leap base rules. For example, to change the font color of all item titles use .lfMn .lfFormLabel {color: #094291 !important}. In some cases you must add the universal, \u201c*\u201d, selector to your rules. For example, to change the font color of all buttons use .lfMn .lfFormBtn * {color: white} To reference image files that are contained within the same application, use a relative URL of ../image/.... For example, to reference the image named background.jpg contained within your application, use url('../image/background.jpg'). For more information about referencing image files within an application, see Managing the files associated with your application Note: Pop-up menus and dialogs are direct childs of the main body, even when they appear to be otherwise. These child menus and dialogs must be styled to match the main body. Best Practices There are no technical limitations to the CSS rules that can be applied to a form; however there are the following best practices: All CSS rules must begin with the .lfMn class selector. This is important for forms that might be shown within the context of another web page, such as in the IBM\u00ae WebSphere\u00ae Portal environment. Base your CSS rules around class names that are prefixed with \u201clf\u201d. For example: lfFormFieldSingleLine. These class names that are likely to remain consistent between Leap releases. Your custom styles are not restricted, so you must be specific with your selectors. Selectors that are too broad affect all aspects of theLeap interface, including all dialogs and all elements within the View Data interface. Your CSS must target the browsers that are supported by Leap. If possible, avoid CSS rules that affect the size and positioning of elements. You might want to specify some custom padding and margins, but it is your responsibility to ensure that no erroneous cropping or extra scroll-bars are displayed. We recommend that you limit your theme to the following properties: background color background image \u2013 typically for background gradients color font font size border \u2013 typically none or one pixel width Styling individual form items Each item on the form is assigned a unique class name. The syntax for this class name is <form id>-<page id>-<item id>. For example, a class name of F_Form1-P_Page1-F_EmailAddress is applied to the item with an ID of F_EmailAddress , on the page with an ID of P_Page1 , on the form with an ID of F_Form1 . You can use these unique class names to style specific items in your application. Note: It is possible that two separate applications each have an item with the same unique class name. Using custom CSS class names You can assign a custom CSS class name to any form, page, item, or stage action button in your application. You can then use the custom CSS class names in your custom theme. Setting custom CSS class names is done in the Properties side panel. Specify the custom class names, which are separated by spaces, in the Custom CSS class names field. Custom class names can also be added to, or removed from, items dynamically with the JavaScript\u2122 API. Testing your custom CSS changes Use a CSS development tool to test your custom CSS changes. Most web browsers contain such a tool, which you can use to discover the wanted styling class. You can even make CSS rule modifications online, so you immediately see how a change affects the form visually. After the rules are determined, copy them to your custom CSS file for uploading into your Leap application. If you do not have access to a CSS development tool, an alternative approach is to place the CSS file on a web server. Reference the web location when you add the CSS file to your Leap application. You can modify the CSS file on the web server, then refresh the Leap application to pick up the changes. This approach quickly tests style changes without requiring you to repeatedly upload a new CSS file into your application, save the application, and then redeploy. Parent topic: Reference","title":"Creating customized Cascading Style Sheets"},{"location":"ref_customized_css.html#customizedcascadingstylesheets","text":"You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Elements are assigned specific class names, prefaced by lf in the custom theme. The following code is an example of a Leap custom theme. /* Form - centered with a drop shadow*/ .lfMn .lfAppFormArea .lfFormBox { -moz-box-shadow: 5px 5px 12px #AEA4A4; -webkit-box-shadow: 5px 5px 12px #AEA4A4; box-shadow: 5px 5px 12px #AEA4A4; margin-right: auto; margin-left: auto; } /* Text (item titles) - medium blue */ .lfMn .lfFormLabel { color: #094291 !important; } /* Section - title bar red background and white text */ .lfMn .lfFormFieldSectionTitle { background: #cd111f !important; color: white !important; font-size: 13px !important; font-weight: bold !important; } .lfMn .lfFormFieldSectionTitle .lfFormLabel { color: white !important; } /* Tabs - dark-blue background with white text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTab { background:#1556a8; border-top-color:#666; border-right-color:#666; border-left-color:#666; } .lfMn .lfFormFieldTabFolder .lfFormFieldTab * { color: white; } /* Tabs (selected) - white background with black text */ .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedHover, .lfMn.lotusui .lfFormFieldTabFolder .lfFormFieldTabCheckedError { background: white; border-top-color:#ccc; border-right-color:#ccc; border-left-color:#ccc; } .lfMn .lfFormFieldTabFolder .lfFormFieldTabChecked * { color: #222 !important; } /* Button (Submit) - light blue background */ .lfMn .lfFormBtn.lfFormActionSubmitBtn { font-size: 12px; background: #93bef3; border: 1px solid #222; font-weight: bold; } .lfMn .lfFormBtn.lfFormActionSubmitBtn * { font-weight: bold; } /* Button (Page Navigation) - dark blue background with white text*/ .lfMn .lfPageNavigation .lfFormBtn { background: #1556a8 !important; border: 1px solid #222; } .lfMn .lfPageNavigation .lfFormBtn *, .lfMn .lfPageNavigation .lfFormBtn * { color: white !important; font-weight: bold; }","title":"Creating customized Cascading Style Sheets"},{"location":"ref_customized_css.html#class-names","text":"View Data layout Class names for the View Data layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfAppOverviewArea .lfBanner .lfFormTitleBar .lfMn.lfAppArea The following graphic shows where the class names for various parts of the View Data section are located. Single form launch layout Class names for the Single form launch layout are: .lfAppForm .lfAppFormArea .lfAppMainArea .lfBanner .lfFormBody .lfFormBox .lfFormFooter .lfFormTitleBar .lfMn.lfSingleFormArea The following graphic shows where the class names for various parts of the Single form launch layout are located. Form items - general General class names are: .lfFormField .lfFormFieldError .lfFormFieldHint .lfFormFieldRequiredMarker .lfFormLabel The following graphic shows where the class names for general form items are located. In addition to the general lfFormField class, each form item has a unique class name: Attachment \u2013 lfFormFieldAttachment Button \u2013 lfFormFieldButton Check box \u2013 lfFormFieldCheckBox Choice Slider - lfFormFieldChoiceSlider Currency \u2013 lfFormFieldCurrency Date \u2013 lfFormFieldDate Drop-down \u2013 lfFormFieldDropDown Email \u2013 lfFormFieldEmail HTML fragment \u2013 lfFormFieldHTML Image \u2013 lfFormFieldImage Line \u2013 lfFormFieldHorizontalLine Media \u2013 lfFormFieldMedia Multi-line entry \u2013 lfFormFieldParagraph Number \u2013 lfFormFieldNumber Numeric Slider - lfFormFieldHorizontalSlider Page navigator \u2013 lfFormFieldPageNavigator Password \u2013 lfFormFieldPassword Text \u2013 lfFormFieldRichText Section \u2013 lfFormFieldSection Select many \u2013 lfFormFieldSelectMany Select one \u2013 lfFormFieldSelectOne Single-line entry \u2013 lfFormFieldSingleLine Survey \u2013 lfFormFieldSurvey Tabbed folder \u2013 lfFormFieldTabFolder Table \u2013 lfFormFieldTable Time \u2013 lfFormFieldTime Time stamp \u2013 lfFormFieldTimestamp Web link \u2013 lfFormFieldStaticWeblink Website \u2013 lfFormFieldWebSiteAddress Required form items also have an extra lfFormFieldRequired class. The lfFormFieldInvalid class is added to form items that are invalid. Section Class names for Section are: .lfFormFieldSection .lfFormFieldSectionBody .lfFormFieldSectionTitle The following graphic shows where the class names used in creating a Section are located. Survey Class names for Survey are: .lfFormFieldSurvey .lfFormFieldSurveyQuestion .lfFormFieldSurveyQuestionText .lfFormFieldSurveyTable .lfFormFieldSurveyTitle .lfFormRequired The following graphic shows where the class names used in creating a Survey are located. Tabbed Folder Class names for Tabbed Folder are: .lfFormFieldTab .lfFormFieldTabChecked .lfFormFieldTabContent .lfFormFieldTabFolder The following graphic shows where the class names used in creating a Tabbed Folder are located. Buttons Class names for Buttons are: .lfFormBtn .lfFormActionBtn .lfFormActionCancelBtn .lfFormActionSubmitBtn .lfFormBackBtn .lfFormFieldButton .lfFormNextBtn .lfPageNavigation The following graphic shows where the class names for creating buttons on a form are located. Dialogs Class names for Dialogs are: .lfDialog .lfDialogContent .lfDialogFooter .lfDialogTitle The following graphic shows where the class names for creating dialog windows are located.","title":"Class Names"},{"location":"ref_customized_css.html#usage-details","text":"Your custom CSS is the last style sheet that is applied in an application. However, you must ensure that your CSS rules are more specific (higher weighted) than the ones already specified in the base CSS rules. In some cases, you must append the !important declaration to your rules to override the Leap base rules. For example, to change the font color of all item titles use .lfMn .lfFormLabel {color: #094291 !important}. In some cases you must add the universal, \u201c*\u201d, selector to your rules. For example, to change the font color of all buttons use .lfMn .lfFormBtn * {color: white} To reference image files that are contained within the same application, use a relative URL of ../image/.... For example, to reference the image named background.jpg contained within your application, use url('../image/background.jpg'). For more information about referencing image files within an application, see Managing the files associated with your application Note: Pop-up menus and dialogs are direct childs of the main body, even when they appear to be otherwise. These child menus and dialogs must be styled to match the main body.","title":"Usage details"},{"location":"ref_customized_css.html#best-practices","text":"There are no technical limitations to the CSS rules that can be applied to a form; however there are the following best practices: All CSS rules must begin with the .lfMn class selector. This is important for forms that might be shown within the context of another web page, such as in the IBM\u00ae WebSphere\u00ae Portal environment. Base your CSS rules around class names that are prefixed with \u201clf\u201d. For example: lfFormFieldSingleLine. These class names that are likely to remain consistent between Leap releases. Your custom styles are not restricted, so you must be specific with your selectors. Selectors that are too broad affect all aspects of theLeap interface, including all dialogs and all elements within the View Data interface. Your CSS must target the browsers that are supported by Leap. If possible, avoid CSS rules that affect the size and positioning of elements. You might want to specify some custom padding and margins, but it is your responsibility to ensure that no erroneous cropping or extra scroll-bars are displayed. We recommend that you limit your theme to the following properties: background color background image \u2013 typically for background gradients color font font size border \u2013 typically none or one pixel width","title":"Best Practices"},{"location":"ref_customized_css.html#styling-individual-form-items","text":"Each item on the form is assigned a unique class name. The syntax for this class name is <form id>-<page id>-<item id>. For example, a class name of F_Form1-P_Page1-F_EmailAddress is applied to the item with an ID of F_EmailAddress , on the page with an ID of P_Page1 , on the form with an ID of F_Form1 . You can use these unique class names to style specific items in your application. Note: It is possible that two separate applications each have an item with the same unique class name.","title":"Styling individual form items"},{"location":"ref_customized_css.html#using-custom-css-class-names","text":"You can assign a custom CSS class name to any form, page, item, or stage action button in your application. You can then use the custom CSS class names in your custom theme. Setting custom CSS class names is done in the Properties side panel. Specify the custom class names, which are separated by spaces, in the Custom CSS class names field. Custom class names can also be added to, or removed from, items dynamically with the JavaScript\u2122 API.","title":"Using custom CSS class names"},{"location":"ref_customized_css.html#testing-your-custom-css-changes","text":"Use a CSS development tool to test your custom CSS changes. Most web browsers contain such a tool, which you can use to discover the wanted styling class. You can even make CSS rule modifications online, so you immediately see how a change affects the form visually. After the rules are determined, copy them to your custom CSS file for uploading into your Leap application. If you do not have access to a CSS development tool, an alternative approach is to place the CSS file on a web server. Reference the web location when you add the CSS file to your Leap application. You can modify the CSS file on the web server, then refresh the Leap application to pick up the changes. This approach quickly tests style changes without requiring you to repeatedly upload a new CSS file into your application, save the application, and then redeploy. Parent topic: Reference","title":"Testing your custom CSS changes"},{"location":"ref_data_access_rest_api.html","text":"Data access REST API The data access REST API exposes operations on application submitted data, also known as records. The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis and reports. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. All examples in this documentation use the program curl, which is available on most Linux\u2122 systems, and can be downloaded for Windows\u2122. However, you can use any tool or library for calling the REST API. For example, the Poster add-on for FireFox is useful for experimenting with the REST API. To get the Swagger definition for the entire Data Access REST API, use /apps-basic/anon|secure/org/data/swagger.json. To get the Swagger definition for a given application and form, use /apps-basic/anon|secure/org/data/{app_uid}/{form_id}/swagger.json. URL HTTP Verb Header Action Name /apps-basic/secure|anon/org/data/{app-uid}/{form-id} GET List /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid} GET Retrieve /apps-basic/secure|anon/org/data/{app-uid}/{form-id}?freedomIdentifyKey={x} POST Create /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} PUT Update /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} DELETE Delete /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/metadata GET Metadata /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/{attachment-uid} GET Retrieve Attachment /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/ POST Create Attachment app-uid : is the UID of the application form-id : is the ID of the form record-uid : is the UID of the record attachment-uid : is the UID of the attachment x : is a randomly generated, difficult to guess single-use numerical value The context for the REST API (/apps-basic/) is different from accessing Leap in the browser (/apps/). The /apps-basic/ context uses basic authentication rather than form-based authentication. The credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Each form and stage can have different permissions set for each REST API action. Use /anon if your applications allow anonymous access. All dates, times, and timestamps must be listed in ISO 8601 format. List This action retrieves a list of records. Retrieve This action retrieves a single record. Create This action creates new records. Update This action updates an existing record. Delete This action deletes an existing record. Metadata This JSON-only action retrieves a description of the items in your form. Retrieve Attachment This action retrieves a single attachment. Create Attachment This action creates a single attachment. Parent topic: REST API reference","title":"Data access REST API"},{"location":"ref_data_access_rest_api.html#ref_rest_public_REST_API","text":"The data access REST API exposes operations on application submitted data, also known as records. The data captured by an HCL Leap application is stored in a relational database. Leap provides secure access to that data through the View Data function, which allows filters and searches, and also allows data to be exported for analysis and reports. When accessing the data using the API, all security permissions as defined in the Access rules for the application are enforced. All examples in this documentation use the program curl, which is available on most Linux\u2122 systems, and can be downloaded for Windows\u2122. However, you can use any tool or library for calling the REST API. For example, the Poster add-on for FireFox is useful for experimenting with the REST API. To get the Swagger definition for the entire Data Access REST API, use /apps-basic/anon|secure/org/data/swagger.json. To get the Swagger definition for a given application and form, use /apps-basic/anon|secure/org/data/{app_uid}/{form_id}/swagger.json. URL HTTP Verb Header Action Name /apps-basic/secure|anon/org/data/{app-uid}/{form-id} GET List /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid} GET Retrieve /apps-basic/secure|anon/org/data/{app-uid}/{form-id}?freedomIdentifyKey={x} POST Create /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} PUT Update /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/{record-uid}?freedomIdentifyKey={x} DELETE Delete /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/metadata GET Metadata /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/{attachment-uid} GET Retrieve Attachment /apps-basic/secure|anon/org/data/{app-uid}/{form-id}/attachment/ POST Create Attachment app-uid : is the UID of the application form-id : is the ID of the form record-uid : is the UID of the record attachment-uid : is the UID of the attachment x : is a randomly generated, difficult to guess single-use numerical value The context for the REST API (/apps-basic/) is different from accessing Leap in the browser (/apps/). The /apps-basic/ context uses basic authentication rather than form-based authentication. The credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Each form and stage can have different permissions set for each REST API action. Use /anon if your applications allow anonymous access. All dates, times, and timestamps must be listed in ISO 8601 format. List This action retrieves a list of records. Retrieve This action retrieves a single record. Create This action creates new records. Update This action updates an existing record. Delete This action deletes an existing record. Metadata This JSON-only action retrieves a description of the items in your form. Retrieve Attachment This action retrieves a single attachment. Create Attachment This action creates a single attachment. Parent topic: REST API reference","title":"Data access REST API"},{"location":"ref_data_rest_api_create.html","text":"Create This action creates new records. Note: The curl command must be entered as a single line. curl --user <loginId>:<passwd> --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @post.xml \"http://<host>:<port>/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 ?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted: ATOM Feed: application/atom+xml JSON: application/json Accept Indicates the type of accepted response. ATOM Feed: application/atom+xml JSON: application/json --data-binary Provides the actual data that is POSTed to the URL. In this case, it is a file on the local system, post.xml, that contains the data to send. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. ATOM Feed One type of data to POST when doing a creation is a full ATOM Feed. The data starts with a element and contains one or more elements. Each element represents a single record to add to the application. <feed xmlns=\"http://www.w3.org/2005/Atom\"> <entry> <title type=\"text\">F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 ... ... It is also possible to POST a single stand alone element such as: {#codeblock_yyr_v3l_nzb} F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 The ID of the form to which this record is being submitted. <updated> Mandatory, but its value is replaced with a new timestamp by the server. A value of 1970-01-01T00:00:00Z can always be used. <content> Contains the submitted data. The structure of the data within the element is different for each application, and is based on the list of form items that were used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data. The root element of the submitted data, which in this example is the <F_Form1> element, must be in the null namespace, which is xmlns=\"\" The root element must have the pressedButton and flowState attributes. The flowState is the ID of the current stage of the record. For all Create REST calls, this is always ST_Start , which is the ID of the Start stage. The pressedButton indicates the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. Upon creation, the new record is assigned a generated unique record UID. This UID can be found in the response data, which is similar to the data returned from a Retrieve action. Response data is only returned when a stand alone is POSTed rather than multiple entries in a . JSON You can also POST a JSON payload, for example: { \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"pressedButton\" : \"S_Submit\", \"flowState\": \"ST_Start\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 } Note: The uid is optional. If supplied, it must be unique and use the format displayed in the JSON example. If not supplied, a unique uid is generated. Parent topic: Data access REST API","title":"Create"},{"location":"ref_data_rest_api_create.html#create","text":"This action creates new records. Note: The curl command must be entered as a single line. curl --user <loginId>:<passwd> --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @post.xml \"http://<host>:<port>/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 ?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted: ATOM Feed: application/atom+xml JSON: application/json Accept Indicates the type of accepted response. ATOM Feed: application/atom+xml JSON: application/json --data-binary Provides the actual data that is POSTed to the URL. In this case, it is a file on the local system, post.xml, that contains the data to send. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities.","title":"Create"},{"location":"ref_data_rest_api_create.html#section_ng4_v3l_nzb","text":"One type of data to POST when doing a creation is a full ATOM Feed. The data starts with a element and contains one or more elements. Each element represents a single record to add to the application. <feed xmlns=\"http://www.w3.org/2005/Atom\"> <entry> <title type=\"text\">F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 ... ... It is also possible to POST a single stand alone element such as: {#codeblock_yyr_v3l_nzb} F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 ","title":"ATOM Feed"},{"location":"ref_data_rest_api_create.html#title","text":"The ID of the form to which this record is being submitted.","title":"<title>"},{"location":"ref_data_rest_api_create.html#updated","text":"Mandatory, but its value is replaced with a new timestamp by the server. A value of 1970-01-01T00:00:00Z can always be used.","title":"<updated>"},{"location":"ref_data_rest_api_create.html#content","text":"Contains the submitted data. The structure of the data within the element is different for each application, and is based on the list of form items that were used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data.","title":"<content>"},{"location":"ref_data_rest_api_create.html#the-root-element-of-the-submitted-data-which-in-this-example-is-the-f_form1-element-must-be-in-the-null-namespace-which-is-xmlns","text":"The root element must have the pressedButton and flowState attributes. The flowState is the ID of the current stage of the record. For all Create REST calls, this is always ST_Start , which is the ID of the Start stage. The pressedButton indicates the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. Upon creation, the new record is assigned a generated unique record UID. This UID can be found in the response data, which is similar to the data returned from a Retrieve action. Response data is only returned when a stand alone is POSTed rather than multiple entries in a .","title":"The root element of the submitted data, which in this example is the <F_Form1> element, must be in the null namespace, which is xmlns=\"\""},{"location":"ref_data_rest_api_create.html#section_y4x_w3l_nzb","text":"You can also POST a JSON payload, for example: { \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"pressedButton\" : \"S_Submit\", \"flowState\": \"ST_Start\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 } Note: The uid is optional. If supplied, it must be unique and use the format displayed in the JSON example. If not supplied, a unique uid is generated. Parent topic: Data access REST API","title":"JSON"},{"location":"ref_data_rest_api_create_attachment.html","text":"Create Attachment This action creates a single attachment. curl --user : -F filename=@c:\\new file.doc --header \"Accept:application/json\" \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/\" Accept Indicates the type of accepted response. ATOM: application/atom+xml JSON: application/json The attachment that is created must be uploaded to the server as multipart/form-data in the body of a POST. The response from this call contains the UID, ID, and filename of the newly created attachment. For example: {\"id\" : 178, \"fileName\" : \"new file.doc\", \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } The UID value that is returned here can be later used with the Retrieve Attachment REST operation. For the attachment to be associated with a form record, a form record must be created or updated that refers to that attachment. Use the Data access REST API , passing the UID, ID, and filename of the attachment. Example JSON payload: { \"pressedButton\":\"S_Submit\", \"F_SingleLine1\" : \"22\", \"F_Number2\" : 1, \"F_Number3\" : 2, \"F_Number4\" : 3, \"F_Attachment1\" : { \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\", \"fileName\" : \"new file.doc\", \"id\" : 178 } } If an attachment is not associated with a form record within a certain time period (48 hours by default), the attachment is deleted automatically. Deleting the record that is associated with an attachment also deletes the attachment. Parent topic: Data access REST API","title":"Create Attachment"},{"location":"ref_data_rest_api_create_attachment.html#create-attachment","text":"This action creates a single attachment. curl --user : -F filename=@c:\\new file.doc --header \"Accept:application/json\" \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/\" Accept Indicates the type of accepted response. ATOM: application/atom+xml JSON: application/json The attachment that is created must be uploaded to the server as multipart/form-data in the body of a POST. The response from this call contains the UID, ID, and filename of the newly created attachment. For example: {\"id\" : 178, \"fileName\" : \"new file.doc\", \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } The UID value that is returned here can be later used with the Retrieve Attachment REST operation. For the attachment to be associated with a form record, a form record must be created or updated that refers to that attachment. Use the Data access REST API , passing the UID, ID, and filename of the attachment. Example JSON payload: { \"pressedButton\":\"S_Submit\", \"F_SingleLine1\" : \"22\", \"F_Number2\" : 1, \"F_Number3\" : 2, \"F_Number4\" : 3, \"F_Attachment1\" : { \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\", \"fileName\" : \"new file.doc\", \"id\" : 178 } } If an attachment is not associated with a form record within a certain time period (48 hours by default), the attachment is deleted automatically. Deleting the record that is associated with an attachment also deletes the attachment. Parent topic: Data access REST API","title":"Create Attachment"},{"location":"ref_data_rest_api_delete.html","text":"Delete This action deletes an existing record. Note: The curl command must be entered as a single line. curl --user : --request DELETE http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=1 --header \"Cookie: freedomIdentifyKey=1\" --request DELETE Specifies the correct HTTP method verb for this action. --header \"Cookie: freedomIdentifyKey=1\" Includes a required cookie as part of the request. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter value avoids XSS vulnerabilities. Parent topic: Data access REST API","title":"Delete"},{"location":"ref_data_rest_api_delete.html#delete","text":"This action deletes an existing record. Note: The curl command must be entered as a single line. curl --user : --request DELETE http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=1 --header \"Cookie: freedomIdentifyKey=1\" --request DELETE Specifies the correct HTTP method verb for this action. --header \"Cookie: freedomIdentifyKey=1\" Includes a required cookie as part of the request. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter value avoids XSS vulnerabilities. Parent topic: Data access REST API","title":"Delete"},{"location":"ref_data_rest_api_list.html","text":"List This action retrieves a list of records. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/ F_Form1?format=application%2Fatom%2Bxml&sortBy=lastUpdated&order=DESC&from=10&to=20 format or Accept header The format in which the data must be returned. You can use either format or Accept header. application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml application/x-msexcel returns data as an Excel document application/vnd.oasis.opendocument.spreadsheet returns data as an OpenDocument spreadsheet application/json returns data in JavaScript\u2122 Object Notation format sortBy The order in which the data must be returned. The default sort order is indeterminate. lastUpdated uses the last updated date as the sort attribute. itemAuthor uses the display name of the author as the sort attribute. flowState uses the stage name as the sort attribute. < item ID > uses the values of a particular form item, for example, F_SingleLine , as the sort attribute. Several widgets cannot be used as the sort attribute due to their storage representation in the database. This includes the Multi-Line Entry , Select Many , Table , and Attachment widgets . order The direction of the sort. ASC uses an ascending sort order. This is the default value. DESC uses a descending sort order. from The starting offset of a range of results. The default value is 0. to The ending offset of a range of results. The default value is the end of the list. If you set a value for to , the result is not inclusive of the to value. For example, there are 100 submitted records. You want to view the results 5 per page. You set the from value to 6, and the to value to 11. Records 6 - 10 are displayed. metadata Set to true to display extra information about items in the form. This parameter is only valid for JSON. The result of this request is a list of records. An example result represented as an ATOM feed: :/apps-basic/landing/1/app/ dd34da19-15c4-4267-8f1e-9f12ece743d7/viewdata/index.html\"> http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 Collection of Form 1 2011-11-22T19:37:09.060Z -1 Freedom :/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1\" rel=\"self\"/> f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 9c1f4a5b-c6b2-482d-874f-804c44bdd91e ... 86352d79-b52e-48e6-84a2-24174d9d5481 ... ... It is important to note: Each submission record is represented by an within the feed. Each entry has an that represents the person who initially created the record. Each entry has a that represents the person who last updated the record. Each entry has a with rel=\"edit\" ** that represents the URL to use to Retrieve and Update just this record. Each entry has a with rel=\"print\" ** that represents the URL that, when displayed in a browser, is the print version of the record. Each entry has a with rel=\"form\" ** that represents the URL that, when displayed in a browser, allows the editing of this record. Each entry has a that contains the actual data for this record. The root element of the actual data, which in this example is , has a generated uid attribute. This attribute is the unique ID for the record and can be used for subsequent calls to Retrieve, Update, or Delete for that particular record. An example result represented as a JSON feed: { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] }, \"items\": [{ \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 0, \"uid\": \"8cca2f81-207c-4780-875f-ee1c2bee4df1\", \"F_SingleLine1\": \"Joe\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 }, { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.75 }] } The following information describes how to filter Data REST API results. Filtering Data REST API results Parent topic: Data access REST API","title":"List"},{"location":"ref_data_rest_api_list.html#list","text":"This action retrieves a list of records. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/ F_Form1?format=application%2Fatom%2Bxml&sortBy=lastUpdated&order=DESC&from=10&to=20 format or Accept header The format in which the data must be returned. You can use either format or Accept header. application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml application/x-msexcel returns data as an Excel document application/vnd.oasis.opendocument.spreadsheet returns data as an OpenDocument spreadsheet application/json returns data in JavaScript\u2122 Object Notation format sortBy The order in which the data must be returned. The default sort order is indeterminate. lastUpdated uses the last updated date as the sort attribute. itemAuthor uses the display name of the author as the sort attribute. flowState uses the stage name as the sort attribute. < item ID > uses the values of a particular form item, for example, F_SingleLine , as the sort attribute. Several widgets cannot be used as the sort attribute due to their storage representation in the database. This includes the Multi-Line Entry , Select Many , Table , and Attachment widgets . order The direction of the sort. ASC uses an ascending sort order. This is the default value. DESC uses a descending sort order. from The starting offset of a range of results. The default value is 0. to The ending offset of a range of results. The default value is the end of the list. If you set a value for to , the result is not inclusive of the to value. For example, there are 100 submitted records. You want to view the results 5 per page. You set the from value to 6, and the to value to 11. Records 6 - 10 are displayed. metadata Set to true to display extra information about items in the form. This parameter is only valid for JSON. The result of this request is a list of records. An example result represented as an ATOM feed: :/apps-basic/landing/1/app/ dd34da19-15c4-4267-8f1e-9f12ece743d7/viewdata/index.html\"> http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1 Collection of Form 1 2011-11-22T19:37:09.060Z -1 Freedom :/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1\" rel=\"self\"/> f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 9c1f4a5b-c6b2-482d-874f-804c44bdd91e ... 86352d79-b52e-48e6-84a2-24174d9d5481 ... ... It is important to note: Each submission record is represented by an within the feed. Each entry has an that represents the person who initially created the record. Each entry has a that represents the person who last updated the record. Each entry has a with rel=\"edit\" ** that represents the URL to use to Retrieve and Update just this record. Each entry has a with rel=\"print\" ** that represents the URL that, when displayed in a browser, is the print version of the record. Each entry has a with rel=\"form\" ** that represents the URL that, when displayed in a browser, allows the editing of this record. Each entry has a that contains the actual data for this record. The root element of the actual data, which in this example is , has a generated uid attribute. This attribute is the unique ID for the record and can be used for subsequent calls to Retrieve, Update, or Delete for that particular record. An example result represented as a JSON feed: { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] }, \"items\": [{ \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 0, \"uid\": \"8cca2f81-207c-4780-875f-ee1c2bee4df1\", \"F_SingleLine1\": \"Joe\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 24.25 }, { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"324007a4-a04f-4649-8d22-e6c764313f1f\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.75 }] } The following information describes how to filter Data REST API results. Filtering Data REST API results Parent topic: Data access REST API","title":"List"},{"location":"ref_data_rest_api_list_filter.html","text":"Filtering Data REST API results The following information describes how to filter Data REST API results. You can filter the results of the List action by providing extra URL parameters. For example: /apps-basic/secure/org/data/{app-uid}/{form-id}?F_Amount__lt=1000 This sample query would limit results to records whose F_Amount currency field value is less than 1000. The syntax of a single filter parameter is {element}__{operator}={value}, where {element} is the ID of an item in the form, or one of the record metadata properties. For example, the author_name is used to filter by the name of the initial submitter of a record. Note: All filter parameters must be properly URL encoded. Common encoding characters are described as follows: %3A - a colon %20 - a space %2B - the plus sign (+) For example, the colon in a time value of \u201c09:40\u201d would need to be encoded as %3A resulting in an encoded value of 09%3A40 . Two simple examples of single filter parameters are: F_Age__equals=5 author_name__equals=James%20Smith Multiple Filters Multiple filter parameters can be included in a single URL along with a searchOperator parameter. OR In an OR relationship, any one of the filters is true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=OR ``` AND In an AND relationship, all of the filters must be true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=AND ``` Note: Only a single searchOperator parameter is supported in a request. You cannot use both AND and OR in a single request. If no searchOperator parameter is present, the default is AND. Metadata properties Each record can use the following properties for filtering. Table 1. Metadata filtering properties Element Operator Type Description author_name See the table of String Operators The name of the user that initially created the record. updater_name See the table of String Operators The name of the user that last updated the record. creation_time See the table of Time Stamp Operators The time stamp of when the record was initially created. updated See the table of Time Stamp Operators The time stamp of when the record was last updated flow_state See the table of Stage Operators The ID of the stage that the record is in. For example, \u201cST_End\u201d String Operators String operators are used on the values of the following form items: Single-Line Entry , Multi-Line Entry , Email , Drop Down , Select One , Select Many , Survey question, Choice Slider , and Website . String operators are also used on the following metadata properties: author_nameand updater_name. Table 2. String operators Operator Description equals The value of the element is tested for equality against the specified value. startswith Checks to see whether the value of the element starts with the specified value. endswith Checks to see whether the value of the element ends with the specified value. contains Checks to see whether the value of the element contains the specified value. Number operators Number operators are used on the values of the following form items: Number , Currency , and Numeric Slider . Table 3. Number operators Operator Description equals The value of the element is tested for equality against the specified value. notequals The value of the element is tested for non-equality against the specified value. gt Checks to see whether the value of the element is greater than the specified value. lt Checks to see whether the value of the element is less than the specified value. gte Checks to see whether the value of the element is greater than or equal to the specified value. lte Checks to see whether the value of the element is less than or equal to the specified value. Boolean operator This operator is only used on the value of the Checkbox form item. Table 4. Boolean operator Operator Description equals The value of the element is tested for equality against the specified value. Valid values to compare against are true and false . Time, Date, and Time Stamp operators Time values are valid against Time form items only. Date values are valid against Date form items only. Time stamp values are valid against Time Stamp form items, or the creation_time and updated metadata properties. Time, date, and time stamp values must be provided in ISO 8601 extended format. For example, a time stamp for 21 Dec 2015 10:00 AM Pacific Standard Time must be given as: 2015-12-21T10:00:00-08:00 or 2015-12-21T18:00:00Z. Note: Remember to take daylight savings into account based on the time zone and the date of a time stamp value. For example, 21 June 2015 10:00 AM Pacific Daylight Time must be given as 2015-06-21T10:00:00- 07:00 or 2015-06-21T 17:00 :00Z Dates must be passed in the format yyyy-mm-dd Times must be passed in the format hh:mm:ss Remember that all values must be properly URL encoded. For example, a value of 2015-06-21T17:00:00Z +8:00 must be encoded as 2015-06-21T17%3A00%3A00 %2B8%3A00 . Table 5. Time, Date, and Time Stamp operators Operator Description after Filters so that the results provided come after the specified time and date. before Filters so that the results provided come before the specified time and date. between Filters so that the results provided fit on or within the specified times and dates. The between operator takes a value in the following format: {start moment}**A\\*N\\*D**{end moment} For example, to search between the start of day 1 June 2015 and the start of day 8 June 2015 (in Pacific Daylight Time) the value is: 2015-06-01T07:00:01Z**A\\*N\\*D**2015-06-08T07:00:01Z Additional Date and Time Stamp operators To adjust for different time zones, use the tzOffset URL parameter. The value is the number of seconds of offset from Coordinated Universal Time. For example, for Pacific Standard Time use tzOffset=-28000 Table 6. Additional Date and Time Stamp operators Operator Description year Filters the results so that the year matches the specified numerical value. month Filters the results so that the month matches the specified numerical value. The value must use the numbers 1-12, where 1 is January and 12 is December. day Filters the results so that the day matches the specified numerical value. The value must use the numbers 1-31, where each numeral matches a day of the month. Stage ID operators Stage operators are used with the value of the flow_state metadata property. Table 7. Stage ID operators Operator Description equals The value of the flow_state is tested for equality against the specified value. notequals The value of the flow_state is tested for non-equality against the specified value. Examples The following parameters are examples of filtering. Each example contains the search parameter and a description of the returned result. This filter returns the first 20 records where the value of the F_Number field is greater than or equal to 5. ?F_Number__gte=5&to=20 This filter returns the first 30 records of where the record was last updated between the start of day June 1, 2015 and the start of day Aug 31, 2015, China Standard Time. ?updated__between=2015-06-01T00%3A00%3A01%2B8%3A00A*N*D2015-08-31T00%3A00%3A01%2B8%3A00&to=30 This filter returns first five records where the value of the F_Currency field is less than 1000 AND the value of the F_Number field is greater than 10. ?F_Currency__lt=1000&F_Number__gt=10&searchOperator=AND&to=5 This filter returns the first 20 records where the value of the F_Number field is less than 5 OR greater than 10. ?F_Number__lt=5&F_Number__gt=10&searchOperator=OR&to=20 Parent topic: List","title":"Filtering Data REST API results"},{"location":"ref_data_rest_api_list_filter.html#filtering-data-rest-api-results","text":"The following information describes how to filter Data REST API results. You can filter the results of the List action by providing extra URL parameters. For example: /apps-basic/secure/org/data/{app-uid}/{form-id}?F_Amount__lt=1000 This sample query would limit results to records whose F_Amount currency field value is less than 1000. The syntax of a single filter parameter is {element}__{operator}={value}, where {element} is the ID of an item in the form, or one of the record metadata properties. For example, the author_name is used to filter by the name of the initial submitter of a record. Note: All filter parameters must be properly URL encoded. Common encoding characters are described as follows: %3A - a colon %20 - a space %2B - the plus sign (+) For example, the colon in a time value of \u201c09:40\u201d would need to be encoded as %3A resulting in an encoded value of 09%3A40 . Two simple examples of single filter parameters are: F_Age__equals=5 author_name__equals=James%20Smith","title":"Filtering Data REST API results"},{"location":"ref_data_rest_api_list_filter.html#multiple-filters","text":"Multiple filter parameters can be included in a single URL along with a searchOperator parameter. OR In an OR relationship, any one of the filters is true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=OR ``` AND In an AND relationship, all of the filters must be true. ``` ?{element1}__{operator1}={value1}&{element2}__{operator2}={value2}&searchOperator=AND ``` Note: Only a single searchOperator parameter is supported in a request. You cannot use both AND and OR in a single request. If no searchOperator parameter is present, the default is AND.","title":"Multiple Filters"},{"location":"ref_data_rest_api_list_filter.html#metadata-properties","text":"Each record can use the following properties for filtering. Table 1. Metadata filtering properties Element Operator Type Description author_name See the table of String Operators The name of the user that initially created the record. updater_name See the table of String Operators The name of the user that last updated the record. creation_time See the table of Time Stamp Operators The time stamp of when the record was initially created. updated See the table of Time Stamp Operators The time stamp of when the record was last updated flow_state See the table of Stage Operators The ID of the stage that the record is in. For example, \u201cST_End\u201d","title":"Metadata properties"},{"location":"ref_data_rest_api_list_filter.html#string-operators","text":"String operators are used on the values of the following form items: Single-Line Entry , Multi-Line Entry , Email , Drop Down , Select One , Select Many , Survey question, Choice Slider , and Website . String operators are also used on the following metadata properties: author_nameand updater_name. Table 2. String operators Operator Description equals The value of the element is tested for equality against the specified value. startswith Checks to see whether the value of the element starts with the specified value. endswith Checks to see whether the value of the element ends with the specified value. contains Checks to see whether the value of the element contains the specified value.","title":"String Operators"},{"location":"ref_data_rest_api_list_filter.html#number-operators","text":"Number operators are used on the values of the following form items: Number , Currency , and Numeric Slider . Table 3. Number operators Operator Description equals The value of the element is tested for equality against the specified value. notequals The value of the element is tested for non-equality against the specified value. gt Checks to see whether the value of the element is greater than the specified value. lt Checks to see whether the value of the element is less than the specified value. gte Checks to see whether the value of the element is greater than or equal to the specified value. lte Checks to see whether the value of the element is less than or equal to the specified value.","title":"Number operators"},{"location":"ref_data_rest_api_list_filter.html#boolean-operator","text":"This operator is only used on the value of the Checkbox form item. Table 4. Boolean operator Operator Description equals The value of the element is tested for equality against the specified value. Valid values to compare against are true and false .","title":"Boolean operator"},{"location":"ref_data_rest_api_list_filter.html#time-date-and-time-stamp-operators","text":"Time values are valid against Time form items only. Date values are valid against Date form items only. Time stamp values are valid against Time Stamp form items, or the creation_time and updated metadata properties. Time, date, and time stamp values must be provided in ISO 8601 extended format. For example, a time stamp for 21 Dec 2015 10:00 AM Pacific Standard Time must be given as: 2015-12-21T10:00:00-08:00 or 2015-12-21T18:00:00Z. Note: Remember to take daylight savings into account based on the time zone and the date of a time stamp value. For example, 21 June 2015 10:00 AM Pacific Daylight Time must be given as 2015-06-21T10:00:00- 07:00 or 2015-06-21T 17:00 :00Z Dates must be passed in the format yyyy-mm-dd Times must be passed in the format hh:mm:ss Remember that all values must be properly URL encoded. For example, a value of 2015-06-21T17:00:00Z +8:00 must be encoded as 2015-06-21T17%3A00%3A00 %2B8%3A00 . Table 5. Time, Date, and Time Stamp operators Operator Description after Filters so that the results provided come after the specified time and date. before Filters so that the results provided come before the specified time and date. between Filters so that the results provided fit on or within the specified times and dates. The between operator takes a value in the following format: {start moment}**A\\*N\\*D**{end moment} For example, to search between the start of day 1 June 2015 and the start of day 8 June 2015 (in Pacific Daylight Time) the value is: 2015-06-01T07:00:01Z**A\\*N\\*D**2015-06-08T07:00:01Z","title":"Time, Date, and Time Stamp operators"},{"location":"ref_data_rest_api_list_filter.html#additional-date-and-time-stamp-operators","text":"To adjust for different time zones, use the tzOffset URL parameter. The value is the number of seconds of offset from Coordinated Universal Time. For example, for Pacific Standard Time use tzOffset=-28000 Table 6. Additional Date and Time Stamp operators Operator Description year Filters the results so that the year matches the specified numerical value. month Filters the results so that the month matches the specified numerical value. The value must use the numbers 1-12, where 1 is January and 12 is December. day Filters the results so that the day matches the specified numerical value. The value must use the numbers 1-31, where each numeral matches a day of the month.","title":"Additional Date and Time Stamp operators"},{"location":"ref_data_rest_api_list_filter.html#stage-id-operators","text":"Stage operators are used with the value of the flow_state metadata property. Table 7. Stage ID operators Operator Description equals The value of the flow_state is tested for equality against the specified value. notequals The value of the flow_state is tested for non-equality against the specified value.","title":"Stage ID operators"},{"location":"ref_data_rest_api_list_filter.html#examples","text":"The following parameters are examples of filtering. Each example contains the search parameter and a description of the returned result. This filter returns the first 20 records where the value of the F_Number field is greater than or equal to 5. ?F_Number__gte=5&to=20 This filter returns the first 30 records of where the record was last updated between the start of day June 1, 2015 and the start of day Aug 31, 2015, China Standard Time. ?updated__between=2015-06-01T00%3A00%3A01%2B8%3A00A*N*D2015-08-31T00%3A00%3A01%2B8%3A00&to=30 This filter returns first five records where the value of the F_Currency field is less than 1000 AND the value of the F_Number field is greater than 10. ?F_Currency__lt=1000&F_Number__gt=10&searchOperator=AND&to=5 This filter returns the first 20 records where the value of the F_Number field is less than 5 OR greater than 10. ?F_Number__lt=5&F_Number__gt=10&searchOperator=OR&to=20 Parent topic: List","title":"Examples"},{"location":"ref_data_rest_api_metadata.html","text":"Metadata This JSON-only action retrieves a description of the items in your form. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/metadata { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] } } Parent topic: Data access REST API","title":"Metadata"},{"location":"ref_data_rest_api_metadata.html#reference_adn_qqt_nv","text":"This JSON-only action retrieves a description of the items in your form. Note: The curl command must be entered as a single line. curl --user : http://:/apps-basic/secure/org/data/ dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/metadata { \"metadata\": { \"fields\": [{ \"name\": \"F_SingleLine1\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"First Name\" }, { \"name\": \"F_SingleLine2\", \"uiType\": \"textField\", \"dataType\": \"string\", \"label\": \"Last Name\" }, { \"name\": \"F_Number1\", \"uiType\": \"number\", \"dataType\": \"decimal\", \"label\": \"Hours worked\", \"decimalPlaces\": 2 }] } } Parent topic: Data access REST API","title":"Metadata"},{"location":"ref_data_rest_api_retrieve.html","text":"Retrieve This action retrieves a single record. Note: The curl command must be entered as a single line. curl --user : --header \"Accept:application/atom+xml\" \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d\" curl --user : \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d ?itemOnly=true&format=application%2fjson\" format or Accept header The format in which the data must be returned. You can use either format or Accept header . application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml . application/json returns data in JavaScript\u2122 Object Notation format Set itemOnly to true if you want to receive a simplified response. itemOnly is only available for JSON. The result of this request is an ATOM Entry XML document: f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 The result of this request as a JSON document: { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.0 } Refer to the List action for a detailed description of the returned entry. Parent topic: Data access REST API","title":"Retrieve"},{"location":"ref_data_rest_api_retrieve.html#retrieve","text":"This action retrieves a single record. Note: The curl command must be entered as a single line. curl --user : --header \"Accept:application/atom+xml\" \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d\" curl --user : \"http://:/volt-api/secure/ org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f-cb67-4008-8219-f49a1b369f7d ?itemOnly=true&format=application%2fjson\" format or Accept header The format in which the data must be returned. You can use either format or Accept header . application/atom+xml returns data as a standard ATOM feed in XML format. This is the default value. Note: When using the format parameter, you must encode the value. For example, application/atom+xml must be inserted into the curl command as application%2Fatom%2Bxml . application/json returns data in JavaScript\u2122 Object Notation format Set itemOnly to true if you want to receive a simplified response. itemOnly is only available for JSON. The result of this request is an ATOM Entry XML document: f82e576f-cb67-4008-8219-f49a1b369f7d F_Form1 2011-11-22T19:36:31.000Z Mike Smith msmith@mycompany.com msmith@mycompany.com Brenda Jones bjones@mycompany.com bjones@mycompany.com 30.45 Brenda 39.0000 The result of this request as a JSON document: { \"lastModified\": \"2013-11-22T19:37:09.060Z\", \"lastModifiedBy\" : { \"displayName\" : \"Demo User 1\", \"email\" : \"demo_user1@yourcompany.com\", \"login\" : \"demo_user1\" }, \"created\": \"2013-11-22T19:37:09.060Z\", \"createdBy\": { \"displayName\": \"Demo User 2\", \"email\": \"demo_user2@yourcompany.com\", \"login\" : \"demo_user2\" }, \"flowState\": \"ST_End\", \"id\": 1, \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 25.0 } Refer to the List action for a detailed description of the returned entry. Parent topic: Data access REST API","title":"Retrieve"},{"location":"ref_data_rest_api_retrieve_attachment.html","text":"Retrieve Attachment This action retrieves a single attachment. curl --user : \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/ccb92c12-d435-4288-baff-878d8d3c2923\" Replace dd34da19-15c4-4267-8f1e-9f12ece743d7 with the app ID of the desired attachment. Replace F_Form1 with the form ID of the desired attachment. Replace ccb92c12-d435-4288-baff-878d8d3c2923 with the UID of the desired attachment. To determine the UID of an attachment, you can use the Data access REST API to retrieve the data for a given record. If the form contains an attachment item, the data for that record will contain the UID, ID, and filename of the attachment. This information is also available in the response when you upload a file using the Create Attachment REST operation. For example: \"F_Attachment1\" : { \"fileName\" : \"some file.doc\", \"id\" : 123, \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } When retrieving an attachment, the credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Parent topic: Data access REST API","title":"Retrieve Attachment"},{"location":"ref_data_rest_api_retrieve_attachment.html#reference_swb_lsf_2z","text":"This action retrieves a single attachment. curl --user : \"http://:/apps-basic/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/attachment/ccb92c12-d435-4288-baff-878d8d3c2923\" Replace dd34da19-15c4-4267-8f1e-9f12ece743d7 with the app ID of the desired attachment. Replace F_Form1 with the form ID of the desired attachment. Replace ccb92c12-d435-4288-baff-878d8d3c2923 with the UID of the desired attachment. To determine the UID of an attachment, you can use the Data access REST API to retrieve the data for a given record. If the form contains an attachment item, the data for that record will contain the UID, ID, and filename of the attachment. This information is also available in the response when you upload a file using the Create Attachment REST operation. For example: \"F_Attachment1\" : { \"fileName\" : \"some file.doc\", \"id\" : 123, \"uid\" : \"ccb92c12-d435-4288-baff-878d8d3c2923\" } When retrieving an attachment, the credentials used for authentication must match the users and permissions specified by the application designer in the Access tab. Parent topic: Data access REST API","title":"Retrieve Attachment"},{"location":"ref_data_rest_api_update.html","text":"Update This action updates an existing record. Note: The curl command must be entered as a single line. curl --user : --request PUT --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @put.xml \"http://:/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f- cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** Accept Indicates the type of accepted response. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** --data-binary Provides the actual data that is PUT to the URL. In this case, it is pointing to a file, put.xml, on the local system that contains the data to send. --request PUT Specifies the correct HTTP method verb for the action. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. ATOM Feed Example PUT data: F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 The ID of the form to which this record is being submitted. <updated> This must be included, but its value is replaced by the server with a new timestamp. A value of 1970-01-01T00:00:00Z can always be used. <content> Contains the submitted data. The structure of the data within the content element is different for each application, and is based on the list of form items used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data. The root element of the submitted data, in this example the <F_Form1> element, is always in the null namespace, xmlns=\"\" The root element must have the application_uid, pressedButton, flowState, uid, and id attributes. The application_uid is the UID of the application. The flowState is the ID of the current stage of the record. The pressedButton is the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. The uid is the unique ID for the record being updated. The id must be an integer, although the actual value is meaningless. A value of 0 can always be used. Note: A PUT REST command updates an existing record with new values. All data fields in the old record will be replaced by the data fields provided in the payload. If the new submission does not include a field, the field will be updated to have an empty value even if it previously had a value (i.e. the two records are NOT merged). JSON Example JSON payload: { \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"flowState\": \"ST_ReviewStage\", \"pressedButton\" : \"S_Approve\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 26.75 } Note: The uid is optional. If supplied, it must match the record uid. For example: f82e576f- cb67-4008-8219-f49a1b369f7d. Parent topic: Data access REST API","title":"Update"},{"location":"ref_data_rest_api_update.html#update","text":"This action updates an existing record. Note: The curl command must be entered as a single line. curl --user <loginId>:<passwd> --request PUT --header \"Accept:application/atom+xml\" --header \"Content-Type:application/atom+xml\" --data-binary @put.xml \"http://<host>:<port>/volt-api/secure/org/data/dd34da19-15c4-4267-8f1e-9f12ece743d7/F_Form1/f82e576f- cb67-4008-8219-f49a1b369f7d?freedomIdentifyKey=x\" --header \"Cookie: freedomIdentifyKey=x\" Content-Type Indicates the type of document submitted. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** Accept Indicates the type of accepted response. - ATOM Feed: **application/atom+xml** - JSON: **application/json.** --data-binary Provides the actual data that is PUT to the URL. In this case, it is pointing to a file, put.xml, on the local system that contains the data to send. --request PUT Specifies the correct HTTP method verb for the action. --header \"Cookie: freedomIdentifyKey=x Includes a required cookie as part of the request where x is a randomly generated, difficult to guess single-use numerical value. The value of the key must match the value of the freedomIdentifyKey URL parameter. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities.","title":"Update"},{"location":"ref_data_rest_api_update.html#section_afj_djl_nzb","text":"Example PUT data: <entry xmlns=\"http://www.w3.org/2005/Atom\"> <title type=\"text\">F_Form1 1970-01-01T00:00:00Z 19.25 Brad Walker 40 The ID of the form to which this record is being submitted. <updated> This must be included, but its value is replaced by the server with a new timestamp. A value of 1970-01-01T00:00:00Z can always be used. <content> Contains the submitted data. The structure of the data within the content element is different for each application, and is based on the list of form items used to create the application. The easiest way to find the complete list of elements is to issue a Retrieve REST call and look at the resulting data. The root element of the submitted data, in this example the <F_Form1> element, is always in the null namespace, xmlns=\"\" The root element must have the application_uid, pressedButton, flowState, uid, and id attributes. The application_uid is the UID of the application. The flowState is the ID of the current stage of the record. The pressedButton is the ID of the stage action submit button, which simulates the submission. A submit button ID must be specified to activate the appropriate stage activities and transfer the record to the next appropriate stage. The uid is the unique ID for the record being updated. The id must be an integer, although the actual value is meaningless. A value of 0 can always be used. Note: A PUT REST command updates an existing record with new values. All data fields in the old record will be replaced by the data fields provided in the payload. If the new submission does not include a field, the field will be updated to have an empty value even if it previously had a value (i.e. the two records are NOT merged).","title":"ATOM Feed"},{"location":"ref_data_rest_api_update.html#section_wwg_2jl_nzb","text":"Example JSON payload: { \"uid\": \"f82e576f-cb67-4008-8219-f49a1b369f7d\", \"flowState\": \"ST_ReviewStage\", \"pressedButton\" : \"S_Approve\", \"F_SingleLine1\": \"Jane\", \"F_SingleLine2\": \"Test\", \"F_Number1\": 26.75 } Note: The uid is optional. If supplied, it must match the record uid. For example: f82e576f- cb67-4008-8219-f49a1b369f7d. Parent topic: Data access REST API","title":"JSON"},{"location":"ref_embed_iframe.html","text":"Embedding items in an iframe You can use iFrames to embed charts and applications in a web page. Embedded Chart Rendering To embed the summary charts in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe src=\"http://host:port/apps/secure/org/app/app\\_uid/results/index.html?form=form\\_id&narrow=true&hideLabels=true&legend=true\"></iframe> The parameters in this URL are: hideLabels=true : Hides labels on pie charts. narrow=true : Renders charts in narrow mode, which is suitable for charts embedded in narrow spaces. In narrow mode, pie charts render at a size to fit the available space and bar charts are hidden. Narrow mode works best in combination with hideLabels=true and legend=true. **Note:** Narrow mode is automatically engaged when the available space for charts is less than 500 pixels wide regardless of the narrow URL parameter. legend=true : Displays a legend with the pie chart. Use in combination with narrow=true and hideLabels=true. When the charts are embedded, the banner is hidden and there are simple messages when no charts are available. Embedded Form Rendering To embed a form in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe style=\"width:600px;height:600px\" src=\"http://host:port/apps/secure/org/app/app\\_uid/launch/index.html?form=form\\_id&width=600px\"> </iframe> The parameters in this URL are: width=value : Value can be a percentage or a fixed number of pixels. **Note:** URL encoding is required for the `%` character. It should be represented as `%25`. For example `99%` would become `&width=99%25` When the forms are embedded, the banner is hidden and when form is shown, the first item does not initially grab focus Parent topic: Reference","title":"Embedding items in an iframe"},{"location":"ref_embed_iframe.html#embeddingitemsinaniframe","text":"You can use iFrames to embed charts and applications in a web page.","title":"Embedding items in an iframe"},{"location":"ref_embed_iframe.html#embedded-chart-rendering","text":"To embed the summary charts in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe src=\"http://host:port/apps/secure/org/app/app\\_uid/results/index.html?form=form\\_id&narrow=true&hideLabels=true&legend=true\"></iframe> The parameters in this URL are: hideLabels=true : Hides labels on pie charts. narrow=true : Renders charts in narrow mode, which is suitable for charts embedded in narrow spaces. In narrow mode, pie charts render at a size to fit the available space and bar charts are hidden. Narrow mode works best in combination with hideLabels=true and legend=true. **Note:** Narrow mode is automatically engaged when the available space for charts is less than 500 pixels wide regardless of the narrow URL parameter. legend=true : Displays a legend with the pie chart. Use in combination with narrow=true and hideLabels=true. When the charts are embedded, the banner is hidden and there are simple messages when no charts are available.","title":"Embedded Chart Rendering"},{"location":"ref_embed_iframe.html#embedded-form-rendering","text":"To embed a form in a web page, use the following URL as a guide. Change the host , port , app_uid and form_id variables to suit your host, port, application ID and form ID. <iframe style=\"width:600px;height:600px\" src=\"http://host:port/apps/secure/org/app/app\\_uid/launch/index.html?form=form\\_id&width=600px\"> </iframe> The parameters in this URL are: width=value : Value can be a percentage or a fixed number of pixels. **Note:** URL encoding is required for the `%` character. It should be represented as `%25`. For example `99%` would become `&width=99%25` When the forms are embedded, the banner is hidden and when form is shown, the first item does not initially grab focus Parent topic: Reference","title":"Embedded Form Rendering"},{"location":"ref_embedding_api.html","text":"Embedding API The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page. Example 1 - Declarative <html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"{launch: {appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', targetId: 'myLeapDiv'}}\"> </script> </body> </html> Example 2 - Programmatic <html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\"></script> <script> function onLeapFormSubmitted (BO) { alert (\"submitted record id: \" + submittedBO.getDataId()); } function onLeapFormLoaded (app, launchParams) { app.getForm(launchParams.formId).connectEvent(\"afterSave\", onLeapFormSubmitted); } Leap.onReady = function() { var launchParams = { appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', target: document.getElementById(\"myLeapDiv\"), locale: 'fr-FR' callback: onLeapFormLoaded }; Leap.launch(launchParams); }; </script> </body> </html> Loading the Leap Embedding UI <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"[leap configuration]\" id=\"leapJS'\"></script> id (optional) - fallback for older browsers; the value should always be \"leapJS\" data-leap-config (optional) - JSON or the name of an existing JavaScript object. Properties: locale (optional) - indicates the preferred locale to the Leap API. For example, \"fr-FR\" launch (optional) - equivalent to calling Leap.launch ({\u2026}) function with respective parameters (see below for more details) overwriteExistingDojoConfig (optional) - In some environments, such as HCL Digital Experience or IBM WebSphere Portal, the djConfig or dojoConfig object may be defined on a page and not used. Set the value of this property to true to override it. Loading the Leap API will result in the creation of global object named Leap. After initial load of the leap.js, you can define a Leap.onReady () function which will be called when the necessary Leap resources have been loaded into the page and the API is ready to be used. Embedding a form programmatically To embed a Leap form programmatically, call Leap.launch({launch_params}); { launch_params } properties: Property Required? Description appId Yes The Leap application UUID. For example, 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55' formId Yes The Leap form ID. For example, 'F_Form1' targetId Either target or targetId must be provided. The id of the HTML DOM element to embed the Leap form within. For example, 'myLeapFormDiv' target Either target or targetId must be provided. The HTML DOM element to place the Leap form within. mode No Determines the mode for embedding. Possible values: - ' iframe ': embeds the form in an <iframe> element. For complete isolation of the form, if necessary - ' embed ' (default): embeds the form into the hosting page in a <div> locale No Indicates the preferred locale for the embedded form. For example, 'fr-FR' prefSecMode No If the form supports both anonymous and authenticated usage, this property can be used to automatically choose the preferred security mode. Possible values: - ' anon ': for anonymous usage - ' secure ': for authenticated usage callback No A callback function which will be called when the application launch completes successfully and the form is ready to be interacted with. The callback function will be passed the following parameters: - app : the Leap JavaScript API application object. For more details, see Interface objects - launchParams : the original launch parameters object, for convenience Known Limitations Only one Leap form can be embedded on the page at a time. Once the Leap form is embedded, it cannot be changed to a different form or reloaded. The hosting page cannot contain any version of the Dojo JavaScript library. The Leap Embedding API will load its own copy of the Dojo JavaScript library into the hosting page. For authentication, it is expected that the hosting page and the Leap server are configured with single sign-on (SSO). Leap\u2019s login UI will not display properly within the hosting page. Cross-Domain Usage If Leap and the hosting page are in different domains, the Leap front-end must be configured to return appropriate CORS headers. Parent topic: Reference","title":"Embedding API"},{"location":"ref_embedding_api.html#embedding-api","text":"The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page.","title":"Embedding API"},{"location":"ref_embedding_api.html#example-1-declarative","text":"<html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"{launch: {appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', targetId: 'myLeapDiv'}}\"> </script> </body> </html>","title":"Example 1 - Declarative"},{"location":"ref_embedding_api.html#example-2-programmatic","text":"<html> \u2026 <body> <div id=\"myLeapDiv\"> <!-- Leap form will go here --> </div> <script src=\"https://leap.example.com/apps/api/leap.js\"></script> <script> function onLeapFormSubmitted (BO) { alert (\"submitted record id: \" + submittedBO.getDataId()); } function onLeapFormLoaded (app, launchParams) { app.getForm(launchParams.formId).connectEvent(\"afterSave\", onLeapFormSubmitted); } Leap.onReady = function() { var launchParams = { appId: 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55', formId: 'F_Form1', target: document.getElementById(\"myLeapDiv\"), locale: 'fr-FR' callback: onLeapFormLoaded }; Leap.launch(launchParams); }; </script> </body> </html>","title":"Example 2 - Programmatic"},{"location":"ref_embedding_api.html#loading-the-leap-embedding-ui","text":"<script src=\"https://leap.example.com/apps/api/leap.js\" data-leap-config=\"[leap configuration]\" id=\"leapJS'\"></script> id (optional) - fallback for older browsers; the value should always be \"leapJS\" data-leap-config (optional) - JSON or the name of an existing JavaScript object. Properties: locale (optional) - indicates the preferred locale to the Leap API. For example, \"fr-FR\" launch (optional) - equivalent to calling Leap.launch ({\u2026}) function with respective parameters (see below for more details) overwriteExistingDojoConfig (optional) - In some environments, such as HCL Digital Experience or IBM WebSphere Portal, the djConfig or dojoConfig object may be defined on a page and not used. Set the value of this property to true to override it. Loading the Leap API will result in the creation of global object named Leap. After initial load of the leap.js, you can define a Leap.onReady () function which will be called when the necessary Leap resources have been loaded into the page and the API is ready to be used.","title":"Loading the Leap Embedding UI"},{"location":"ref_embedding_api.html#embedding-a-form-programmatically","text":"To embed a Leap form programmatically, call Leap.launch({launch_params}); { launch_params } properties: Property Required? Description appId Yes The Leap application UUID. For example, 'e9ec1ed3-c12b-4b5c-8f5e-7a6ff4800a55' formId Yes The Leap form ID. For example, 'F_Form1' targetId Either target or targetId must be provided. The id of the HTML DOM element to embed the Leap form within. For example, 'myLeapFormDiv' target Either target or targetId must be provided. The HTML DOM element to place the Leap form within. mode No Determines the mode for embedding. Possible values: - ' iframe ': embeds the form in an <iframe> element. For complete isolation of the form, if necessary - ' embed ' (default): embeds the form into the hosting page in a <div> locale No Indicates the preferred locale for the embedded form. For example, 'fr-FR' prefSecMode No If the form supports both anonymous and authenticated usage, this property can be used to automatically choose the preferred security mode. Possible values: - ' anon ': for anonymous usage - ' secure ': for authenticated usage callback No A callback function which will be called when the application launch completes successfully and the form is ready to be interacted with. The callback function will be passed the following parameters: - app : the Leap JavaScript API application object. For more details, see Interface objects - launchParams : the original launch parameters object, for convenience","title":"Embedding a form programmatically"},{"location":"ref_embedding_api.html#known-limitations","text":"Only one Leap form can be embedded on the page at a time. Once the Leap form is embedded, it cannot be changed to a different form or reloaded. The hosting page cannot contain any version of the Dojo JavaScript library. The Leap Embedding API will load its own copy of the Dojo JavaScript library into the hosting page. For authentication, it is expected that the hosting page and the Leap server are configured with single sign-on (SSO). Leap\u2019s login UI will not display properly within the hosting page.","title":"Known Limitations"},{"location":"ref_embedding_api.html#cross-domain-usage","text":"If Leap and the hosting page are in different domains, the Leap front-end must be configured to return appropriate CORS headers. Parent topic: Reference","title":"Cross-Domain Usage"},{"location":"ref_form_objects.html","text":"Form objects Table 1. Form Object (form) The form object provides access to a number of functions that affect the entire form. Object Description Example form.addClasses(classes) Adds a list of custom class names to the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. form.addClasses(\u201cemphasized error\u201d); form.backwardPage() Return the form to the previous page in navigation order. If the first page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.backwardPage(); form.connectEvent(eventName, callbackFunction) Connects a function to an event on the form. This is useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the form dynamically. Returns a handle object that represents the connection of the function to that event name. The handle can be used to disconnect this same event using form.disconnectEvent . If there is a F_CurrentUser field, then populate the currentUser: var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } }); form.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a form.connectEvent call. To avoid duplicate event handlers being connected, connect to events from within the application onStart or form onLoad events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the disconnectEvent method. var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } form.disconnectEvent(hndl); }); form.forwardPage() Advance the form to the next page in navigation order. If the last page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.forwardPage(); |form.getApp() Returns the application object: app. Not a commonly used function, because within the form scope the app variable is also available. form.getBO() Returns the object that contains the Business Object data for the entire form. This is commonly used in the application onStart , since at this scope the form variable is not defined. var myForm = app.getForm('F_Form1'); var formBO = myForm.getBO(); formBO.F_SingleLine.setValue('setting the value using code!'); | |form.getClasses()|Returns an Array of custom class names currently applied to the form.| | |form.getCurrentPage()|Gets the currently shown page. If there is no page shown, then null is returned. It is possible, though rarely desirable, to have all pages hidden.|``` var pageShown = form.getCurrentPage(); if(pageShown === 'F_Page1') pageShown.F_Text.setContent('Changing the text of this text item when this page is shown.'); | |form.getId\\(\\)|Returns the unique ID within the application of this form. For example, F\\_Form1.| | |form.getPageIds\\(\\)|Returns an array of the page IDs for the pages in this form.| | |form.getPage\\(pageId\\)|Returns the page object, page, for the page specified. Returns null if the pageId is invalid.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then, navigate to that page:``` if(thePage !== null) form.selectPage('thePage') | |form.getServiceConfigurationIds\\(\\)|Returns an array of all the IDs for services mapped in this form.|``` var serviceConfigs = form.getServiceConfigurationIds(); | |form.getServiceConfiguration(serviceId)|Gets the service object for a particular service ID.|Lookup and execute a service from JavaScript:``` var service = form.getServiceConfiguration('SC_ServiceConfig'); service.callService(); | |form.getStageActions\\(\\)|Returns an array of all the action buttons for the current stage. This includes any hidden action buttons as well.|Trigger a specific action using JavaScript:``` var actions = form.getStageActions(): for(var i=0; i<actions.length; i++) { if(get(actions,i).getId() === 'S_Submit') { get(actions,i).activate(); break; } } | |form.getType()|Returns a string identifying the object type. For example, form.| | |form.removeClasses(classes)|Removes a list of custom class names from the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` form.removeClasses(\u201cemphasized\u201d); | |form.removePageFromNavigation\\(pageId\\)|Removes the specified page from the navigation list for the form. The page navigation item no longer visits that page when **next**, or **previous** is selected, nor can you switch to that page programmatically.|If the check is selected, remove page 2 from the navigation:``` if(BO.F_Check.getValue) form.removePageFromNavigation('P_Page2'); | |form.restorePageNavigation(pageId)|Restores a previously removed page back into the navigation list for the form.|If the check is not selected, restore page 2 into the navigation:``` if(!BO.F_Check.getValue) form.restorePageNavigation('P_Page2'); | |form.selectPage\\(pageId\\)|Switches to the specified page. If the page is removed from navigation by Stages, Rules, or JavaScript, then you cannot select it.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then navigate to that page:``` if(thePage !== null) form.selectPage(thePage); | |form.sendData\\(data\\)|For IBM\u00ae WebSphere\u00ae Portal only. When hosted in a portlet, calling this method sends the string to any subscribers to the portlet. The content of this string depends on the portlet that consumes it.|Send a URL to be processed by the wire connected to the portlet: ``` form.sendData(BO.F_ServerURL.getValue() + \"/apps/secure/org/app/b5806ef1-b784-4c85-8844-653cd4064201/launch/index.html?form=F_FormA\"); | Parent topic: Interface objects","title":"Form objects"},{"location":"ref_form_objects.html#form-objects","text":"Table 1. Form Object (form) The form object provides access to a number of functions that affect the entire form. Object Description Example form.addClasses(classes) Adds a list of custom class names to the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. form.addClasses(\u201cemphasized error\u201d); form.backwardPage() Return the form to the previous page in navigation order. If the first page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.backwardPage(); form.connectEvent(eventName, callbackFunction) Connects a function to an event on the form. This is useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the form dynamically. Returns a handle object that represents the connection of the function to that event name. The handle can be used to disconnect this same event using form.disconnectEvent . If there is a F_CurrentUser field, then populate the currentUser: var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } }); form.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a form.connectEvent call. To avoid duplicate event handlers being connected, connect to events from within the application onStart or form onLoad events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the disconnectEvent method. var hndl = form.connectEvent('onLoad', function() { if(form.getBO().F_CurrentUser) form.getBO().F_CurrentUser.setValue(app.getCurrentUser()); } form.disconnectEvent(hndl); }); form.forwardPage() Advance the form to the next page in navigation order. If the last page is reached, then nothing happens. The following could be used to turn a regular button into a navigation button. In the onClick event of a button: form.forwardPage(); |form.getApp() Returns the application object: app. Not a commonly used function, because within the form scope the app variable is also available. form.getBO() Returns the object that contains the Business Object data for the entire form. This is commonly used in the application onStart , since at this scope the form variable is not defined. var myForm = app.getForm('F_Form1'); var formBO = myForm.getBO(); formBO.F_SingleLine.setValue('setting the value using code!'); | |form.getClasses()|Returns an Array of custom class names currently applied to the form.| | |form.getCurrentPage()|Gets the currently shown page. If there is no page shown, then null is returned. It is possible, though rarely desirable, to have all pages hidden.|``` var pageShown = form.getCurrentPage(); if(pageShown === 'F_Page1') pageShown.F_Text.setContent('Changing the text of this text item when this page is shown.'); | |form.getId\\(\\)|Returns the unique ID within the application of this form. For example, F\\_Form1.| | |form.getPageIds\\(\\)|Returns an array of the page IDs for the pages in this form.| | |form.getPage\\(pageId\\)|Returns the page object, page, for the page specified. Returns null if the pageId is invalid.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then, navigate to that page:``` if(thePage !== null) form.selectPage('thePage') | |form.getServiceConfigurationIds\\(\\)|Returns an array of all the IDs for services mapped in this form.|``` var serviceConfigs = form.getServiceConfigurationIds(); | |form.getServiceConfiguration(serviceId)|Gets the service object for a particular service ID.|Lookup and execute a service from JavaScript:``` var service = form.getServiceConfiguration('SC_ServiceConfig'); service.callService(); | |form.getStageActions\\(\\)|Returns an array of all the action buttons for the current stage. This includes any hidden action buttons as well.|Trigger a specific action using JavaScript:``` var actions = form.getStageActions(): for(var i=0; i<actions.length; i++) { if(get(actions,i).getId() === 'S_Submit') { get(actions,i).activate(); break; } } | |form.getType()|Returns a string identifying the object type. For example, form.| | |form.removeClasses(classes)|Removes a list of custom class names from the form for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` form.removeClasses(\u201cemphasized\u201d); | |form.removePageFromNavigation\\(pageId\\)|Removes the specified page from the navigation list for the form. The page navigation item no longer visits that page when **next**, or **previous** is selected, nor can you switch to that page programmatically.|If the check is selected, remove page 2 from the navigation:``` if(BO.F_Check.getValue) form.removePageFromNavigation('P_Page2'); | |form.restorePageNavigation(pageId)|Restores a previously removed page back into the navigation list for the form.|If the check is not selected, restore page 2 into the navigation:``` if(!BO.F_Check.getValue) form.restorePageNavigation('P_Page2'); | |form.selectPage\\(pageId\\)|Switches to the specified page. If the page is removed from navigation by Stages, Rules, or JavaScript, then you cannot select it.|Get the specified page:``` var thePage = form.getPage('F_Page1'); If the page exists then navigate to that page:``` if(thePage !== null) form.selectPage(thePage); | |form.sendData\\(data\\)|For IBM\u00ae WebSphere\u00ae Portal only. When hosted in a portlet, calling this method sends the string to any subscribers to the portlet. The content of this string depends on the portlet that consumes it.|Send a URL to be processed by the wire connected to the portlet: ``` form.sendData(BO.F_ServerURL.getValue() + \"/apps/secure/org/app/b5806ef1-b784-4c85-8844-653cd4064201/launch/index.html?form=F_FormA\"); | Parent topic: Interface objects","title":"Form objects"},{"location":"ref_item_objects.html","text":"Item objects Note: The item.setTitle parameter is not applicable to Tabbed Folder form items. Object Description Example item.addClasses(classes)apItem.addClasses(classes) |Adds a list of custom class names to an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned.|``` item.addClasses(\"emphasized error\"); | |item.clearRequiredMessage\\(\\)apItem.clearRequiredMessage\\(\\) |Validates the item data, but prevents the required error message from displaying.| | |item.connectEvent\\(eventName,callbackFunction\\)apItem.connectEvent\\(eventName,callbackFunction\\) |Connects a function to an event on the item. Useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the item dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using item.disconnectEvent.|Connect a listener to the **onItemChange** event to make a section visible. This could be placed in the form **onLoad** event: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } }); | |item.disconnectEvent(eventHandle)apItem.disconnectEvent(eventHandle) |Disconnects the event handler specified by the passed-in event handle object that was returned by an item.connectEvent call.If you connect an item event, you must also disconnect it in the same event. Otherwise, multiple versions of the connected code are attached every time the event is triggered. |If the connect event is placed in the item onShow then the listener needs to be disconnected: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } item.disconnectEvent(hndl); }); | |item.getActive\\(\\)apItem.getActive\\(\\) |Returns true if this item is active, or false if it is made read only by a rule, stage, or JavaScript.| | |apItem.getAppPage\\(\\)|Returns the page object to which this item belongs.| | |item.getBO\\(\\)|Returns the Business Object for the entire form.| | |item.getBOAttr\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.|Get data for an item and set its value:``` item.getBOAttr().setValue(45); | |item.getChildren()|If this item contains children, for example Section, or Tab Folder, it returns a list object that provides access to all direct children items. The list object has the getLength() function and get(index) function for accessing the objects in the list.|Rest all numbers inside a section to 0:``` var list = item.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'number') list.get(i).getBOAttr().setValue(0); } | |item.getClasses\\(\\)apItem.getClasses\\(\\) |Returns an Array of custom class names currently applied to an item.| | |item.getDisplayValue\\(\\)apItem.getDisplayValue\\(\\) |Returns the current value that is being displayed. It can be used in onItemLiveChange to get current, but not yet committed value.| | |item.getHoverText\\(\\)apItem.getHoverText\\(\\) |Returns the current value set as hover text.| | |item.getHintText\\(\\)apItem.getHintText\\(\\) |Returns the value set as **Hint** text.| | |item.getId\\(\\)apItem.getId\\(\\) |Returns the unique ID, within the application, of this item. For example, F\\_FirstName.| | |apItem.getInvalidMessage\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.| | |item.getPage\\(\\)|Returns the page object to which this item belongs.|Get the form object:``` var form = item.getPage().getForm(); | |item.getParent()apItem.getParent() |Returns the object that is the direct parent of the item, which can be a page, section, or tab folder.| | |item.getPlaceholderText()apItem.getPlaceholderText() |Returns the current value set as place holder text.| | |apItem.getRequired()|Gets a value set previously using setRequired().| | |item.getRows()|Returns the current value set as the number of rows displayed. This method gets the number of rows the text area displayed. Note: This parameter works only on multi-line input areas. | | |item.getStartLabel()|This method gets the value of the label displayed at the start of a numeric or choice slider.| | |item.getStopLabel()|This method gets the value of the label displayed at the end of a numeric or choice slider.| | |item.getStyle()|Returns the current value set for display style. Note: This parameter works only on Date and Time input fields. | | |item.getTitle()apItem.getTitle() |Returns the current value used as the field title.| | |item.getType()apItem.getType() |Returns a string identifying the object type.||Palette item|Type|Palette item|Type| |------------|----|------------|----| |Attachment|attachment|Paragraph Text|textArea| |Button|button|Password|password| |Check Box|checkBox|Section|section| |Currency|currency|Select Many|checkGroup| |Date|date|Select One|radioGroup| |Dropdown|comboBox|Single Line|text| |Email Address|emailAddress|Survey|survey| |Folder Tab|tabFolderTab|Survey Question|surveyQuestion| |HTML Fragment|htmlArea|Tabbed folder|tabFolder| |Image|image|Table|aggregationListContainer| |Line|horizontalLine|Text|richText| |Media|media|Time|time| |Number|number|Timestamp|timeStamp| |Numeric Slider|horizontalSlider|Web Link|staticWebLink| |Page|page|Website|weblink| |Page Navigation|pageNavigator|Name Picker|name| |Rich text|richTextArea|Data Grid|dataGrid| | |apItem.getValid()|Gets a value set previously using setValid().| | |item.getValue()apItem.getValue() |Returns the current value. Its type depends on the data type. For example, String [check and radio list objects return a delimited list with _#_ as the delimiter], Number [number, currency], Boolean , Date [date, timestamp, time], or Object [attachment]. | | |item.getVisible()apItem.getVisible() |Returns true if this item is visible (does not take into account which page is being shown) or false if it is hidden by a rule, stage, or JavaScript, or if its parent is hidden.| | |apItem.isMissing()|Returns true if this item is required and it has no value.| | |apItem.isRequired()|Returns true if the item is required, otherwise false.| | |apItem.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |item.removeClasses(classes)apItem.removeClasses(classes) |Removes a list of custom class names from an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` item.removeClasses(\"emphasized\"); | |item.setActive\\(active\\)apItem.setActive\\(active\\) |Sets whether this item is inactive, or read only. **Note:** If this item is made inactive by a rule or stage, then you cannot make it active with JavaScript. | | |item.setDisplayValue\\(pValue\\)apItem.setDisplayValue\\(pValue\\) |Takes a string or number in pValue. This method sets the value being displayed. If the user is editing, then it will update the value they are trying to enter. If the user is not editing, then it will be the same as setValue\\(\\). This method works on direct input items such as single line, multi line, number, currency, email and website.| | |item.setFocus\\(\\)apItem.setFocus\\(\\) |Causes this item to receive focus. This option has no effect on items that cannot have focus, are invisible, or are read-only.| | |item.setHintText\\(pValue\\)apItem.setHintText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for hover text on input items. If an empty value is provided, the hint text area is removed.| | |item.setHoverText\\(pValue\\)apItem.setHoverText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for **Hint** text on input items. If an empty value is provided, no hover help is displayed.| | |apItem.setRequired\\(required\\)|You can override non-required data to be required with this method. Passing true causes its data to be required and prevents submission if it is not set. Setting the valid to false clears any previously overridden value.| | |item.setRows\\(pValue\\)|Takes a pValue number. This method sets the number of rows the text area displays.**Note:** Whenever possible, do not exceed 40 rows. | | |item.setPlaceholderText\\(pValue\\)apItem.setPlaceholderText\\(pValue\\) |Takes a pValue string. This method sets the text used as placeholder text on input items.| | |item.setStartLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the start of a numeric or choice slider.| | |item.setStopLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the end of a numeric or choice slider.| | |item.setStyle\\(pValue\\)|Takes a pValue string. This method sets the style used to display time and dates. Valid values are numeric, short, medium, long, and full. Valid values for time are numeric, short and medium.| | |item.setTitle\\(pValue\\)apItem.setTitle\\(pValue\\) |Takes a pValue string. This method sets the text used for a field titles on input items. If an empty value is provided, the title is removed.| | |apItem.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. Passing false causes the data to be invalid, and prevents submission. You can optionally provide a custom error message. Setting the valid to true clears any previously overridden valid value.| | |item.setValue\\(pValue\\)apItem.setValue\\(pValue\\) |Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. **Note:** The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. | | |item.setVisible\\(visible\\)apItem.setVisible\\(visible\\) |Sets whether this item is visible. **Note:** If this item is made invisible by a rule or stage, or because a parent is hidden, then you cannot unhide it by calling this function. | | |apItem.validate\\(\\)|Triggers the validation of the data item.| | |item.getColumnHeaders\\(\\) |Returns a JSON object that contains the id, title and width of each header displayed for the table. Sample JSON output: [{id:\"F_Currency1\",title:\"La Currency\",width:20}, {id:\"F_Date1\",title:\"La Date\"}] |``` var headers = page.F_Table1.getColumnHeaders(); for(var h in headers) { alert(\"ID=\" + get(headers,h).id + \", title=\" + get(headers,h).title + \", width=\" + get(headers,h).width); } | |item.setColumnHeaders(headers) |Function accepts a JSON object that can be used to set the id, title and width of each column in the table. This is helpful, for example, to change the language of the column header displayed. |``` {#codeblock_hpl_rqh_hwb} var headers = new Array(); set(headers, 0, {id: \"F_Currency1\", title: \"La Currency\", width: 20}); set(headers, 1, {id: \"F_Date1\", title: \"La Date\"}); page.F_Table1.setColumnHeaders(headers); | |Object|Description|Example| |------|-----------|-------| |item.getOptions\\(\\)|Returns the array of options currently shown in the drop-down. Each object in the array has a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Get the title of a specific dropdown value:``` var displayedValue = \"\"; var savedValue = BO.F_DropDown1.getValue(); var opts = page.F_DropDown1.getOptions(); for(var i=0; i<opts.length; i++) { var opt = get(opts, i); if(opt.value === savedValue) { displayedValue = opt.title; break; } } | |item.setOptions(options)|Changes the list of options to show in the drop-down. It must be an array of objects. Each object must have a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Provide custom list for the drop-down:``` var options = new Array(); options.push({title:'Banana',value:'BA'}); options.push({title:'Apple',value:'AP'}); options.push({title:'Orange',value:'OR'}); item.setOptions(options); | |Object|Description| |------|-----------| |item.setDisplayValue\\(display\\)|Sets the display value that the user sees as the link in the browser.| |item.setLinkValue\\(link\\)|Sets the URL to which the link navigates when this item is clicked.| |Object|Description| |------|-----------| |item.getContent\\(\\)|Gets the currently shown content for this interface item.| |item.setContent\\(content\\)|Shows content in this interface only item. The content is evaluated as HTML code.| |Object|Description| |------|-----------| |item.setContent\\(content\\)|Shows content in this interface-only item. In Text, it is the raw text to show, no special formatting is supported.| |Object|Description| |------|-----------| |item.setAlternativeText\\(pText\\)|Sets the alt text of the image assigned to the button.| |item.setContent\\(content\\)|Sets the label that is shown on the button.| |item.setDisabledImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the button is disabled.| |item.setImageHeight\\(pHeight\\)|Sets explicit height in pixels for the image.| |item.setImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL.| |item.setImageWidth\\(pWidth\\)|Sets explicit width in pixels for the image.| |item.setMouseDownImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse down event is triggered.| |item.setMouseOverImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse over event is triggered.| |Object|Description| |------|-----------| |item.getHeight\\(\\)|Returns the current image height. Can be zero or blank.| |item.getURL\\(\\)|Gets the current URL shown by this image item.| |item.getWidth\\(\\)|Returns the current image width. Can be zero or blank.| |item.setHeight\\(height\\)|Sets explicit height in pixels for the image. Setting \u201c0\u201d removes the explicit height.| |item.setURL\\(newURL\\)|Sets the URL shown by this image item.| |item.setWidth\\(width\\)|Sets explicit width in pixels for the image. Setting \u201c0\u201d removes the explicit width.| |Object|Description| |------|-----------| |item.getExpanded\\(\\)|Returns true if the section is expanded and false if it is collapsed.| |item.setExpanded\\(expanded\\)|Sets the expanded state of the section. If true, the section is expanded. If false, then it is collapsed.| |Object|Description|Example| |------|-----------|-------| |item.getSelectionIndex\\(\\)|Returns the index of the currently selected tab.|Set 12 into the first item in the currently shown tab:``` var sel = item.getSelectionIndex(); var tabs = item.getChildren(); var selTab = tabs.get(sel); var tabChildren = selTab.getChildren(); tabChildren.get(0).getBOAttr().setValue(12); | |item.getTabTitleList()|Returns an array of all the tab titles in this folder.| | |item.setSelectedTab(tabTitle)|Takes a tabTable string. Selects the Tab that matches the tabTable string.| | |item.setTabTitle(tabIndex,pTitle)|Updates the title of a tab within a Tabbed Folder by using a tabIndex integer and pTitle string value. tabIndex denotes the location of the tab within the list of available tabs from left-to-right. For bidirectional languages, the order is right-to-left.|On the form, a Tabbed folder contains 5 tabs: Red, Orange, Yellow, Green, Blue. The default start number of the tabIndex is 0. In our example tabbed folder, the tabIndex number 0 is the Red tab which is furthest left, while 4 is the tab furthest to the right. In a bidirectional language, the order is reversed. Tab 0 is assigned to Blue, which is the tab furthest to the right. | |item.setTabTitleList(pTitleArray)|Updates the titles of tabs within a Tabbed Folder from a list of strings by using a pTitleArray array of string values. The list of tabs is updated respective to the order of strings that are defined in the array. If there are more array values than tabs in the form, the additional values are ignored.|``` item.setTabTitleList(['Monday','Tuesday','Wednesday','Thursday','Friday']); | |Object|Description|Example| |------|-----------|-------| |item.getSelection\\(\\)|Returns the Business Object of the selected row or null if there is no selection.| | |item.setSelection\\(BO\\)|Selects the last Business Object in the table.|Select that last row in the table:``` var lastIndex = item.getBOAttr().getLength()-1; var lastRow = item.getBOAttr().get(lastIndex); item.setSelection(lastRow); | |item.showAdd(show)|If show is true, then the Add button is made visible.If false, then the Add button is hidden. | | |item.showEdit(show)|If show is true, then the Edit button is made visible. If false, then the Edit button is hidden. | | |item.showRemove(show)|If show is true, then the Remove button is made visible. If false, then the Remove button is hidden. | | Object Description item.getOptions() Returns an array of all the options for the survey questions. Each option has a value property, that gets saved in the data, and a display property, the title of at the beginning of the survey. Object Description Example item.getDisplayedData() - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - uid : The identifier of the attachment. - filename : the file name of the attachment. - viewUrl : The url to view the attachment. - downloadUrl : The url to download the attachment. - Object: Name Picker - Object: Select Many - savedValues : An array of all the saved values. - displayValues : An array of all the display values. - displayString : All the list values provided as a comma-separated string. - String: All other items |Render all the row data displayed in the data grid as JSON: ``` {#codeblock_fzz_2dq_5qb} appPage.F_Text2.setContent(toJson(appPage.F_DataGrid1.getDisplayedData(), true)); Calculate the sum of a column from displayed data: ``` {#codeblock_znv_gdq_5qb} var data = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in data) { var dObj = get(data, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); | |item.isAllDataDisplayed()|Returns true if all the submitted data for the form connected to the data grid is rendered on screen in a single page.|If all the known data is being displayed, then do something with that data. In this example the sum of a column is calculated: if(appPage.F_DataGrid1.isAllDataDisplayed()) { var allData = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in allData) { var dObj = get(allData, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); } | |item.isColumnVisible(columnId)|Returns true if the specified column is visible in the data grid.|``` {#codeblock_zyh_s3q_5qb} appPage.F_DataGrid1.isColumnVisble(\u201cF_SingleLine1\u201d); | |item.refresh\\(\\)|Forces the data grid to reload. For example, a submission with \u201capps as a service\u201d may have been triggered and the content in the data grid is stale.|Refresh the data grid after calling a service that changes \\(i.e. adds to, removes from, or updates\\) the data to which the data grid is connected: ``` {#codeblock_csc_x3q_5qb} var srv = form.getServiceConfiguration('SC_theService'); srv.connectEvent(\"onCallFinished\", function(success) { if(success) { try { appPage.F_DataGrid1.refresh(); } catch (err) { alert(\"SC_theService: \" + err); } } }); | |item.selectFirstRow()|Selects the first row in the data grid.| | |item.setColumnHeader(columnId, pHeaderValue)|Sets the header identified by columnId, to the value provided in pHeaderValue.|See above for columnId values. Set the header of a column to another language: ``` {#codeblock_rt3_djq_5qb} appPage.F_DataGrid1.setColumnHeader(\"createdBy\", \"Cr\u00e9\u00e9 par\"); | |item.setColumnVisible\\(columnId, boolVal\\)|Controls the visibility of the column identified by columnId. If boolVal is true, the column is shown. If boolVal is false, the column is hidden.|See above for columnId values. Hide a column from the data grid if user is not part of a specific role: ``` {#codeblock_dz3_3jq_5qb} var isAdmin = app.getCurrentUserRoles().contains(\"Administrator\"); item.setColumnVisible(\"F_AdminOnly1\", isAdmin); | |item.resetFilters()|Returns the filters to what was specified in the data grid configuration.| | |item.setFilters([filter], filterOp)|Set filters for the data grid, this will override any filters specified in the data grid configuration. [filter] is an array of filter objects. filterOp is either \u201cand\u201d or \u201cor\u201d and is required if there is more than one filter. A filter is made up of the following: name: the id of a meta-data attribute or a field of the form configured to the data grid. Note: The field id does not have to be displayed in the data grid. operator: as documented in Filtering Data REST API results . value: the value to search |Set a filter to show records that are older than one week and in the \u201cST_Triage\u201d stage: ``` {#codeblock_ls3_yjq_5qb} var now = new Date(); var aWeekAgo = new Date (now.getTime() - (7 24 60 60 1000)); var filters = [ {name : \"created\", operator: \"before\", value: aWeekAgo}, {name: \"stageId\", operator: \"equals\", value: \"ST_Triage\"} ]; page.F_DataGrid1.setFilters(filters, \"and\"); Set a filter to show records between two dates, from fields on the same app page as the data grid: ``` {#codeblock_kp5_5ls_lsb} var filters = [ {name: \"F_BirthDate\", operator: \"between\", value: [appPage.F_StartDate.getValue(), appPage.F_EndDate.getValue()]} ]; appPage.F_DataGrid2.setFilters(filters, \"and\"); Remove all filters: {#codeblock_nyv_zjq_5qb} appPage.F_DataGrid1.setFilters(null); | Parent topic: Interface objects","title":"Item objects"},{"location":"ref_item_objects.html#ref_item_objects","text":"Note: The item.setTitle parameter is not applicable to Tabbed Folder form items. Object Description Example item.addClasses(classes)apItem.addClasses(classes) |Adds a list of custom class names to an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned.|``` item.addClasses(\"emphasized error\"); | |item.clearRequiredMessage\\(\\)apItem.clearRequiredMessage\\(\\) |Validates the item data, but prevents the required error message from displaying.| | |item.connectEvent\\(eventName,callbackFunction\\)apItem.connectEvent\\(eventName,callbackFunction\\) |Connects a function to an event on the item. Useful for utility functions defined in external JavaScript\u2122 files to hook behavior into the item dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using item.disconnectEvent.|Connect a listener to the **onItemChange** event to make a section visible. This could be placed in the form **onLoad** event: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } }); | |item.disconnectEvent(eventHandle)apItem.disconnectEvent(eventHandle) |Disconnects the event handler specified by the passed-in event handle object that was returned by an item.connectEvent call.If you connect an item event, you must also disconnect it in the same event. Otherwise, multiple versions of the connected code are attached every time the event is triggered. |If the connect event is placed in the item onShow then the listener needs to be disconnected: ``` var hndl = item.connectEvent('onItemChange', function() { if(item.getBOAttr().getValue() === 'Yes') form.getBO().F_SectionA.setVisible(true); } item.disconnectEvent(hndl); }); | |item.getActive\\(\\)apItem.getActive\\(\\) |Returns true if this item is active, or false if it is made read only by a rule, stage, or JavaScript.| | |apItem.getAppPage\\(\\)|Returns the page object to which this item belongs.| | |item.getBO\\(\\)|Returns the Business Object for the entire form.| | |item.getBOAttr\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.|Get data for an item and set its value:``` item.getBOAttr().setValue(45); | |item.getChildren()|If this item contains children, for example Section, or Tab Folder, it returns a list object that provides access to all direct children items. The list object has the getLength() function and get(index) function for accessing the objects in the list.|Rest all numbers inside a section to 0:``` var list = item.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'number') list.get(i).getBOAttr().setValue(0); } | |item.getClasses\\(\\)apItem.getClasses\\(\\) |Returns an Array of custom class names currently applied to an item.| | |item.getDisplayValue\\(\\)apItem.getDisplayValue\\(\\) |Returns the current value that is being displayed. It can be used in onItemLiveChange to get current, but not yet committed value.| | |item.getHoverText\\(\\)apItem.getHoverText\\(\\) |Returns the current value set as hover text.| | |item.getHintText\\(\\)apItem.getHintText\\(\\) |Returns the value set as **Hint** text.| | |item.getId\\(\\)apItem.getId\\(\\) |Returns the unique ID, within the application, of this item. For example, F\\_FirstName.| | |apItem.getInvalidMessage\\(\\)|An interface item that is collecting data, this method returns the Business Object Attribute that contains that data. If it is an interface-only item, then it returns null.| | |item.getPage\\(\\)|Returns the page object to which this item belongs.|Get the form object:``` var form = item.getPage().getForm(); | |item.getParent()apItem.getParent() |Returns the object that is the direct parent of the item, which can be a page, section, or tab folder.| | |item.getPlaceholderText()apItem.getPlaceholderText() |Returns the current value set as place holder text.| | |apItem.getRequired()|Gets a value set previously using setRequired().| | |item.getRows()|Returns the current value set as the number of rows displayed. This method gets the number of rows the text area displayed. Note: This parameter works only on multi-line input areas. | | |item.getStartLabel()|This method gets the value of the label displayed at the start of a numeric or choice slider.| | |item.getStopLabel()|This method gets the value of the label displayed at the end of a numeric or choice slider.| | |item.getStyle()|Returns the current value set for display style. Note: This parameter works only on Date and Time input fields. | | |item.getTitle()apItem.getTitle() |Returns the current value used as the field title.| | |item.getType()apItem.getType() |Returns a string identifying the object type.||Palette item|Type|Palette item|Type| |------------|----|------------|----| |Attachment|attachment|Paragraph Text|textArea| |Button|button|Password|password| |Check Box|checkBox|Section|section| |Currency|currency|Select Many|checkGroup| |Date|date|Select One|radioGroup| |Dropdown|comboBox|Single Line|text| |Email Address|emailAddress|Survey|survey| |Folder Tab|tabFolderTab|Survey Question|surveyQuestion| |HTML Fragment|htmlArea|Tabbed folder|tabFolder| |Image|image|Table|aggregationListContainer| |Line|horizontalLine|Text|richText| |Media|media|Time|time| |Number|number|Timestamp|timeStamp| |Numeric Slider|horizontalSlider|Web Link|staticWebLink| |Page|page|Website|weblink| |Page Navigation|pageNavigator|Name Picker|name| |Rich text|richTextArea|Data Grid|dataGrid| | |apItem.getValid()|Gets a value set previously using setValid().| | |item.getValue()apItem.getValue() |Returns the current value. Its type depends on the data type. For example, String [check and radio list objects return a delimited list with _#_ as the delimiter], Number [number, currency], Boolean , Date [date, timestamp, time], or Object [attachment]. | | |item.getVisible()apItem.getVisible() |Returns true if this item is visible (does not take into account which page is being shown) or false if it is hidden by a rule, stage, or JavaScript, or if its parent is hidden.| | |apItem.isMissing()|Returns true if this item is required and it has no value.| | |apItem.isRequired()|Returns true if the item is required, otherwise false.| | |apItem.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |item.removeClasses(classes)apItem.removeClasses(classes) |Removes a list of custom class names from an item for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names.|``` item.removeClasses(\"emphasized\"); | |item.setActive\\(active\\)apItem.setActive\\(active\\) |Sets whether this item is inactive, or read only. **Note:** If this item is made inactive by a rule or stage, then you cannot make it active with JavaScript. | | |item.setDisplayValue\\(pValue\\)apItem.setDisplayValue\\(pValue\\) |Takes a string or number in pValue. This method sets the value being displayed. If the user is editing, then it will update the value they are trying to enter. If the user is not editing, then it will be the same as setValue\\(\\). This method works on direct input items such as single line, multi line, number, currency, email and website.| | |item.setFocus\\(\\)apItem.setFocus\\(\\) |Causes this item to receive focus. This option has no effect on items that cannot have focus, are invisible, or are read-only.| | |item.setHintText\\(pValue\\)apItem.setHintText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for hover text on input items. If an empty value is provided, the hint text area is removed.| | |item.setHoverText\\(pValue\\)apItem.setHoverText\\(pValue\\) |Takes a pValue string. This method sets the text that is used for **Hint** text on input items. If an empty value is provided, no hover help is displayed.| | |apItem.setRequired\\(required\\)|You can override non-required data to be required with this method. Passing true causes its data to be required and prevents submission if it is not set. Setting the valid to false clears any previously overridden value.| | |item.setRows\\(pValue\\)|Takes a pValue number. This method sets the number of rows the text area displays.**Note:** Whenever possible, do not exceed 40 rows. | | |item.setPlaceholderText\\(pValue\\)apItem.setPlaceholderText\\(pValue\\) |Takes a pValue string. This method sets the text used as placeholder text on input items.| | |item.setStartLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the start of a numeric or choice slider.| | |item.setStopLabel\\(pValue\\)|Takes a pValue string. This method sets the value of the label displayed at the end of a numeric or choice slider.| | |item.setStyle\\(pValue\\)|Takes a pValue string. This method sets the style used to display time and dates. Valid values are numeric, short, medium, long, and full. Valid values for time are numeric, short and medium.| | |item.setTitle\\(pValue\\)apItem.setTitle\\(pValue\\) |Takes a pValue string. This method sets the text used for a field titles on input items. If an empty value is provided, the title is removed.| | |apItem.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. Passing false causes the data to be invalid, and prevents submission. You can optionally provide a custom error message. Setting the valid to true clears any previously overridden valid value.| | |item.setValue\\(pValue\\)apItem.setValue\\(pValue\\) |Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. **Note:** The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. | | |item.setVisible\\(visible\\)apItem.setVisible\\(visible\\) |Sets whether this item is visible. **Note:** If this item is made invisible by a rule or stage, or because a parent is hidden, then you cannot unhide it by calling this function. | | |apItem.validate\\(\\)|Triggers the validation of the data item.| | |item.getColumnHeaders\\(\\) |Returns a JSON object that contains the id, title and width of each header displayed for the table. Sample JSON output: [{id:\"F_Currency1\",title:\"La Currency\",width:20}, {id:\"F_Date1\",title:\"La Date\"}] |``` var headers = page.F_Table1.getColumnHeaders(); for(var h in headers) { alert(\"ID=\" + get(headers,h).id + \", title=\" + get(headers,h).title + \", width=\" + get(headers,h).width); } | |item.setColumnHeaders(headers) |Function accepts a JSON object that can be used to set the id, title and width of each column in the table. This is helpful, for example, to change the language of the column header displayed. |``` {#codeblock_hpl_rqh_hwb} var headers = new Array(); set(headers, 0, {id: \"F_Currency1\", title: \"La Currency\", width: 20}); set(headers, 1, {id: \"F_Date1\", title: \"La Date\"}); page.F_Table1.setColumnHeaders(headers); | |Object|Description|Example| |------|-----------|-------| |item.getOptions\\(\\)|Returns the array of options currently shown in the drop-down. Each object in the array has a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Get the title of a specific dropdown value:``` var displayedValue = \"\"; var savedValue = BO.F_DropDown1.getValue(); var opts = page.F_DropDown1.getOptions(); for(var i=0; i<opts.length; i++) { var opt = get(opts, i); if(opt.value === savedValue) { displayedValue = opt.title; break; } } | |item.setOptions(options)|Changes the list of options to show in the drop-down. It must be an array of objects. Each object must have a \u201ctitle\u201d property that is shown in the interface, and a \u201cvalue\u201d property that is saved into the data.|Provide custom list for the drop-down:``` var options = new Array(); options.push({title:'Banana',value:'BA'}); options.push({title:'Apple',value:'AP'}); options.push({title:'Orange',value:'OR'}); item.setOptions(options); | |Object|Description| |------|-----------| |item.setDisplayValue\\(display\\)|Sets the display value that the user sees as the link in the browser.| |item.setLinkValue\\(link\\)|Sets the URL to which the link navigates when this item is clicked.| |Object|Description| |------|-----------| |item.getContent\\(\\)|Gets the currently shown content for this interface item.| |item.setContent\\(content\\)|Shows content in this interface only item. The content is evaluated as HTML code.| |Object|Description| |------|-----------| |item.setContent\\(content\\)|Shows content in this interface-only item. In Text, it is the raw text to show, no special formatting is supported.| |Object|Description| |------|-----------| |item.setAlternativeText\\(pText\\)|Sets the alt text of the image assigned to the button.| |item.setContent\\(content\\)|Sets the label that is shown on the button.| |item.setDisabledImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the button is disabled.| |item.setImageHeight\\(pHeight\\)|Sets explicit height in pixels for the image.| |item.setImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL.| |item.setImageWidth\\(pWidth\\)|Sets explicit width in pixels for the image.| |item.setMouseDownImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse down event is triggered.| |item.setMouseOverImageUrl\\(pUrl\\)|Sets the background of the button to the image at the public URL when the mouse over event is triggered.| |Object|Description| |------|-----------| |item.getHeight\\(\\)|Returns the current image height. Can be zero or blank.| |item.getURL\\(\\)|Gets the current URL shown by this image item.| |item.getWidth\\(\\)|Returns the current image width. Can be zero or blank.| |item.setHeight\\(height\\)|Sets explicit height in pixels for the image. Setting \u201c0\u201d removes the explicit height.| |item.setURL\\(newURL\\)|Sets the URL shown by this image item.| |item.setWidth\\(width\\)|Sets explicit width in pixels for the image. Setting \u201c0\u201d removes the explicit width.| |Object|Description| |------|-----------| |item.getExpanded\\(\\)|Returns true if the section is expanded and false if it is collapsed.| |item.setExpanded\\(expanded\\)|Sets the expanded state of the section. If true, the section is expanded. If false, then it is collapsed.| |Object|Description|Example| |------|-----------|-------| |item.getSelectionIndex\\(\\)|Returns the index of the currently selected tab.|Set 12 into the first item in the currently shown tab:``` var sel = item.getSelectionIndex(); var tabs = item.getChildren(); var selTab = tabs.get(sel); var tabChildren = selTab.getChildren(); tabChildren.get(0).getBOAttr().setValue(12); | |item.getTabTitleList()|Returns an array of all the tab titles in this folder.| | |item.setSelectedTab(tabTitle)|Takes a tabTable string. Selects the Tab that matches the tabTable string.| | |item.setTabTitle(tabIndex,pTitle)|Updates the title of a tab within a Tabbed Folder by using a tabIndex integer and pTitle string value. tabIndex denotes the location of the tab within the list of available tabs from left-to-right. For bidirectional languages, the order is right-to-left.|On the form, a Tabbed folder contains 5 tabs: Red, Orange, Yellow, Green, Blue. The default start number of the tabIndex is 0. In our example tabbed folder, the tabIndex number 0 is the Red tab which is furthest left, while 4 is the tab furthest to the right. In a bidirectional language, the order is reversed. Tab 0 is assigned to Blue, which is the tab furthest to the right. | |item.setTabTitleList(pTitleArray)|Updates the titles of tabs within a Tabbed Folder from a list of strings by using a pTitleArray array of string values. The list of tabs is updated respective to the order of strings that are defined in the array. If there are more array values than tabs in the form, the additional values are ignored.|``` item.setTabTitleList(['Monday','Tuesday','Wednesday','Thursday','Friday']); | |Object|Description|Example| |------|-----------|-------| |item.getSelection\\(\\)|Returns the Business Object of the selected row or null if there is no selection.| | |item.setSelection\\(BO\\)|Selects the last Business Object in the table.|Select that last row in the table:``` var lastIndex = item.getBOAttr().getLength()-1; var lastRow = item.getBOAttr().get(lastIndex); item.setSelection(lastRow); | |item.showAdd(show)|If show is true, then the Add button is made visible.If false, then the Add button is hidden. | | |item.showEdit(show)|If show is true, then the Edit button is made visible. If false, then the Edit button is hidden. | | |item.showRemove(show)|If show is true, then the Remove button is made visible. If false, then the Remove button is hidden. | | Object Description item.getOptions() Returns an array of all the options for the survey questions. Each option has a value property, that gets saved in the data, and a display property, the title of at the beginning of the survey. Object Description Example item.getDisplayedData() - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - uid : The identifier of the attachment. - filename : the file name of the attachment. - viewUrl : The url to view the attachment. - downloadUrl : The url to download the attachment. - Object: Name Picker - Object: Select Many - savedValues : An array of all the saved values. - displayValues : An array of all the display values. - displayString : All the list values provided as a comma-separated string. - String: All other items |Render all the row data displayed in the data grid as JSON: ``` {#codeblock_fzz_2dq_5qb} appPage.F_Text2.setContent(toJson(appPage.F_DataGrid1.getDisplayedData(), true)); Calculate the sum of a column from displayed data: ``` {#codeblock_znv_gdq_5qb} var data = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in data) { var dObj = get(data, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); | |item.isAllDataDisplayed()|Returns true if all the submitted data for the form connected to the data grid is rendered on screen in a single page.|If all the known data is being displayed, then do something with that data. In this example the sum of a column is calculated: if(appPage.F_DataGrid1.isAllDataDisplayed()) { var allData = appPage.F_DataGrid1.getDisplayedData(); var sum = 0; for(var d in allData) { var dObj = get(allData, d); sum += dObj.F_Number1; } alert(\"Sum = \" + sum); } | |item.isColumnVisible(columnId)|Returns true if the specified column is visible in the data grid.|``` {#codeblock_zyh_s3q_5qb} appPage.F_DataGrid1.isColumnVisble(\u201cF_SingleLine1\u201d); | |item.refresh\\(\\)|Forces the data grid to reload. For example, a submission with \u201capps as a service\u201d may have been triggered and the content in the data grid is stale.|Refresh the data grid after calling a service that changes \\(i.e. adds to, removes from, or updates\\) the data to which the data grid is connected: ``` {#codeblock_csc_x3q_5qb} var srv = form.getServiceConfiguration('SC_theService'); srv.connectEvent(\"onCallFinished\", function(success) { if(success) { try { appPage.F_DataGrid1.refresh(); } catch (err) { alert(\"SC_theService: \" + err); } } }); | |item.selectFirstRow()|Selects the first row in the data grid.| | |item.setColumnHeader(columnId, pHeaderValue)|Sets the header identified by columnId, to the value provided in pHeaderValue.|See above for columnId values. Set the header of a column to another language: ``` {#codeblock_rt3_djq_5qb} appPage.F_DataGrid1.setColumnHeader(\"createdBy\", \"Cr\u00e9\u00e9 par\"); | |item.setColumnVisible\\(columnId, boolVal\\)|Controls the visibility of the column identified by columnId. If boolVal is true, the column is shown. If boolVal is false, the column is hidden.|See above for columnId values. Hide a column from the data grid if user is not part of a specific role: ``` {#codeblock_dz3_3jq_5qb} var isAdmin = app.getCurrentUserRoles().contains(\"Administrator\"); item.setColumnVisible(\"F_AdminOnly1\", isAdmin); | |item.resetFilters()|Returns the filters to what was specified in the data grid configuration.| | |item.setFilters([filter], filterOp)|Set filters for the data grid, this will override any filters specified in the data grid configuration. [filter] is an array of filter objects. filterOp is either \u201cand\u201d or \u201cor\u201d and is required if there is more than one filter. A filter is made up of the following: name: the id of a meta-data attribute or a field of the form configured to the data grid. Note: The field id does not have to be displayed in the data grid. operator: as documented in Filtering Data REST API results . value: the value to search |Set a filter to show records that are older than one week and in the \u201cST_Triage\u201d stage: ``` {#codeblock_ls3_yjq_5qb} var now = new Date(); var aWeekAgo = new Date (now.getTime() - (7 24 60 60 1000)); var filters = [ {name : \"created\", operator: \"before\", value: aWeekAgo}, {name: \"stageId\", operator: \"equals\", value: \"ST_Triage\"} ]; page.F_DataGrid1.setFilters(filters, \"and\"); Set a filter to show records between two dates, from fields on the same app page as the data grid: ``` {#codeblock_kp5_5ls_lsb} var filters = [ {name: \"F_BirthDate\", operator: \"between\", value: [appPage.F_StartDate.getValue(), appPage.F_EndDate.getValue()]} ]; appPage.F_DataGrid2.setFilters(filters, \"and\"); Remove all filters: {#codeblock_nyv_zjq_5qb} appPage.F_DataGrid1.setFilters(null); | Parent topic: Interface objects","title":"Item objects"},{"location":"ref_javascript_api.html","text":"JavaScript API JavaScript\u2122 API Structure Leap JavaScript API structure. The graphic provides a high-level view of the JavaScript API object structure at run time. The Form interface is created once when the application is loaded into the browser, and is then reused every time form data needs to be displayed. The Form Data Business Object is dynamic and is loaded into the user interface each time a form is loaded or created. Usage Details: This library follows a security protocol as defined in Securing Leap overview . For applications with multiple forms, only the form user interface displayed has a Business Object assigned to it. The other forms are hidden, and do not point to data. Tables point to a data element that is a list of Business Object data instances. These Business Object elements are of the same structure as the Business Objects used for a full form. The sub form that you create for editing the table data works only on one item in this list at a time. When it is not in use, it is hidden and does not point to any data. Interface Model Application : The application is the parent that contains forms. It provides a few useful general functions and can be used to get access to any of the forms. Although you can get access to all the forms, only the form currently being displayed has a data Business Object and can have its user interface modified. Forms : There can be any number of forms in an application. Each form contains one or more pages that contain the items. There is a Business Object for each form that holds the data contained in the form. Pages : Pages contain items that collect and display the information for the form. All items on a page can be accessed as properties directly on the page, for example, page.F_MySingleLineitem.setVisible(false);. Each item is accessed by its ID, which can be found in the composer by opening the item\u2019s Edit Properties dialog and going to the Advanced tab. Items : There are two types of items on a form: those that collect data, for example, Single Line Field and Timestamp, and those that do not, including Image, Text, and Section. Any item that collects data is associated with a Business Object Attribute that contains this data. Data Model Business Object : The Business Object contains all the data for a particular form. This data is contained in a Business Object Attribute for each data item contained in the form. These options can be accessed using the following syntax: ``` BO.F_MySingleLineitem ``` Each Business Object Attribute is accessed by its ID, which is found in the composer by opening the item\u2019s **Edit Properties** dialog and going to the **Advanced** tab. Business Object Attribute : Each item that is mapped to data has its own Business Object Attribute. The Business Object Attribute contains this data. **Note:** Some items do not collect data. These items do not have a corresponding Business Object Attributes in the Business Object. For example: PageNavigation. Running Custom JavaScript \u2013 Events Custom JavaScript is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Running Custom JavaScript Files Custom JavaScript can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Reference Objects and Functions Describes the Functions available on different parts of the HCL Leap object model. Parent topic: Reference","title":"JavaScript API"},{"location":"ref_javascript_api.html#ref_jsapi","text":"","title":"JavaScript API"},{"location":"ref_javascript_api.html#javascripttm-api-structure","text":"Leap JavaScript API structure. The graphic provides a high-level view of the JavaScript API object structure at run time. The Form interface is created once when the application is loaded into the browser, and is then reused every time form data needs to be displayed. The Form Data Business Object is dynamic and is loaded into the user interface each time a form is loaded or created. Usage Details: This library follows a security protocol as defined in Securing Leap overview . For applications with multiple forms, only the form user interface displayed has a Business Object assigned to it. The other forms are hidden, and do not point to data. Tables point to a data element that is a list of Business Object data instances. These Business Object elements are of the same structure as the Business Objects used for a full form. The sub form that you create for editing the table data works only on one item in this list at a time. When it is not in use, it is hidden and does not point to any data.","title":"JavaScript\u2122 API Structure"},{"location":"ref_javascript_api.html#interface-model","text":"Application : The application is the parent that contains forms. It provides a few useful general functions and can be used to get access to any of the forms. Although you can get access to all the forms, only the form currently being displayed has a data Business Object and can have its user interface modified. Forms : There can be any number of forms in an application. Each form contains one or more pages that contain the items. There is a Business Object for each form that holds the data contained in the form. Pages : Pages contain items that collect and display the information for the form. All items on a page can be accessed as properties directly on the page, for example, page.F_MySingleLineitem.setVisible(false);. Each item is accessed by its ID, which can be found in the composer by opening the item\u2019s Edit Properties dialog and going to the Advanced tab. Items : There are two types of items on a form: those that collect data, for example, Single Line Field and Timestamp, and those that do not, including Image, Text, and Section. Any item that collects data is associated with a Business Object Attribute that contains this data.","title":"Interface Model"},{"location":"ref_javascript_api.html#data-model","text":"Business Object : The Business Object contains all the data for a particular form. This data is contained in a Business Object Attribute for each data item contained in the form. These options can be accessed using the following syntax: ``` BO.F_MySingleLineitem ``` Each Business Object Attribute is accessed by its ID, which is found in the composer by opening the item\u2019s **Edit Properties** dialog and going to the **Advanced** tab. Business Object Attribute : Each item that is mapped to data has its own Business Object Attribute. The Business Object Attribute contains this data. **Note:** Some items do not collect data. These items do not have a corresponding Business Object Attributes in the Business Object. For example: PageNavigation. Running Custom JavaScript \u2013 Events Custom JavaScript is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Running Custom JavaScript Files Custom JavaScript can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Reference Objects and Functions Describes the Functions available on different parts of the HCL Leap object model. Parent topic: Reference","title":"Data Model"},{"location":"ref_jsapi_application_events.html","text":"Application Events This topic describes the Application Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There is one event at the application level in Settings > Events that is called from the context of the application, regardless of what form is going to be displayed. Table 1. JavaScript\u2122 objects available in application events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.getCurrentUser(); GUI Table 2. Application Events Event Description Example onStart Called once when the browser is first loaded with your application. You can access the form\u2019s interface model for attaching programmatic events. However, nothing else on the form is modified because the forms have not been displayed to the user, nor have they had any data attached. - Create a global function for later use: app.getSharedData().messageBox = function( { alert(\"Warning: \" +message); }; - Register a function to be called that shows a section when a Service finishes: var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration('SC_ServiceConfig0'); serviceConfig.connectEvent('onCallFinished', function(success) { form.getPage('P_Page1').F_Section1.setVisible(true); }); Parent topic: Running Custom JavaScript \u2013 Events","title":"Application Events"},{"location":"ref_jsapi_application_events.html#application-events","text":"This topic describes the Application Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There is one event at the application level in Settings > Events that is called from the context of the application, regardless of what form is going to be displayed. Table 1. JavaScript\u2122 objects available in application events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.getCurrentUser(); GUI Table 2. Application Events Event Description Example onStart Called once when the browser is first loaded with your application. You can access the form\u2019s interface model for attaching programmatic events. However, nothing else on the form is modified because the forms have not been displayed to the user, nor have they had any data attached. - Create a global function for later use: app.getSharedData().messageBox = function( { alert(\"Warning: \" +message); }; - Register a function to be called that shows a section when a Service finishes: var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration('SC_ServiceConfig0'); serviceConfig.connectEvent('onCallFinished', function(success) { form.getPage('P_Page1').F_Section1.setVisible(true); }); Parent topic: Running Custom JavaScript \u2013 Events","title":"Application Events"},{"location":"ref_jsapi_form_events.html","text":"Form Events This topic describes the Form Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a form that are accessed from the forms Edit Properties dialog. Table 1. JavaScript\u2122 objects available in form events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI BO Business Object object Top level data object for the form. BO.F_Username.getValue(); DATA Table 2. Form Events Event Description Example afterSave Called after the form is submitted or saved to the server. Changes made to the form in this event are lost, as it was already submitted. Custom alert message: alert(\u201cThank you for submitting\u201d + app.getCurrentUser()); beforeSave Called just before the form is about to be submitted to the server. Any changes to data in the form are saved. Make a field lowercase before submission: BO.F_tag.setValue(BO.F_tag.getValue().toLowerCase()); onDataReceived Applicable only when the form is hosted inside IBM\u00ae WebSphere\u00ae Portal. This event is called when the form receives data from another portlet. The data is provided with the pData parameter, which is a string containing arbitrary data passed in by portal. Update Info Message: form.getPage('P_Page1').F_Info.setContent(pData); onHide Called after the form is hidden. onDestruct Same as onHide. Legacy event. onLoad Called after data Business Object is attached to the Form, and its values loaded into the interface, whether it is a new form or an existing form. If the form is new, this event is called after onNew. Update the current Datetime into a Timestamp item: BO.F_Date.setValue(new Date()); onNew Called when a blank form is created, and after the default values are loaded. Ideal location to pre-populate, or do first time setup of data. Populate an item with the current user: BO.F_User.setValue(app.getCurrentUser()); onShow Called after the form is shown. This can occur after onNew and onLoad. onShowActionButtons Called after the stage action buttons are created and shown. validateButtonPressed Called after every stage action button is pressed and the ID of the button is passed in as the pActionId parameter. Returning false in this event cancels the action taken by the button press. Verify the user is cancelling: if(pActionId === 'S_Cancel') { if(confirm('Are you sure you want to cancel?')) return true; return false; } Parent topic: Running Custom JavaScript \u2013 Events","title":"Form Events"},{"location":"ref_jsapi_form_events.html#form-events","text":"This topic describes the Form Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a form that are accessed from the forms Edit Properties dialog. Table 1. JavaScript\u2122 objects available in form events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI BO Business Object object Top level data object for the form. BO.F_Username.getValue(); DATA Table 2. Form Events Event Description Example afterSave Called after the form is submitted or saved to the server. Changes made to the form in this event are lost, as it was already submitted. Custom alert message: alert(\u201cThank you for submitting\u201d + app.getCurrentUser()); beforeSave Called just before the form is about to be submitted to the server. Any changes to data in the form are saved. Make a field lowercase before submission: BO.F_tag.setValue(BO.F_tag.getValue().toLowerCase()); onDataReceived Applicable only when the form is hosted inside IBM\u00ae WebSphere\u00ae Portal. This event is called when the form receives data from another portlet. The data is provided with the pData parameter, which is a string containing arbitrary data passed in by portal. Update Info Message: form.getPage('P_Page1').F_Info.setContent(pData); onHide Called after the form is hidden. onDestruct Same as onHide. Legacy event. onLoad Called after data Business Object is attached to the Form, and its values loaded into the interface, whether it is a new form or an existing form. If the form is new, this event is called after onNew. Update the current Datetime into a Timestamp item: BO.F_Date.setValue(new Date()); onNew Called when a blank form is created, and after the default values are loaded. Ideal location to pre-populate, or do first time setup of data. Populate an item with the current user: BO.F_User.setValue(app.getCurrentUser()); onShow Called after the form is shown. This can occur after onNew and onLoad. onShowActionButtons Called after the stage action buttons are created and shown. validateButtonPressed Called after every stage action button is pressed and the ID of the button is passed in as the pActionId parameter. Returning false in this event cancels the action taken by the button press. Verify the user is cancelling: if(pActionId === 'S_Cancel') { if(confirm('Are you sure you want to cancel?')) return true; return false; } Parent topic: Running Custom JavaScript \u2013 Events","title":"Form Events"},{"location":"ref_jsapi_item_events.html","text":"Item Events This topic describes the Item Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on an item that is accessed from the item Edit Properties dialog. Table 1. JavaScript\u2122 objects available in item events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI item Item object The object representing the current item item.setVisible(true); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA BOA Business Object Attribute object Object representing the Data for the current item. Only present for data items BOA.setValue(\"Please enter your Name\"); DATA Table 2. Item Events Event Description onClick Called every time that the item is selected by the user. onHide Called every time that the item is hidden, whether just itself or the entire page. onInvalid (only data items) Called when a data item goes from being valid to invalid. onItemBlur Called when the item is blurred (focus is lost). onItemChange Called when the item data is changed and saved into the Business Object. For some types of items, it occurs when the user tabs or switches focus, for example, when users select Number, Single Line, Multi-Line, and Currency form items. For other items, it occurs every time they make a change, such as Check Box, Survey, or drop-down. Note: You cannot change the value of an item within this event as its value has changed, and it is locked. onItemFocus Called when focus is received by an item. onItemLiveChange (items which can be incrementally changed) Called every time data is entered but not yet updated to the Business Object, such as Number, Single Line, Multi-Line, and Currency. onMouseOut Called every time the mouse moves out of the item bounding area (not including label). onMouseOver Called every time the mouse moves into the item bounding area (not including label). onShow Called every time the item goes from being hidden to being shown, whether from a page flip or because of a rule or JavaScript change. onValid (only data items) Called when a data item goes from being invalid to valid. Table 3. Item Events - Table only Event Description Example onAdd This event is called after an entry is added to the table. The newly added item data is available from the variable itemBO. Add a value from the new row to a subtotal field: var curValue = BO.F_Total.getValue(); curValue += itemBO.F_Price.getValue(); BO.F_Total.setValue(curValue); onEdit Called after an existing row is edited by the user. The item that was edited is available from the variable itemBO. onRemove Called after a row is deleted from the table by the user. The item that was deleted is available from the variable itemBO. Table 4. Item Events - Tabbed Folder only Event Description onTabSelected Called after a tab is selected. Table 5. Item Events - Section only Event Description onCollapse Called when the section is collapsed. onExpand Called when the section is expanded. Table 6. beforeOptionsUpdate Event Description Example beforeOptionsUpdate This event is called before the options in a drop-down list are updated from a service call or from an API call. The array of options is passed in as pOptions and can be modified by the event code. By default, when a new options list is set into a drop-down list and the current selected item is not in the new list, it is added into the new list automatically. If you return false from this event, it does not copy the missing option into the new list. pOptions.push({title:'Pizza', value:'fooditem3'}); return false; Parent topic: Running Custom JavaScript \u2013 Events","title":"Item Events"},{"location":"ref_jsapi_item_events.html#item-events","text":"This topic describes the Item Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on an item that is accessed from the item Edit Properties dialog. Table 1. JavaScript\u2122 objects available in item events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI item Item object The object representing the current item item.setVisible(true); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA BOA Business Object Attribute object Object representing the Data for the current item. Only present for data items BOA.setValue(\"Please enter your Name\"); DATA Table 2. Item Events Event Description onClick Called every time that the item is selected by the user. onHide Called every time that the item is hidden, whether just itself or the entire page. onInvalid (only data items) Called when a data item goes from being valid to invalid. onItemBlur Called when the item is blurred (focus is lost). onItemChange Called when the item data is changed and saved into the Business Object. For some types of items, it occurs when the user tabs or switches focus, for example, when users select Number, Single Line, Multi-Line, and Currency form items. For other items, it occurs every time they make a change, such as Check Box, Survey, or drop-down. Note: You cannot change the value of an item within this event as its value has changed, and it is locked. onItemFocus Called when focus is received by an item. onItemLiveChange (items which can be incrementally changed) Called every time data is entered but not yet updated to the Business Object, such as Number, Single Line, Multi-Line, and Currency. onMouseOut Called every time the mouse moves out of the item bounding area (not including label). onMouseOver Called every time the mouse moves into the item bounding area (not including label). onShow Called every time the item goes from being hidden to being shown, whether from a page flip or because of a rule or JavaScript change. onValid (only data items) Called when a data item goes from being invalid to valid. Table 3. Item Events - Table only Event Description Example onAdd This event is called after an entry is added to the table. The newly added item data is available from the variable itemBO. Add a value from the new row to a subtotal field: var curValue = BO.F_Total.getValue(); curValue += itemBO.F_Price.getValue(); BO.F_Total.setValue(curValue); onEdit Called after an existing row is edited by the user. The item that was edited is available from the variable itemBO. onRemove Called after a row is deleted from the table by the user. The item that was deleted is available from the variable itemBO. Table 4. Item Events - Tabbed Folder only Event Description onTabSelected Called after a tab is selected. Table 5. Item Events - Section only Event Description onCollapse Called when the section is collapsed. onExpand Called when the section is expanded. Table 6. beforeOptionsUpdate Event Description Example beforeOptionsUpdate This event is called before the options in a drop-down list are updated from a service call or from an API call. The array of options is passed in as pOptions and can be modified by the event code. By default, when a new options list is set into a drop-down list and the current selected item is not in the new list, it is added into the new list automatically. If you return false from this event, it does not copy the missing option into the new list. pOptions.push({title:'Pizza', value:'fooditem3'}); return false; Parent topic: Running Custom JavaScript \u2013 Events","title":"Item Events"},{"location":"ref_jsapi_javascript_security.html","text":"JavaScript Security The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. The JavaScript in the sandbox generally follows rules to limit dangerous operations: Use of eval, with, ==, !=, and the subscript operator [] are not allowed. Instead of == use === Instead of != use !== Instead of the [ ] operator, use the forEach(), get(index), and set() functions provided. Usage of the this keyword is not allowed: For item level events, the keyword item is used in place of the this keyword. For page level events, the keyword page is used in place of the this keyword. For form level events, the keyword form is used in place of the this keyword. Limited access to global variables. Details are provided in the following section. These properties might not be used: apply, arguments, call, callee, caller, constructor, eval, prototype this, unwatch, valueOf, watch, and any property beginning or ending with __. Security The following global variables are accessible: Variable Description element This the root element of the sandbox. Sandboxed elements do not have access to relational properties such as parentNode, firstSibling, nextSibling, etc. You can still use DOM methods and string properties like innerHTML. The style object can also be used, accessed, and modified. document This is a sandboxed document object that provides node creation and basic element searching facilities. The sandboxed document provides the following methods: getElementById, createElement, createTextNode, and write. The following standard JavaScript/DOM functions/constructors, and their child functions when applicable, might be called. They can be used only in call position. They cannot be accessed in any other way. They generally behave as the standard JavaScript function, unless otherwise noted: isNaN isFinite parseInt parseFloat escape unescape encodeURI encodeURIComponent decodeURI decodeURIComponent alert confirm prompt Date RegExp Error Number Math setTimeout - This only accepts a function, not a string. setInterval - This only accepts a function, not a string. clearTimeout clearInterval The following special functions are available to compensate for the JavaScript syntax limitations imposed by the sandbox: Function Description get(obj,prop) This is a special function to handle accessing properties in lieu of the [] operator. Calling get(obj,prop) is equivalent to obj[prop]. set(obj,prop,value) This is a special function to handle modifying properties in lieu of the [] operator. Calling set(obj,prop,value) is equivalent to obj[prop]=value. forEach(obj,func) This is a special function to iterate through all the properties in an object, or items in an array. For each item, the func function is called with the item as the first argument, the index as the second object, and the obj as the third object. The following functions for DOM manipulation and extra language features are provided by the Dojo library. This represents a safe subset of Dojo. All Dojo library functions are provided as top-level functions. Namespacing is unnecessary because scripts do have access to modify the global object and can't define global variables. Thus, you can call Dojo functions directly, for example, you can call mixin(obj,mixinObj). You might also use the traditional syntax (dojox.mixin(...)). Available functions include: mixin require isString isArray isFunction isObject isArrayLike isAlien hitch delegate partial trim connect disconnect subscribe unsubscribe Deferred toJson fromJson style attr query - This only searches within the sandbox. byId body - This returns the root element of the sandbox. Disabling JavaScript Security Under some circumstances, the limitations imposed by the dojox.secure library might be too restrictive. Therefore, the dojox.secure library can be disabled server-wide by editing a Java\u2122 properties file called Leap_config.properties in the FSP extensions directory (C:\\HCL\\Leap\\extensions on Windows\u2122, /opt/HCL/Leap/extensions on Linux\u2122). Set the value of the ibm.nitro.ApplicationCompilerService.secureJS key to false. Once the properties file is changed, the HCL Leap server should be restarted to ensure that the configuration takes effect. For more information, see Configuring the properties file . Changing this configuration setting should only be done if all the Leaps on the server are known trusted users. Disabling JavaScript Security on a deployment of the Leap that allows anonymous users to create applications could pose a serious security risk. It should be noted that this configuration only applies to applications that are deployed after making this configuration change. Applications that are deployed before this configuration change must be redeployed for the configuration to take effect. Parent topic: Reference Objects and Functions","title":"JavaScript Security"},{"location":"ref_jsapi_javascript_security.html#javascriptsecurity","text":"The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. The JavaScript in the sandbox generally follows rules to limit dangerous operations: Use of eval, with, ==, !=, and the subscript operator [] are not allowed. Instead of == use === Instead of != use !== Instead of the [ ] operator, use the forEach(), get(index), and set() functions provided. Usage of the this keyword is not allowed: For item level events, the keyword item is used in place of the this keyword. For page level events, the keyword page is used in place of the this keyword. For form level events, the keyword form is used in place of the this keyword. Limited access to global variables. Details are provided in the following section. These properties might not be used: apply, arguments, call, callee, caller, constructor, eval, prototype this, unwatch, valueOf, watch, and any property beginning or ending with __.","title":"JavaScript Security"},{"location":"ref_jsapi_javascript_security.html#security","text":"The following global variables are accessible: Variable Description element This the root element of the sandbox. Sandboxed elements do not have access to relational properties such as parentNode, firstSibling, nextSibling, etc. You can still use DOM methods and string properties like innerHTML. The style object can also be used, accessed, and modified. document This is a sandboxed document object that provides node creation and basic element searching facilities. The sandboxed document provides the following methods: getElementById, createElement, createTextNode, and write. The following standard JavaScript/DOM functions/constructors, and their child functions when applicable, might be called. They can be used only in call position. They cannot be accessed in any other way. They generally behave as the standard JavaScript function, unless otherwise noted: isNaN isFinite parseInt parseFloat escape unescape encodeURI encodeURIComponent decodeURI decodeURIComponent alert confirm prompt Date RegExp Error Number Math setTimeout - This only accepts a function, not a string. setInterval - This only accepts a function, not a string. clearTimeout clearInterval The following special functions are available to compensate for the JavaScript syntax limitations imposed by the sandbox: Function Description get(obj,prop) This is a special function to handle accessing properties in lieu of the [] operator. Calling get(obj,prop) is equivalent to obj[prop]. set(obj,prop,value) This is a special function to handle modifying properties in lieu of the [] operator. Calling set(obj,prop,value) is equivalent to obj[prop]=value. forEach(obj,func) This is a special function to iterate through all the properties in an object, or items in an array. For each item, the func function is called with the item as the first argument, the index as the second object, and the obj as the third object. The following functions for DOM manipulation and extra language features are provided by the Dojo library. This represents a safe subset of Dojo. All Dojo library functions are provided as top-level functions. Namespacing is unnecessary because scripts do have access to modify the global object and can't define global variables. Thus, you can call Dojo functions directly, for example, you can call mixin(obj,mixinObj). You might also use the traditional syntax (dojox.mixin(...)). Available functions include: mixin require isString isArray isFunction isObject isArrayLike isAlien hitch delegate partial trim connect disconnect subscribe unsubscribe Deferred toJson fromJson style attr query - This only searches within the sandbox. byId body - This returns the root element of the sandbox.","title":"Security"},{"location":"ref_jsapi_javascript_security.html#disabling-javascript-security","text":"Under some circumstances, the limitations imposed by the dojox.secure library might be too restrictive. Therefore, the dojox.secure library can be disabled server-wide by editing a Java\u2122 properties file called Leap_config.properties in the FSP extensions directory (C:\\HCL\\Leap\\extensions on Windows\u2122, /opt/HCL/Leap/extensions on Linux\u2122). Set the value of the ibm.nitro.ApplicationCompilerService.secureJS key to false. Once the properties file is changed, the HCL Leap server should be restarted to ensure that the configuration takes effect. For more information, see Configuring the properties file . Changing this configuration setting should only be done if all the Leaps on the server are known trusted users. Disabling JavaScript Security on a deployment of the Leap that allows anonymous users to create applications could pose a serious security risk. It should be noted that this configuration only applies to applications that are deployed after making this configuration change. Applications that are deployed before this configuration change must be redeployed for the configuration to take effect. Parent topic: Reference Objects and Functions","title":"Disabling JavaScript Security"},{"location":"ref_jsapi_objects_and_functions.html","text":"Reference Objects and Functions Describes the Functions available on different parts of the HCL Leap object model. Interface objects The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Data objects This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. JavaScript Security The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. Parent topic: JavaScript API","title":"Reference Objects and Functions"},{"location":"ref_jsapi_objects_and_functions.html#referenceobjectsandfunctions","text":"Describes the Functions available on different parts of the HCL Leap object model. Interface objects The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Data objects This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. JavaScript Security The dojox.secure library is used to restrict the JavaScript\u2122-provided clients to a safe sandbox so they cannot do anything malicious. However, this imposes a number of limitations. Parent topic: JavaScript API","title":"Reference Objects and Functions"},{"location":"ref_jsapi_page_events.html","text":"Page Events This topic describes the Page Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a page that are accessed from the page Edit Properties dialog. Table 1. JavaScript\u2122 objects available in page events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA Table 2. Page Events Event Description Example onHide Called when the page is hidden. This is usually a result of page navigation. onNavigateAway Called as the page is about to be switched away from this one. A pAllowSwitch variable is passed to this event that contains one property called allow. Setting this property to false cancels the page switch. Cancel the page switch if a check box is not checked: if(!BO.F_Agree.getValue()) pAllowSwitch.allow = false; onRemoveFromNavigation Called when this page is removed from navigation by calling the form.removePageFromNavigation\\(\\) method for this page. onRestoreFromNavigation Called when a page is restored to navigation by calling the form.restorePageNavigation\\(\\) method for this page. onShow Called every time the page is shown. This includes when the form is first displayed and when the user navigates to the page. A good location to update any display items. Note: When a form is first opened, this event is only called on the current displayed page. Parent topic: Running Custom JavaScript \u2013 Events","title":"Page Events"},{"location":"ref_jsapi_page_events.html#page-events","text":"This topic describes the Page Events, and their parameters when using JavaScript\u2122 API in HCL Leap. There are many events available to hook into on a page that are accessed from the page Edit Properties dialog. Table 1. JavaScript\u2122 objects available in page events Variable Full name Description Example Type app Application object Contains functions for accessing global general information app.isSingleFormView() GUI form Form object For accessing the pages and controlling page navigation form.getPage('P_Page1'); GUI page Page object For accessing the Page and the items on it page.F_Text.setContent('This a Label'); GUI BO Business Object object Top-level data object for the form BO.F_Username.getValue(); DATA Table 2. Page Events Event Description Example onHide Called when the page is hidden. This is usually a result of page navigation. onNavigateAway Called as the page is about to be switched away from this one. A pAllowSwitch variable is passed to this event that contains one property called allow. Setting this property to false cancels the page switch. Cancel the page switch if a check box is not checked: if(!BO.F_Agree.getValue()) pAllowSwitch.allow = false; onRemoveFromNavigation Called when this page is removed from navigation by calling the form.removePageFromNavigation\\(\\) method for this page. onRestoreFromNavigation Called when a page is restored to navigation by calling the form.restorePageNavigation\\(\\) method for this page. onShow Called every time the page is shown. This includes when the form is first displayed and when the user navigates to the page. A good location to update any display items. Note: When a form is first opened, this event is only called on the current displayed page. Parent topic: Running Custom JavaScript \u2013 Events","title":"Page Events"},{"location":"ref_jsapi_ref_data_objects.html","text":"Data objects This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. Object Description Example BO.<itemId> Accesses the Business Object Attribute data for an individual item on the form. Set the value of a number item on the form:``` BO.F_Age.setValue(12); | |BO.setValid\\(valid, msg\\)|Setting **valid** to \u201cfalse\u201d overrides the validity of the form and prevents submission, showing the user the message provided. Setting **valid** to \u201ctrue\u201d removes any previous override. However, it will not override other ways in which the form might be invalid.|Place this code in the **onItemChange** event of a field to constrain the input to a specific value.``` if(BOA.getValue() < 15 || BOA.getValue() > 35) { BOA.setValid(false, \"The age must be between 16 and 35\"); } | |BO.getValid()|Returns the current value of the overridden valid state of the form as set by BO.setValid() .| | |BO.isValid() |Returns true if every field in the form is valid and false otherwise. This is different from getValid() which returns the overridden valid state of the form as set by BO.setValid(). | | |BO.getInvalidMessages() |This function returns an array of the error messages of any invalid fields in the form. If there are no invalid fields, the function returns an empty array.| | |BO.getCurrentStage()|Returns the current stage of the form.|If the form is in the Submitted stage then show the user a custom message in the onLoad :``` if(BO.getCurrentStage() === 'ST_Submitted') alert('Reminder: This form is complete and cannot be modified'); | |BO.getDataId\\(\\)|Returns the unique ID that represents this data item or will represent it if it has never been submitted.| | |BO.getChildren\\(\\)|Returns a list object that provides access to all the individual Business Object Attribute data. The list object has getLength\\(\\) function, and get\\(index\\) function for accessing the objects in the list.| | |Object|Description|Example| |------|-----------|-------| |BOA.getValue\\(\\)|Returns the current value. The type of the returned value depends on the type of item. - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - Multi-Value String: Select Many, Survey Question \\(when \"Allow selection of multiple values\" checked\\). Values will be delimited with \"\\_\\_\\#\\_\\_\" - String: All other items |``` var s = \"\"; //string s = BO.F_SingleLine1.getValue(); s = BO.F_Paragraph1.getValue(); var n = 0; //number or currency n = BO.F_Number1.getValue(); n = BO.F_Currency1.getValue(); var d = new Date(); //date or timestamp d = BO.F_Date1.getValue(); d = BO.F_TimeStamp1.getValue(); var b = false; //boolean b = BO.F_CheckBox1.getValue(); var o = null; //object o = BO.F_Attachment1.getValue(); alert(\"ID: \" + o.id + \", filename: \" + o.fileName + \", uid: \" + o.uid); | |BOA.setValue(value)|Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. Note: The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. |``` //string BO.F_SingleLine1.setValue(\"Sample String\"); BO.F_Paragraph1.setValue(\"Sample String\"); //number or currency BO.F_Number1.setValue(25); BO.F_Currency1.setValue(123.65); //date or timestamp BO.F_Date1.setValue(new Date()); BO.F_TimeStamp1.setValue(new Date()); //boolean BO.F_CheckBox1.setValue(true); //object BO.F_Attachment1.setValue({uid: 'ccb92c12-d435-4288-baff-878d8d3c2923', id: '25', fileName: 'myfile.txt'}); | |BOA.getId\\(\\)|Returns the ID of this data item that is unique per form.| | |BOA.getBO\\(\\)|Returns the Business Object for the entire form.| | |BOA.getType\\(\\)|Returns a string that indicates the type of data. For example, string, number, boolean, currency, time, date, timeStamp, or attachment.| | |BOA.connectEvent\\(eventName, callbackFunction\\)|Used for connecting an event listener to a Business Object Attribute. You can define code to execute when the listener detects that the event is triggered. The only supported event for a Business Object Attribute is **onChange**.**Note:** If you connect an event, it must be disconnected using BOA.disconnectEvent\\(eventHandle\\). |Place this in the **onShow** event of the field to display a message box when the item changes.``` var hdl = BOA.connectEvent(\"onChange\", function(newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.disconnectEvent(eventHandle)|Disconnects the event handler specified by the passed-in event handle object that was returned by a BOA.connectEvent call. If you create a listener in the event of a form object, you must disconnect it. Otherwise, duplicate listeners are created every time the event is triggered.|``` var hdl = BOA.connectEvent(\"onChange\", function (newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. By passing \u201cfalse\u201d, you cause the data to be invalid, and prevent submission. You can optionally provide a custom error message. Setting the valid to \u201ctrue\u201d clears any previously overridden valid value.**Note:** You cannot set a Business Object Attribute to valid which actually has invalid data, or is set invalid by a rule. |Force the user to enter more than 3 characters for their name by adding this code to the items onItemChange:``` if(BOA.getValue().length < 3) BOA.setValid(false, 'Name must be at least 3 characters'); else BOA.setValid(true); | |BOA.getValid()|Gets a value set previously using setValid().| | |BOA.setRequired(required)|You can override non-required data to be required with this method. By passing \u201ctrue\u201d, you cause its data to be required and prevent submission if it is not set. Setting the valid to \u201cfalse\u201d clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | | |BOA.getRequired()|Gets a value set previously using setRequired().| | |BOA.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |BOA.getInvalidMessage()|Returns the current error messages for this data, or null if the data is valid.| | |BOA.isRequired()|Returns true if this item is required.| | |BOA.isMissing()|Returns true if this item is required and it has no value.| | |BOA.validate()|Triggers the validation of the data item.| | Object Description BOL.getLength() Returns the number of Business Objects in the list. BOL.get(index) Returns the Business Object at the specified index. BOL.createNew() Creates a new empty Business Object ready to be inserted into the list using the add() method. BOL.add(bo) Adds a Business Object of the appropriate type to the list. Can be one created with a call to the createNew() method or removed from the list with a remove() call. BOL.remove(bo) Removes the Business Object from the list. Returns true if successful, false if not. BOL.getId() Returns the ID of this data item that is unique per form. BOL.getType() Returns a string that indicates the type of Business Object List data. BOL.setValid(valid, msg) You can override valid data to be invalid with this method. By passing false, you cause its data to be invalid and prevent submission. You can optionally provide a custom error message. Setting valid to true clears any previously overridden valid value. Note: You cannot set a Business Object List to valid that actually has invalid data, or is set invalid by a rule. | |BOL.getValid()|Gets a value set previously using setValid().| |BOL.setRequired(required)|You can override non-required data to be required with this method. By passing true, you cause its data to be required and prevent submission if it is not set. Setting the valid to false clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | |BOL.getRequired()|Gets a value set previously using setRequired().| Parent topic: Reference Objects and Functions","title":"Data objects"},{"location":"ref_jsapi_ref_data_objects.html#dataobjects","text":"This topic describes and gives samples for data objects used within the HCL Leap JavaScript\u2122 API. Object Description Example BO.<itemId> Accesses the Business Object Attribute data for an individual item on the form. Set the value of a number item on the form:``` BO.F_Age.setValue(12); | |BO.setValid\\(valid, msg\\)|Setting **valid** to \u201cfalse\u201d overrides the validity of the form and prevents submission, showing the user the message provided. Setting **valid** to \u201ctrue\u201d removes any previous override. However, it will not override other ways in which the form might be invalid.|Place this code in the **onItemChange** event of a field to constrain the input to a specific value.``` if(BOA.getValue() < 15 || BOA.getValue() > 35) { BOA.setValid(false, \"The age must be between 16 and 35\"); } | |BO.getValid()|Returns the current value of the overridden valid state of the form as set by BO.setValid() .| | |BO.isValid() |Returns true if every field in the form is valid and false otherwise. This is different from getValid() which returns the overridden valid state of the form as set by BO.setValid(). | | |BO.getInvalidMessages() |This function returns an array of the error messages of any invalid fields in the form. If there are no invalid fields, the function returns an empty array.| | |BO.getCurrentStage()|Returns the current stage of the form.|If the form is in the Submitted stage then show the user a custom message in the onLoad :``` if(BO.getCurrentStage() === 'ST_Submitted') alert('Reminder: This form is complete and cannot be modified'); | |BO.getDataId\\(\\)|Returns the unique ID that represents this data item or will represent it if it has never been submitted.| | |BO.getChildren\\(\\)|Returns a list object that provides access to all the individual Business Object Attribute data. The list object has getLength\\(\\) function, and get\\(index\\) function for accessing the objects in the list.| | |Object|Description|Example| |------|-----------|-------| |BOA.getValue\\(\\)|Returns the current value. The type of the returned value depends on the type of item. - Boolean: Checkbox - Number : Number, Currency, Numeric Slider - Date: Date, Time, Timestamp - Object: Attachment - Multi-Value String: Select Many, Survey Question \\(when \"Allow selection of multiple values\" checked\\). Values will be delimited with \"\\_\\_\\#\\_\\_\" - String: All other items |``` var s = \"\"; //string s = BO.F_SingleLine1.getValue(); s = BO.F_Paragraph1.getValue(); var n = 0; //number or currency n = BO.F_Number1.getValue(); n = BO.F_Currency1.getValue(); var d = new Date(); //date or timestamp d = BO.F_Date1.getValue(); d = BO.F_TimeStamp1.getValue(); var b = false; //boolean b = BO.F_CheckBox1.getValue(); var o = null; //object o = BO.F_Attachment1.getValue(); alert(\"ID: \" + o.id + \", filename: \" + o.fileName + \", uid: \" + o.uid); | |BOA.setValue(value)|Sets the value of this data item. The correct data type should be provided based on the Business Object Attribute\u2019s type. Some type conversion is done where possible, for example, a Number converted to a String. Note: The attachment data takes an object with a uid property, an id property, and a filename property. Modifying attachment data is not recommended in most circumstances. |``` //string BO.F_SingleLine1.setValue(\"Sample String\"); BO.F_Paragraph1.setValue(\"Sample String\"); //number or currency BO.F_Number1.setValue(25); BO.F_Currency1.setValue(123.65); //date or timestamp BO.F_Date1.setValue(new Date()); BO.F_TimeStamp1.setValue(new Date()); //boolean BO.F_CheckBox1.setValue(true); //object BO.F_Attachment1.setValue({uid: 'ccb92c12-d435-4288-baff-878d8d3c2923', id: '25', fileName: 'myfile.txt'}); | |BOA.getId\\(\\)|Returns the ID of this data item that is unique per form.| | |BOA.getBO\\(\\)|Returns the Business Object for the entire form.| | |BOA.getType\\(\\)|Returns a string that indicates the type of data. For example, string, number, boolean, currency, time, date, timeStamp, or attachment.| | |BOA.connectEvent\\(eventName, callbackFunction\\)|Used for connecting an event listener to a Business Object Attribute. You can define code to execute when the listener detects that the event is triggered. The only supported event for a Business Object Attribute is **onChange**.**Note:** If you connect an event, it must be disconnected using BOA.disconnectEvent\\(eventHandle\\). |Place this in the **onShow** event of the field to display a message box when the item changes.``` var hdl = BOA.connectEvent(\"onChange\", function(newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.disconnectEvent(eventHandle)|Disconnects the event handler specified by the passed-in event handle object that was returned by a BOA.connectEvent call. If you create a listener in the event of a form object, you must disconnect it. Otherwise, duplicate listeners are created every time the event is triggered.|``` var hdl = BOA.connectEvent(\"onChange\", function (newValue) { alert(\"Field content is \" + newValue); BOA.disconnectEvent(hdl); }); | |BOA.setValid\\(valid, msg\\)|You can override valid data to be invalid with this method. By passing \u201cfalse\u201d, you cause the data to be invalid, and prevent submission. You can optionally provide a custom error message. Setting the valid to \u201ctrue\u201d clears any previously overridden valid value.**Note:** You cannot set a Business Object Attribute to valid which actually has invalid data, or is set invalid by a rule. |Force the user to enter more than 3 characters for their name by adding this code to the items onItemChange:``` if(BOA.getValue().length < 3) BOA.setValid(false, 'Name must be at least 3 characters'); else BOA.setValid(true); | |BOA.getValid()|Gets a value set previously using setValid().| | |BOA.setRequired(required)|You can override non-required data to be required with this method. By passing \u201ctrue\u201d, you cause its data to be required and prevent submission if it is not set. Setting the valid to \u201cfalse\u201d clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | | |BOA.getRequired()|Gets a value set previously using setRequired().| | |BOA.isValid()|Returns true if the data is valid. Returns false if the data is invalid.| | |BOA.getInvalidMessage()|Returns the current error messages for this data, or null if the data is valid.| | |BOA.isRequired()|Returns true if this item is required.| | |BOA.isMissing()|Returns true if this item is required and it has no value.| | |BOA.validate()|Triggers the validation of the data item.| | Object Description BOL.getLength() Returns the number of Business Objects in the list. BOL.get(index) Returns the Business Object at the specified index. BOL.createNew() Creates a new empty Business Object ready to be inserted into the list using the add() method. BOL.add(bo) Adds a Business Object of the appropriate type to the list. Can be one created with a call to the createNew() method or removed from the list with a remove() call. BOL.remove(bo) Removes the Business Object from the list. Returns true if successful, false if not. BOL.getId() Returns the ID of this data item that is unique per form. BOL.getType() Returns a string that indicates the type of Business Object List data. BOL.setValid(valid, msg) You can override valid data to be invalid with this method. By passing false, you cause its data to be invalid and prevent submission. You can optionally provide a custom error message. Setting valid to true clears any previously overridden valid value. Note: You cannot set a Business Object List to valid that actually has invalid data, or is set invalid by a rule. | |BOL.getValid()|Gets a value set previously using setValid().| |BOL.setRequired(required)|You can override non-required data to be required with this method. By passing true, you cause its data to be required and prevent submission if it is not set. Setting the valid to false clears any previously overridden value. Note: If a Business Object Attribute has been set as required by a property or by a Rule, you cannot make it unrequired. | |BOL.getRequired()|Gets a value set previously using setRequired().| Parent topic: Reference Objects and Functions","title":"Data objects"},{"location":"ref_jsapi_running_custom_js_events.html","text":"Running Custom JavaScript \u2013 Events Custom JavaScript\u2122 is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Application Events This topic describes the Application Events, and their parameters when using JavaScript API in HCL Leap. Form Events This topic describes the Form Events, and their parameters when using JavaScript API in HCL Leap. Page Events This topic describes the Page Events, and their parameters when using JavaScript API in HCL Leap. Item Events This topic describes the Item Events, and their parameters when using JavaScript API in HCL Leap. Parent topic: JavaScript API","title":"Running Custom JavaScript -\u2013 Events"},{"location":"ref_jsapi_running_custom_js_events.html#runningcustomjavascriptevents","text":"Custom JavaScript\u2122 is run in response to events in the form. These events can be triggered at the application, form, page, and item level in response to form lifecycle changes, and to user interactions. A list of the events available, and how to interact with the form using them is shown in the following list. Application Events This topic describes the Application Events, and their parameters when using JavaScript API in HCL Leap. Form Events This topic describes the Form Events, and their parameters when using JavaScript API in HCL Leap. Page Events This topic describes the Page Events, and their parameters when using JavaScript API in HCL Leap. Item Events This topic describes the Item Events, and their parameters when using JavaScript API in HCL Leap. Parent topic: JavaScript API","title":"Running Custom JavaScript \u2013 Events"},{"location":"ref_jsapi_running_external_js_files.html","text":"Running Custom JavaScript Files Custom JavaScript\u2122 can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Table 1. JavaScript\u2122 objects available in attached JavaScript\u2122 files Variable Full name Description Example Type app Application object Contains functions for accessing global general information - app.getCurrentUser(); - A common use case for external .js files is utility methods to be executed later in events by custom JavaScript. One example is a function to sum up all Number values in a section: ``` app.getSharedData().sumNumbers = function(section) { var total = 0; var children = section.getChildren(); for(var i=0; i Then from an event where you want to sum all numbers in a section: var sub = app.getSharedData().sumNumbers(page.F_Expense); GUI Note: When JavaScript security is enabled: For added security, external JavaScript files that are referenced by URL do not load into the running application. Uploaded JavaScript files are evaluated in a safe sandbox and all content must adhere to the restrictions of the sandbox. See JavaScript Security for more details. For example, functions must be defined by using the following format: app.getSharedData().blat = function (...) { ... } When JavaScript security is disabled: External JavaScript files that are referenced by URL are loaded by using a <script> tag and does not have access to the app variable. These scripts must use window.NitroApplication to access the Leap API functions. JavaScript files that are uploaded to the application are evaluated by using the eval() function. Parent topic: JavaScript API","title":"Interface objects"},{"location":"ref_jsapi_running_external_js_files.html#running-custom-javascript-files","text":"Custom JavaScript\u2122 can also be loaded from attached JavaScript files. Any .js file that is added to the application in the Settings > Files section is automatically loaded into your running application. An associated JavaScript file is evaluated once when the browser first loads the running application, and is not called in response to any events. Table 1. JavaScript\u2122 objects available in attached JavaScript\u2122 files Variable Full name Description Example Type app Application object Contains functions for accessing global general information - app.getCurrentUser(); - A common use case for external .js files is utility methods to be executed later in events by custom JavaScript. One example is a function to sum up all Number values in a section: ``` app.getSharedData().sumNumbers = function(section) { var total = 0; var children = section.getChildren(); for(var i=0; i Then from an event where you want to sum all numbers in a section: var sub = app.getSharedData().sumNumbers(page.F_Expense); GUI Note: When JavaScript security is enabled: For added security, external JavaScript files that are referenced by URL do not load into the running application. Uploaded JavaScript files are evaluated in a safe sandbox and all content must adhere to the restrictions of the sandbox. See JavaScript Security for more details. For example, functions must be defined by using the following format: app.getSharedData().blat = function (...) { ... } When JavaScript security is disabled: External JavaScript files that are referenced by URL are loaded by using a <script> tag and does not have access to the app variable. These scripts must use window.NitroApplication to access the Leap API functions. JavaScript files that are uploaded to the application are evaluated by using the eval() function. Parent topic: JavaScript API","title":"Running Custom JavaScript Files"},{"location":"ref_jsapi_user_interface_objects.html","text":"Interface objects The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Note: When you use JavaScript to modify form items, the change appears only in the user interface, it does not persist to the submitted data. The user completing the form sees the modifications that are made by your JavaScript, however a user reviewing submitted data sees the original form items. If you want the changes to appear in the form any time it is viewed, the JavaScript must be attached to events that run each time that the form is opened. Application objects Form objects Page and App Page objects Item objects Other objects Parent topic: Reference Objects and Functions","title":"Interface objects {#userinterfaceobjects .reference}"},{"location":"ref_jsapi_user_interface_objects.html#userinterfaceobjects","text":"The following topics describe and gives samples for interface objects that are used within the HCL Leap JavaScript\u2122 API. Note: When you use JavaScript to modify form items, the change appears only in the user interface, it does not persist to the submitted data. The user completing the form sees the modifications that are made by your JavaScript, however a user reviewing submitted data sees the original form items. If you want the changes to appear in the form any time it is viewed, the JavaScript must be attached to events that run each time that the form is opened. Application objects Form objects Page and App Page objects Item objects Other objects Parent topic: Reference Objects and Functions","title":"Interface objects"},{"location":"ref_other_objects.html","text":"Other objects Table 1. Service Configuration Object This object represents a mapped service in the form and is retrieved using form.getServiceConfiguration(). Object Description Example service.callService\\(\\) Executes the service. service.connectEvent\\(eventName, callbackFunction\\) The only supported event is **onCallFinished**, which is called every time after the service mapping is executed. It is passed two parameters: pSuccess, which indicates whether the service call succeeded. pErrorObj, which is a JSON object \\(\\{code: '', message: '', handled: ''\\}\\) that contains details about the error \\(if thrown\\). If the error is being handled by javascript, setting `pErrorObj.handled = true` will suppress the error dialog. Resister these events in the Applications onStart event so that they are only registered once. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } else { //do something with the error form.getBO().F_Error.setValue(pErrorObj.code + \u201c: \u201d + pErrorObj.message); pErrorObj.handled = true; //suppress error dialog } }); service.disconnectEvent\\(eventHandle\\) Disconnects the event handler specified by the passed-in event handle object that was returned by a service.connectEvent call.To avoid duplicate event handlers being connected, connect to events from within the application **onStart** or form **onLoad** events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the **disconnectEvent** method. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); var serviceHdl = serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } serviceConfig.disconnectEvent(serviceHdl); }); Table 2. Stage Action Button Object Represents an action button that is retrieved by calling form.getStageActions(). Object Description action.activate\\(\\) Triggers this button, which cancels, submit or save the form. Note: If a button is hidden by a Rule, you can try and fire it. However, the server rejects the submission. var actionButtons = form.getStageActions(); for(var i=0; i<actionButtons.length; i++){ if(get(actionButtons, i).getId() === 'S_Cancel') get(actionButtons, i).activate(); } action.addClasses\\(classes\\) Adds a list of custom class names to an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. action.addClasses(\u201cemphasized error\u201d); action.getActionType\\(\\) Returns a string that identifies the type of the button. Values are **Cancel**, **Submit**, and **Save**. action.getActive\\(\\) Returns true if this button is active, and false if it is disabled. action.getClasses\\(\\) Returns an Array of custom class names currently applied to an action. action.getId\\(\\) Returns the unique ID \\(within the application\\) of this action button \u201cS\\_Submit\u201d. action.getTitle\\(\\) Returns the user-defined title of this button. action.getVisible\\(\\) Returns true if this button is visible, or false if it is hidden by a rule or JavaScript\u2122. action.removeClasses\\(classes\\) Removes a list of custom class names from an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. action.removeClasses(\u201cemphasized\u201d); action.setActive\\(active\\) If active is true, then the button is made active. If false, the button is disabled. action.setFocus\\(\\) Causes this button to receive focus, if possible. action.setTitle\\(title\\) Sets the title for the button. action.setVisible\\(visible\\) Sets whether this action is visible. Note: If this item is made invisible by a rule, then you cannot unhide it by calling this function. Parent topic: Interface objects","title":"Other objects"},{"location":"ref_other_objects.html#other-objects","text":"Table 1. Service Configuration Object This object represents a mapped service in the form and is retrieved using form.getServiceConfiguration(). Object Description Example service.callService\\(\\) Executes the service. service.connectEvent\\(eventName, callbackFunction\\) The only supported event is **onCallFinished**, which is called every time after the service mapping is executed. It is passed two parameters: pSuccess, which indicates whether the service call succeeded. pErrorObj, which is a JSON object \\(\\{code: '', message: '', handled: ''\\}\\) that contains details about the error \\(if thrown\\). If the error is being handled by javascript, setting `pErrorObj.handled = true` will suppress the error dialog. Resister these events in the Applications onStart event so that they are only registered once. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } else { //do something with the error form.getBO().F_Error.setValue(pErrorObj.code + \u201c: \u201d + pErrorObj.message); pErrorObj.handled = true; //suppress error dialog } }); service.disconnectEvent\\(eventHandle\\) Disconnects the event handler specified by the passed-in event handle object that was returned by a service.connectEvent call.To avoid duplicate event handlers being connected, connect to events from within the application **onStart** or form **onLoad** events. If you connect to an event outside of these two events, you should explicitly disconnect from the event using the **disconnectEvent** method. var form = app.getForm('F_Form1'); var serviceConfig = form.getServiceConfiguration(\"SC_ServiceConfig\"); var serviceHdl = serviceConfig.connectEvent(\"onCallFinished\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } serviceConfig.disconnectEvent(serviceHdl); }); Table 2. Stage Action Button Object Represents an action button that is retrieved by calling form.getStageActions(). Object Description action.activate\\(\\) Triggers this button, which cancels, submit or save the form. Note: If a button is hidden by a Rule, you can try and fire it. However, the server rejects the submission. var actionButtons = form.getStageActions(); for(var i=0; i<actionButtons.length; i++){ if(get(actionButtons, i).getId() === 'S_Cancel') get(actionButtons, i).activate(); } action.addClasses\\(classes\\) Adds a list of custom class names to an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. action.addClasses(\u201cemphasized error\u201d); action.getActionType\\(\\) Returns a string that identifies the type of the button. Values are **Cancel**, **Submit**, and **Save**. action.getActive\\(\\) Returns true if this button is active, and false if it is disabled. action.getClasses\\(\\) Returns an Array of custom class names currently applied to an action. action.getId\\(\\) Returns the unique ID \\(within the application\\) of this action button \u201cS\\_Submit\u201d. action.getTitle\\(\\) Returns the user-defined title of this button. action.getVisible\\(\\) Returns true if this button is visible, or false if it is hidden by a rule or JavaScript\u2122. action.removeClasses\\(classes\\) Removes a list of custom class names from an action for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. action.removeClasses(\u201cemphasized\u201d); action.setActive\\(active\\) If active is true, then the button is made active. If false, the button is disabled. action.setFocus\\(\\) Causes this button to receive focus, if possible. action.setTitle\\(title\\) Sets the title for the button. action.setVisible\\(visible\\) Sets whether this action is visible. Note: If this item is made invisible by a rule, then you cannot unhide it by calling this function. Parent topic: Interface objects","title":"Other objects"},{"location":"ref_page_app_page_objects.html","text":"Page and App Page objects Object Description Example page. appPage. Provides convenient direct access to all items on the page, including those inside Sections and Tab Folders. Hide a specific button on the page: page.F_NextButton.setVisible(false); page.addClasses(classes) appPage.addClasses(classes) Adds a list of custom class names to the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. page.addClasses(\u201cemphasized error\u201d); page.connectEvent(eventName, callbackFunction) appPage.connectEvent(eventName, callbackFunction) Connects a function to an event on the page. The list of events is the same as for the page in the Design interface. Useful for utility functions defined in JavaScript\u2122 files to hook behavior into the page dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using page.disconnectEvent or appPage.disconnectEvent. page.disconnectEvent(eventHandle) appPage.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a page.connectEvent or appPage.connectEvent call. To avoid duplicate event handlers being connected to pages, connect to page events from within the application onStart or form onLoad events. If you connect to a page event outside of these two events you should explicitly disconnect from the page event using the disconnectEvent method. var eventHdl = page.connectEvent(\"<some event>\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } page.disconnectEvent(eventHndl); }); page.getBO() Returns the object that contains the Business Object data for the entire form. var theBO = page.getBO(); theBO.F_SingleLine.setValue('new Value'); page.getChildren() appPage.getChildren() Returns the list object that provides access to all direct children items for this page. For example, items in a Section on the page are not in the list, however the Section itself is. The list object has the getLength() function and get(index) function for accessing the objects in the list. Hide all button items on a page: var list = page.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'button') list.get(i).setVisible(false); } page.getClasses() appPage.getClasses() Returns an Array of custom class names currently applied to the page. page.getForm() Returns the form object to which this page belongs. page.getId() appPage.getId() Returns the unique ID, within the application, of this page. For example, P_Page1 . appPage.getServiceConfigurationIds() Returns an array of all the IDs for services mapped in this app page. var serviceConfigs = appPage.getServiceConfigurationIds(); appPage.getServiceConfiguration(serviceId) Gets the service object for a particular service ID. Lookup and execute a service from JavaScript\u2122: var service = appPage.getServiceConfiguration('SC_ServiceConfig'); service.callService(); page.getType() appPage.getType() Returns a string identifying the object type. For example,\u201cpage\u201d. page.getVisibility() Returns true if the page is being shown, and false if it is hidden. page.removeClasses(classes) appPage.removeClasses(classes) Removes a list of custom class names from the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. page.removeClasses(\u201cemphasized\u201d); Parent topic: Interface objects","title":"Page and App Page objects"},{"location":"ref_page_app_page_objects.html#page-and-app-page-objects","text":"Object Description Example page. appPage. Provides convenient direct access to all items on the page, including those inside Sections and Tab Folders. Hide a specific button on the page: page.F_NextButton.setVisible(false); page.addClasses(classes) appPage.addClasses(classes) Adds a list of custom class names to the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. If any of the given class names are invalid CSS class names, then no classes are added and false is returned. page.addClasses(\u201cemphasized error\u201d); page.connectEvent(eventName, callbackFunction) appPage.connectEvent(eventName, callbackFunction) Connects a function to an event on the page. The list of events is the same as for the page in the Design interface. Useful for utility functions defined in JavaScript\u2122 files to hook behavior into the page dynamically. Returns a handle object that represents the connection of the function to that event name. That handle can be used to disconnect this same event using page.disconnectEvent or appPage.disconnectEvent. page.disconnectEvent(eventHandle) appPage.disconnectEvent(eventHandle) Disconnects the event handler specified by the passed-in event handle object that was returned by a page.connectEvent or appPage.connectEvent call. To avoid duplicate event handlers being connected to pages, connect to page events from within the application onStart or form onLoad events. If you connect to a page event outside of these two events you should explicitly disconnect from the page event using the disconnectEvent method. var eventHdl = page.connectEvent(\"<some event>\", function(pSuccess, pErrorObj) { if (pSuccess) { //do something when service is done } page.disconnectEvent(eventHndl); }); page.getBO() Returns the object that contains the Business Object data for the entire form. var theBO = page.getBO(); theBO.F_SingleLine.setValue('new Value'); page.getChildren() appPage.getChildren() Returns the list object that provides access to all direct children items for this page. For example, items in a Section on the page are not in the list, however the Section itself is. The list object has the getLength() function and get(index) function for accessing the objects in the list. Hide all button items on a page: var list = page.getChildren(); for(var i=0; i<list.getLength(); i++) { if(list.get(i).getType() === 'button') list.get(i).setVisible(false); } page.getClasses() appPage.getClasses() Returns an Array of custom class names currently applied to the page. page.getForm() Returns the form object to which this page belongs. page.getId() appPage.getId() Returns the unique ID, within the application, of this page. For example, P_Page1 . appPage.getServiceConfigurationIds() Returns an array of all the IDs for services mapped in this app page. var serviceConfigs = appPage.getServiceConfigurationIds(); appPage.getServiceConfiguration(serviceId) Gets the service object for a particular service ID. Lookup and execute a service from JavaScript\u2122: var service = appPage.getServiceConfiguration('SC_ServiceConfig'); service.callService(); page.getType() appPage.getType() Returns a string identifying the object type. For example,\u201cpage\u201d. page.getVisibility() Returns true if the page is being shown, and false if it is hidden. page.removeClasses(classes) appPage.removeClasses(classes) Removes a list of custom class names from the page for dynamic CSS styling. The classes parameter can be a single class name, multiple class names separated by spaces, or an Array of class names. page.removeClasses(\u201cemphasized\u201d); Parent topic: Interface objects","title":"Page and App Page objects"},{"location":"ref_portlet_parameters.html","text":"Leap Portlet parameters You can dynamically or programmatically set the Leap Portlet to load a specific Leap application at run time.","title":"Leap Portlet parameters {#reference_cxs_q4b_pt .reference}"},{"location":"ref_portlet_parameters.html#reference_cxs_q4b_pt","text":"You can dynamically or programmatically set the Leap Portlet to load a specific Leap application at run time.","title":"Leap Portlet parameters"},{"location":"ref_public_render_parameters.html","text":"Public render parameters Public render parameters are leveraged to allow the Leap Portlet to communicate with other portlets. One type of public render parameter instructs the Leap Portlet to load a specific application. Open Given Application The Leap Portlet opens a form when you specify the application URL as the value of the render parameter. Note: The code must be entered as a single line. [Plugin:RenderURL pr1.value=\"\\{Application URL\\}\" pr1.key=\"{http://www.ibm.com/pb/models}openURL\" copyCurrentParams=\"true\" pr1.mode=\"set\" pr1.type=\"public\"] Where Application URL is a URL pointing to the Leap application. The format of the Application URL to launch a blank form is: /landing/org/app/<app id>/launch/index.html?form=<form id>. The format of the Application URL to launch the form for a specific record is: /landing/org/app/<app id>/launch/index.html?form=<form id>&id=<rec id> For more information on the app id , form id , and rec id , see the developerWorks\u00ae Leap wiki . Send data When data is pushed into the Leap portlet, the onDataReceived event fires. The event handler shares the contents of the string as a pData parameter, however it is up to the event to understand the contents of the string. [Plugin:RenderURL pr1.value=\"<your data>\" copyCurrentParams=\"true\" pr1.key=\"{http://www.ibm.com/pb/models}payload\" pr1.mode=\"set\" pr1.type=\"public\"] Where your data is the string you want sent to the Leap application. For more information on render parameters, see WebSphere\u00ae Portal Render Parameters Usage Details If you have multiple Leap Portlets in your Portal site, you can control which Forms Experience Portlet responds to the public render parameters by setting the param.sharing.scope parameter for your portal page. For more information, see How to control parameter sharing in the portal . Once a FEB Portlet responds to these actions, it will continue to do so until directed to perform another action.","title":"Public render parameters {#publicrenderparameters .reference}"},{"location":"ref_public_render_parameters.html#publicrenderparameters","text":"Public render parameters are leveraged to allow the Leap Portlet to communicate with other portlets. One type of public render parameter instructs the Leap Portlet to load a specific application.","title":"Public render parameters"},{"location":"ref_public_render_parameters.html#open-given-application","text":"The Leap Portlet opens a form when you specify the application URL as the value of the render parameter. Note: The code must be entered as a single line. [Plugin:RenderURL pr1.value=\"\\{Application URL\\}\" pr1.key=\"{http://www.ibm.com/pb/models}openURL\" copyCurrentParams=\"true\" pr1.mode=\"set\" pr1.type=\"public\"] Where Application URL is a URL pointing to the Leap application. The format of the Application URL to launch a blank form is: /landing/org/app/<app id>/launch/index.html?form=<form id>. The format of the Application URL to launch the form for a specific record is: /landing/org/app/<app id>/launch/index.html?form=<form id>&id=<rec id> For more information on the app id , form id , and rec id , see the developerWorks\u00ae Leap wiki .","title":"Open Given Application"},{"location":"ref_public_render_parameters.html#send-data","text":"When data is pushed into the Leap portlet, the onDataReceived event fires. The event handler shares the contents of the string as a pData parameter, however it is up to the event to understand the contents of the string. [Plugin:RenderURL pr1.value=\"<your data>\" copyCurrentParams=\"true\" pr1.key=\"{http://www.ibm.com/pb/models}payload\" pr1.mode=\"set\" pr1.type=\"public\"] Where your data is the string you want sent to the Leap application. For more information on render parameters, see WebSphere\u00ae Portal Render Parameters Usage Details If you have multiple Leap Portlets in your Portal site, you can control which Forms Experience Portlet responds to the public render parameters by setting the param.sharing.scope parameter for your portal page. For more information, see How to control parameter sharing in the portal . Once a FEB Portlet responds to these actions, it will continue to do so until directed to perform another action.","title":"Send data"},{"location":"ref_rest_api_auto_deploy.html","text":"Application management REST API The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications. Authentication To get the Swagger definition for the Application management REST API, use /apps-basic/anon|secure/org/app/swagger.json All REST API calls must be made as an authenticated user. If you want to exercise the API with code, then, you can use basic authentication. The authenticated user must be a valid user of Leap and must have the appropriate permission. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string. REST actions The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb Header Action Name /apps-basic/secure/org/app/app-uid/archive?mode=source&submitted=true GET Export /apps-basic/secure/org/app/app-uid/archive?replaceEmbeddedData=on&runDatabaseUpgradeNow=on&replaceSubmittedData=on&freedomIdentifyKey=x POST Upgrade /apps-basic/secure/org/app?deploy=false&importData=false&freedomIdentifyKey=x POST Import /apps-basic/secure/org/app/app-uid?freedomIdentifyKey=x DELETE Delete Export Exports the defined application as a .nitro_s file. You can use the following parameters to export the application: submitted=true : Can be set to true or false . true returns the application and all submission data that exists in the application. **Note:** If no value is passed, then the default is **true**. Upgrade Allows the user to upgrade the content of an application to match the application that is contained in the POST request. You can use the following parameters to upgrade the application: replaceSubmittedData=off : Can be on or off . on replaces the existing submission data with the submission data contained in the application being uploaded. **Note:** The default for replaceSubmittedData is **off**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The upgraded application must be uploaded to the server as multipart/form-data in the body of the POST. Import Imports the specified application into the Leap server. The user that performs the import is automatically added as an administrator. You can use the following parameters to import the application: deploy=false : Can be set to true or false . true automatically deploys the application as part of the import. **Note:** The default is **false**. importData=false : Can be set to true or false . true imports the submission data, or submitted records, if they were included when the application was exported. **Note:** The default is **false**. cleanIds=false : Can be set to true or false . true removes all groups and users from roles within the imported application ensuring that only the current authenticated user has access to the application. **Note:** The default is **false**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The application to be imported must be uploaded to the server as multipart/form-data. Delete Deletes the specified application from the server. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. Basic Application Flow This is the basic flow of an application communicating with the Leap REST API: Establish a URLConnection with the URL that matches the action you want. Set the basic authentication credentials into the URLConnection. Set extra headers or body content if required for the action. Process the response. Parent topic: REST API reference","title":"Application management REST API"},{"location":"ref_rest_api_auto_deploy.html#ref_rest_api_auto_deploy","text":"The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications.","title":"Application management REST API"},{"location":"ref_rest_api_auto_deploy.html#authentication","text":"To get the Swagger definition for the Application management REST API, use /apps-basic/anon|secure/org/app/swagger.json All REST API calls must be made as an authenticated user. If you want to exercise the API with code, then, you can use basic authentication. The authenticated user must be a valid user of Leap and must have the appropriate permission. The primary mechanism is to use basic authentication where the username and password are a Base64 encoded string.","title":"Authentication"},{"location":"ref_rest_api_auto_deploy.html#rest-actions","text":"The following table lists the types of actions that are available and the URLs associated with those actions. URL HTTP Verb Header Action Name /apps-basic/secure/org/app/app-uid/archive?mode=source&submitted=true GET Export /apps-basic/secure/org/app/app-uid/archive?replaceEmbeddedData=on&runDatabaseUpgradeNow=on&replaceSubmittedData=on&freedomIdentifyKey=x POST Upgrade /apps-basic/secure/org/app?deploy=false&importData=false&freedomIdentifyKey=x POST Import /apps-basic/secure/org/app/app-uid?freedomIdentifyKey=x DELETE Delete","title":"REST actions"},{"location":"ref_rest_api_auto_deploy.html#export","text":"Exports the defined application as a .nitro_s file. You can use the following parameters to export the application: submitted=true : Can be set to true or false . true returns the application and all submission data that exists in the application. **Note:** If no value is passed, then the default is **true**.","title":"Export"},{"location":"ref_rest_api_auto_deploy.html#upgrade","text":"Allows the user to upgrade the content of an application to match the application that is contained in the POST request. You can use the following parameters to upgrade the application: replaceSubmittedData=off : Can be on or off . on replaces the existing submission data with the submission data contained in the application being uploaded. **Note:** The default for replaceSubmittedData is **off**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The upgraded application must be uploaded to the server as multipart/form-data in the body of the POST.","title":"Upgrade"},{"location":"ref_rest_api_auto_deploy.html#import","text":"Imports the specified application into the Leap server. The user that performs the import is automatically added as an administrator. You can use the following parameters to import the application: deploy=false : Can be set to true or false . true automatically deploys the application as part of the import. **Note:** The default is **false**. importData=false : Can be set to true or false . true imports the submission data, or submitted records, if they were included when the application was exported. **Note:** The default is **false**. cleanIds=false : Can be set to true or false . true removes all groups and users from roles within the imported application ensuring that only the current authenticated user has access to the application. **Note:** The default is **false**. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information. The application to be imported must be uploaded to the server as multipart/form-data.","title":"Import"},{"location":"ref_rest_api_auto_deploy.html#delete","text":"Deletes the specified application from the server. freedomIdentifyKey=x : The value of x , must be a randomly generated, difficult to guess, single-use numerical value. The value of this URL parameter must match the value of the freedomIdentifyKey cookie. Requiring a cookie value that matches the URL parameter helps avoid possible browser vulnerabilities. See Data REST API Delete for more information.","title":"Delete"},{"location":"ref_rest_api_auto_deploy.html#basic-application-flow","text":"This is the basic flow of an application communicating with the Leap REST API: Establish a URLConnection with the URL that matches the action you want. Set the basic authentication credentials into the URLConnection. Set extra headers or body content if required for the action. Process the response. Parent topic: REST API reference","title":"Basic Application Flow"},{"location":"ref_rest_api_ref.html","text":"REST API reference The REST API can be used by other programs to communicate with Leap. To get the Swagger definition for all REST APIs, use /apps-basic/anon/org/api/swagger.json. Data access REST API The data access REST API exposes operations on application submitted data, also known as records. Application management REST API The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications. Application statistics REST API Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Parent topic: Reference","title":"REST API reference"},{"location":"ref_rest_api_ref.html#restapireference","text":"The REST API can be used by other programs to communicate with Leap. To get the Swagger definition for all REST APIs, use /apps-basic/anon/org/api/swagger.json. Data access REST API The data access REST API exposes operations on application submitted data, also known as records. Application management REST API The Application management REST API allows for programmatic import, export, upgrade, and delete of Leap applications. Application statistics REST API Application statistics REST API exposes statistics data on all applications, such as an application's last updated date, record count, attachment size etc. Parent topic: Reference","title":"REST API reference"},{"location":"ref_send_email.html","text":"Send Email service This topic provides reference information on the Send Email service in HCL Leap. Purpose The Send Email service provides a mechanism to send an email from a Leap application. The service enables an application author to bind fields from their form to the parameters of the service and it can be executed at any time, which is what distinguishes it from the submit activity email functionality (which can only be sent as part of a submit event). This feature is disabled by default and must be enabled by the administrator. To enable this service, add (or modify) the following property in the Leap_config.properties: ibm.nitro.NitroConfig.enableEmailService=true Leap does not need to be restarted, but it may take a few minutes for the service to appear in the authoring environment. Service parameters Parameter Definition To One or more addresses to be used as the primary email target. CC One or more addresses to which the email will be sent as cc. BCC One or more addresses to which the email will be sent as bcc. Reply To The email address to be shown as the reply to address. Subject The text to be used for the email subject. Text Content Plain text content to be used for the email body. HTML Content HTML content to be used for the email body. Note: Both the plain text and html content are sent as part of the email if specified. It is up to the rendering email client to decide how and when to use the content provided. Advanced service parameters To access the advanced service parameters, select Advanced from the drop-down labelled View on the Inputs tab. Parameter Definition To List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018To\u2019 field. CC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018CC\u2019 field. BCC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018BCC\u2019 field. How to use To use this service, complete the following steps while editing an application: Select Settings . Create a service configuration. Select the General service catalog. From the list of services, select Send Email . Map form items to the email service parameters On the Details tab, define a meaningful service id.. Click OK . The service is then listed on the services page for that form. This service can be connected to a button click event or triggered from any item\u2019s javaScript event. You can also setup an \u2018onCallFinished\u2019 handler to run custom javaScript code after the service completes. Possible response values The service does not return any parameters. The service could throw the following errors: Error message *Definition * CLFNI1803E: Email must define at least one address ('to', 'cc' or 'bcc'). If the to, cc and bcc are empty CLFNI1804E: Email body may not be empty. If the text content and the html content are empty CLFNI1805E: Failed to send email. If an error is received from the mail server configured with Leap. Parent topic: Services","title":"Send Email service"},{"location":"ref_send_email.html#send-email-service","text":"This topic provides reference information on the Send Email service in HCL Leap.","title":"Send Email service"},{"location":"ref_send_email.html#section_jkm_qck_d1c","text":"The Send Email service provides a mechanism to send an email from a Leap application. The service enables an application author to bind fields from their form to the parameters of the service and it can be executed at any time, which is what distinguishes it from the submit activity email functionality (which can only be sent as part of a submit event). This feature is disabled by default and must be enabled by the administrator. To enable this service, add (or modify) the following property in the Leap_config.properties: ibm.nitro.NitroConfig.enableEmailService=true Leap does not need to be restarted, but it may take a few minutes for the service to appear in the authoring environment.","title":"Purpose"},{"location":"ref_send_email.html#section_qgm_tck_d1c","text":"Parameter Definition To One or more addresses to be used as the primary email target. CC One or more addresses to which the email will be sent as cc. BCC One or more addresses to which the email will be sent as bcc. Reply To The email address to be shown as the reply to address. Subject The text to be used for the email subject. Text Content Plain text content to be used for the email body. HTML Content HTML content to be used for the email body. Note: Both the plain text and html content are sent as part of the email if specified. It is up to the rendering email client to decide how and when to use the content provided.","title":"Service parameters"},{"location":"ref_send_email.html#section_hwm_zck_d1c","text":"To access the advanced service parameters, select Advanced from the drop-down labelled View on the Inputs tab. Parameter Definition To List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018To\u2019 field. CC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018CC\u2019 field. BCC List This is a list parameter that can be connected to a list form item, like a table, to enable multiple addresses to be assigned to the email \u2018BCC\u2019 field.","title":"Advanced service parameters"},{"location":"ref_send_email.html#section_zvw_cdk_d1c","text":"To use this service, complete the following steps while editing an application: Select Settings . Create a service configuration. Select the General service catalog. From the list of services, select Send Email . Map form items to the email service parameters On the Details tab, define a meaningful service id.. Click OK . The service is then listed on the services page for that form. This service can be connected to a button click event or triggered from any item\u2019s javaScript event. You can also setup an \u2018onCallFinished\u2019 handler to run custom javaScript code after the service completes.","title":"How to use"},{"location":"ref_send_email.html#section_gx3_ndk_d1c","text":"The service does not return any parameters. The service could throw the following errors: Error message *Definition * CLFNI1803E: Email must define at least one address ('to', 'cc' or 'bcc'). If the to, cc and bcc are empty CLFNI1804E: Email body may not be empty. If the text content and the html content are empty CLFNI1805E: Failed to send email. If an error is received from the mail server configured with Leap. Parent topic: Services","title":"Possible response values"},{"location":"ref_service_basic_credentials_provider.html","text":"Basic Credentials Provider This topic describes Basic Credentials Providers used within a Service Description. Purpose of the Basic Credentials Provider The Basic Credentials Provider provides a mechanism that allows user name and password credentials to be gathered, and provided to a Service Transport. The credentials that are gathered are specific to a single user session with HCL Leap. These credentials are not shared between multiple sessions and are not accessible to other users or administrators of Leap. When to use the Basic Credentials Provider When a Service Description needs a set of credentials and the credentials vary based on the user invoking the service call, use the Basic Credentials Provider. How to Configure the Basic Credentials Provider In general, the Basic Credentials Provider does not need any custom configuration to work. By configuring the Service Description to use the Basic Credentials Provider, Leap collects credentials, and makes them available to the Service Transport configured in the Service Description. Sharing Credentials Between Service Descriptions In some cases, several Service Descriptions might need to share a set of user credentials. Instead of having the user enter their credentials once per service, the Basic Credentials Provider can be configured to allow multiple Service Descriptions to share user-entered credentials using a realm. The realm is a property of the Basic Credentials Provider. Its value is the name of the realm to which entered credentials are associated. When multiple Service Descriptions share the realm value, they share the set of credentials. Using the Basic Credentials Provider in a Service Description The provider ID for the Basic Credentials Provider to enter in a Service Description is: basic Credentials Provider Parameters Name Description Mandatory Default realm The name of the realm to use to associate entered credentials so that they can be shared between multiple Service Descriptions. No N/A Sample Service Description <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <credentials providerId=\"basic\"\\> <property name=\"realm\" value=\"myRealm\"/\\> </credentials\\> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#ref_service_basic_credentials_provider","text":"This topic describes Basic Credentials Providers used within a Service Description.","title":"Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#purpose-of-the-basic-credentials-provider","text":"The Basic Credentials Provider provides a mechanism that allows user name and password credentials to be gathered, and provided to a Service Transport. The credentials that are gathered are specific to a single user session with HCL Leap. These credentials are not shared between multiple sessions and are not accessible to other users or administrators of Leap.","title":"Purpose of the Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#when-to-use-the-basic-credentials-provider","text":"When a Service Description needs a set of credentials and the credentials vary based on the user invoking the service call, use the Basic Credentials Provider.","title":"When to use the Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#how-to-configure-the-basic-credentials-provider","text":"In general, the Basic Credentials Provider does not need any custom configuration to work. By configuring the Service Description to use the Basic Credentials Provider, Leap collects credentials, and makes them available to the Service Transport configured in the Service Description.","title":"How to Configure the Basic Credentials Provider"},{"location":"ref_service_basic_credentials_provider.html#sharing-credentials-between-service-descriptions","text":"In some cases, several Service Descriptions might need to share a set of user credentials. Instead of having the user enter their credentials once per service, the Basic Credentials Provider can be configured to allow multiple Service Descriptions to share user-entered credentials using a realm. The realm is a property of the Basic Credentials Provider. Its value is the name of the realm to which entered credentials are associated. When multiple Service Descriptions share the realm value, they share the set of credentials.","title":"Sharing Credentials Between Service Descriptions"},{"location":"ref_service_basic_credentials_provider.html#using-the-basic-credentials-provider-in-a-service-description","text":"The provider ID for the Basic Credentials Provider to enter in a Service Description is: basic","title":"Using the Basic Credentials Provider in a Service Description"},{"location":"ref_service_basic_credentials_provider.html#credentials-provider-parameters","text":"Name Description Mandatory Default realm The name of the realm to use to associate entered credentials so that they can be shared between multiple Service Descriptions. No N/A","title":"Credentials Provider Parameters"},{"location":"ref_service_basic_credentials_provider.html#sample-service-description","text":"<serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <credentials providerId=\"basic\"\\> <property name=\"realm\" value=\"myRealm\"/\\> </credentials\\> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_cookie_credentials_provider.html","text":"Cookie Credentials Provider This topic describes Cookie Credentials Provider used within a Service Description. Purpose of the Cookie Credentials Provider The Cookie Credentials Provider provides a mechanism through which cookies between the Leap and the web browser can be made available to a Service Transport. When to use the Cookie Credentials Provider The Cookie Credentials Provider is used when Leap and the endpoint of a Service share common Single Sign-On (SSO) credentials. For example, Leap and a service application are installed into the same SSO domain configured using Lightweight Third-Party Authentication (LTPA). The Cookie Credentials Provider is used to pass the LTPA tokens that were generated at login by Leap to the service application when a service call is made. How to Configure the Cookie Credentials Provider By default, the Cookie Credentials Provider does not make any cookies available to the Service Transport. In order to make cookies available to a Service Transport, the Cookie Credentials Provider must be configured. The value of the cookie\u2019s property is a comma-separated list of cookie names. Any request cookies that have the same name, based on a case insensitive comparison, as the names in the cookies property are made available to the Service Transport. Using the Cookie Credentials Provider in a Service Description The provider ID for the Cookie Credentials Provider to enter in a Service Description is: cookie Credentials Provider Parameters Name Description Mandatory Default cookies A comma-separated list of cookie names available to the Service Transport No N/A Sample Service Description <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> **<credentials providerId=\"cookie\"\\> <property name=\"cookies\" value=\"LtpaToken,LtpaToken2\"/\\> </credentials\\>** <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#ref_service_cookie_credentials_provider","text":"This topic describes Cookie Credentials Provider used within a Service Description.","title":"Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#purpose-of-the-cookie-credentials-provider","text":"The Cookie Credentials Provider provides a mechanism through which cookies between the Leap and the web browser can be made available to a Service Transport.","title":"Purpose of the Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#when-to-use-the-cookie-credentials-provider","text":"The Cookie Credentials Provider is used when Leap and the endpoint of a Service share common Single Sign-On (SSO) credentials. For example, Leap and a service application are installed into the same SSO domain configured using Lightweight Third-Party Authentication (LTPA). The Cookie Credentials Provider is used to pass the LTPA tokens that were generated at login by Leap to the service application when a service call is made.","title":"When to use the Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#how-to-configure-the-cookie-credentials-provider","text":"By default, the Cookie Credentials Provider does not make any cookies available to the Service Transport. In order to make cookies available to a Service Transport, the Cookie Credentials Provider must be configured. The value of the cookie\u2019s property is a comma-separated list of cookie names. Any request cookies that have the same name, based on a case insensitive comparison, as the names in the cookies property are made available to the Service Transport.","title":"How to Configure the Cookie Credentials Provider"},{"location":"ref_service_cookie_credentials_provider.html#using-the-cookie-credentials-provider-in-a-service-description","text":"The provider ID for the Cookie Credentials Provider to enter in a Service Description is: cookie","title":"Using the Cookie Credentials Provider in a Service Description"},{"location":"ref_service_cookie_credentials_provider.html#credentials-provider-parameters","text":"Name Description Mandatory Default cookies A comma-separated list of cookie names available to the Service Transport No N/A","title":"Credentials Provider Parameters"},{"location":"ref_service_cookie_credentials_provider.html#sample-service-description","text":"<serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> **<credentials providerId=\"cookie\"\\> <property name=\"cookies\" value=\"LtpaToken,LtpaToken2\"/\\> </credentials\\>** <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_deploying_service_description.html","text":"Deploying a Service Description This topic contains information about how to deploy an HCL Leap Service Description. To deploy a Service Description, place the XML document in one of the following directories, or in a subdirectory of one of the following directories: Windows\u2122: any drive\\HCL\\Leap\\ServiceCatalog\\1\\ Linux\u2122, or AIX\u00ae: /opt/HCL/Leap/ServiceCatalog/1/ Important notes on directories: There must be an extensions directory in the same parent directory as the ServiceCatalog directory. Otherwise, the ServiceCatalog directory is not found. For example, /opt/HCL/Leap/extensions/. If the extensions directory or ServiceCatalog/1 directory does not exist, then the Leap server must be restarted after the directories are created. /opt/HCL/Leap/ is not case-sensitive. When the Leap server starts, the ServiceCatalog directory and its subdirectories are scanned for new, deleted, and changed Service Descriptions. New and changed Service Descriptions are loaded and registered with the Leap server, and become available immediately. Service Descriptions that fail to load, or do not have an appropriate Service Transport registered, are not available. Access to a service description may be given to a specific user, group, or special assignment (i.e. Authenticated, Anonymous, etc). The access control is made up of two parts: who may discover and work with the service while designing an application, and who may run the service. Users or Groups provided must be in the proper format - it is recommended to use the dialog (by clicking the button with the down arrow) when adding permissions. Adding or removing users does not require a server restart, but there will be a short delay before the changes take effect. Deleting Service Descriptions and changing Service Descriptions must be done with care. Applications might depend on any or all of the parameters for the Service Description, as well as data returned within the Service Description. Therefore, modifying the structure or ID of parameters, or how data is mapped into the parameters, can potentially cause failures within deployed applications. Deleted Service Descriptions are unregistered and immediately become unavailable to any applications, deployed or otherwise. It is critical that before deregistering a Service Description, a check is performed to ensure that there are no applications that are using the Service Description. In general, adding new parameters or mappings and changing names and descriptions does not cause failures. However, removing existing parameters, changing parameter mapping, or modifying IDs for Service Description, Service Transport, or a parameter, are likely to cause failures. A list of potentially safe and unsafe operations are summarized in Table 2. Table 1. Summary of potentially safe and unsafe changes Potentially Safe Changes Potentially Unsafe Changes Adding new parameters Changing the name of a parameter Changing the description of a parameter Changing the name of the Service Description Changing the description of the Service Description Adding support for an additional language within the Service Description Changing the Service Description default locale Removing existing parameters Changing the ID of an existing parameter Changing the ID of the Service Description Changing the Transport ID of the Service Description Changing the mapping of existing parameters. If significant changes must be made to a Service Description that is in use by deployed applications, a new Service Description must be created and the existing Service Description that remains intact. The new Service Description must be given a unique ID, and given a distinct name with a version number to indicate that this new Service Description is different from similarly named ones. Parent topic: Service Description","title":"Deploying a Service Description"},{"location":"ref_service_deploying_service_description.html#deploying-a-service-description","text":"This topic contains information about how to deploy an HCL Leap Service Description. To deploy a Service Description, place the XML document in one of the following directories, or in a subdirectory of one of the following directories: Windows\u2122: any drive\\HCL\\Leap\\ServiceCatalog\\1\\ Linux\u2122, or AIX\u00ae: /opt/HCL/Leap/ServiceCatalog/1/ Important notes on directories: There must be an extensions directory in the same parent directory as the ServiceCatalog directory. Otherwise, the ServiceCatalog directory is not found. For example, /opt/HCL/Leap/extensions/. If the extensions directory or ServiceCatalog/1 directory does not exist, then the Leap server must be restarted after the directories are created. /opt/HCL/Leap/ is not case-sensitive. When the Leap server starts, the ServiceCatalog directory and its subdirectories are scanned for new, deleted, and changed Service Descriptions. New and changed Service Descriptions are loaded and registered with the Leap server, and become available immediately. Service Descriptions that fail to load, or do not have an appropriate Service Transport registered, are not available. Access to a service description may be given to a specific user, group, or special assignment (i.e. Authenticated, Anonymous, etc). The access control is made up of two parts: who may discover and work with the service while designing an application, and who may run the service. Users or Groups provided must be in the proper format - it is recommended to use the dialog (by clicking the button with the down arrow) when adding permissions. Adding or removing users does not require a server restart, but there will be a short delay before the changes take effect. Deleting Service Descriptions and changing Service Descriptions must be done with care. Applications might depend on any or all of the parameters for the Service Description, as well as data returned within the Service Description. Therefore, modifying the structure or ID of parameters, or how data is mapped into the parameters, can potentially cause failures within deployed applications. Deleted Service Descriptions are unregistered and immediately become unavailable to any applications, deployed or otherwise. It is critical that before deregistering a Service Description, a check is performed to ensure that there are no applications that are using the Service Description. In general, adding new parameters or mappings and changing names and descriptions does not cause failures. However, removing existing parameters, changing parameter mapping, or modifying IDs for Service Description, Service Transport, or a parameter, are likely to cause failures. A list of potentially safe and unsafe operations are summarized in Table 2. Table 1. Summary of potentially safe and unsafe changes Potentially Safe Changes Potentially Unsafe Changes Adding new parameters Changing the name of a parameter Changing the description of a parameter Changing the name of the Service Description Changing the description of the Service Description Adding support for an additional language within the Service Description Changing the Service Description default locale Removing existing parameters Changing the ID of an existing parameter Changing the ID of the Service Description Changing the Transport ID of the Service Description Changing the mapping of existing parameters. If significant changes must be made to a Service Description that is in use by deployed applications, a new Service Description must be created and the existing Service Description that remains intact. The new Service Description must be given a unique ID, and given a distinct name with a version number to indicate that this new Service Description is different from similarly named ones. Parent topic: Service Description","title":"Deploying a Service Description"},{"location":"ref_service_http_service_transport.html","text":"HTTP Service Transport This topic provides reference information on HTTP Service Transports used in HCL Leap. Purpose of the HTTP Service Transport The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the Leap service mapping engine, the HTTP Service Transport extracts data from an HTTP response and makes it available to your application. When to use the HTTP Service Transport The HTTP Service Transport can be used to communicate with any standard HTTP server. There are some limits on what the HTTP Service Transport can provide, but in most cases, the HTTP Service Transport is all that is required to communicate with a basic HTTP server, or RESTful service. How to use the HTTP Service Transport The HTTP Service Transport has numerous parameters to configure it to talk to many HTTP Servers. In many cases, only a subset of the available parameters is needed. However, all the parameters can be used for any Service Description. The following sections provide a high-level outline of the parameters needed to configure specific parts of your HTTP request. Configuring the Request Method All HTTP requests require a request method, which tells the receiving HTTP server what to do with the request. The HTTP Service Transport supports all the basic HTTP request methods, including: GET, PUT, POST, and DELETE. The HTTP Service Transport supports configuring the HTTP request method with the request-method parameter. If this parameter is missing, or does not contain a valid HTTP request method, then the default, GET is used. Configuring the Request URL A URL is required to make an HTTP request. There is no default for this parameter, so it must be provided to the HTTP Service Transport. There are several parameters that affect how the request URL is built: request-url, request-url-postfix, request-url-postfix-encoded, and two dynamic parameters: request-url-postfix-N and request-url-postfix-N-encoded. The HTTP Service Transport constructs the URL by starting with the value of request-url and appending postfixes. If request-url-postfix is present, its value is appended to the value of request-url. Before appending, the HTTP Service Transport URL encodes the value of request-url-postfix if the request-url-postfix-encoded flag is not present or if its value is anything other than true. Encoding allows values containing characters that are not valid to be placed into the URL without any harm. Choosing to not encode a value allows it to be appended without modification to the URL. For example, consider a Service Description that requires the path to a file as input. Since the path might contain slash (/) characters that must be preserved, then request-url-postfix-encoded is set to true. This instructs the HTTP Service Transport to leave the value alone. However, another Service Description might need to include a text string as a path component. In this case, the slash (/) or any other characters are encoded such that they do not interfere with the path. In this second case, the request-url-postfix-encoded parameter is set to false or omitted from the Service Description. In some cases, having a single postfix does not provide enough flexibility. Therefore, the dynamic parameters request-url-postfix-Nand request-url-postfix-N-encoded are used. The N in each of these parameters refers to its order. During processing, the HTTP Service Transport appends the value of these parameters starting with 0 until it finds a missing parameter. As with the single postfix, encoding is optionally performed on each of the parameters before it is added if the value of the request-url-postfix-N-encoded flag is not present or contains any value other than true. For example, if the Service Description contains parameters called request-url-postfix-0, request-url-postfix-1, and request-url-postfix-3, only request-url-postfix-0 and request-url-postfix-1 are appended to the URL. While building the request URL if a parameter called request-url-postfix is found, the dynamic parameters are ignored. The Service Description developer must make a conscious choice to use these dynamic parameters. Configuring Request Parameters Query parameters are configured using parameters with the prefix request-query-. Text after the prefix is considered to be the name of the query parameter to pass. The value of the query parameter comes from the value of the transport parameter, and is encoded to prevent the URL from being disrupted. All parameters with the request-query- prefix are added to the URL. No guarantees are made as to the order in which the query parameters are added. For example, consider a search service that requires the search criteria term to be passed as a query parameter. In order to communicate with this service, the Service Description must have a parameter called request-query-term. Configuring Request Headers The HTTP Service Transport allows HTTP request headers to be configured using parameters with the prefix request-header-. Text after the prefix is considered to be the name of the header. The value of the request header is the value of the parameter. No escaping or encoding is performed on either the name or value of request headers. Therefore, header configuration must include only characters that are permissible. Configuring the Request Body HTTP allows a body, or entity, to be sent with PUT and POST requests. In order to allow a Service Description to include a request entity, the HTTP Service Transport sends the contents of the request-entity parameter with the request. The contents of this parameter are ignored if the content of request-method is not PUT or POST. Configuring HTTP Authentication The HTTP Service Transport supports HTTP Basic and HTTP Digest authentication schemes. There arethreetwo mechanisms through which the credentials can be configured: hard coded in the Service Description, provided through the Java 2 Connector (J2C) Authentication Credentials provider, or provided at run time through the Basic Credentials Provider. To hard code the credentials that the HTTP Service Transport uses to authenticate, the request-http-auth-username and request-http-auth-password parameters must be available. The values of these parameters are used during any HTTP authentication challenge for either HTTP Basic or HTTP Digest authentication. The HTTP Service Transport performs any hashing required. Therefore, the values of these parameters must be the plain text version of both the user name and password. Credentials can be provided at run time using the Basic Credentials Provider. Refer to the Service Description and Basic Credentials Provider help topic for more information. The HTTP Service Transport only uses credentials provided by the Basic Credentials Provider if the request-http-auth-username and request-http-auth-password parameters are empty. Credentials can be provided using the J2C Authentication Credentials Provider. Refer to the Java 2 Connector (J2C) Authentication Credentials Provider help topic for more information. Note: The HTTP Service transport can only use credentials provided by the Basic Credentials provideror the J2C Authentication Credentials Provider if the request-HTTP-auth-username and request-HTTP-auth-password parameters are empty. In addition to HTTP Basic and HTTP Digest authentication, the HTTP Service Transport supports Single Sign on (SSO) authentication using the Cookie Credentials Provider. In the case where the request made through the HTTP Service Transports needs to passLeap authentication cookies, the Cookie Credentials Provider can be used. In general, the Cookie Credentials Provider is configured to pass the LtpaToken and LtpaToken2 cookies. Consult the Service Description and Cookie Credentials Provider help topics for information. Receiving Response Status Information The HTTP Service Transport ensures that the HTTP status code and message are available for consumption. The HTTP status code, for example, 200, 404, or 500, is available in the outbound response-code parameter. Similarly, the outbound response-message parameter contains the status message returned, for example, OK, Not Found, or Server Error. Receiving Response Headers All the headers that are returned in the HTTP response are made available to the Service Description via dynamic parameters. Each header name is converted to lowercase and appended with response-header-. For example, the content-type header would be available as an outbound parameter called response-header-content-type. The parameter contains the value of the header. In the case where a header contains more than one value, the header values are collapsed into a single comma-separated list. Receiving the Response Body The entire response body, or entity, is made available via the outbound response-entity parameter. Specifying the HTTP Service Transport in a Service Description The HTTP Service Transport can be used by specifying its unique ID as the value of the transportId element of the Service Description. The unique ID of the HTTP Service Transport is: HTTPServiceTransport Supported Credentials Providers The HTTP Service Transport supports the following Credentials Providers: Basic Cookie J2C Transport Parameters Inbound Inbound parameters are provided to the HTTP Service Transport. Table 1. Available Inbound Parameters Name Description Mandatory Type Default request-url Base URL to request. Yes String request-method HTTP verb to use when making the request. Acceptable values are GET, PUT, POST, or DELETE. No String GET request-url-postfix Postfix to append to the value of request-url. No String N/A request-url-postfix-encoded Flag indicating whether the value of request-postfix is encoded. If this parameter is missing or is set to false, the value is URL encoded. Yes Boolean FALSE request-url-postfix-N The N postfix to append to the value of request-url. This parameter is only considered if request-postfix is not present. No String N/A request-url-postfix-N-encoded Flag indicating whether the value of the corresponding request-postfix-N is encoded. If this parameter is missing or set to false, the value is URL encoded. No Boolean FALSE request-header-x The value for the request header x. For example, request-header-accept creates a request header called accept. No String N/A request-query-x The value for the query parameter called x. For example, request-query-term creates a query parameter called term. No String N/A request-entity The body of the request to send. The UTF-8 character set is used. No String N/A Outbound Outbound parameters are returned from the transport as a result of the service invocation. Table 2. Available Outbound Parameters Name Description Type response-code HTTP status code returned by the server. This could be any of the standard values, for example, 200, 400, and 500, or a non-standard code returned by the server. Integer response-message HTTP status message associated with the HTTP status code. The value of this parameter is determined by the server. Generally, this message is a standard status message, for example, OK, Not Found, or Server Error. String response-header-x The value of the response header named x in lowercase. For example, if the response contains the response header Content-Type: text/html then response-header-content-type contains the value text/html. String response-entity The entire response body from the HTTP request. It is assumed that the response uses the UTF-8, or ASCII character set. String Sample Service Description For more examples using the HTTP Service Transport, see Service Description . <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#http-service-transport","text":"This topic provides reference information on HTTP Service Transports used in HCL Leap.","title":"HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#purpose-of-the-http-service-transport","text":"The HTTP Service Transport provides a mechanism to communicate with HTTP servers. The transport allows configuration of the URL to request, HTTP method to use, query parameters, and request headers. When combined with the Leap service mapping engine, the HTTP Service Transport extracts data from an HTTP response and makes it available to your application.","title":"Purpose of the HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#when-to-use-the-http-service-transport","text":"The HTTP Service Transport can be used to communicate with any standard HTTP server. There are some limits on what the HTTP Service Transport can provide, but in most cases, the HTTP Service Transport is all that is required to communicate with a basic HTTP server, or RESTful service.","title":"When to use the HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#how-to-use-the-http-service-transport","text":"The HTTP Service Transport has numerous parameters to configure it to talk to many HTTP Servers. In many cases, only a subset of the available parameters is needed. However, all the parameters can be used for any Service Description. The following sections provide a high-level outline of the parameters needed to configure specific parts of your HTTP request. Configuring the Request Method All HTTP requests require a request method, which tells the receiving HTTP server what to do with the request. The HTTP Service Transport supports all the basic HTTP request methods, including: GET, PUT, POST, and DELETE. The HTTP Service Transport supports configuring the HTTP request method with the request-method parameter. If this parameter is missing, or does not contain a valid HTTP request method, then the default, GET is used. Configuring the Request URL A URL is required to make an HTTP request. There is no default for this parameter, so it must be provided to the HTTP Service Transport. There are several parameters that affect how the request URL is built: request-url, request-url-postfix, request-url-postfix-encoded, and two dynamic parameters: request-url-postfix-N and request-url-postfix-N-encoded. The HTTP Service Transport constructs the URL by starting with the value of request-url and appending postfixes. If request-url-postfix is present, its value is appended to the value of request-url. Before appending, the HTTP Service Transport URL encodes the value of request-url-postfix if the request-url-postfix-encoded flag is not present or if its value is anything other than true. Encoding allows values containing characters that are not valid to be placed into the URL without any harm. Choosing to not encode a value allows it to be appended without modification to the URL. For example, consider a Service Description that requires the path to a file as input. Since the path might contain slash (/) characters that must be preserved, then request-url-postfix-encoded is set to true. This instructs the HTTP Service Transport to leave the value alone. However, another Service Description might need to include a text string as a path component. In this case, the slash (/) or any other characters are encoded such that they do not interfere with the path. In this second case, the request-url-postfix-encoded parameter is set to false or omitted from the Service Description. In some cases, having a single postfix does not provide enough flexibility. Therefore, the dynamic parameters request-url-postfix-Nand request-url-postfix-N-encoded are used. The N in each of these parameters refers to its order. During processing, the HTTP Service Transport appends the value of these parameters starting with 0 until it finds a missing parameter. As with the single postfix, encoding is optionally performed on each of the parameters before it is added if the value of the request-url-postfix-N-encoded flag is not present or contains any value other than true. For example, if the Service Description contains parameters called request-url-postfix-0, request-url-postfix-1, and request-url-postfix-3, only request-url-postfix-0 and request-url-postfix-1 are appended to the URL. While building the request URL if a parameter called request-url-postfix is found, the dynamic parameters are ignored. The Service Description developer must make a conscious choice to use these dynamic parameters. Configuring Request Parameters Query parameters are configured using parameters with the prefix request-query-. Text after the prefix is considered to be the name of the query parameter to pass. The value of the query parameter comes from the value of the transport parameter, and is encoded to prevent the URL from being disrupted. All parameters with the request-query- prefix are added to the URL. No guarantees are made as to the order in which the query parameters are added. For example, consider a search service that requires the search criteria term to be passed as a query parameter. In order to communicate with this service, the Service Description must have a parameter called request-query-term. Configuring Request Headers The HTTP Service Transport allows HTTP request headers to be configured using parameters with the prefix request-header-. Text after the prefix is considered to be the name of the header. The value of the request header is the value of the parameter. No escaping or encoding is performed on either the name or value of request headers. Therefore, header configuration must include only characters that are permissible. Configuring the Request Body HTTP allows a body, or entity, to be sent with PUT and POST requests. In order to allow a Service Description to include a request entity, the HTTP Service Transport sends the contents of the request-entity parameter with the request. The contents of this parameter are ignored if the content of request-method is not PUT or POST. Configuring HTTP Authentication The HTTP Service Transport supports HTTP Basic and HTTP Digest authentication schemes. There arethreetwo mechanisms through which the credentials can be configured: hard coded in the Service Description, provided through the Java 2 Connector (J2C) Authentication Credentials provider, or provided at run time through the Basic Credentials Provider. To hard code the credentials that the HTTP Service Transport uses to authenticate, the request-http-auth-username and request-http-auth-password parameters must be available. The values of these parameters are used during any HTTP authentication challenge for either HTTP Basic or HTTP Digest authentication. The HTTP Service Transport performs any hashing required. Therefore, the values of these parameters must be the plain text version of both the user name and password. Credentials can be provided at run time using the Basic Credentials Provider. Refer to the Service Description and Basic Credentials Provider help topic for more information. The HTTP Service Transport only uses credentials provided by the Basic Credentials Provider if the request-http-auth-username and request-http-auth-password parameters are empty. Credentials can be provided using the J2C Authentication Credentials Provider. Refer to the Java 2 Connector (J2C) Authentication Credentials Provider help topic for more information. Note: The HTTP Service transport can only use credentials provided by the Basic Credentials provideror the J2C Authentication Credentials Provider if the request-HTTP-auth-username and request-HTTP-auth-password parameters are empty. In addition to HTTP Basic and HTTP Digest authentication, the HTTP Service Transport supports Single Sign on (SSO) authentication using the Cookie Credentials Provider. In the case where the request made through the HTTP Service Transports needs to passLeap authentication cookies, the Cookie Credentials Provider can be used. In general, the Cookie Credentials Provider is configured to pass the LtpaToken and LtpaToken2 cookies. Consult the Service Description and Cookie Credentials Provider help topics for information. Receiving Response Status Information The HTTP Service Transport ensures that the HTTP status code and message are available for consumption. The HTTP status code, for example, 200, 404, or 500, is available in the outbound response-code parameter. Similarly, the outbound response-message parameter contains the status message returned, for example, OK, Not Found, or Server Error. Receiving Response Headers All the headers that are returned in the HTTP response are made available to the Service Description via dynamic parameters. Each header name is converted to lowercase and appended with response-header-. For example, the content-type header would be available as an outbound parameter called response-header-content-type. The parameter contains the value of the header. In the case where a header contains more than one value, the header values are collapsed into a single comma-separated list. Receiving the Response Body The entire response body, or entity, is made available via the outbound response-entity parameter.","title":"How to use the HTTP Service Transport"},{"location":"ref_service_http_service_transport.html#specifying-the-http-service-transport-in-a-service-description","text":"The HTTP Service Transport can be used by specifying its unique ID as the value of the transportId element of the Service Description. The unique ID of the HTTP Service Transport is: HTTPServiceTransport","title":"Specifying the HTTP Service Transport in a Service Description"},{"location":"ref_service_http_service_transport.html#supported-credentials-providers","text":"The HTTP Service Transport supports the following Credentials Providers: Basic Cookie J2C","title":"Supported Credentials Providers"},{"location":"ref_service_http_service_transport.html#transport-parameters","text":"Inbound Inbound parameters are provided to the HTTP Service Transport. Table 1. Available Inbound Parameters Name Description Mandatory Type Default request-url Base URL to request. Yes String request-method HTTP verb to use when making the request. Acceptable values are GET, PUT, POST, or DELETE. No String GET request-url-postfix Postfix to append to the value of request-url. No String N/A request-url-postfix-encoded Flag indicating whether the value of request-postfix is encoded. If this parameter is missing or is set to false, the value is URL encoded. Yes Boolean FALSE request-url-postfix-N The N postfix to append to the value of request-url. This parameter is only considered if request-postfix is not present. No String N/A request-url-postfix-N-encoded Flag indicating whether the value of the corresponding request-postfix-N is encoded. If this parameter is missing or set to false, the value is URL encoded. No Boolean FALSE request-header-x The value for the request header x. For example, request-header-accept creates a request header called accept. No String N/A request-query-x The value for the query parameter called x. For example, request-query-term creates a query parameter called term. No String N/A request-entity The body of the request to send. The UTF-8 character set is used. No String N/A Outbound Outbound parameters are returned from the transport as a result of the service invocation. Table 2. Available Outbound Parameters Name Description Type response-code HTTP status code returned by the server. This could be any of the standard values, for example, 200, 400, and 500, or a non-standard code returned by the server. Integer response-message HTTP status message associated with the HTTP status code. The value of this parameter is determined by the server. Generally, this message is a standard status message, for example, OK, Not Found, or Server Error. String response-header-x The value of the response header named x in lowercase. For example, if the response contains the response header Content-Type: text/html then response-header-content-type contains the value text/html. String response-entity The entire response body from the HTTP request. It is assumed that the response uses the UTF-8, or ASCII character set. String","title":"Transport Parameters"},{"location":"ref_service_http_service_transport.html#sample-service-description","text":"For more examples using the HTTP Service Transport, see Service Description . <?xml version=\"1.0\" encoding=\"utf-8\"?> <serviceDescription> <id>make-http-request</id> <defaultLocale>en-us</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en-us\">Make an HTTP Request</name> <description xml:lang=\"en-us\">Makes an HTTP request to the configured URL and returns the result</description> <inbound> <parameters> <parameter> <id>request-url</id> <name xml:lang=\"en-us\">URL</name> <description xml:lang=\"en-us\">URL to request.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> <parameter> <id>request-method</id> <name xml:lang=\"en-us\">Method</name> <description xml:lang=\"en-us\">HTTP method to use, one of GET, PUT, POST, or DELETE.</description> <mandatory>true</mandatory> <type>STRING</type> </parameter> </parameters> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <name xml:lang=\"en-us\">Response</name> <description xml:lang=\"en-us\">Response returned by making a request to the configured URL.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_j2c_credentials_provider.html","text":"Java 2 Connector (J2C) Authentication Credentials Provider This topic describes J2C Authentication Credentials Providers that are used within a Service Description. Purpose of the J2C Credentials Provider The J2C Authentication Credentials Provider provides a mechanism that allows user name and password credentials to be provided to a Service Transport without being hardcoded within the Service Description. The credentials are defined by the WebSphere\u00ae Application Server administrator and associated with an alias that is then used within the Service Description. When to use the J2C Credentials Provider Use the J2C Authentication Credentials Provider when a Service Description needs to define a static set of credentials, typically used to access a backend resource or service, and not specific to a particular user starting the service. How to Configure the J2C Credentials Provider To use the J2C Authentication Credential Provider, the WebSphere Application Server administrator must first define a user identity (User ID, Password, and Alias name) within the JAAS \u2013 J2C authentication data section of the WebSphere Application Server administrative console. For an example of the WebSphere Application Server Network Deployment 8.5.5, see the WebSphere Application Server documentation . Using the J2C Credentials Provider in a Service Description The provider ID for the J2C Credentials Provider to enter in a Service Description is: j2cAlias Credentials Provider Parameters Name Description Mandatory Default alias The Alias name of a user identity that contains the credentials that are required for the Service Description. Yes N/A Sample Service Description <serviceDescription> <id>watsonTranslateJ2C</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Watson Translator J2C</name> <description xml:lang=\"en\"> Translate text using the bluemix Watson Service </description> <credentials providerId=\"j2cAlias\"> <property name=\"alias\" value=\"someNode01/BlueMixTranslateService\"/> </credentials> <inbound> <parameters> <parameter> <id>text</id> <type>STRING</type> <name xml:lang=\"en\">Text</name> <description xml:lang=\"en\">Text to be translated</description> <mandatory>true</mandatory> </parameter> <parameter> <id>model_id</id> <type>STRING</type> <name xml:lang=\"en\">Model ID</name> <description xml:lang=\"en\">Translation to be performed (ex. 'en-fr' to translate from English to French)</description> <mandatory>true</mandatory> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>request-url</id> <value>https://gateway.watsonplatform.net/language-translation/api/v2/translate</value> </constant> <constant> <id>request-method</id> <value>GET</value> </constant> </constants> <mapping xmlns=\"\"> <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> <mapping target=\"transport:request-query-txt\" source=\"parameter:text\"/> <mapping target=\"transport:request-query-model_id\" source=\"parameter:model_id\"/> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <type>STRING</type> <name xml:lang=\"en\">Translated Text</name> <description xml:lang=\"en\">Text containing new translation.</description> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Java 2 Connector (J2C) Authentication Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#ref_service_j2c_credentials_provider","text":"This topic describes J2C Authentication Credentials Providers that are used within a Service Description.","title":"Java 2 Connector (J2C) Authentication Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#purpose-of-the-j2c-credentials-provider","text":"The J2C Authentication Credentials Provider provides a mechanism that allows user name and password credentials to be provided to a Service Transport without being hardcoded within the Service Description. The credentials are defined by the WebSphere\u00ae Application Server administrator and associated with an alias that is then used within the Service Description.","title":"Purpose of the J2C Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#when-to-use-the-j2c-credentials-provider","text":"Use the J2C Authentication Credentials Provider when a Service Description needs to define a static set of credentials, typically used to access a backend resource or service, and not specific to a particular user starting the service.","title":"When to use the J2C Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#how-to-configure-the-j2c-credentials-provider","text":"To use the J2C Authentication Credential Provider, the WebSphere Application Server administrator must first define a user identity (User ID, Password, and Alias name) within the JAAS \u2013 J2C authentication data section of the WebSphere Application Server administrative console. For an example of the WebSphere Application Server Network Deployment 8.5.5, see the WebSphere Application Server documentation .","title":"How to Configure the J2C Credentials Provider"},{"location":"ref_service_j2c_credentials_provider.html#using-the-j2c-credentials-provider-in-a-service-description","text":"The provider ID for the J2C Credentials Provider to enter in a Service Description is: j2cAlias","title":"Using the J2C Credentials Provider in a Service Description"},{"location":"ref_service_j2c_credentials_provider.html#credentials-provider-parameters","text":"Name Description Mandatory Default alias The Alias name of a user identity that contains the credentials that are required for the Service Description. Yes N/A","title":"Credentials Provider Parameters"},{"location":"ref_service_j2c_credentials_provider.html#sample-service-description","text":"<serviceDescription> <id>watsonTranslateJ2C</id> <defaultLocale>en</defaultLocale> <transportId>HTTPServiceTransport</transportId> <name xml:lang=\"en\">Watson Translator J2C</name> <description xml:lang=\"en\"> Translate text using the bluemix Watson Service </description> <credentials providerId=\"j2cAlias\"> <property name=\"alias\" value=\"someNode01/BlueMixTranslateService\"/> </credentials> <inbound> <parameters> <parameter> <id>text</id> <type>STRING</type> <name xml:lang=\"en\">Text</name> <description xml:lang=\"en\">Text to be translated</description> <mandatory>true</mandatory> </parameter> <parameter> <id>model_id</id> <type>STRING</type> <name xml:lang=\"en\">Model ID</name> <description xml:lang=\"en\">Translation to be performed (ex. 'en-fr' to translate from English to French)</description> <mandatory>true</mandatory> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>request-url</id> <value>https://gateway.watsonplatform.net/language-translation/api/v2/translate</value> </constant> <constant> <id>request-method</id> <value>GET</value> </constant> </constants> <mapping xmlns=\"\"> <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> <mapping target=\"transport:request-query-txt\" source=\"parameter:text\"/> <mapping target=\"transport:request-query-model_id\" source=\"parameter:model_id\"/> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>response-entity</id> <type>STRING</type> <name xml:lang=\"en\">Translated Text</name> <description xml:lang=\"en\">Text containing new translation.</description> </parameter> </parameters> </outbound> </serviceDescription> Parent topic: Services","title":"Sample Service Description"},{"location":"ref_service_localizing_service_description.html","text":"Localizing Service Descriptions The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Service Descriptions can be localized in two ways: using the xml:lang attribute, or providing translations in a separate .properties file. However, these approaches can be cumbersome if the Service Description is to be localized into many languages. An alternative is to use the key attribute on the name, and description elements. The value of the key attribute denotes the key in a Java\u2122 style .properties file that maps the key to the value to display for the name or description element. When the Service Description is loaded, Leap loads the associated .properties files, and uses their contents as the messages to display for the name and description elements. When a Service Description uses this approach, the .properties files and Service Description must be placed in the same deployment directory. Changes to the .properties files are not automatically reloaded if they are changed. In order to refresh with new strings, the Service Description XML file must be changed or its modification date changed. Naming the .properties files is important because the Leap looks for .properties files with specific names. The name of the .properties file that contains the default strings, if none are specified for a specific locale, is the same as the base name of the Service Description XML file, but with a .properties extension. For the locale-specific .properties files, the name is similar but includes an underscore followed by a locale specifier after the base name but before the .properties extension. For example, if the Service Description XML file is CurrencyConvService.xml, then the default .properties file is CurrencyConvService.properties and the French messages are in a file named CurrencyConvService_fr.properties. For details on locale specifier formats, refer to the documentation of java.util.Locale. Parent topic: Service Description","title":"Localizing Service Descriptions"},{"location":"ref_service_localizing_service_description.html#ref_service_localizing_service_description","text":"The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Service Descriptions can be localized in two ways: using the xml:lang attribute, or providing translations in a separate .properties file. However, these approaches can be cumbersome if the Service Description is to be localized into many languages. An alternative is to use the key attribute on the name, and description elements. The value of the key attribute denotes the key in a Java\u2122 style .properties file that maps the key to the value to display for the name or description element. When the Service Description is loaded, Leap loads the associated .properties files, and uses their contents as the messages to display for the name and description elements. When a Service Description uses this approach, the .properties files and Service Description must be placed in the same deployment directory. Changes to the .properties files are not automatically reloaded if they are changed. In order to refresh with new strings, the Service Description XML file must be changed or its modification date changed. Naming the .properties files is important because the Leap looks for .properties files with specific names. The name of the .properties file that contains the default strings, if none are specified for a specific locale, is the same as the base name of the Service Description XML file, but with a .properties extension. For the locale-specific .properties files, the name is similar but includes an underscore followed by a locale specifier after the base name but before the .properties extension. For example, if the Service Description XML file is CurrencyConvService.xml, then the default .properties file is CurrencyConvService.properties and the French messages are in a file named CurrencyConvService_fr.properties. For details on locale specifier formats, refer to the documentation of java.util.Locale. Parent topic: Service Description","title":"Localizing Service Descriptions"},{"location":"ref_service_mapping_service_description.html","text":"Mapping Data for a Service Description The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport Mapping Data Each serviceMapping consists of two elements: constants, and mapping. The constants element, defines constant values that can be mapped into the output structure. The mapping element and its child mapping elements allow mapping of the Service Description parameters to the Service Transport, or the Service Transport data to the Service Description parameters. All the named constants available during mapping must be declared within the optional constants element. If no constants are required during mapping, the constants element can be omitted. If the constants element is present, it can contain one or more constant elements. Each constant element contains two elements: id and value, which specify the ID of the constant and its value. The id of a constant must contain characters that are allowed in a URL path, which are [A-Z], [a-z], [0-9], hyphen (-), and underscore (_). The text of the value element is used as the value of the constant. Any XML or JSON markup that exists inside the value element is not present at run time. Literal XML values can be produced by either wrapping the contents of the element in a CDATA section, or escaping any angle brackets. Mapping Service Description parameters to Service Transport parameters, and vice versa, is defined using mapping elements. A root mapping element must be placed as a child of serviceDescription. This root mapping contains other mapping elements that describe how data is to be mapped. The source and target of a mapping are declared using attributes on the mapping element. These attributes are: source, sourceType, sourceRef, target, targetType, and targetRef. Each mapping element can also have child mapping elements that allow repeating structures and large XML or JSON documents to be produced. Mapping Structure The input and output of both Service Descriptions and Service Transports is a simple map of key value pairs. A value can be either a string, or a list of maps of key value pairs. Leap does not support a map as a value. A value of a key in one map cannot be another map, it must be either a string or a list of maps. The mapping elements within a Service Description instruct Leap on how to produce one such structure from another, potentially extracting values from strings treated as XML or JSON. Mapping Definition Each mapping element within a Service Description describes how Leap must map data from a source to a destination. Each mapping is made up of a source, and a target. The value of the source and target attributes is a colon separated value containing the scheme of the value and its name. Valid values for the scheme depend on the binding in which the mapping is located, and whether the scheme refers to the source or target of the mapping. For inbound mapping, the source scheme must be parameter or constant, and the target must be transport. For outbound mapping, the source scheme must be transport or constant, and the target must be parameter. A summary of the valid schemes and their contexts are listed in Table 1. The name component of a scheme identifies the key to use when looking up a value or where to place the result. Table 1. Summary of valid schemes and their contexts Scheme Inbound Inbound Outbound Outbound Type Source Target Source Target constant Yes No Yes No parameter Yes No No Yes transport No Yes Yes No Both the source and target have a type which instructs Leap how to work with the value. Both ends of a mapping can contain a reference, which allows a subset of the source to be placed at a specific location within the target. Valid values for type are string, xml, jsonand list, with string being the default. If the type is xml or json, the reference represents an XPath expression that determines which nodes are affected by the mapping. A source reference is used to extract a subset of the value identified by the source scheme. A target reference is used to construct the path where the value extracted from the source is placed. If there are no nodes that match a target reference, the node and its missing parent nodes are created. For this reason, only simple XPath predicates, those that use only the and operator, are permitted. In all other cases, the value of the reference is not used and is omitted. Each mapping element can also contain sub-mappings, which allow repeating structures to be iterated over and built. At run time, Leap server processes the mapping elements in top-down order. Nested mappings evaluate their source and target in the context of their parent source or target mapping. Run time Mapping At runtime, Leap server performs the following operations for each mapping element. Each mapping element is evaluated in the order in which it occurs within the root mapping element. Look up the source. Convert the source value if required (parse as XML or JSON). Resolve the source reference. Look up the target, if present. Convert the target value if required (parent as XML or JSON). Resolve the target reference. Map the source value to the target value. Evaluate child mapping elements. To look up the source, the Leap server first needs to determine the scheme. If the scheme is constant, the identified constant is looked up and returned. If there is no constant with the given name, an empty string is used. If the scheme is parameter or transport, then the current context is searched for the named item. For top-level mapping elements, this is the root of the parameter structure. For child mapping elements, this is the result of the lookup, conversion, and resolve operation on its parent. If the named value cannot be found in the current context, the parent context is checked until there are no more parent contexts. If the value does not exist in any context, an empty string is used. The value returned by the lookup operation is then converted into the type specified for the source or target. If the conversion produced an XML or JSON value, the reference is resolved, which returns a subset of the original value. The same lookup, conversion, and resolve operations are then performed on the target of the mapping. Once both the source and target are resolved, the mapping operation begins. Generally, the cardinality of the target matches the source. For example, if a list is the source, then the target must be a list. Similarly, if a single value is the source, then the target must be a single value. When the source is a single value, that value is assigned directly to the target value. When the source is a list, a new list is created to contain the results. For each item in the source list, the child mappings of the current mapping element are evaluated. The results of these mappings are added to the list being constructed. When all the source items are evaluated, the list is assigned to the target value. For more information on creating a Service Description that returns JSON, see the developerWorks\u00ae Leap wiki . Parent topic: Service Description","title":"Mapping Data for a Service Description"},{"location":"ref_service_mapping_service_description.html#mapping-data-for-a-service-description","text":"The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport","title":"Mapping Data for a Service Description"},{"location":"ref_service_mapping_service_description.html#mapping-data","text":"Each serviceMapping consists of two elements: constants, and mapping. The constants element, defines constant values that can be mapped into the output structure. The mapping element and its child mapping elements allow mapping of the Service Description parameters to the Service Transport, or the Service Transport data to the Service Description parameters. All the named constants available during mapping must be declared within the optional constants element. If no constants are required during mapping, the constants element can be omitted. If the constants element is present, it can contain one or more constant elements. Each constant element contains two elements: id and value, which specify the ID of the constant and its value. The id of a constant must contain characters that are allowed in a URL path, which are [A-Z], [a-z], [0-9], hyphen (-), and underscore (_). The text of the value element is used as the value of the constant. Any XML or JSON markup that exists inside the value element is not present at run time. Literal XML values can be produced by either wrapping the contents of the element in a CDATA section, or escaping any angle brackets. Mapping Service Description parameters to Service Transport parameters, and vice versa, is defined using mapping elements. A root mapping element must be placed as a child of serviceDescription. This root mapping contains other mapping elements that describe how data is to be mapped. The source and target of a mapping are declared using attributes on the mapping element. These attributes are: source, sourceType, sourceRef, target, targetType, and targetRef. Each mapping element can also have child mapping elements that allow repeating structures and large XML or JSON documents to be produced. Mapping Structure The input and output of both Service Descriptions and Service Transports is a simple map of key value pairs. A value can be either a string, or a list of maps of key value pairs. Leap does not support a map as a value. A value of a key in one map cannot be another map, it must be either a string or a list of maps. The mapping elements within a Service Description instruct Leap on how to produce one such structure from another, potentially extracting values from strings treated as XML or JSON. Mapping Definition Each mapping element within a Service Description describes how Leap must map data from a source to a destination. Each mapping is made up of a source, and a target. The value of the source and target attributes is a colon separated value containing the scheme of the value and its name. Valid values for the scheme depend on the binding in which the mapping is located, and whether the scheme refers to the source or target of the mapping. For inbound mapping, the source scheme must be parameter or constant, and the target must be transport. For outbound mapping, the source scheme must be transport or constant, and the target must be parameter. A summary of the valid schemes and their contexts are listed in Table 1. The name component of a scheme identifies the key to use when looking up a value or where to place the result. Table 1. Summary of valid schemes and their contexts Scheme Inbound Inbound Outbound Outbound Type Source Target Source Target constant Yes No Yes No parameter Yes No No Yes transport No Yes Yes No Both the source and target have a type which instructs Leap how to work with the value. Both ends of a mapping can contain a reference, which allows a subset of the source to be placed at a specific location within the target. Valid values for type are string, xml, jsonand list, with string being the default. If the type is xml or json, the reference represents an XPath expression that determines which nodes are affected by the mapping. A source reference is used to extract a subset of the value identified by the source scheme. A target reference is used to construct the path where the value extracted from the source is placed. If there are no nodes that match a target reference, the node and its missing parent nodes are created. For this reason, only simple XPath predicates, those that use only the and operator, are permitted. In all other cases, the value of the reference is not used and is omitted. Each mapping element can also contain sub-mappings, which allow repeating structures to be iterated over and built. At run time, Leap server processes the mapping elements in top-down order. Nested mappings evaluate their source and target in the context of their parent source or target mapping.","title":"Mapping Data"},{"location":"ref_service_mapping_service_description.html#run-time-mapping","text":"At runtime, Leap server performs the following operations for each mapping element. Each mapping element is evaluated in the order in which it occurs within the root mapping element. Look up the source. Convert the source value if required (parse as XML or JSON). Resolve the source reference. Look up the target, if present. Convert the target value if required (parent as XML or JSON). Resolve the target reference. Map the source value to the target value. Evaluate child mapping elements. To look up the source, the Leap server first needs to determine the scheme. If the scheme is constant, the identified constant is looked up and returned. If there is no constant with the given name, an empty string is used. If the scheme is parameter or transport, then the current context is searched for the named item. For top-level mapping elements, this is the root of the parameter structure. For child mapping elements, this is the result of the lookup, conversion, and resolve operation on its parent. If the named value cannot be found in the current context, the parent context is checked until there are no more parent contexts. If the value does not exist in any context, an empty string is used. The value returned by the lookup operation is then converted into the type specified for the source or target. If the conversion produced an XML or JSON value, the reference is resolved, which returns a subset of the original value. The same lookup, conversion, and resolve operations are then performed on the target of the mapping. Once both the source and target are resolved, the mapping operation begins. Generally, the cardinality of the target matches the source. For example, if a list is the source, then the target must be a list. Similarly, if a single value is the source, then the target must be a single value. When the source is a single value, that value is assigned directly to the target value. When the source is a list, a new list is created to contain the results. For each item in the source list, the child mappings of the current mapping element are evaluated. The results of these mappings are added to the list being constructed. When all the source items are evaluated, the list is assigned to the target value. For more information on creating a Service Description that returns JSON, see the developerWorks\u00ae Leap wiki . Parent topic: Service Description","title":"Run time Mapping"},{"location":"ref_service_service_description.html","text":"Service Description A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface. Elements of a Service Description A Service Description is represented as an XML document that follows an XML schema. This single XML document contains all the information for a single Service Description: name, description, input and output parameters, and input and output mapping. For a full listing of the XML schema, refer to Appendix A - Service Description schema . The top-level element in a Service Description is the serviceDescription element. This element, and all of its childs, must be in the XML namespace with a URI of http://www.ibm.com/xmlns/prod/forms/services/serviceDescription/1.0. ID Each Service Description must contain a unique id that identifies it to the Leap server. The id can contain any characters that are valid as a component of a URL path. These characters include: Alphabetical letters \u2013 [A-Z], and [a-z] Numerals \u2013 [0-9] Hyphens \u2013 [-] Underscore \u2013 [_] Because a Service Description ID is a surrogate for the Service Description itself, this ID does not must be descriptive. Any UUID is a valid choice for a Service Description ID because it guarantees uniqueness and contains only characters that are valid in a URL path component. Transport ID A Service Description must reference a Service Transport to perform its underlying operation. Each Service Transport has its own unique transportId that uniquely identifies it to the Leap server. The ID for a Service Transport must be made available by its developer. Name and Description To help users build Leap applications with services, each Service Description contains both a name, and a description. The name and description elements allow you to localize a Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents.See Localizing Service Descriptions for information about how to provide names and descriptions in multiple languages. Default Locale If the Service Description is not localized in the language of a particular user, the defaultLocale contains the locale in which the name and description must be presented. For example, if a user asks for the Service Description in French, but the Service Description has only English and Spanish strings, the English is returned if en is set as the defaultLocale. Credentials The credentials contains the configuration for a Credentials Provider. The ID of the credentials provider is specified in the providerId attribute. The credentials element can contain zero or more property elements to configure the properties of the specified Credentials Provider. Each property element must contain a name attribute whose value is the name of the property being configured, and a value attribute that contains the value of the property. Not all Credentials Providers are applicable to all Service Transports. Therefore, the documentation for each Service Transport must be consulted before you configure the credentials element. If the configured Service Transport does not understand the provider that is specified by providerId , the Service Description is not available. Bindings Every Service Description must specify its input and output structures. These structures outline the ID, name, description, and type of each parameter and any subparameters . In addition to the parameter structure, bindings might also contain a section that declares how data going into the Service Transport is mapped from the input structure and how data coming from the Service Transport is mapped to the output structure. There are two top-level elements for bindings: inbound, and outbound. Inbound defines the binding for data coming into the Service Description from the Builder Application. Outbound defines the data going to the Leap application from the Service Description. Only one of each of these elements can be present within a single Service Description, and each must be placed as a child of the serviceDescription element. Directly underneath inbound and outbound are two elements that define the main components of a binding: parameters and serviceMapping . The parameters element contains all the information that is related to the parameters. The contents of the serviceMapping element instructs Leap how to map data coming from the parameters into data for the transport and vice versa. Parameters The parameters element contains zero or more parameter elements. Each parameter element defines a single parameter coming into or being returned from the Service Description. Each parameter element must have an id , type , name , and description . The id element uniquely identifies the parameter within the binding. The type element specifies the type of data that is expected to be contained within the parameter. The following data types are supported: STRING, BOOLEAN, DECIMAL, FLOAT, DOUBLE, INTEGER, DATETIME, TIME, DATE, and LIST As with the name and description child elements of the serviceDescription element, these childs of parameter specify the name and description of the parameter that is used in Leap. These elements can also be localized using the xml:lang attribute. Optionally, the mandatory element can be included for inbound bindings to specify whether the parameter must be bound before starting the Service Description. Valid values for this element are true and false, with the latter being the default. Each parameter element can have a child element that is called parameters which is a container for child parameters. The contents of the parameters element is one or more parameter elements. If a parameter contains subparameters , its type is set to LIST. At run time, the parameter contains a list of structures with each of the subparameters . Service Mapping The serviceMapping element contains all the information that is needed for the Leap server to map data between the Service Description parameters, and the Service Transport. For more information, see Mapping Data for a Service Description . XML Namespaces XML namespace declarations must be defined on the serviceMapping element or higher. Sample Service Descriptions Each example in this section includes a list of the Service Descriptions and a discussion of how each Service Description operates. The Service Descriptions in this section rely solely on the Service Transports that are shipped with the Leap server. Where applicable, sample and setup instructions are included. Example 1: Simple Mapping The following Service Description uses the HTTP Service Transport to make a request to a web server and return the content type of the response. In this example, the URL to which the request is made comes as an inbound parameter from the Builder application. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type</name> 7: <description xml:lang=\"en-us\"> 8: Retrieves the content type of the response from an HTTP server for the configured URL. 9: </description> 10: <inbound> 11: <parameters> 12: <parameter> 13: <id>request-url</id> 14: <type>STRING</type> 15: <name xml:lang=\"en-us\">URL</name> 16: <description xml:lang=\"en-us\">URL to request.</description> 17: <mandatory>true</mandatory> 18: </parameter> 19: </parameters> 20: </inbound> 21: <outbound> 22: <parameters> 23: <parameter> 24: <id>response-header-content-type</id> 25: <type>STRING</type> 26: <name xml:lang=\"en-us\">Content Type</name> 27: <description xml:lang=\"en-us\">Content Type of the response.</description> 28: </parameter> 29: </parameters> 30: </outbound> 31: </serviceDescription> ``` All Service Descriptions begin with a serviceDescription element, and in this example, it is defined in line 2. The serviceDescription element contains all the information that is needed for the Leap server to work with the Service Description. The unique ID of this Service Description is get-content-type as defined in line 3. The unique ID is not exposed to a user, but it must be unique. Line 5 declares the ID of the Service Transport to use, which is HTTPServiceTransport , and this is the unique ID of the HTTP Service Transport. Lines 7 and 8 define the name and description of the Service Description, which are presented to the user when designing applications. Lines 10-20 define the inbound bindings, and lines 21-30 define the outbound bindings. As mentioned previously, the inbound bindings refer to the parameters that are flowing from the application to the Service Transport. The outbound bindings refer to the parameters that are flowing in the opposite direction. Lines 11-19 contain all the inbound parameters, of which there is only one. The parameter that is defined in lines 12-18 represents the URL to which a request is made. According to the HTTP Service Transport documentation, the parameter that contains the URL to which the request is made must be called request-url . Line 13 defines the id of the parameter so that it matches the expectations of the HTTP Service Transport. The name and description are defined in lines 15 and 16, and line 17 specifies that this parameter must be supplied in order for this Service Description to operate. Lines 21-30 define the outbound parameters for the Service Description. In this case, there is only one output parameter: the content type of the response. The HTTP Service Transport dynamically creates new parameters that are based on the information that is returned in the HTTP response. In particular, response headers are converted to lowercase and are prefixed with response-header- . Since this Service Description is interested in the Content-Type header, the outbound parameter response-header-content-type is created in lines 23-28 to contain this data. Example 2: Augmenting Parameters with Constants The following Service Description returns the same information as Example 1. However, in this case, we do not want the Leap application to supply the URL. Instead, the URL is declared using a constant, and mapped into the inbound parameters for the Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type-with-constant</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type with Constant</name> 7: <description xml:lang=\"en-us\"> 8: Retreives the content type of the response from an HTTP server. 9: </description> 10: <inbound> 11: <serviceMapping> 12: <constants> 13: <constant> 14: <id>url-to-request</id> 15: <value>http://www.ibm.com</value> 16: </constant> 17: </constants> 18: <mapping> 19: <mapping source=\"constant:url-to-request\" sourceType=\"string\" target=\"transport:request-url\" targetType=\"string\"/> 20: </mapping> 21: </serviceMapping> 22: </inbound> 23: <outbound> 24: <parameters> 25: <parameter> 26: <id>response-header-content-type</id> 27: <type>STRING</type> 28: <name xml:lang=\"en-us\">Content Type</name> 29: <description xml:lang=\"en-us\">Content Type of the response.</description> 30: </parameter> 31: </parameters> 32: </outbound> 33: </serviceDescription> ``` Like Example 1, the Service Description makes a request to an HTTP server and returns the content type of the response. However, this Service Description differs from the Example 1 because there are no input parameters to this service. The request-url HTTP Service Transport parameter is mapped into the transport via a constant. Lines 12-17 define the constants section. There is a single constant that is defined in lines 13-16. This constant has an id of url-to-request specified in line 14, and a value of http://www.ibm.com, specified in line 15. The id of the constant is used when creating the parameter structure that is passed to the Service Transport. This constant is referenced in line 19 within the mapping section. Lines 18-20 contain the mapping information. Since there is only one parameter to be sent, there is only one mapping, which is defined in line 19. This mapping specifies that the value of the Service Transport parameter named request-url is specified by the value of the constant named url-to-request . Example 3: Lists of Data The following Service Description demonstrates the use of nested parameters. This example is the same as the Service Description used for the Countries by Region service that is shipped with Leap. This example describes how to specify a region and return a list of the names of countries within that region. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>countries-by-region</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>4647b8cf-093f-11e0-89dd-001e4cf83606</transportId> 6: <name xml:lang=\"en-us\"> 7: Countries by Region using Service Description 8: </name> 9: <description xml:lang=\"en-us\"> 10: Given a region, return a list of country information in that region. 11: </description> 12: <inbound> 13: <parameters> 14: <parameter> 15: <id>region</id> 16: <type>STRING</type> 17: <name xml:lang=\"en-us\">Region</name> 18: <description xml:lang=\"en-us\"> 19: One of \"Africa\", \"America, North\", \"America, South\", \"Asia\", \"Europe\", or \"Oceania\" 20: </description> 21: <mandatory>true</mandatory> 22: </parameter> 23: </parameters> 24: </inbound> 25: <outbound> 26: <parameters> 27: <parameter> 28: <id>countries</id> 29: <type>LIST</type> 30: <name xml:lang=\"en-us\">Countries\"</name> 31: <description xml:lang=\"en-us\">List of country information</description> 32: <parameters> 33: <parameter> 34: <id>name</id> 35: <type>STRING</type> 36: <name xml:lang=\"en-us\">Name</name> 37: <description xml:lang=\"en-us\">Name of Country</description> 38: </parameter> 39: </parameters> 40: </parameter> 41: </parameters> 42: </outbound> 43: </serviceDescription> ``` As with the other Service Description examples, this Service Description has its own unique ID, defined in line 3, a name, which is defined in lines 6-8, and a description, which is defined in lines 9-11. This Service Description uses the sample Countries by Region Service Transport, which is shipped with the Leap , and is identified by its id in line 5. Because this Service Description has a single inbound parameter, the parameters element, in lines 13-23, of the inbound bindings in lines 12-24. parameters contains only a single parameter, which is defined in lines 14-22. The id of this parameter is region, which is what is expected by the Countries by Region Service Transport. Since there can be multiple countries within a region, the outbound bindings, which are defined in lines 25-42, must contain a list parameter to contain all the information for each country. The outbound structure for this Service Description consists of a parameter that is called countries that contains a list of maps. Each of the maps that are contained within the countries list consists of a single name key that contains the name of a country. This structure is defined within the parameters element, which is defined in lines 26-41, of the outbound bindings section. The top-level parameter, countries, is defined between lines 27 and 40. Since the countries parameter contains other parameters, its type is set as LIST in line 29. All the parameters of the list entries are defined within the parameters element inside the countries parameter that is defined in lines 32-39. The single name subparameter is defined in lines 33-38. Since the inbound and outbound bindings directly match what is returned by the Countries by Region Service Transport, there is no need for any mapping information. This service can be set up such that the name subparameter is mapped to list-like items such as drop-down options or an item in a table. Example 4: Mapping XML into Parameters The following Service Description extracts data from an XML document that is returned from an HTTP request using the HTTP Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>address-lookup</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Address Lookup</name> 7: <description xml:lang=\"en-us\">Returns information related to a postal code or address.</description> 8: <inbound> 9: <parameters> 10: <parameter> 11: <id>address</id> 12: <type>STRING</type> 13: <name xml:lang=\"en-us\">Address or Postal Code</name> 14: <description xml:lang=\"en-us\"></description> 15: <mandatory>true</mandatory> 16: </parameter> 17: </parameters> 18: <serviceMapping> 19: <constants> 20: <constant> 21: <id>request-url</id> 22: <value>http://maps.googleapis.com/maps/api/geocode/xml</value> 23: </constant> 24: <constant> 25: <id>false-constant</id> 26: <value>false</value> 27: </constant> 28: <constant> 29: <id>request-method</id> 30: <value>GET</value> 31: </constant> 32: </constants> 33: <mapping> 34: <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> 35: <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> 36: <mapping target=\"transport:request-query-address\" source=\"parameter:address\"/> 37: <mapping target=\"transport:request-query-sensor\" source=\"constant:false-constant\"/> 38: </mapping> 39: </serviceMapping> 40: </inbound> 41: <outbound> 42: <parameters> 43: <parameter> 44: <id>latitude</id> 45: <type>STRING</type> 46: <name xml:lang=\"en-us\">Latitude</name> 47: <description xml:lang=\"en-us\"></description> 48: </parameter> 49: <parameter> 50: <id>longitude</id> 51: <type>STRING</type> 52: <name xml:lang=\"en-us\">Longitude</name> 53: <description xml:lang=\"en-us\"></description> 54: </parameter> 55: <parameter> 56: <id>address-information</id> 57: <type>LIST</type> 58: <name xml:lang=\"en-us\">Address Information</name> 59: <description xml:lang=\"en-us\"></description> 60: <parameters> 61: <parameter> 62: <id>long-name</id> 63: <type>STRING</type> 64: <name xml:lang=\"en-us\">Long Name</name> 65: <description xml:lang=\"en-us\"></description> 66: </parameter> 67: <parameter> 68: <id>short-name</id> 69: <type>STRING</type> 70: <name xml:lang=\"en-us\">Short Name</name> 71: <description xml:lang=\"en-us\"></description> 72: </parameter> 73: <parameter> 74: <id>type-1</id> 75: <type>STRING</type> 76: <name xml:lang=\"en-us\">Type</name> 77: <description xml:lang=\"en-us\"></description> 78: </parameter> 79: <parameter> 80: <id>type-2</id> 81: <type>STRING</type> 82: <name xml:lang=\"en-us\">Type(2)</name> 83: <description xml:lang=\"en-us\"></description> 84: </parameter> 85: </parameters> 86: </parameter> 87: </parameters> 88: <serviceMapping> 89: <mapping> 90: <mapping source=\"transport:response-entity\" 91: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lat\" 92: sourceType=\"xml\" 93: target=\"parameter:latitude\"/> 94: <mapping source=\"transport:response-entity\" 95: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lng\" 96: sourceType=\"xml\" 97: target=\"parameter:longitude\"/> 98: <mapping source=\"transport:response-entity\" 99: sourceRef=\"GeocodeResponse/result[1]/address_component\" 100: sourceType=\"xml\" 101: target=\"parameter:address-information\"> 102: <mapping sourceRef=\"long_name\" target=\"parameter:long-name\"/> 103: <mapping sourceRef=\"short_name\" target=\"parameter:short-name\"/> 104: <mapping sourceRef=\"type[1]\" target=\"parameter:type-1\"/> 105: <mapping sourceRef=\"type[2]\" target=\"parameter:type-2\"/> 106: </mapping> 107: </mapping> 108: </serviceMapping> 109: </outbound> 110: </serviceDescription> ``` This Service Description performs a reverse address lookup using a free Google web service. As with the other Service Description examples, the standard prologue of id, transportId , name, and description is specified in lines 3-7. This service has a single parameter, address, that can be assigned by an application, as specified in lines 10-16. Since this parameter is required to perform the address look-up, it is marked as mandatory in line 15. Since this Service Description uses the HTTP Service Transport, a request-url must be specified. The URL used in this request takes the form http://maps.googleapis.com/maps/api/geocode/xml?address=[address]&sensor=[true|false]. Because there are query parameters that must be sent, this Service Description uses the HTTP Service Transport support for query parameters by prefixing the name of the parameter with request-query-. However, because some of these query parameters are not exposed to the user, you must create a mapping section to map some constant values. The inbound binding constant section, in lines 19-32, defines the three constants that are used: request-url , lines 20-23, false-constant, lines 24-27, and request-method , lines 28-31. These constants contain the URL to which to request is made, a constant string value false for the sensor query parameter, and the request method. While some of these constants, including request-url and request-method, match the name of the parameter to which they are applied, there is no requirement that they match. Parameter names that match do not automatically get a constant value if it has the same name. All mapping must be explicitly defined. In lines 33-38, the mapping section of the inbound binding maps the constants and Service Description parameters to the Service Transport parameters. Each of the mapping elements is fairly self-explanatory: the request-url constant is mapped to the request-url transport parameter; the request-method constant is mapped to the request-method transport parameter; the address parameter is mapped to the request-query-address transport parameter; and the constant false-constant is mapped to the sensor transport parameter. The HTTP Service Transport then builds a URL out of the request-url , request-query-address , and request-query-sensor parameters, and makes a request to that URL using the HTTP method given in the request-method parameter. The response body that is returned by this request is placed in the response-entity transport parameter, which is then taken apart by the mapping section of the outbound bindings. This service expects the response-entity to be similar to the following: ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <GeocodeResponse> 3: <status>OK</status> 4: <result> 5: <type>street_address</type> 6: <formatted_address>1 New Orchard Rd, Armonk, NY, USA</formatted_address> 7: <address_component> 8: <long_name>1</long_name> 9: <short_name>1</short_name> 10: <type>street_number</type> 11: </address_component> 12: <address_component> 13: <long_name>New Orchard Rd</long_name> 14: <short_name>New Orchard Rd</short_name> 15: <type>route</type> 16: </address_component> 17: <address_component> 18: <long_name>Armonk</long_name> 19: <short_name>Armonk</short_name> 20: <type>locality</type> 21: <type>political</type> 22: </address_component> 23: <address_component> 24: <long_name>Westchester</long_name> 25: <short_name>Westchester</short_name> 26: <type>administrative_area_level_2</type> 27: <type>political</type> 28: </address_component> 29: <address_component> 30: <long_name>New York</long_name> 31: <short_name>NY</short_name> 32: <type>administrative_area_level_1</type> 33: <type>political</type> 34: </address_component> 35: <address_component> 36: <long_name>United States</long_name> 37: <short_name>US</short_name> 38: <type>country</type> 39: <type>political</type> 40: </address_component> 41: <geometry> 42: <location> 43: <lat>41.1083018</lat> 44: <lng>-73.7204677</lng> 45: </location> 46: <location_type>ROOFTOP</location_type> 47: <viewport> 48: <southwest> 49: <lat>41.1051542</lat> 50: <lng>-73.7236153</lng> 51: </southwest> 52: <northeast> 53: <lat>41.1114494</lat> 54: <lng>-73.7173201</lng> 55: </northeast> 56: </viewport> 57: </geometry> 58: </result> 59: </GeocodeResponse> ``` There is much data in this response, but only some of it is needed for this Service Description. The latitude, longitude, and a list of the address information from the first result is required. To get only the required information, the Service Description outlines the parameters that it expects to return in the parameters section, in lines 42-87. The Service Description then uses the mapping section, in lines 88-108, to extract the required data from the response-entity transport parameter. Each of the parameters in the parameters section is self-explanatory. Latitude and longitude are top-level parameters because there is only one of each of them in a single result. However, there are several address_component elements, each of which are returned. Therefore, the address-information parameter is a list parameter that contains subparameters, one for each of the pieces of information in an address_component that the Service Description wants to make available. In lines 88-108, the service mapping section defines all the mapping that must be performed to extract the data from the XML response. Latitude, which is specified in lines 90-93, and longitude, which is specified in lines 94-97, each extract the data using a single XPath expression. The source type for each is set to XML. Mapping of a repeating structure is accomplished in a similar fashion. Lines 98-101 define the mapping for the address-information parameter. The XPath expression for address-information returns a nodeset as there are several nodes that match the expression GeocodeResponse/result/address_component. For each node that is returned, a new structure is created to contain the result of each of the submappings. Each of the submappings places its target into the newly created structure. Since the source of each of the submappings is one of the matched nodes, the mapping elements do not specify a source. It is assumed to be the inherited context. Similarly, the reference is evaluated within the context of the source, which is inherited. After each of the submappings is evaluated for a single source, the structure is added to a running list and the submappings are evaluated again for the next result in the source list. When all the sources are processed, the list that was collecting the results of the map is assigned to the address-information parameter. Appendix A - Service Description schema Localizing Service Descriptions The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Mapping Data for a Service Description The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport Deploying a Service Description This topic contains information about how to deploy an HCL Leap Service Description. Parent topic: Services","title":"Service Description"},{"location":"ref_service_service_description.html#service-description","text":"A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface.","title":"Service Description"},{"location":"ref_service_service_description.html#elements-of-a-service-description","text":"A Service Description is represented as an XML document that follows an XML schema. This single XML document contains all the information for a single Service Description: name, description, input and output parameters, and input and output mapping. For a full listing of the XML schema, refer to Appendix A - Service Description schema . The top-level element in a Service Description is the serviceDescription element. This element, and all of its childs, must be in the XML namespace with a URI of http://www.ibm.com/xmlns/prod/forms/services/serviceDescription/1.0. ID Each Service Description must contain a unique id that identifies it to the Leap server. The id can contain any characters that are valid as a component of a URL path. These characters include: Alphabetical letters \u2013 [A-Z], and [a-z] Numerals \u2013 [0-9] Hyphens \u2013 [-] Underscore \u2013 [_] Because a Service Description ID is a surrogate for the Service Description itself, this ID does not must be descriptive. Any UUID is a valid choice for a Service Description ID because it guarantees uniqueness and contains only characters that are valid in a URL path component. Transport ID A Service Description must reference a Service Transport to perform its underlying operation. Each Service Transport has its own unique transportId that uniquely identifies it to the Leap server. The ID for a Service Transport must be made available by its developer. Name and Description To help users build Leap applications with services, each Service Description contains both a name, and a description. The name and description elements allow you to localize a Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents.See Localizing Service Descriptions for information about how to provide names and descriptions in multiple languages. Default Locale If the Service Description is not localized in the language of a particular user, the defaultLocale contains the locale in which the name and description must be presented. For example, if a user asks for the Service Description in French, but the Service Description has only English and Spanish strings, the English is returned if en is set as the defaultLocale. Credentials The credentials contains the configuration for a Credentials Provider. The ID of the credentials provider is specified in the providerId attribute. The credentials element can contain zero or more property elements to configure the properties of the specified Credentials Provider. Each property element must contain a name attribute whose value is the name of the property being configured, and a value attribute that contains the value of the property. Not all Credentials Providers are applicable to all Service Transports. Therefore, the documentation for each Service Transport must be consulted before you configure the credentials element. If the configured Service Transport does not understand the provider that is specified by providerId , the Service Description is not available. Bindings Every Service Description must specify its input and output structures. These structures outline the ID, name, description, and type of each parameter and any subparameters . In addition to the parameter structure, bindings might also contain a section that declares how data going into the Service Transport is mapped from the input structure and how data coming from the Service Transport is mapped to the output structure. There are two top-level elements for bindings: inbound, and outbound. Inbound defines the binding for data coming into the Service Description from the Builder Application. Outbound defines the data going to the Leap application from the Service Description. Only one of each of these elements can be present within a single Service Description, and each must be placed as a child of the serviceDescription element. Directly underneath inbound and outbound are two elements that define the main components of a binding: parameters and serviceMapping . The parameters element contains all the information that is related to the parameters. The contents of the serviceMapping element instructs Leap how to map data coming from the parameters into data for the transport and vice versa. Parameters The parameters element contains zero or more parameter elements. Each parameter element defines a single parameter coming into or being returned from the Service Description. Each parameter element must have an id , type , name , and description . The id element uniquely identifies the parameter within the binding. The type element specifies the type of data that is expected to be contained within the parameter. The following data types are supported: STRING, BOOLEAN, DECIMAL, FLOAT, DOUBLE, INTEGER, DATETIME, TIME, DATE, and LIST As with the name and description child elements of the serviceDescription element, these childs of parameter specify the name and description of the parameter that is used in Leap. These elements can also be localized using the xml:lang attribute. Optionally, the mandatory element can be included for inbound bindings to specify whether the parameter must be bound before starting the Service Description. Valid values for this element are true and false, with the latter being the default. Each parameter element can have a child element that is called parameters which is a container for child parameters. The contents of the parameters element is one or more parameter elements. If a parameter contains subparameters , its type is set to LIST. At run time, the parameter contains a list of structures with each of the subparameters . Service Mapping The serviceMapping element contains all the information that is needed for the Leap server to map data between the Service Description parameters, and the Service Transport. For more information, see Mapping Data for a Service Description .","title":"Elements of a Service Description"},{"location":"ref_service_service_description.html#xml-namespaces","text":"XML namespace declarations must be defined on the serviceMapping element or higher.","title":"XML Namespaces"},{"location":"ref_service_service_description.html#sample-service-descriptions","text":"Each example in this section includes a list of the Service Descriptions and a discussion of how each Service Description operates. The Service Descriptions in this section rely solely on the Service Transports that are shipped with the Leap server. Where applicable, sample and setup instructions are included. Example 1: Simple Mapping The following Service Description uses the HTTP Service Transport to make a request to a web server and return the content type of the response. In this example, the URL to which the request is made comes as an inbound parameter from the Builder application. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type</name> 7: <description xml:lang=\"en-us\"> 8: Retrieves the content type of the response from an HTTP server for the configured URL. 9: </description> 10: <inbound> 11: <parameters> 12: <parameter> 13: <id>request-url</id> 14: <type>STRING</type> 15: <name xml:lang=\"en-us\">URL</name> 16: <description xml:lang=\"en-us\">URL to request.</description> 17: <mandatory>true</mandatory> 18: </parameter> 19: </parameters> 20: </inbound> 21: <outbound> 22: <parameters> 23: <parameter> 24: <id>response-header-content-type</id> 25: <type>STRING</type> 26: <name xml:lang=\"en-us\">Content Type</name> 27: <description xml:lang=\"en-us\">Content Type of the response.</description> 28: </parameter> 29: </parameters> 30: </outbound> 31: </serviceDescription> ``` All Service Descriptions begin with a serviceDescription element, and in this example, it is defined in line 2. The serviceDescription element contains all the information that is needed for the Leap server to work with the Service Description. The unique ID of this Service Description is get-content-type as defined in line 3. The unique ID is not exposed to a user, but it must be unique. Line 5 declares the ID of the Service Transport to use, which is HTTPServiceTransport , and this is the unique ID of the HTTP Service Transport. Lines 7 and 8 define the name and description of the Service Description, which are presented to the user when designing applications. Lines 10-20 define the inbound bindings, and lines 21-30 define the outbound bindings. As mentioned previously, the inbound bindings refer to the parameters that are flowing from the application to the Service Transport. The outbound bindings refer to the parameters that are flowing in the opposite direction. Lines 11-19 contain all the inbound parameters, of which there is only one. The parameter that is defined in lines 12-18 represents the URL to which a request is made. According to the HTTP Service Transport documentation, the parameter that contains the URL to which the request is made must be called request-url . Line 13 defines the id of the parameter so that it matches the expectations of the HTTP Service Transport. The name and description are defined in lines 15 and 16, and line 17 specifies that this parameter must be supplied in order for this Service Description to operate. Lines 21-30 define the outbound parameters for the Service Description. In this case, there is only one output parameter: the content type of the response. The HTTP Service Transport dynamically creates new parameters that are based on the information that is returned in the HTTP response. In particular, response headers are converted to lowercase and are prefixed with response-header- . Since this Service Description is interested in the Content-Type header, the outbound parameter response-header-content-type is created in lines 23-28 to contain this data. Example 2: Augmenting Parameters with Constants The following Service Description returns the same information as Example 1. However, in this case, we do not want the Leap application to supply the URL. Instead, the URL is declared using a constant, and mapped into the inbound parameters for the Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>get-content-type-with-constant</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Get Content Type with Constant</name> 7: <description xml:lang=\"en-us\"> 8: Retreives the content type of the response from an HTTP server. 9: </description> 10: <inbound> 11: <serviceMapping> 12: <constants> 13: <constant> 14: <id>url-to-request</id> 15: <value>http://www.ibm.com</value> 16: </constant> 17: </constants> 18: <mapping> 19: <mapping source=\"constant:url-to-request\" sourceType=\"string\" target=\"transport:request-url\" targetType=\"string\"/> 20: </mapping> 21: </serviceMapping> 22: </inbound> 23: <outbound> 24: <parameters> 25: <parameter> 26: <id>response-header-content-type</id> 27: <type>STRING</type> 28: <name xml:lang=\"en-us\">Content Type</name> 29: <description xml:lang=\"en-us\">Content Type of the response.</description> 30: </parameter> 31: </parameters> 32: </outbound> 33: </serviceDescription> ``` Like Example 1, the Service Description makes a request to an HTTP server and returns the content type of the response. However, this Service Description differs from the Example 1 because there are no input parameters to this service. The request-url HTTP Service Transport parameter is mapped into the transport via a constant. Lines 12-17 define the constants section. There is a single constant that is defined in lines 13-16. This constant has an id of url-to-request specified in line 14, and a value of http://www.ibm.com, specified in line 15. The id of the constant is used when creating the parameter structure that is passed to the Service Transport. This constant is referenced in line 19 within the mapping section. Lines 18-20 contain the mapping information. Since there is only one parameter to be sent, there is only one mapping, which is defined in line 19. This mapping specifies that the value of the Service Transport parameter named request-url is specified by the value of the constant named url-to-request . Example 3: Lists of Data The following Service Description demonstrates the use of nested parameters. This example is the same as the Service Description used for the Countries by Region service that is shipped with Leap. This example describes how to specify a region and return a list of the names of countries within that region. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>countries-by-region</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>4647b8cf-093f-11e0-89dd-001e4cf83606</transportId> 6: <name xml:lang=\"en-us\"> 7: Countries by Region using Service Description 8: </name> 9: <description xml:lang=\"en-us\"> 10: Given a region, return a list of country information in that region. 11: </description> 12: <inbound> 13: <parameters> 14: <parameter> 15: <id>region</id> 16: <type>STRING</type> 17: <name xml:lang=\"en-us\">Region</name> 18: <description xml:lang=\"en-us\"> 19: One of \"Africa\", \"America, North\", \"America, South\", \"Asia\", \"Europe\", or \"Oceania\" 20: </description> 21: <mandatory>true</mandatory> 22: </parameter> 23: </parameters> 24: </inbound> 25: <outbound> 26: <parameters> 27: <parameter> 28: <id>countries</id> 29: <type>LIST</type> 30: <name xml:lang=\"en-us\">Countries\"</name> 31: <description xml:lang=\"en-us\">List of country information</description> 32: <parameters> 33: <parameter> 34: <id>name</id> 35: <type>STRING</type> 36: <name xml:lang=\"en-us\">Name</name> 37: <description xml:lang=\"en-us\">Name of Country</description> 38: </parameter> 39: </parameters> 40: </parameter> 41: </parameters> 42: </outbound> 43: </serviceDescription> ``` As with the other Service Description examples, this Service Description has its own unique ID, defined in line 3, a name, which is defined in lines 6-8, and a description, which is defined in lines 9-11. This Service Description uses the sample Countries by Region Service Transport, which is shipped with the Leap , and is identified by its id in line 5. Because this Service Description has a single inbound parameter, the parameters element, in lines 13-23, of the inbound bindings in lines 12-24. parameters contains only a single parameter, which is defined in lines 14-22. The id of this parameter is region, which is what is expected by the Countries by Region Service Transport. Since there can be multiple countries within a region, the outbound bindings, which are defined in lines 25-42, must contain a list parameter to contain all the information for each country. The outbound structure for this Service Description consists of a parameter that is called countries that contains a list of maps. Each of the maps that are contained within the countries list consists of a single name key that contains the name of a country. This structure is defined within the parameters element, which is defined in lines 26-41, of the outbound bindings section. The top-level parameter, countries, is defined between lines 27 and 40. Since the countries parameter contains other parameters, its type is set as LIST in line 29. All the parameters of the list entries are defined within the parameters element inside the countries parameter that is defined in lines 32-39. The single name subparameter is defined in lines 33-38. Since the inbound and outbound bindings directly match what is returned by the Countries by Region Service Transport, there is no need for any mapping information. This service can be set up such that the name subparameter is mapped to list-like items such as drop-down options or an item in a table. Example 4: Mapping XML into Parameters The following Service Description extracts data from an XML document that is returned from an HTTP request using the HTTP Service Transport. ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <serviceDescription> 3: <id>address-lookup</id> 4: <defaultLocale>en-us</defaultLocale> 5: <transportId>HTTPServiceTransport</transportId> 6: <name xml:lang=\"en-us\">Address Lookup</name> 7: <description xml:lang=\"en-us\">Returns information related to a postal code or address.</description> 8: <inbound> 9: <parameters> 10: <parameter> 11: <id>address</id> 12: <type>STRING</type> 13: <name xml:lang=\"en-us\">Address or Postal Code</name> 14: <description xml:lang=\"en-us\"></description> 15: <mandatory>true</mandatory> 16: </parameter> 17: </parameters> 18: <serviceMapping> 19: <constants> 20: <constant> 21: <id>request-url</id> 22: <value>http://maps.googleapis.com/maps/api/geocode/xml</value> 23: </constant> 24: <constant> 25: <id>false-constant</id> 26: <value>false</value> 27: </constant> 28: <constant> 29: <id>request-method</id> 30: <value>GET</value> 31: </constant> 32: </constants> 33: <mapping> 34: <mapping target=\"transport:request-url\" source=\"constant:request-url\"/> 35: <mapping target=\"transport:request-method\" source=\"constant:request-method\"/> 36: <mapping target=\"transport:request-query-address\" source=\"parameter:address\"/> 37: <mapping target=\"transport:request-query-sensor\" source=\"constant:false-constant\"/> 38: </mapping> 39: </serviceMapping> 40: </inbound> 41: <outbound> 42: <parameters> 43: <parameter> 44: <id>latitude</id> 45: <type>STRING</type> 46: <name xml:lang=\"en-us\">Latitude</name> 47: <description xml:lang=\"en-us\"></description> 48: </parameter> 49: <parameter> 50: <id>longitude</id> 51: <type>STRING</type> 52: <name xml:lang=\"en-us\">Longitude</name> 53: <description xml:lang=\"en-us\"></description> 54: </parameter> 55: <parameter> 56: <id>address-information</id> 57: <type>LIST</type> 58: <name xml:lang=\"en-us\">Address Information</name> 59: <description xml:lang=\"en-us\"></description> 60: <parameters> 61: <parameter> 62: <id>long-name</id> 63: <type>STRING</type> 64: <name xml:lang=\"en-us\">Long Name</name> 65: <description xml:lang=\"en-us\"></description> 66: </parameter> 67: <parameter> 68: <id>short-name</id> 69: <type>STRING</type> 70: <name xml:lang=\"en-us\">Short Name</name> 71: <description xml:lang=\"en-us\"></description> 72: </parameter> 73: <parameter> 74: <id>type-1</id> 75: <type>STRING</type> 76: <name xml:lang=\"en-us\">Type</name> 77: <description xml:lang=\"en-us\"></description> 78: </parameter> 79: <parameter> 80: <id>type-2</id> 81: <type>STRING</type> 82: <name xml:lang=\"en-us\">Type(2)</name> 83: <description xml:lang=\"en-us\"></description> 84: </parameter> 85: </parameters> 86: </parameter> 87: </parameters> 88: <serviceMapping> 89: <mapping> 90: <mapping source=\"transport:response-entity\" 91: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lat\" 92: sourceType=\"xml\" 93: target=\"parameter:latitude\"/> 94: <mapping source=\"transport:response-entity\" 95: sourceRef=\"GeocodeResponse/result[1]/geometry/location/lng\" 96: sourceType=\"xml\" 97: target=\"parameter:longitude\"/> 98: <mapping source=\"transport:response-entity\" 99: sourceRef=\"GeocodeResponse/result[1]/address_component\" 100: sourceType=\"xml\" 101: target=\"parameter:address-information\"> 102: <mapping sourceRef=\"long_name\" target=\"parameter:long-name\"/> 103: <mapping sourceRef=\"short_name\" target=\"parameter:short-name\"/> 104: <mapping sourceRef=\"type[1]\" target=\"parameter:type-1\"/> 105: <mapping sourceRef=\"type[2]\" target=\"parameter:type-2\"/> 106: </mapping> 107: </mapping> 108: </serviceMapping> 109: </outbound> 110: </serviceDescription> ``` This Service Description performs a reverse address lookup using a free Google web service. As with the other Service Description examples, the standard prologue of id, transportId , name, and description is specified in lines 3-7. This service has a single parameter, address, that can be assigned by an application, as specified in lines 10-16. Since this parameter is required to perform the address look-up, it is marked as mandatory in line 15. Since this Service Description uses the HTTP Service Transport, a request-url must be specified. The URL used in this request takes the form http://maps.googleapis.com/maps/api/geocode/xml?address=[address]&sensor=[true|false]. Because there are query parameters that must be sent, this Service Description uses the HTTP Service Transport support for query parameters by prefixing the name of the parameter with request-query-. However, because some of these query parameters are not exposed to the user, you must create a mapping section to map some constant values. The inbound binding constant section, in lines 19-32, defines the three constants that are used: request-url , lines 20-23, false-constant, lines 24-27, and request-method , lines 28-31. These constants contain the URL to which to request is made, a constant string value false for the sensor query parameter, and the request method. While some of these constants, including request-url and request-method, match the name of the parameter to which they are applied, there is no requirement that they match. Parameter names that match do not automatically get a constant value if it has the same name. All mapping must be explicitly defined. In lines 33-38, the mapping section of the inbound binding maps the constants and Service Description parameters to the Service Transport parameters. Each of the mapping elements is fairly self-explanatory: the request-url constant is mapped to the request-url transport parameter; the request-method constant is mapped to the request-method transport parameter; the address parameter is mapped to the request-query-address transport parameter; and the constant false-constant is mapped to the sensor transport parameter. The HTTP Service Transport then builds a URL out of the request-url , request-query-address , and request-query-sensor parameters, and makes a request to that URL using the HTTP method given in the request-method parameter. The response body that is returned by this request is placed in the response-entity transport parameter, which is then taken apart by the mapping section of the outbound bindings. This service expects the response-entity to be similar to the following: ``` 1: <?xml version=\"1.0\" encoding=\"UTF-8\"?> 2: <GeocodeResponse> 3: <status>OK</status> 4: <result> 5: <type>street_address</type> 6: <formatted_address>1 New Orchard Rd, Armonk, NY, USA</formatted_address> 7: <address_component> 8: <long_name>1</long_name> 9: <short_name>1</short_name> 10: <type>street_number</type> 11: </address_component> 12: <address_component> 13: <long_name>New Orchard Rd</long_name> 14: <short_name>New Orchard Rd</short_name> 15: <type>route</type> 16: </address_component> 17: <address_component> 18: <long_name>Armonk</long_name> 19: <short_name>Armonk</short_name> 20: <type>locality</type> 21: <type>political</type> 22: </address_component> 23: <address_component> 24: <long_name>Westchester</long_name> 25: <short_name>Westchester</short_name> 26: <type>administrative_area_level_2</type> 27: <type>political</type> 28: </address_component> 29: <address_component> 30: <long_name>New York</long_name> 31: <short_name>NY</short_name> 32: <type>administrative_area_level_1</type> 33: <type>political</type> 34: </address_component> 35: <address_component> 36: <long_name>United States</long_name> 37: <short_name>US</short_name> 38: <type>country</type> 39: <type>political</type> 40: </address_component> 41: <geometry> 42: <location> 43: <lat>41.1083018</lat> 44: <lng>-73.7204677</lng> 45: </location> 46: <location_type>ROOFTOP</location_type> 47: <viewport> 48: <southwest> 49: <lat>41.1051542</lat> 50: <lng>-73.7236153</lng> 51: </southwest> 52: <northeast> 53: <lat>41.1114494</lat> 54: <lng>-73.7173201</lng> 55: </northeast> 56: </viewport> 57: </geometry> 58: </result> 59: </GeocodeResponse> ``` There is much data in this response, but only some of it is needed for this Service Description. The latitude, longitude, and a list of the address information from the first result is required. To get only the required information, the Service Description outlines the parameters that it expects to return in the parameters section, in lines 42-87. The Service Description then uses the mapping section, in lines 88-108, to extract the required data from the response-entity transport parameter. Each of the parameters in the parameters section is self-explanatory. Latitude and longitude are top-level parameters because there is only one of each of them in a single result. However, there are several address_component elements, each of which are returned. Therefore, the address-information parameter is a list parameter that contains subparameters, one for each of the pieces of information in an address_component that the Service Description wants to make available. In lines 88-108, the service mapping section defines all the mapping that must be performed to extract the data from the XML response. Latitude, which is specified in lines 90-93, and longitude, which is specified in lines 94-97, each extract the data using a single XPath expression. The source type for each is set to XML. Mapping of a repeating structure is accomplished in a similar fashion. Lines 98-101 define the mapping for the address-information parameter. The XPath expression for address-information returns a nodeset as there are several nodes that match the expression GeocodeResponse/result/address_component. For each node that is returned, a new structure is created to contain the result of each of the submappings. Each of the submappings places its target into the newly created structure. Since the source of each of the submappings is one of the matched nodes, the mapping elements do not specify a source. It is assumed to be the inherited context. Similarly, the reference is evaluated within the context of the source, which is inherited. After each of the submappings is evaluated for a single source, the structure is added to a running list and the submappings are evaluated again for the next result in the source list. When all the sources are processed, the list that was collecting the results of the map is assigned to the address-information parameter.","title":"Sample Service Descriptions"},{"location":"ref_service_service_description.html#ServDescAppendixA","text":"Localizing Service Descriptions The name and description elements allow you to localize an HCL Leap Service Description in multiple languages using duplicate elements, each with a different xml:lang attribute and contents. Mapping Data for a Service Description The serviceMapping element of the Service Description contains all the information needed for the HCL Leap server to map data from the Service Description inbound data to the Service Transport Deploying a Service Description This topic contains information about how to deploy an HCL Leap Service Description. Parent topic: Services","title":"Appendix A - Service Description schema"},{"location":"ref_service_wsdl_ovr.html","text":"Using the service description tool for WSDL web service This tool is used to build a service description to expose services for WSDL based web service. Overview This tool is built specifically for users who have a WSDL that defines the web service. The user can supply the WSDL file and the tool generates the service descriptions for each operation defined in the WSDL. The tool generates a service description for each operation for each binding for each service port. It is a command line tool. Requirements You must have a valid WSDL file to use this tool. You can point to the file on the web with a URL or on a local machine with a file path. The binding style for your WSDL must be RPC/Encoded or Document/Literal and must be declared in the file. The tool reads the binding style with the following attributes on its XPath values: wsdl:binding/soap:binding/@style=[document|rpc] wsdl:binding/wsdl:operation/wsdl:input/@use= [literal|encoded]. You can use a WSDL file that declares the schema within the file, or you can use an external schema that is included or imported using a file path or URL. The tool scans for a schema file mySchema.xsd base on the relative path you specify. WSDL service description tool parameters Build a command to expose services for a WSDL based web device. Troubleshooting the WSDL service description generator - FAQ Use the following information to help you troubleshoot your WSDL service description generator. Parent topic: Services","title":"Using the service description tool for WSDL web service"},{"location":"ref_service_wsdl_ovr.html#usingtheservicedescriptionfromwsdltool","text":"This tool is used to build a service description to expose services for WSDL based web service.","title":"Using the service description tool for WSDL web service"},{"location":"ref_service_wsdl_ovr.html#overview","text":"This tool is built specifically for users who have a WSDL that defines the web service. The user can supply the WSDL file and the tool generates the service descriptions for each operation defined in the WSDL. The tool generates a service description for each operation for each binding for each service port. It is a command line tool.","title":"Overview"},{"location":"ref_service_wsdl_ovr.html#requirements","text":"You must have a valid WSDL file to use this tool. You can point to the file on the web with a URL or on a local machine with a file path. The binding style for your WSDL must be RPC/Encoded or Document/Literal and must be declared in the file. The tool reads the binding style with the following attributes on its XPath values: wsdl:binding/soap:binding/@style=[document|rpc] wsdl:binding/wsdl:operation/wsdl:input/@use= [literal|encoded]. You can use a WSDL file that declares the schema within the file, or you can use an external schema that is included or imported using a file path or URL. The tool scans for a schema file mySchema.xsd base on the relative path you specify. WSDL service description tool parameters Build a command to expose services for a WSDL based web device. Troubleshooting the WSDL service description generator - FAQ Use the following information to help you troubleshoot your WSDL service description generator. Parent topic: Services","title":"Requirements"},{"location":"ref_service_wsdl_param.html","text":"WSDL service description tool parameters Build a command to expose services for a WSDL based web device. Running the WSDL service description tool At the command line prompt, type the following command to activate the tool: java -jar serviceDescriptionGenerator.jar -wsdlFile=webService.wsdl In this command, serviceDescriptionGenerator.jar : is the name of the executable .jar file. -wsdlFile : the command you use if the WSDL file is local. webService.wsdl is the file name of the WSDL file. Use the following options to customize the commands for your file: Table 1. WSDL command optionsSummary of the support commands Command Description Note -wsdlFile Specifies the file location of the WSDL file You must use either this option or the -wsdlUri option in the command you enter -wsdlUri Specifies the URI of the WSDL file You must use either this option or the -wsdlFile option in the command you enter. -saveTo You can specify a location where the generated service descriptions will be created with this command. The default is the current working directory. Optional -defaultLocale You can specify the locale used to generate the service description. Optional The default is English. -transformNames You can convert the service description parameter names to a more readable format. It supports camelCase, underscores and dashes. Optional The default is false. The possible values are true or false. -credentialProvider Adds a credential provider to all generated service description. The values are basic and cookie. -realm Use when the credential provider is set to basic. Optional -cookies Use when the credential provider is set to cookie. Optional -log Set the logging level of messages displayed to the user. The default is WARNING. The possible values are ALL, CONFIG, FINE, FINER, FINEST, INFO, OFF, SEVERE, and WARNING. -help Displays a quick reference of the commands for the tool. Optional Schema Data Type Interpretation In cases where an element or attribute type is a union of two or more schema data types, the parameter type will be set to string. The schema data type xsd:anyType is valid schema data type. However, there is no equivalent parameter type for it. Therefore, the tool is unable to create the equivalent parameter for any elements and attributes with this type. A parameter type depends on its schema data type. The following table lists the equivalent schema data types for a given parameter type. Table 2. Schema data types and its equivalent service parameter data type Service Description Parameter Type Schema Data Type String string> gYearMonth gMonthDay gYear gDay gMonth hexBinary base64Binary anyURI QName NOTATION normalizedString token language Name NMTOKEN NCName NMTOKENS ID IDREF ENTITY Integer integer nonPositiveInteger long nonNegativeInteger negativeInteger int short byte unsignedLong postiveInteger unsignedInt unsignedShort unsignedByte Boolean Boolean Decimal Decimal Float |Float Double Double Duration Duration DateTime DateTime Time Time Date Date The parameter description contains any restrictions of an element or attribute. The description contains the schema data type, all restrictions and all values of each restriction. Parent topic: Using the service description tool for WSDL web service","title":"WSDL service description tool parameters"},{"location":"ref_service_wsdl_param.html#wsdl-service-description-tool-parameters","text":"Build a command to expose services for a WSDL based web device.","title":"WSDL service description tool parameters"},{"location":"ref_service_wsdl_param.html#running-the-wsdl-service-description-tool","text":"At the command line prompt, type the following command to activate the tool: java -jar serviceDescriptionGenerator.jar -wsdlFile=webService.wsdl In this command, serviceDescriptionGenerator.jar : is the name of the executable .jar file. -wsdlFile : the command you use if the WSDL file is local. webService.wsdl is the file name of the WSDL file. Use the following options to customize the commands for your file: Table 1. WSDL command optionsSummary of the support commands Command Description Note -wsdlFile Specifies the file location of the WSDL file You must use either this option or the -wsdlUri option in the command you enter -wsdlUri Specifies the URI of the WSDL file You must use either this option or the -wsdlFile option in the command you enter. -saveTo You can specify a location where the generated service descriptions will be created with this command. The default is the current working directory. Optional -defaultLocale You can specify the locale used to generate the service description. Optional The default is English. -transformNames You can convert the service description parameter names to a more readable format. It supports camelCase, underscores and dashes. Optional The default is false. The possible values are true or false. -credentialProvider Adds a credential provider to all generated service description. The values are basic and cookie. -realm Use when the credential provider is set to basic. Optional -cookies Use when the credential provider is set to cookie. Optional -log Set the logging level of messages displayed to the user. The default is WARNING. The possible values are ALL, CONFIG, FINE, FINER, FINEST, INFO, OFF, SEVERE, and WARNING. -help Displays a quick reference of the commands for the tool. Optional","title":"Running the WSDL service description tool"},{"location":"ref_service_wsdl_param.html#schema-data-type-interpretation","text":"In cases where an element or attribute type is a union of two or more schema data types, the parameter type will be set to string. The schema data type xsd:anyType is valid schema data type. However, there is no equivalent parameter type for it. Therefore, the tool is unable to create the equivalent parameter for any elements and attributes with this type. A parameter type depends on its schema data type. The following table lists the equivalent schema data types for a given parameter type. Table 2. Schema data types and its equivalent service parameter data type Service Description Parameter Type Schema Data Type String string> gYearMonth gMonthDay gYear gDay gMonth hexBinary base64Binary anyURI QName NOTATION normalizedString token language Name NMTOKEN NCName NMTOKENS ID IDREF ENTITY Integer integer nonPositiveInteger long nonNegativeInteger negativeInteger int short byte unsignedLong postiveInteger unsignedInt unsignedShort unsignedByte Boolean Boolean Decimal Decimal Float |Float Double Double Duration Duration DateTime DateTime Time Time Date Date The parameter description contains any restrictions of an element or attribute. The description contains the schema data type, all restrictions and all values of each restriction. Parent topic: Using the service description tool for WSDL web service","title":"Schema Data Type Interpretation"},{"location":"ref_services_toc.html","text":"Services The following topics provide reference information about adding services to HCL Leap. Basic Credentials Provider This topic describes Basic Credentials Providers used within a Service Description. Cookie Credentials Provider This topic describes Cookie Credentials Provider used within a Service Description. Java 2 Connector (J2C) Authentication Credentials Provider This topic describes J2C Authentication Credentials Providers that are used within a Service Description. Service Description A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface. Using the service description tool for WSDL web service This tool is used to build a service description to expose services for WSDL based web service. HTTP Service Transport This topic provides reference information on HTTP Service Transports used in HCL Leap. Send Email service This topic provides reference information on the Send Email service in HCL Leap. Parent topic: Reference","title":"Services"},{"location":"ref_services_toc.html#servicesoverview","text":"The following topics provide reference information about adding services to HCL Leap. Basic Credentials Provider This topic describes Basic Credentials Providers used within a Service Description. Cookie Credentials Provider This topic describes Cookie Credentials Provider used within a Service Description. Java 2 Connector (J2C) Authentication Credentials Provider This topic describes J2C Authentication Credentials Providers that are used within a Service Description. Service Description A Service Description provides a specific interface to a Service Transport. The Service Description describes the inputs and outputs when you configure services within the HCL Leap mapping user interface. Using the service description tool for WSDL web service This tool is used to build a service description to expose services for WSDL based web service. HTTP Service Transport This topic provides reference information on HTTP Service Transports used in HCL Leap. Send Email service This topic provides reference information on the Send Email service in HCL Leap. Parent topic: Reference","title":"Services"},{"location":"reference_toc.html","text":"Reference The documents in this section provide reference material and samples for HCL Leap. REST API reference The REST API can be used by other programs to communicate with Leap. JavaScript API Services The following topics provide reference information about adding services to HCL Leap. Embedding items in an iframe You can use iFrames to embed charts and applications in a web page. Embedding API The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page. Creating customized Cascading Style Sheets You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Custom Widget API This API provides a mechanism to incorporate custom widgets into the HCL Leap product.","title":"References"},{"location":"reference_toc.html#reference","text":"The documents in this section provide reference material and samples for HCL Leap. REST API reference The REST API can be used by other programs to communicate with Leap. JavaScript API Services The following topics provide reference information about adding services to HCL Leap. Embedding items in an iframe You can use iFrames to embed charts and applications in a web page. Embedding API The Embedding API can be used to embed a Leap form directly in another webpage without using an <iframe>. The Leap form will be inserted into the DOM of the hosting page and can be interacted with using the Leap JavaScript API or any custom JavaScript. Additionally, the style of items in the Leap form can be customized by the CSS of the hosting page. Creating customized Cascading Style Sheets You can apply your own custom Cascading Style Sheet (CSS) to the rendering of your HCL Leap application. To create a custom theme, you must be familiar with the basic concepts of CSS. Custom Widget API This API provides a mechanism to incorporate custom widgets into the HCL Leap product.","title":"Reference"},{"location":"ru_creating_rules_in_your_form.html","text":"Creating rules in your application Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. With the Rules feature, you can create a dynamic user experience that ensures accurate data capture, and enforcement of business rules. Rules allow you to guide the user through the form by hiding questions, or pages, that are not relevant. Rules also allow you to enforce your business validation rules within the form to ensure that data is valid before the form is submitted. The following steps describe how to set rules that require users to enter more information depending on how the first question is answered. Rules can be set for the following conditions: Show or Hide You can set data entry items, buttons, and containers to be hidden, or visible. Enable or Disable You can set buttons and data entry items as enabled or disabled. Valid or Not Valid In a data entry item, such as a Single Line Entry field, you can set conditions on what type of information is acceptable. For example, in a timesheet application, you can set a rule that the check-out time cannot occur before a check in time. Required or Not required You can choose whether you want data entry items to be mandatory, or optional. Additional general information on Rules You can add multiple Boolean operators, such as AND, and OR, for each rule. However, you cannot mix the two conditions in a rule. You can name and rename rules. It is useful to give each rule a unique and descriptive name. If you have several rules with similar operations, a descriptive name lets you quickly find the specific rule without having to open each one to view the details. You can search rules based on form item. To set a new rule, use the Edit rules icon in each form item. You can also create rules for pages and buttons. You can use the icon to open a rule and edit it. After a rule is set, a checkmark appears on the Rule icon for the form item, as well as any form item involved in the rule. This makes it easy to see which form items are used in rules. HCL Leap warns you if you attempt to delete a form item that is used in a rule. If you agree, you delete the rule. If you duplicate a field, the rule is duplicated with it. Note: When you set rules for Number or Currency form items, you must set the default value of the form item to zero in the Properties side panel. In the Properties side panel, set the minimum value to zero. If the Number or Currency form item is blank, it does not default to zero, and any rule you set does not work properly. Setting rules on form items You can set rules that govern how form items appear in a form. Setting rules on pages in an application You can set rules that govern how pages are shown or hidden in a form. Setting rules on Stages You can direct the workflow of an application by setting rules on buttons within Stages. Parent topic: Creating and managing applications","title":"Creating rules in your application"},{"location":"ru_creating_rules_in_your_form.html#creating-rules-in-your-application","text":"Rules help you gather the correct information from users and organize your information after data is entered in a form. You can create composite rules that govern how your form, and the data in your form behaves. With the Rules feature, you can create a dynamic user experience that ensures accurate data capture, and enforcement of business rules. Rules allow you to guide the user through the form by hiding questions, or pages, that are not relevant. Rules also allow you to enforce your business validation rules within the form to ensure that data is valid before the form is submitted. The following steps describe how to set rules that require users to enter more information depending on how the first question is answered. Rules can be set for the following conditions:","title":"Creating rules in your application"},{"location":"ru_creating_rules_in_your_form.html#show-or-hide","text":"You can set data entry items, buttons, and containers to be hidden, or visible.","title":"Show or Hide"},{"location":"ru_creating_rules_in_your_form.html#enable-or-disable","text":"You can set buttons and data entry items as enabled or disabled.","title":"Enable or Disable"},{"location":"ru_creating_rules_in_your_form.html#valid-or-not-valid","text":"In a data entry item, such as a Single Line Entry field, you can set conditions on what type of information is acceptable. For example, in a timesheet application, you can set a rule that the check-out time cannot occur before a check in time.","title":"Valid or Not Valid"},{"location":"ru_creating_rules_in_your_form.html#required-or-not-required","text":"You can choose whether you want data entry items to be mandatory, or optional.","title":"Required or Not required"},{"location":"ru_creating_rules_in_your_form.html#additional-general-information-on-rules","text":"You can add multiple Boolean operators, such as AND, and OR, for each rule. However, you cannot mix the two conditions in a rule. You can name and rename rules. It is useful to give each rule a unique and descriptive name. If you have several rules with similar operations, a descriptive name lets you quickly find the specific rule without having to open each one to view the details. You can search rules based on form item. To set a new rule, use the Edit rules icon in each form item. You can also create rules for pages and buttons. You can use the icon to open a rule and edit it. After a rule is set, a checkmark appears on the Rule icon for the form item, as well as any form item involved in the rule. This makes it easy to see which form items are used in rules. HCL Leap warns you if you attempt to delete a form item that is used in a rule. If you agree, you delete the rule. If you duplicate a field, the rule is duplicated with it. Note: When you set rules for Number or Currency form items, you must set the default value of the form item to zero in the Properties side panel. In the Properties side panel, set the minimum value to zero. If the Number or Currency form item is blank, it does not default to zero, and any rule you set does not work properly. Setting rules on form items You can set rules that govern how form items appear in a form. Setting rules on pages in an application You can set rules that govern how pages are shown or hidden in a form. Setting rules on Stages You can direct the workflow of an application by setting rules on buttons within Stages. Parent topic: Creating and managing applications","title":"Additional general information on Rules"},{"location":"ru_set_rule_on_form_items.html","text":"Setting rules on form items You can set rules that govern how form items appear in a form. The following steps describe how to add form items to your application and to create a sample rule on a form item. The rule will show a field if a user selects a specific input. For example, if the employee is full-time, fields appear requesting additional information. If the employee is not full-time, the fields remain hidden. Add a Select One item to your form. Click the item\u2019s title to change it to \u201cAre you a full-time worker?\u201d. Click the check box beside Required to indicate that the user must fill in this form item to submit the form. In the properties side panel, under Options : Change the Displayed Value of the first row to Yes . Click the Add option button to insert a second option row. Change the Displayed Value of the second row to No . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhere is your work site located?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . If you intend to have several rules on a form, you should give each rule a unique name so it is easy to find. For this example, leave the name as Rule 1 In the Perform this action: section, the name of the form item is automatically inserted as the item on which you want to set the rule. Select Show from the action menu. In the When the following condition is true: section, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhat is your job title?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . Note that this rule is named Rule 2. In the Perform this action: section, the name of the form item is automatically inserted. Select Show from the action menu. In the When the following condition is true: menu, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close The rule is set so that if the user states they are a full-time worker, the additional fields appear and request information on the work location and job title. Parent topic: Creating rules in your application","title":"Setting rules on form items"},{"location":"ru_set_rule_on_form_items.html#makingawidgetconditionalinanapplication","text":"You can set rules that govern how form items appear in a form. The following steps describe how to add form items to your application and to create a sample rule on a form item. The rule will show a field if a user selects a specific input. For example, if the employee is full-time, fields appear requesting additional information. If the employee is not full-time, the fields remain hidden. Add a Select One item to your form. Click the item\u2019s title to change it to \u201cAre you a full-time worker?\u201d. Click the check box beside Required to indicate that the user must fill in this form item to submit the form. In the properties side panel, under Options : Change the Displayed Value of the first row to Yes . Click the Add option button to insert a second option row. Change the Displayed Value of the second row to No . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhere is your work site located?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . If you intend to have several rules on a form, you should give each rule a unique name so it is easy to find. For this example, leave the name as Rule 1 In the Perform this action: section, the name of the form item is automatically inserted as the item on which you want to set the rule. Select Show from the action menu. In the When the following condition is true: section, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close . Add a Single Line entry to the form. Click the box to the left of the title. A red asterisk appears to indicate the item is mandatory and must be completed for the user to submit the form. Change the title to \u201cWhat is your job title?\u201d Click the Edit Rules icon for \u201cWhere is your work site located?\u201d The Rules window opens. Click Add Rule . Note that this rule is named Rule 2. In the Perform this action: section, the name of the form item is automatically inserted. Select Show from the action menu. In the When the following condition is true: menu, select Are you a full time employee? from the first menu, and then Equals in the second menu. To the right of A fixed value , select the Yes radio button. Click Apply and Close The rule is set so that if the user states they are a full-time worker, the additional fields appear and request information on the work location and job title. Parent topic: Creating rules in your application","title":"Setting rules on form items"},{"location":"ru_setting_rules_on_pages_in_an_application.html","text":"Setting rules on pages in an application You can set rules that govern how pages are shown or hidden in a form. Before using the following steps, create an application with two pages. Rules in the HCL Leap can help you administer a form so different groups of users are asked for different information. You can add multiple Boolean conditions, such as AND, or OR, for each rule. The following example hides form pages from users whose salary does not meet the rule qualification of $30,000. To use the following steps, you must have multiple pages in your form. On Page 1 of your form, add a Currency item to your form and title it Salary . Click the Rules button on Page 2 of your form. Click Add Rule . In Perform this action: make no changes. The default value is \u201chide\u201d. In When the following condition is true , select Show items on all pages , and select Salary . Select Less than from the menu. Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user enters less than $30,000, they are not shown the second page of the form. Parent topic: Creating rules in your application","title":"Setting rules on pages in an application"},{"location":"ru_setting_rules_on_pages_in_an_application.html#settingrulesonpagesinanapplication","text":"You can set rules that govern how pages are shown or hidden in a form. Before using the following steps, create an application with two pages. Rules in the HCL Leap can help you administer a form so different groups of users are asked for different information. You can add multiple Boolean conditions, such as AND, or OR, for each rule. The following example hides form pages from users whose salary does not meet the rule qualification of $30,000. To use the following steps, you must have multiple pages in your form. On Page 1 of your form, add a Currency item to your form and title it Salary . Click the Rules button on Page 2 of your form. Click Add Rule . In Perform this action: make no changes. The default value is \u201chide\u201d. In When the following condition is true , select Show items on all pages , and select Salary . Select Less than from the menu. Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user enters less than $30,000, they are not shown the second page of the form. Parent topic: Creating rules in your application","title":"Setting rules on pages in an application"},{"location":"ru_setting_rules_on_stage_actions.html","text":"Setting rules on Stages You can direct the workflow of an application by setting rules on buttons within Stages. In a stage, you can build two approval buttons that appear identical, but send the user to a different page or stage. Which button appears to the user is determined by information the user enters, and the rules set on the form. To use the following instructions you must have stages created for your form. The instructions describe how to use rules and stages to create a button that provides multiple functionality for form designers away from the visual display to a user. The Submit button requests different information from users based on whether they make more or less than $30,000. Click the Workflow tab. Click the Visibility button at the top of the screen, select the desired stage (i.e. Start), and click anywhere in the section at the bottom of the page where the submit buttons are shown. Click the Edit Rules icon for the desired submit button. Open the Rules window for the Submit button of the Start stage. Click Add Rule . In the Perform this action section, leave the defaults of Start - Submit in the first menu, and Hide in the second menu. In When the following condition is true, select Show items on all pages , then select Salary . Set the operation to Less than . Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so users will not see the Submit button if they makes less that $30,000. Click the Add Action icon to add another Submit button. A duplicate Submit button appears. Follow steps 2 through 9, but set the operation to Greater than or equals . The form developer sees two different buttons that perform two different actions. When you preview the form, only one Submit button appears. You can now create stages and form pages specific to the user\u2019s salary. Parent topic: Creating rules in your application","title":"Setting rules on Stages"},{"location":"ru_setting_rules_on_stage_actions.html#settingrulesonstageactions","text":"You can direct the workflow of an application by setting rules on buttons within Stages. In a stage, you can build two approval buttons that appear identical, but send the user to a different page or stage. Which button appears to the user is determined by information the user enters, and the rules set on the form. To use the following instructions you must have stages created for your form. The instructions describe how to use rules and stages to create a button that provides multiple functionality for form designers away from the visual display to a user. The Submit button requests different information from users based on whether they make more or less than $30,000. Click the Workflow tab. Click the Visibility button at the top of the screen, select the desired stage (i.e. Start), and click anywhere in the section at the bottom of the page where the submit buttons are shown. Click the Edit Rules icon for the desired submit button. Open the Rules window for the Submit button of the Start stage. Click Add Rule . In the Perform this action section, leave the defaults of Start - Submit in the first menu, and Hide in the second menu. In When the following condition is true, select Show items on all pages , then select Salary . Set the operation to Less than . Leave A fixed value in the next menu and type 30000 in the blank field. Click Apply and Close to save your changes and close the Rules window. The rule is now set so users will not see the Submit button if they makes less that $30,000. Click the Add Action icon to add another Submit button. A duplicate Submit button appears. Follow steps 2 through 9, but set the operation to Greater than or equals . The form developer sees two different buttons that perform two different actions. When you preview the form, only one Submit button appears. You can now create stages and form pages specific to the user\u2019s salary. Parent topic: Creating rules in your application","title":"Setting rules on Stages"},{"location":"rules_widgets.html","text":"Rules App authors will be able to incorporate custom widgets in rules. Display Widgets Actions: Show Hide Data Widgets Actions: Show Hide Enable Disable Valid Not Valid Required Not Required Condition Operators: Based on widget's datatype. Parent topic: Custom Widget API","title":"Rules"},{"location":"rules_widgets.html#rules_widgets","text":"App authors will be able to incorporate custom widgets in rules.","title":"Rules"},{"location":"rules_widgets.html#section_yp4_scn_jyb","text":"Actions: Show Hide","title":"Display Widgets"},{"location":"rules_widgets.html#section_pwd_w2n_jyb","text":"Actions: Show Hide Enable Disable Valid Not Valid Required Not Required Condition Operators: Based on widget's datatype. Parent topic: Custom Widget API","title":"Data Widgets"},{"location":"sad_allowing_users_to_save.html","text":"Saving work as a draft Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. In any stage, you can enable authenticated users to save their work as a draft. When a user returns to a saved draft in a form, a message asks whether to start a new form, or continue working on the draft. You can add an option for users to email themselves a link to their own draft. A user can save one draft on any stage at any time. The draft is also reflected in View Data. Click the Workflow tab. Click Add a save draft button . A Save Draft button appears with the Submit button. Click on the Save Draft button. In the Properties side panel, click the Include email option in display message check box to ask users if they want to be sent an email with a URL of their draft. Note: The Save Draft button must be added manually to each stage of the form. Parent topic: Adding Stages to an application","title":"Saving work as a draft"},{"location":"sad_allowing_users_to_save.html#allowinguserstosavetheirworkasadraft","text":"Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. In any stage, you can enable authenticated users to save their work as a draft. When a user returns to a saved draft in a form, a message asks whether to start a new form, or continue working on the draft. You can add an option for users to email themselves a link to their own draft. A user can save one draft on any stage at any time. The draft is also reflected in View Data. Click the Workflow tab. Click Add a save draft button . A Save Draft button appears with the Submit button. Click on the Save Draft button. In the Properties side panel, click the Include email option in display message check box to ask users if they want to be sent an email with a URL of their draft. Note: The Save Draft button must be added manually to each stage of the form. Parent topic: Adding Stages to an application","title":"Saving work as a draft"},{"location":"se_permission_for_sharing_data_with_other_apps.html","text":"Defining permissions to share data with other applications HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. When setting permissions, you are defining access to the data based on the application, and user, that calls the service. For example, you create an application called \u201cProduct Names\u201d. You want your \u201cPurchase Order\u201d application to read the data stored in the \u201cProduct Names\u201d application, and use the data to populate a drop-down list. In the \u201cProduct Names\u201d application, create a \u201cPurchase Order\u201d user group in Roles, then give that Read access. You can also allow other applications to write data to the \u201cProduct Names\u201d application. For another application to write data, it must have Write access. For more information about creating roles, see Defining basic security roles for users . For more information on using other Leap applications as services, see Integrating your application with existing Leap applications . Go to the Access tab. Select Design Settings . For a specific role, click the Read , Write , or both check boxes. Parent topic: Securing","title":"Defining permissions to share data with other applications"},{"location":"se_permission_for_sharing_data_with_other_apps.html#definingpermissionstosharedatawithotherapplications","text":"HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. When setting permissions, you are defining access to the data based on the application, and user, that calls the service. For example, you create an application called \u201cProduct Names\u201d. You want your \u201cPurchase Order\u201d application to read the data stored in the \u201cProduct Names\u201d application, and use the data to populate a drop-down list. In the \u201cProduct Names\u201d application, create a \u201cPurchase Order\u201d user group in Roles, then give that Read access. You can also allow other applications to write data to the \u201cProduct Names\u201d application. For another application to write data, it must have Write access. For more information about creating roles, see Defining basic security roles for users . For more information on using other Leap applications as services, see Integrating your application with existing Leap applications . Go to the Access tab. Select Design Settings . For a specific role, click the Read , Write , or both check boxes. Parent topic: Securing","title":"Defining permissions to share data with other applications"},{"location":"se_security_toc.html","text":"Securing When building applications, user roles require various levels of security access. A manager is able to review submitted forms, but an administrator can delete them. The following topics describe how to set security levels for all levels of users. Leap allows application designers to compose applications that combine user interfaces, data records, and a stages-based lifecycle. The Leap security settings govern access to applications and data by defining who can edit, maintain, deploy applications, and access data for submitted forms. You can define your security rules using the Access tab from within the Design environment. These topics describe the Leap security concepts and how to use the Access tab to grant access to users in your organization. Defining basic security roles for users Create roles for users in your organization so they can work with data that is relevant to them. Assigning users or groups to roles Give the users in your organization permission to work with the data relevant to them by assigning them roles. Setting Stage permissions Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. Defining permissions to share data with other applications HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. Assigning users to maintain the application To define who can edit an HCL Leap application, use the design settings in the Access tab. Setting up security for anonymous access Using the correct permissions, you can allow anonymous users to access a form.","title":"Securing"},{"location":"se_security_toc.html#securitytoc","text":"When building applications, user roles require various levels of security access. A manager is able to review submitted forms, but an administrator can delete them. The following topics describe how to set security levels for all levels of users. Leap allows application designers to compose applications that combine user interfaces, data records, and a stages-based lifecycle. The Leap security settings govern access to applications and data by defining who can edit, maintain, deploy applications, and access data for submitted forms. You can define your security rules using the Access tab from within the Design environment. These topics describe the Leap security concepts and how to use the Access tab to grant access to users in your organization. Defining basic security roles for users Create roles for users in your organization so they can work with data that is relevant to them. Assigning users or groups to roles Give the users in your organization permission to work with the data relevant to them by assigning them roles. Setting Stage permissions Setting Stage permissions defines the \u201cCreate\u201d, \u201cRead\u201d, \u201cUpdate\u201d, and \u201cDelete\u201d permissions for each role in a stage. Defining permissions to share data with other applications HCL Leap applications can share data through services with other Leap applications. To allow other applications access to the data from the application you are designing, you must define the security permissions. Assigning users to maintain the application To define who can edit an HCL Leap application, use the design settings in the Access tab. Setting up security for anonymous access Using the correct permissions, you can allow anonymous users to access a form.","title":"Securing"},{"location":"se_triggering_a_web_service_from_a_button.html","text":"Triggering a service from a button You can use a service to add information to a form automatically after a user clicks a button. To use a service call when the user clicks a button: Add a Button to your form from the Palette if your form does not yet have one. Select the newly added button. The Properties side panel opens. Select Call a service when clicked . A menu opens where you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 8. Create a service call by clicking Add/Edit Service Configuration . To configure a service, go to step 5. When you click Add/Edit Service Configuration , the Service Configuration window opens. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Triggering a service from a button"},{"location":"se_triggering_a_web_service_from_a_button.html#triggeringawebservicefromabutton","text":"You can use a service to add information to a form automatically after a user clicks a button. To use a service call when the user clicks a button: Add a Button to your form from the Palette if your form does not yet have one. Select the newly added button. The Properties side panel opens. Select Call a service when clicked . A menu opens where you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 8. Create a service call by clicking Add/Edit Service Configuration . To configure a service, go to step 5. When you click Add/Edit Service Configuration , the Service Configuration window opens. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Outputs section of the page. Click OK to exit the Service Configuration window. Parent topic: Incorporating web services into your applications","title":"Triggering a service from a button"},{"location":"se_using_a_service_to_populate_a_drop_down.html","text":"Using a service to populate form items You can use a web service to populate to a Drop Down, Select One, and Select Many form item. The following instructions describe how to populate a Drop Down, however the same instructions apply for populating the Select One and Select Many form items. Select Drop Down from the Palette and drop it onto your form. Select the newly added dropdown. The Properties side panel opens. Click the Events tab. From the Client Side: list, select an action to associate with the service. A window for the web service opens. From this window, you can: Select a predefined action, such as Run a Formula , Call a Service , or both. Insert your own custom code in the Custom Actions area. Select Call a Service . From this menu, you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 9. Create a web service call by clicking Add/Edit Service Configuration . To configure a web service, go to step 6. Cick Add/Edit Service Configuration , to open the Service Configuration window. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Outputs section of the page. Click OK to exit the Service Configuration . All form item data is stored in database columns. For Drop Down, Select One, Select Many, and Survey items, the data column must be large enough to accommodate the largest value a user can select. The amount of space that is allocated to a database column is based on the larger of either the Storage Size parameter (50 characters), or the largest defined static value. As it is possible to pull information from a web service or from JavaScript\u2122 into the previously listed form items, Leap cannot calculate the largest size needed. To set larger database columns, modify the Saved Value character limit field to ensure that it is large enough to hold the largest value expected. Change the size of the Saved Value character limit field to the required number of characters. Parent topic: Incorporating web services into your applications","title":"Using a service to populate form items"},{"location":"se_using_a_service_to_populate_a_drop_down.html#callingaservicefromadropdownmenu","text":"You can use a web service to populate to a Drop Down, Select One, and Select Many form item. The following instructions describe how to populate a Drop Down, however the same instructions apply for populating the Select One and Select Many form items. Select Drop Down from the Palette and drop it onto your form. Select the newly added dropdown. The Properties side panel opens. Click the Events tab. From the Client Side: list, select an action to associate with the service. A window for the web service opens. From this window, you can: Select a predefined action, such as Run a Formula , Call a Service , or both. Insert your own custom code in the Custom Actions area. Select Call a Service . From this menu, you can: Select an existing web service from the menu. If you select an existing service from the menu, go to step 9. Create a web service call by clicking Add/Edit Service Configuration . To configure a web service, go to step 6. Cick Add/Edit Service Configuration , to open the Service Configuration window. Enter the URL of your service Select Or, select a service and select a URL from a list of available services Click the Inputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Inputs section of the page. Click the Outputs tab. Select a source from the Select source: window. Select a target from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are shown in the Assigned Outputs section of the page. Click OK to exit the Service Configuration . All form item data is stored in database columns. For Drop Down, Select One, Select Many, and Survey items, the data column must be large enough to accommodate the largest value a user can select. The amount of space that is allocated to a database column is based on the larger of either the Storage Size parameter (50 characters), or the largest defined static value. As it is possible to pull information from a web service or from JavaScript\u2122 into the previously listed form items, Leap cannot calculate the largest size needed. To set larger database columns, modify the Saved Value character limit field to ensure that it is large enough to hold the largest value expected. Change the size of the Saved Value character limit field to the required number of characters. Parent topic: Incorporating web services into your applications","title":"Using a service to populate form items"},{"location":"ser_add_service_catalog.html","text":"Adding a Service Catalog A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. A Service Catalog is implemented in much the same manner as a Service Catalog Group. You first create an implementation of the IServiceCatalog interface. The recommended approach is to extend the AbstractServiceCatalog class. Your implementation and supporting files are then packaged into an OSGi bundle and deployed to the extensions directory on the Leap server. Refer to Setting up your development environment before using the following instructions. Create a Java class The following example of a custom Service Catalog provides the description of a single sample service called Hello Service. This service has one input parameter and one output parameter. This custom Service Catalog is linked with the sample Service Catalog Group described in the Service Catalog Group help topic by returning the com.mycompany.services.MyServiceCatalogGroup.id from the getGroupId() method. The Hello Service service is started when My Services is selected by the application designer from the Service Catalog dropdown in the Service Configuration dialog. package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.util.*; public class MyServiceCatalog extends AbstractServiceCatalog implements IServiceCatalog { private Collection<IServiceDescription> mServiceDescriptions = null; public String getGroupId() { return \"com.mycompany.services.MyServiceCatalogGroup.id\"; } public void setServiceDescriptionBuilderFactory(IServiceDescriptionBuilderFactory pServiceDescriptionBuilderFactory) { if (this.mServiceDescriptions == null) { this.mServiceDescriptions = new ArrayList<IServiceDescription>(); try { IServiceDescriptionBuilder builder1 = pServiceDescriptionBuilderFactory.newDescriptionBuilder(); builder1.setId(\"com.mycompany.services.Hello\").setDefaultLocale(Locale.ENGLISH); builder1.setName(Locale.ENGLISH, \"Hello Service\"); builder1.setDescription(Locale.ENGLISH, \"This service says 'Hello' to a given person\"); builder1.setTransportId(\"com.mycompany.services.HelloServiceTransport.id\"); // service inputs IServiceBindingBuilder inboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder inParamBuilder1 = inboundBindingBuilder.newParameterBuilder(); inParamBuilder1.setName(Locale.ENGLISH, \"Person\"); inParamBuilder1.setDescription(Locale.ENGLISH, \"The person to say 'Hello' to\"); inParamBuilder1.setId(\"person\").setMandatory(true).setType(ServiceParameterType.STRING); inboundBindingBuilder.addParameter(inParamBuilder1.getServiceParameter()); builder1.setInbound(inboundBindingBuilder.getServiceBinding()); // service outputs IServiceBindingBuilder outboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder outParamBuilder1 = outboundBindingBuilder.newParameterBuilder(); outParamBuilder1.setName(Locale.ENGLISH, \"Greeting\"); outParamBuilder1.setDescription(Locale.ENGLISH, \"The 'Hello' greeting\"); outParamBuilder1.setId(\"greeting\").setType(ServiceParameterType.STRING); outboundBindingBuilder.addParameter(outParamBuilder1.getServiceParameter()); builder1.setOutbound(outboundBindingBuilder.getServiceBinding()); IServiceDescription serviceDescription1 = builder1.getServiceDescription(); this.mServiceDescriptions.add(serviceDescription1); } catch (ServiceException ex) { throw new RuntimeException(ex); } } } public Collection<IServiceDescription> getServiceDescriptions(IServiceManager pManager, IOrg pOrg, IUser pUser, String pFilterCatalog, String pFilterStatus, String pFilterText, boolean pFilterIncludesDesc, Locale pFilterLocale) { this.filterServiceDescriptions(pManager, this.mServiceDescriptions, pFilterStatus, pFilterText, pFilterIncludesDesc, pFilterLocale); return Collections.unmodifiableCollection(this.mServiceDescriptions); } public IServiceDescription getServiceDescription(IServiceManager pManager, IOrg pOrg, IUser pUser, String pServiceDescriptionId) { for (IServiceDescription description : this.mServiceDescriptions) { if (description.getId().equals(pServiceDescriptionId)) return description; } return null; } } In this example, an IserviceDescriptionBuilder is used to build up a Service Description programmatically. However, IserviceDescriptionBuilder also provides methods to parse Service Descriptions from XML files. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalog.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalog.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalog\" /> <reference bind=\"setServiceDescriptionBuilderFactory\" cardinality=\"1..1\" interface=\"com.ibm.form.nitro.service.services.IServiceDescriptionBuilderFactory\" name=\"ServiceDescriptionBuilderFactory\" policy=\"static\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalog\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1 . Notice the inclusion of the <reference> element in this example. This ensures that your custom Service Catalog has access to an IServiceDescriptionBuilderFactory for programmatically building up Service Descriptions. Create a MANIFEST.MF file Create a MANIFEST.MF file similar to Step 3 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Catalog Group and a custom Service Catalog. Deploy the Service Catalog. Deployment of your Service Catalog is similar to Step 4 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle, so the same .jar file can be used for your custom Service Catalog Group and custom Service Catalog. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog"},{"location":"ser_add_service_catalog.html#ser_add_service_catalog","text":"A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. A Service Catalog is implemented in much the same manner as a Service Catalog Group. You first create an implementation of the IServiceCatalog interface. The recommended approach is to extend the AbstractServiceCatalog class. Your implementation and supporting files are then packaged into an OSGi bundle and deployed to the extensions directory on the Leap server. Refer to Setting up your development environment before using the following instructions. Create a Java class The following example of a custom Service Catalog provides the description of a single sample service called Hello Service. This service has one input parameter and one output parameter. This custom Service Catalog is linked with the sample Service Catalog Group described in the Service Catalog Group help topic by returning the com.mycompany.services.MyServiceCatalogGroup.id from the getGroupId() method. The Hello Service service is started when My Services is selected by the application designer from the Service Catalog dropdown in the Service Configuration dialog. package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.util.*; public class MyServiceCatalog extends AbstractServiceCatalog implements IServiceCatalog { private Collection<IServiceDescription> mServiceDescriptions = null; public String getGroupId() { return \"com.mycompany.services.MyServiceCatalogGroup.id\"; } public void setServiceDescriptionBuilderFactory(IServiceDescriptionBuilderFactory pServiceDescriptionBuilderFactory) { if (this.mServiceDescriptions == null) { this.mServiceDescriptions = new ArrayList<IServiceDescription>(); try { IServiceDescriptionBuilder builder1 = pServiceDescriptionBuilderFactory.newDescriptionBuilder(); builder1.setId(\"com.mycompany.services.Hello\").setDefaultLocale(Locale.ENGLISH); builder1.setName(Locale.ENGLISH, \"Hello Service\"); builder1.setDescription(Locale.ENGLISH, \"This service says 'Hello' to a given person\"); builder1.setTransportId(\"com.mycompany.services.HelloServiceTransport.id\"); // service inputs IServiceBindingBuilder inboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder inParamBuilder1 = inboundBindingBuilder.newParameterBuilder(); inParamBuilder1.setName(Locale.ENGLISH, \"Person\"); inParamBuilder1.setDescription(Locale.ENGLISH, \"The person to say 'Hello' to\"); inParamBuilder1.setId(\"person\").setMandatory(true).setType(ServiceParameterType.STRING); inboundBindingBuilder.addParameter(inParamBuilder1.getServiceParameter()); builder1.setInbound(inboundBindingBuilder.getServiceBinding()); // service outputs IServiceBindingBuilder outboundBindingBuilder = builder1.newBindingBuilder(); IServiceParameterBuilder outParamBuilder1 = outboundBindingBuilder.newParameterBuilder(); outParamBuilder1.setName(Locale.ENGLISH, \"Greeting\"); outParamBuilder1.setDescription(Locale.ENGLISH, \"The 'Hello' greeting\"); outParamBuilder1.setId(\"greeting\").setType(ServiceParameterType.STRING); outboundBindingBuilder.addParameter(outParamBuilder1.getServiceParameter()); builder1.setOutbound(outboundBindingBuilder.getServiceBinding()); IServiceDescription serviceDescription1 = builder1.getServiceDescription(); this.mServiceDescriptions.add(serviceDescription1); } catch (ServiceException ex) { throw new RuntimeException(ex); } } } public Collection<IServiceDescription> getServiceDescriptions(IServiceManager pManager, IOrg pOrg, IUser pUser, String pFilterCatalog, String pFilterStatus, String pFilterText, boolean pFilterIncludesDesc, Locale pFilterLocale) { this.filterServiceDescriptions(pManager, this.mServiceDescriptions, pFilterStatus, pFilterText, pFilterIncludesDesc, pFilterLocale); return Collections.unmodifiableCollection(this.mServiceDescriptions); } public IServiceDescription getServiceDescription(IServiceManager pManager, IOrg pOrg, IUser pUser, String pServiceDescriptionId) { for (IServiceDescription description : this.mServiceDescriptions) { if (description.getId().equals(pServiceDescriptionId)) return description; } return null; } } In this example, an IserviceDescriptionBuilder is used to build up a Service Description programmatically. However, IserviceDescriptionBuilder also provides methods to parse Service Descriptions from XML files. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalog.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalog.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalog\" /> <reference bind=\"setServiceDescriptionBuilderFactory\" cardinality=\"1..1\" interface=\"com.ibm.form.nitro.service.services.IServiceDescriptionBuilderFactory\" name=\"ServiceDescriptionBuilderFactory\" policy=\"static\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalog\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1 . Notice the inclusion of the <reference> element in this example. This ensures that your custom Service Catalog has access to an IServiceDescriptionBuilderFactory for programmatically building up Service Descriptions. Create a MANIFEST.MF file Create a MANIFEST.MF file similar to Step 3 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Catalog Group and a custom Service Catalog. Deploy the Service Catalog. Deployment of your Service Catalog is similar to Step 4 in the Service Catalog Group help topic. Multiple OSGi services can be packaged within the same OSGi bundle, so the same .jar file can be used for your custom Service Catalog Group and custom Service Catalog. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog"},{"location":"ser_add_service_catalog_group.html","text":"Adding a Service Catalog Group A Service Catalog Group provides a way to group web services in HCL Leap. Refer to Setting up your development environment before starting. A new Service Catalog Group can be added toLeap by creating and deploying an appropriate OSGi .jar bundle. To the application designer, Service Catalog Groups are listed in the Service Catalog dropdown in the Leap Service Configuration dialog. This dropdown allows the application designer to filter services by the Service Catalog Group to which they belong. By default, there are two predefined groups: General and HCL Leap Applications. Providing a new implementation of a Service Catalog Group creates a group as an option in the Service Catalog dropdown. Services can be added to a particular Service Catalog Group by implementing a Service Catalog that belongs to that group. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceCatalogGroup interface to return a unique group identifier and a readable group name. The following example adds the My Services group to the Leap. package com.mycompany.services; import com.ibm.form.nitro.service.services.IServiceCatalogGroup; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.Locale; public class MyServiceCatalogGroup implements IServiceCatalogGroup { public String getGroupId() { return \"com.company.services.MyServiceCatalogGroup.id\"; } public String getGroupName() { Locale requestLocale = LocaleUtils.getRequestLocale(); /* use request locale to determine a translated group name */ return \"My Services\"; } } In this example, the locale used by the user can be retrieved by using com.ibm.form.platform.service.framework.i18n.LocaleUtils.getRequestLocale(. If you are using the Eclipse IDE, its Externalize Strings wizard can extract strings for your OSGi bundle. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalogGroup.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalogGroup.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalogGroup\" /> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalogGroup\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Deploy the Service Catalog Group. Create a .jar file that contains all the files listed in the previous steps in an OSGi bundle structure. For example: / META-INF/ MANIFEST.MF OSGI-INF/ MyServiceCatalogGroup.xml com/ mycompany/ services/ MyServiceCatalogGroup.classn On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Note: If the extensions directory does not exist, you must restart the Leap server after the directory is created. /opt/HCL/Leap/ is not case-sensitive. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog Group"},{"location":"ser_add_service_catalog_group.html#ser_provide_groups_of_dynamic_services","text":"A Service Catalog Group provides a way to group web services in HCL Leap. Refer to Setting up your development environment before starting. A new Service Catalog Group can be added toLeap by creating and deploying an appropriate OSGi .jar bundle. To the application designer, Service Catalog Groups are listed in the Service Catalog dropdown in the Leap Service Configuration dialog. This dropdown allows the application designer to filter services by the Service Catalog Group to which they belong. By default, there are two predefined groups: General and HCL Leap Applications. Providing a new implementation of a Service Catalog Group creates a group as an option in the Service Catalog dropdown. Services can be added to a particular Service Catalog Group by implementing a Service Catalog that belongs to that group. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceCatalogGroup interface to return a unique group identifier and a readable group name. The following example adds the My Services group to the Leap. package com.mycompany.services; import com.ibm.form.nitro.service.services.IServiceCatalogGroup; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.Locale; public class MyServiceCatalogGroup implements IServiceCatalogGroup { public String getGroupId() { return \"com.company.services.MyServiceCatalogGroup.id\"; } public String getGroupName() { Locale requestLocale = LocaleUtils.getRequestLocale(); /* use request locale to determine a translated group name */ return \"My Services\"; } } In this example, the locale used by the user can be retrieved by using com.ibm.form.platform.service.framework.i18n.LocaleUtils.getRequestLocale(. If you are using the Eclipse IDE, its Externalize Strings wizard can extract strings for your OSGi bundle. Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a MyServiceCatalogGroup.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" enabled=\"true\" immediate=\"true\" name=\"com.mycompany.services.MyServiceCatalogGroup.service\"> <implementation class=\"com.mycompany.services.MyServiceCatalogGroup\" /> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceCatalogGroup\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1 . Ensure that the name attribute of the component element is unique. Although not required, you can make the name attribute the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Deploy the Service Catalog Group. Create a .jar file that contains all the files listed in the previous steps in an OSGi bundle structure. For example: / META-INF/ MANIFEST.MF OSGI-INF/ MyServiceCatalogGroup.xml com/ mycompany/ services/ MyServiceCatalogGroup.classn On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Note: If the extensions directory does not exist, you must restart the Leap server after the directory is created. /opt/HCL/Leap/ is not case-sensitive. Parent topic: Providing Groups of Dynamic Services","title":"Adding a Service Catalog Group"},{"location":"ser_create_custom_service_transport.html","text":"Creating your own custom Service Transport By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. If you plan to call an external service using HTTP, consider using the HTTP Service Transport instead. Refer to HTTP Service Transport for more information. A custom Service Transport can be added to the Leap environment by creating and deploying an appropriate OSGi JAR bundle. Refer to Setting up your development environment before starting. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceTransport interface. The following example is a Hello example transport that returns a greeting to a person. This transport expects a single input parameter person and responds with a single output parameter greeting. In this simple example, the transport does not talk to any external system to run the service. The transport implements the service itself. package com.mycompany.services; import com.ibm.form.nitro.service.model.IUser; import com.ibm.form.nitro.service.services.*; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.*; public class HelloServiceTransport implements IServiceTransport { public String getId() { return \"com.mycompany.services.HelloServiceTransport.id\"; } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { String personName = (String) pParameters.get(\"person\"); Locale requestLocale = LocaleUtils.getRequestLocale(); String greeting = \"\"; if (requestLocale.getLanguage().equals(Locale.FRENCH.getLanguage())) greeting = \"Bonjour\" + personName; else greeting = \"Hello \" + personName; pParameters.put(\"greeting\", greeting); ServiceResult result = new ServiceResult(200, \"success\"); return result; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public IServiceTransportMetadata getMetadata() { return new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { return Collections.emptySet(); } }; } } Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a HelloServiceTransport.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" immediate=\"true\" name=\"com.mycompany.services.HelloServiceTransport.service\"> <implementation class=\"com.mycompany.services.HelloServiceTransport\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceTransport\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1. Ensure that the name attribute of the component element is unique. Although not required, you can make it the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. Deploy the Service Transport. Create a .jar file that contains the Java class, OSGi Service Description, and the MANIFEST.MF, created in steps 1 - 3. For example: / META-INF/ MANIFEST.MF OSGI-INF/ HelloServiceTransport.xml com/ mycompany/ services/ HelloServiceTransport.class HelloServiceTransport$1.class Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same .jar file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case-sensitive. Sample LDAP query Service Transport The following example is a more complex Service Transport that demonstrates one possible way to query an LDAP server. The transport itself remains fairly generic so that multiple different service descriptions, each with their own custom parameters and LDAP search properties, can use this same transport. This sample uses the JVM's naming services (javax.naming.directory and javax.naming.ldap) to communicate with the external LDAP server. LDAP search results are converted to XML which can then be pulled apart by the outgoing mapping section of the service description as needed. For example: <searchresults> <searchresult> <telephone>1-555-555-555</telephone> <email>csmith@mycompany.com</email> <cn>Chris Smith</cn> </searchresult> <searchresult> ... </searchresult> ... </searchresults> If necessary, the Basic Credentials Provider is used to collect the credentials needed to query the LDAP server. Sample Java code: package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.io.*; import java.util.*; import javax.naming.*; import javax.naming.directory.*; import javax.naming.ldap.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.*; public class SampleLDAPServiceTransport implements IServiceTransport { private IServiceTransportMetadata metaData; public String getId() { return \"com.mycompany.services.SampleLDAPServiceTransport.id\"; } public IServiceTransportMetadata getMetadata() { if (this.metaData == null) { this.metaData = new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { Set<String> ids = new HashSet<String>(); ids.add(\"basic\"); return ids; } }; } return this.metaData; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { if (pParameters == null) { pParameters = new HashMap<String, Object>(); } String baseDN = (String) pParameters.get(\"basedn\"); String filter = (String) pParameters.get(\"filter\"); List<String> filterArgs = new ArrayList<String>(); int argIndex = 0; while (pParameters.containsKey(\"filter-arg-\" + argIndex)) { String filterArgValue = (String) pParameters.get(\"filter-arg-\" + argIndex); filterArgs.add(filterArgValue == null ? \"\" : filterArgValue); argIndex++; } String[] attributes = null; if (pParameters.containsKey(\"result-attributes\")) { attributes = ((String) pParameters.get(\"result-attributes\")).trim().split(\"[\\\\s]*,[\\\\s]*\"); } int resultCountLimit = 50; if (pParameters.containsKey(\"result-count-limit\")) { resultCountLimit = Integer.parseInt((String) pParameters.get(\"result-count-limit\")); } int resultCount = 0; InitialLdapContext ctx = null; try { ctx = ldapConnect(pServiceCredentialsProvider, pParameters); if (ctx != null) { Document doc = createDocument(); Node rootNode = doc.createElement(\"searchresults\"); doc.appendChild(rootNode); SearchControls sc = new SearchControls(); sc.setSearchScope(SearchControls.SUBTREE_SCOPE); sc.setCountLimit(resultCountLimit); sc.setReturningAttributes(attributes); sc.setReturningObjFlag(false); // fetch results NamingEnumeration<SearchResult> searchResults = ctx.search(baseDN, filter, filterArgs.toArray(new String[0]), sc); while (searchResults.hasMore()) { Node resultNode = doc.createElement(\"searchresult\"); rootNode.appendChild(resultNode); resultCount++; SearchResult result = searchResults.next(); Attributes resultAttrs = result.getAttributes(); NamingEnumeration<String> attrIds = resultAttrs.getIDs(); while (attrIds.hasMore()) { String attrName = attrIds.next(); String attrValue = (String) resultAttrs.get(attrName).get(0); Node attrNode = doc.createElement(attrName); attrNode.setTextContent(attrValue); resultNode.appendChild(attrNode); } } String result = serializeDocument(doc); pParameters.put(\"resultXML\", result); } } catch (AuthenticationException ex) { if (pServiceCredentialsProvider != null) { return new ServiceResult(401); } else { return new ServiceResult(500, ex.getLocalizedMessage()); } } catch (Exception ex) { return new ServiceResult(500, ex.getLocalizedMessage()); } finally { if (ctx != null) { try { ctx.close(); } catch (NamingException ex) { // Ignore } } } // Success return new ServiceResult(200, resultCount + \" LDAP search result(s)\"); } /** * Creates the LDAP Context used to call to the LDAP server. */ private InitialLdapContext ldapConnect(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws NamingException, ServiceException { String url = (String) pParameters.get(\"url\"); Map<String, String> securityInfo = this.getSecurityInfo(pServiceCredentialsProvider, pParameters); String securityAuth = securityInfo.get(\"auth\"); String securityPrincipal = securityInfo.get(\"principal\"); String securityCredentials = securityInfo.get(\"credentials\"); InitialLdapContext ctx = null; Hashtable<String, String> contextConfig = null; // Set up LDAP config settings contextConfig = new Hashtable<String, String>(); contextConfig.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.ldap.LdapCtxFactory\"); contextConfig.put(Context.REFERRAL, \"follow\"); contextConfig.put(Context.PROVIDER_URL, url); // For non-anonymous authentication security needs to be configured if (securityAuth != null && securityAuth.equals(\"none\") == false) { contextConfig.put(Context.SECURITY_AUTHENTICATION, securityAuth); contextConfig.put(Context.SECURITY_PRINCIPAL, securityPrincipal); contextConfig.put(Context.SECURITY_CREDENTIALS, securityCredentials); } ctx = new InitialLdapContext(contextConfig, null); return ctx; } private Map<String, String> getSecurityInfo(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws ServiceException { Map<String, String> resultMap = new HashMap<String, String>(); resultMap.put(\"auth\", (String) pParameters.get(\"security-authentication\")); if (resultMap.get(\"auth\") != null) { resultMap.put(\"principal\", (String) pParameters.get(\"security-principal\")); resultMap.put(\"credentials\", (String) pParameters.get(\"security-credentials\")); } if (pServiceCredentialsProvider != null) { if (pServiceCredentialsProvider.getId() == \"basic\") { resultMap.put(\"auth\", \"simple\"); try { // use reflection to get username and password resultMap.put(\"principal\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getUsername\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); resultMap.put(\"credentials\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getPassword\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); } catch (Exception e) { throw new ServiceException(e); } } } if (resultMap.get(\"principal\") == null) resultMap.put(\"principal\", \"\"); if (resultMap.get(\"credentials\") == null) resultMap.put(\"credentials\", \"\"); return resultMap; } /** * Creates an empty XML document. */ private Document createDocument() throws ServiceException { Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.newDocument(); } catch (Exception ex) { throw new ServiceException(ex); } return doc; } /** * Serializes an XML document to a String. */ private String serializeDocument(Document pDocument) throws ServiceException { try { Transformer t = TransformerFactory.newInstance().newTransformer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); t.transform(new DOMSource(pDocument), new StreamResult(baos)); return new String(baos.toByteArray(), \"UTF-8\"); } catch (Exception ex) { throw new ServiceException(ex); } } } Sample LDAP query Service Description This service description utilizes the previous sample LDAP transport to search an LDAP server for employee info. The results returned are based on a wildcard match of the employee's name or email address. <?xml version=\"1.0\" encoding=\"UTF-8\"?> <serviceDescription> <id>com.mycompany.services.SampleLDAPSearch</id> <defaultLocale>en-us</defaultLocale> <transportId>com.mycompany.services.SampleLDAPServiceTransport.id</transportId> <name>Sample LDAP Search Service</name> <description>Searches an LDAP server for employee information.</description> <credentials providerId=\"basic\"> <property name=\"realm\" value=\"com.mycompany.services.SampleLDAPRealm\"/> </credentials> <inbound> <parameters> <parameter> <id>searchName</id> <name>Search Name</name> <description>The employee name to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> <parameter> <id>searchEmail</id> <name>Search Email</name> <description>The employee email to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>url</id> <value>ldap://ldap.mysite.com:389/</value> </constant> <constant> <id>basedn</id> <value>ou=employees,o=mysite.com</value> </constant> <constant> <id>filter</id> <value>(&(objectClass=person)(cn=*{0}*)(email=*{1}*))</value> </constant> <constant> <id>result-attributes</id> <value>cn,telephone,email</value> </constant> </constants> <mapping> <mapping target=\"transport:url\" source=\"constant:url\" /> <mapping target=\"transport:basedn\" source=\"constant:basedn\" /> <mapping target=\"transport:filter\" source=\"constant:filter\" /> <mapping target=\"transport:filter-arg-0\" source=\"parameter:searchName\" /> <mapping target=\"transport:filter-arg-1\" source=\"parameter:searchEmail\" /> <mapping target=\"transport:result-attributes\" source=\"constant:result-attributes\" /> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>searchResults</id> <name>Search Results</name> <description>The list of search results</description> <type>LIST</type> <parameters> <parameter> <id>name</id> <name>Employee Name</name> <description>The employee's name.</description> <type>STRING</type> </parameter> <parameter> <id>email</id> <name>Employee Email</name> <description>The employee's email address.</description> <type>STRING</type> </parameter> <parameter> <id>phone</id> <name>Employee Phone Number</name> <description>The employee's phone number.</description> <type>STRING</type> </parameter> </parameters> </parameter> </parameters> <serviceMapping> <mapping> <mapping target=\"parameter:searchResults\" source=\"transport:resultXML\" sourceRef=\"searchresults/searchresult\" sourceType=\"xml\"> <mapping target=\"parameter:name\" sourceRef=\"cn\" sourceType=\"xml\" /> <mapping target=\"parameter:email\" sourceRef=\"email\" sourceType=\"xml\" /> <mapping target=\"parameter:phone\" sourceRef=\"telephone\" sourceType=\"xml\" /> </mapping> </mapping> </serviceMapping> </outbound> </serviceDescription> Parent topic: Service Oriented Architecture \u2013 Service Transport","title":"Creating your own custom Service Transport"},{"location":"ser_create_custom_service_transport.html#ser_create_custom_service_transport","text":"By creating a custom Service Transport, you can allow HCL Leap applications to use services from any external system, or access any data source. Alternatively, the transport can implement a custom service itself without communicating with any external system or data source. If you plan to call an external service using HTTP, consider using the HTTP Service Transport instead. Refer to HTTP Service Transport for more information. A custom Service Transport can be added to the Leap environment by creating and deploying an appropriate OSGi JAR bundle. Refer to Setting up your development environment before starting. Create a Java class Create a Java class that implements the com.ibm.form.nitro.service.services.IServiceTransport interface. The following example is a Hello example transport that returns a greeting to a person. This transport expects a single input parameter person and responds with a single output parameter greeting. In this simple example, the transport does not talk to any external system to run the service. The transport implements the service itself. package com.mycompany.services; import com.ibm.form.nitro.service.model.IUser; import com.ibm.form.nitro.service.services.*; import com.ibm.form.platform.service.framework.i18n.LocaleUtils; import java.util.*; public class HelloServiceTransport implements IServiceTransport { public String getId() { return \"com.mycompany.services.HelloServiceTransport.id\"; } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { String personName = (String) pParameters.get(\"person\"); Locale requestLocale = LocaleUtils.getRequestLocale(); String greeting = \"\"; if (requestLocale.getLanguage().equals(Locale.FRENCH.getLanguage())) greeting = \"Bonjour\" + personName; else greeting = \"Hello \" + personName; pParameters.put(\"greeting\", greeting); ServiceResult result = new ServiceResult(200, \"success\"); return result; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public IServiceTransportMetadata getMetadata() { return new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { return Collections.emptySet(); } }; } } Create an OSGi Service Description You must create an .xml file to declare your Java class as an OSGi service. For example, create a HelloServiceTransport.xml file with the following content: <?xml version=\"1.0\" encoding=\"UTF-8\"?> <scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" configuration-policy=\"optional\" immediate=\"true\" name=\"com.mycompany.services.HelloServiceTransport.service\"> <implementation class=\"com.mycompany.services.HelloServiceTransport\"/> <service> <provide interface=\"com.ibm.form.nitro.service.services.IServiceTransport\"/> </service> </scr:component> For the class attribute of the implementation element, use the fully qualified name of the Java class you created in Step 1. Ensure that the name attribute of the component element is unique. Although not required, you can make it the same as the fully qualified name of the Java class that you created in Step 1. Create a MANIFEST.MF file Sample content: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: My Company Services Bundle-SymbolicName: com.mycompany.services Bundle-Version: 1.0.0.b1 Bundle-Vendor: My Company Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.ibm.form.nitro.service.model, com.ibm.form.nitro.service.services, com.ibm.form.platform.service.framework.i18n Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same MANIFEST.MF file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. Deploy the Service Transport. Create a .jar file that contains the Java class, OSGi Service Description, and the MANIFEST.MF, created in steps 1 - 3. For example: / META-INF/ MANIFEST.MF OSGI-INF/ HelloServiceTransport.xml com/ mycompany/ services/ HelloServiceTransport.class HelloServiceTransport$1.class Multiple OSGi services can be packaged within the same OSGi bundle. Therefore, the same .jar file can be used for a custom Service Transport, a custom Service Catalog Group, and a custom Service Catalog. On the Leap server, put the .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case-sensitive.","title":"Creating your own custom Service Transport"},{"location":"ser_create_custom_service_transport.html#sample-ldap-query-service-transport","text":"The following example is a more complex Service Transport that demonstrates one possible way to query an LDAP server. The transport itself remains fairly generic so that multiple different service descriptions, each with their own custom parameters and LDAP search properties, can use this same transport. This sample uses the JVM's naming services (javax.naming.directory and javax.naming.ldap) to communicate with the external LDAP server. LDAP search results are converted to XML which can then be pulled apart by the outgoing mapping section of the service description as needed. For example: <searchresults> <searchresult> <telephone>1-555-555-555</telephone> <email>csmith@mycompany.com</email> <cn>Chris Smith</cn> </searchresult> <searchresult> ... </searchresult> ... </searchresults> If necessary, the Basic Credentials Provider is used to collect the credentials needed to query the LDAP server. Sample Java code: package com.mycompany.services; import com.ibm.form.nitro.service.model.*; import com.ibm.form.nitro.service.services.*; import java.io.*; import java.util.*; import javax.naming.*; import javax.naming.directory.*; import javax.naming.ldap.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.*; public class SampleLDAPServiceTransport implements IServiceTransport { private IServiceTransportMetadata metaData; public String getId() { return \"com.mycompany.services.SampleLDAPServiceTransport.id\"; } public IServiceTransportMetadata getMetadata() { if (this.metaData == null) { this.metaData = new IServiceTransportMetadata() { public Set<String> getAllowableCredentialsProviderIds() { Set<String> ids = new HashSet<String>(); ids.add(\"basic\"); return ids; } }; } return this.metaData; } public Collection<IServiceDescription> getSampleServiceDescriptions() { return Collections.emptyList(); } public ServiceResult run(IServiceDescription pDescription, IServiceCredentialsProvider pServiceCredentialsProvider, IUser pUser, Map<String, Object> pParameters) { if (pParameters == null) { pParameters = new HashMap<String, Object>(); } String baseDN = (String) pParameters.get(\"basedn\"); String filter = (String) pParameters.get(\"filter\"); List<String> filterArgs = new ArrayList<String>(); int argIndex = 0; while (pParameters.containsKey(\"filter-arg-\" + argIndex)) { String filterArgValue = (String) pParameters.get(\"filter-arg-\" + argIndex); filterArgs.add(filterArgValue == null ? \"\" : filterArgValue); argIndex++; } String[] attributes = null; if (pParameters.containsKey(\"result-attributes\")) { attributes = ((String) pParameters.get(\"result-attributes\")).trim().split(\"[\\\\s]*,[\\\\s]*\"); } int resultCountLimit = 50; if (pParameters.containsKey(\"result-count-limit\")) { resultCountLimit = Integer.parseInt((String) pParameters.get(\"result-count-limit\")); } int resultCount = 0; InitialLdapContext ctx = null; try { ctx = ldapConnect(pServiceCredentialsProvider, pParameters); if (ctx != null) { Document doc = createDocument(); Node rootNode = doc.createElement(\"searchresults\"); doc.appendChild(rootNode); SearchControls sc = new SearchControls(); sc.setSearchScope(SearchControls.SUBTREE_SCOPE); sc.setCountLimit(resultCountLimit); sc.setReturningAttributes(attributes); sc.setReturningObjFlag(false); // fetch results NamingEnumeration<SearchResult> searchResults = ctx.search(baseDN, filter, filterArgs.toArray(new String[0]), sc); while (searchResults.hasMore()) { Node resultNode = doc.createElement(\"searchresult\"); rootNode.appendChild(resultNode); resultCount++; SearchResult result = searchResults.next(); Attributes resultAttrs = result.getAttributes(); NamingEnumeration<String> attrIds = resultAttrs.getIDs(); while (attrIds.hasMore()) { String attrName = attrIds.next(); String attrValue = (String) resultAttrs.get(attrName).get(0); Node attrNode = doc.createElement(attrName); attrNode.setTextContent(attrValue); resultNode.appendChild(attrNode); } } String result = serializeDocument(doc); pParameters.put(\"resultXML\", result); } } catch (AuthenticationException ex) { if (pServiceCredentialsProvider != null) { return new ServiceResult(401); } else { return new ServiceResult(500, ex.getLocalizedMessage()); } } catch (Exception ex) { return new ServiceResult(500, ex.getLocalizedMessage()); } finally { if (ctx != null) { try { ctx.close(); } catch (NamingException ex) { // Ignore } } } // Success return new ServiceResult(200, resultCount + \" LDAP search result(s)\"); } /** * Creates the LDAP Context used to call to the LDAP server. */ private InitialLdapContext ldapConnect(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws NamingException, ServiceException { String url = (String) pParameters.get(\"url\"); Map<String, String> securityInfo = this.getSecurityInfo(pServiceCredentialsProvider, pParameters); String securityAuth = securityInfo.get(\"auth\"); String securityPrincipal = securityInfo.get(\"principal\"); String securityCredentials = securityInfo.get(\"credentials\"); InitialLdapContext ctx = null; Hashtable<String, String> contextConfig = null; // Set up LDAP config settings contextConfig = new Hashtable<String, String>(); contextConfig.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.ldap.LdapCtxFactory\"); contextConfig.put(Context.REFERRAL, \"follow\"); contextConfig.put(Context.PROVIDER_URL, url); // For non-anonymous authentication security needs to be configured if (securityAuth != null && securityAuth.equals(\"none\") == false) { contextConfig.put(Context.SECURITY_AUTHENTICATION, securityAuth); contextConfig.put(Context.SECURITY_PRINCIPAL, securityPrincipal); contextConfig.put(Context.SECURITY_CREDENTIALS, securityCredentials); } ctx = new InitialLdapContext(contextConfig, null); return ctx; } private Map<String, String> getSecurityInfo(IServiceCredentialsProvider pServiceCredentialsProvider, Map<String, Object> pParameters) throws ServiceException { Map<String, String> resultMap = new HashMap<String, String>(); resultMap.put(\"auth\", (String) pParameters.get(\"security-authentication\")); if (resultMap.get(\"auth\") != null) { resultMap.put(\"principal\", (String) pParameters.get(\"security-principal\")); resultMap.put(\"credentials\", (String) pParameters.get(\"security-credentials\")); } if (pServiceCredentialsProvider != null) { if (pServiceCredentialsProvider.getId() == \"basic\") { resultMap.put(\"auth\", \"simple\"); try { // use reflection to get username and password resultMap.put(\"principal\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getUsername\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); resultMap.put(\"credentials\", (String) pServiceCredentialsProvider.getClass().getMethod(\"getPassword\", new Class[0]) .invoke(pServiceCredentialsProvider, new Object[0])); } catch (Exception e) { throw new ServiceException(e); } } } if (resultMap.get(\"principal\") == null) resultMap.put(\"principal\", \"\"); if (resultMap.get(\"credentials\") == null) resultMap.put(\"credentials\", \"\"); return resultMap; } /** * Creates an empty XML document. */ private Document createDocument() throws ServiceException { Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.newDocument(); } catch (Exception ex) { throw new ServiceException(ex); } return doc; } /** * Serializes an XML document to a String. */ private String serializeDocument(Document pDocument) throws ServiceException { try { Transformer t = TransformerFactory.newInstance().newTransformer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); t.transform(new DOMSource(pDocument), new StreamResult(baos)); return new String(baos.toByteArray(), \"UTF-8\"); } catch (Exception ex) { throw new ServiceException(ex); } } } Sample LDAP query Service Description This service description utilizes the previous sample LDAP transport to search an LDAP server for employee info. The results returned are based on a wildcard match of the employee's name or email address. <?xml version=\"1.0\" encoding=\"UTF-8\"?> <serviceDescription> <id>com.mycompany.services.SampleLDAPSearch</id> <defaultLocale>en-us</defaultLocale> <transportId>com.mycompany.services.SampleLDAPServiceTransport.id</transportId> <name>Sample LDAP Search Service</name> <description>Searches an LDAP server for employee information.</description> <credentials providerId=\"basic\"> <property name=\"realm\" value=\"com.mycompany.services.SampleLDAPRealm\"/> </credentials> <inbound> <parameters> <parameter> <id>searchName</id> <name>Search Name</name> <description>The employee name to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> <parameter> <id>searchEmail</id> <name>Search Email</name> <description>The employee email to search for.</description> <mandatory>false</mandatory> <type>STRING</type> </parameter> </parameters> <serviceMapping> <constants> <constant> <id>url</id> <value>ldap://ldap.mysite.com:389/</value> </constant> <constant> <id>basedn</id> <value>ou=employees,o=mysite.com</value> </constant> <constant> <id>filter</id> <value>(&(objectClass=person)(cn=*{0}*)(email=*{1}*))</value> </constant> <constant> <id>result-attributes</id> <value>cn,telephone,email</value> </constant> </constants> <mapping> <mapping target=\"transport:url\" source=\"constant:url\" /> <mapping target=\"transport:basedn\" source=\"constant:basedn\" /> <mapping target=\"transport:filter\" source=\"constant:filter\" /> <mapping target=\"transport:filter-arg-0\" source=\"parameter:searchName\" /> <mapping target=\"transport:filter-arg-1\" source=\"parameter:searchEmail\" /> <mapping target=\"transport:result-attributes\" source=\"constant:result-attributes\" /> </mapping> </serviceMapping> </inbound> <outbound> <parameters> <parameter> <id>searchResults</id> <name>Search Results</name> <description>The list of search results</description> <type>LIST</type> <parameters> <parameter> <id>name</id> <name>Employee Name</name> <description>The employee's name.</description> <type>STRING</type> </parameter> <parameter> <id>email</id> <name>Employee Email</name> <description>The employee's email address.</description> <type>STRING</type> </parameter> <parameter> <id>phone</id> <name>Employee Phone Number</name> <description>The employee's phone number.</description> <type>STRING</type> </parameter> </parameters> </parameter> </parameters> <serviceMapping> <mapping> <mapping target=\"parameter:searchResults\" source=\"transport:resultXML\" sourceRef=\"searchresults/searchresult\" sourceType=\"xml\"> <mapping target=\"parameter:name\" sourceRef=\"cn\" sourceType=\"xml\" /> <mapping target=\"parameter:email\" sourceRef=\"email\" sourceType=\"xml\" /> <mapping target=\"parameter:phone\" sourceRef=\"telephone\" sourceType=\"xml\" /> </mapping> </mapping> </serviceMapping> </outbound> </serviceDescription> Parent topic: Service Oriented Architecture \u2013 Service Transport","title":"Sample LDAP query Service Transport"},{"location":"ser_provide_groups_of_dynamic_services.html","text":"Providing Groups of Dynamic Services You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Adding a Service Catalog Group A Service Catalog Group provides a way to group web services in HCL Leap. Adding a Service Catalog A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. Parent topic: Adding services","title":"Providing Groups of Dynamic Services"},{"location":"ser_provide_groups_of_dynamic_services.html#ser_provide_groups_of_dynamic_services","text":"You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Adding a Service Catalog Group A Service Catalog Group provides a way to group web services in HCL Leap. Adding a Service Catalog A Service Catalog serves two purposes. First, a Service Catalog is a programmatic mechanism to dynamically provide Service Descriptions to HCL Leap instead of using static XML files. Second, a Service Catalog is linked to a Service Catalog Group and provides a mechanism to assign Service Descriptions to a specific Service Catalog Group. Parent topic: Adding services","title":"Providing Groups of Dynamic Services"},{"location":"ser_setup_development_environment.html","text":"Setting up your development environment The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Gather Leap JAR files Use the following script, or a similar script, to extract appropriate .jar files from the Leap .ear file. If you use the following script, update the variables to match your system. The extracted JAR files are placed in the %EXTRACT_DIR%\\Leap_bundles\\ directory. SET EXTRACT_DIR=C:\\temp\\Builder_extract SET JAVA_BIN=C:\\hcl-java-sdk-60-win-i386\\bin SET LEAP_INSTALL_DIR=C:\\Program Files\\HCL\\Leap Server\\8.0\\Leap SET LEAP_VERSION=8.0.0.1013 SET FSP_VERSION=8.0.0.494 mkdir \"%EXTRACT_DIR%\" mkdir \"%EXTRACT_DIR%\\fsp\" mkdir \"%EXTRACT_DIR%\\core\" mkdir \"%EXTRACT_DIR%\\Leap_bundles\" copy \"%LEAP_INSTALL_DIR%\\deploy\\hcl-leap.ear\" \"%EXTRACT_DIR%\" cd \"%EXTRACT_DIR%\" \"%JAVA_BIN%\\jar\" xvf hcl-leap.ear \"%JAVA_BIN%\\jar\" xvf leap.war copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\fsp\" copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\core\" cd \"%EXTRACT_DIR%\\fsp\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPJARS.jar copy ibm.fsp.core.service.framework-%FSP_VERSION%.jar ..\\Leap_bundles cd \"%EXTRACT_DIR%\\core\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPBUNDLES.jar copy ibm.nitro.services-%LEAP_VERSION%.jar ..\\Leap_bundles Create a Plug-in Project In the Eclipse IDE, an OSGi bundle is also referred to as a plug-in. Start a new Plug-in Project to create an OSGi bundle: Select File > New > Project... > Plug-in Development > Plug-in Project . In the Target Platform section, select an OSGi framework: , and select Equinox . Add Leap Jars to the Build Path To compile your custom bundle against the Leapjars extracted in Step 1, add them to the build path by changing the Target Platform that your plug-in builds against: Select Window > Preferences > Plug-in Development > Target Platform . Select Running Platform (Active) > Edit > Locations > Add... > ****. Enter the complete path of the Leap_bundles directory from Step 1. Select Finish . Implement any classes and supporting files as needed. Refer to other documents and JavaDocs. Package your Plug-In and Deploy Package your code as a .jar file. The typical structure for an OSGi bundle is shown here: / META-INF/ MANIFEST.MF OSGI-INF/ Service1.xml Service2.xml com/ mycompany/ services/ hclLeap Service1.class Service2.class If you are using the Eclipse IDE, you can package your bundle with the Export feature: Make sure the build.properties file for the project, which is created automatically for a Plug-in Project, includes all the resources you want included in your bundle. For example, make sure the OSGI-INF directory and its contents are included. Right-click your Plug-in project. Select Export > Plug-in Development > Deployable plug-ins and fragments . Select your Plug-in project. Specify an output directory. Click Finish . On the Leap server, put the exported .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non-Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case sensitive. Debugging If you start the Leap server in debug mode, you can attach your debugger to the running JVM and step through your own code. Also, you can enable debug logging or finer logging for the com.ibm.form.nitro.service.services package to get more information from the Leap code. Refer to the documentation for WebSphere\u00ae Application Server for more details. Do not run a production system in debug mode or with debug logging enabled. Enabling these options degrades performance. Parent topic: Adding services","title":"Setting up your development environment"},{"location":"ser_setup_development_environment.html#ser_setup_development_environment","text":"The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Gather Leap JAR files Use the following script, or a similar script, to extract appropriate .jar files from the Leap .ear file. If you use the following script, update the variables to match your system. The extracted JAR files are placed in the %EXTRACT_DIR%\\Leap_bundles\\ directory. SET EXTRACT_DIR=C:\\temp\\Builder_extract SET JAVA_BIN=C:\\hcl-java-sdk-60-win-i386\\bin SET LEAP_INSTALL_DIR=C:\\Program Files\\HCL\\Leap Server\\8.0\\Leap SET LEAP_VERSION=8.0.0.1013 SET FSP_VERSION=8.0.0.494 mkdir \"%EXTRACT_DIR%\" mkdir \"%EXTRACT_DIR%\\fsp\" mkdir \"%EXTRACT_DIR%\\core\" mkdir \"%EXTRACT_DIR%\\Leap_bundles\" copy \"%LEAP_INSTALL_DIR%\\deploy\\hcl-leap.ear\" \"%EXTRACT_DIR%\" cd \"%EXTRACT_DIR%\" \"%JAVA_BIN%\\jar\" xvf hcl-leap.ear \"%JAVA_BIN%\\jar\" xvf leap.war copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\fsp\" copy \"WEB-INF\\lib\\ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar\" \"%EXTRACT_DIR%\\core\" cd \"%EXTRACT_DIR%\\fsp\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.fsp-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPJARS.jar copy ibm.fsp.core.service.framework-%FSP_VERSION%.jar ..\\Leap_bundles cd \"%EXTRACT_DIR%\\core\" \"%JAVA_BIN%\\jar\" xvf ibm.nitro.packaging.onejar.core-%LEAP_VERSION%.jar \"%JAVA_BIN%\\jar\" xvf FSPBUNDLES.jar copy ibm.nitro.services-%LEAP_VERSION%.jar ..\\Leap_bundles Create a Plug-in Project In the Eclipse IDE, an OSGi bundle is also referred to as a plug-in. Start a new Plug-in Project to create an OSGi bundle: Select File > New > Project... > Plug-in Development > Plug-in Project . In the Target Platform section, select an OSGi framework: , and select Equinox . Add Leap Jars to the Build Path To compile your custom bundle against the Leapjars extracted in Step 1, add them to the build path by changing the Target Platform that your plug-in builds against: Select Window > Preferences > Plug-in Development > Target Platform . Select Running Platform (Active) > Edit > Locations > Add... > ****. Enter the complete path of the Leap_bundles directory from Step 1. Select Finish . Implement any classes and supporting files as needed. Refer to other documents and JavaDocs. Package your Plug-In and Deploy Package your code as a .jar file. The typical structure for an OSGi bundle is shown here: / META-INF/ MANIFEST.MF OSGI-INF/ Service1.xml Service2.xml com/ mycompany/ services/ hclLeap Service1.class Service2.class If you are using the Eclipse IDE, you can package your bundle with the Export feature: Make sure the build.properties file for the project, which is created automatically for a Plug-in Project, includes all the resources you want included in your bundle. For example, make sure the OSGI-INF directory and its contents are included. Right-click your Plug-in project. Select Export > Plug-in Development > Deployable plug-ins and fragments . Select your Plug-in project. Specify an output directory. Click Finish . On the Leap server, put the exported .jar file in one the following directories or in a subdirectory of one of the following directories: Windows\u2122: any drive:\\HCL\\Leap\\extensions\\ Non-Windows: /opt/HCL/Leap/extensions/ Important notes on directories: If the extensions directory does not exist, then the Leap server must be restarted after the directory is created. /opt/HCL/Leap/ is not case sensitive. Debugging If you start the Leap server in debug mode, you can attach your debugger to the running JVM and step through your own code. Also, you can enable debug logging or finer logging for the com.ibm.form.nitro.service.services package to get more information from the Leap code. Refer to the documentation for WebSphere\u00ae Application Server for more details. Do not run a production system in debug mode or with debug logging enabled. Enabling these options degrades performance. Parent topic: Adding services","title":"Setting up your development environment"},{"location":"services_toc.html","text":"Adding services The following topics describe how to add services to your Leap applications. Setting up your development environment The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Providing Groups of Dynamic Services You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Service Oriented Architecture \u2013 Service Transport HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Parent topic: Extending","title":"Adding services"},{"location":"services_toc.html#addingservicestofeb","text":"The following topics describe how to add services to your Leap applications. Setting up your development environment The HCL Leap runs within an OSGi framework environment. Code that extends the Leap needs to be packaged within OSGi bundles to run. Any Java\u2122 development environment can be used to create custom bundles, but using the Eclipse IDE built-in OSGi tooling is recommended to minimize effort and errors. Providing Groups of Dynamic Services You can develop, deploy, and use Service Catalogs and Service Catalog Groups within theHCL Leap environment. Service Oriented Architecture \u2013 Service Transport HCL Leap has a powerful, and extensible, Service Oriented Architecture (SOA) integration feature. The foundation of this feature is the Service Transport. Parent topic: Extending","title":"Adding services"},{"location":"sub_adding_stages_toc.html","text":"Adding Stages to an application It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Each form in an HCL Leap application can have multiple stages. By default, a newly created form has two stages: Start \u2013 The initial state of every form. Once the form transitions away from the Start stage it cannot return. Submitted \u2013 A submitted form is stored in this stage. Forms in this stage may be updated by users with permission. Additional stages can be added and configured by clicking the plus (+) icon that appears when hovering over a Stage box or by clicking the Add Stage button in the Properties panel; however, the Start stage is always required and is unique. Actions Each stage can have multiple stage actions. Each stage action presents itself as a button in the form's footer area and therefore the terms \u201cstage action\u201d, and \u201cstage button\u201d are used interchangeably. There are three types of stage actions: Submit \u2013 Submits the form data, and transitions the form to the next stage. A single stage can have multiple Submit buttons. Each Submit button may have different settings, and may transition the form to a different next stage. A stage that does not have any Submit buttons will be depicted as an \"End\" stage with a red square icon, however stage buttons may be added at any time. Save Draft \u2013 Temporarily stores the form's data so the user can return later to complete the rest of the form. A single stage can have multiple Save Draft buttons. Each button may have different settings, such as a unique message for the user. A stage is not required to have a Save Draft button. For more information, see Saving work as Draft . Cancel \u2013 Returns the form to its original state before the end-user started making modifications. The form remains within the same stage. A single stage can have only one Cancel button. A stage is not required to have a Cancel button. Every newly created stage, including the Start stage, is given by default a single Submit button and Cancel button as a starting point. Activities During the transition from one stage to the next, there are several activities that can take place: Send an Email, Call a Service, and Assign Users. The Visibility tab also allows the application designer to disable or hide any form item, or entire page, within a specific stage for a particular form. Leap provides control over which users can access or modify the Form's data at any particular stage. The setting of these permissions is done by clicking on a stage and navigating to Permissions , or by clicking the Visibility tab. For more information, see Application and Security overview . Branching Each stage action may define one (or more) conditional branch by clicking on the diamond icon below the stage object in the workflow diagram, or with the action selected by clicking on + Add conditional branch . A branch defines an alternate path the form takes when submitted. A branch must define a condition that determines when it will be followed. Branch conditions may be based on a user in/not in a role or the value of an item on the form. Each branch may have its own distinct activities that are executed when followed. Editing the message a user sees upon form submission The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. Redirecting users after form submission The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. Sending an email after a user submits a form You can send email notifications to managers or other users by adding an activity to the Submit button in a form. Populating information upon form submission using a web service Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. Assigning users to a role after submission You can dynamically assign roles to a form after form submission. Configuring behavior of a form on submission Once a user completes an HCL Leap form, you can send them to another stage of that form. Saving work as a draft Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. Scenario: hidden or read-only form items in Stages This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. Saving a PDF to a file location Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. Parent topic: Creating and managing applications","title":"Adding Stages to an application"},{"location":"sub_adding_stages_toc.html#configuringwhatusersseeaftersubmittingaform","text":"It is often desirable to have an application, or form, transition through a set of phases or stages. At each stage the form might be used by different people in different roles. The form also might be presented in a slightly different manner in each stage, such as having some items or pages hidden, or in a read-only state. Each form in an HCL Leap application can have multiple stages. By default, a newly created form has two stages: Start \u2013 The initial state of every form. Once the form transitions away from the Start stage it cannot return. Submitted \u2013 A submitted form is stored in this stage. Forms in this stage may be updated by users with permission. Additional stages can be added and configured by clicking the plus (+) icon that appears when hovering over a Stage box or by clicking the Add Stage button in the Properties panel; however, the Start stage is always required and is unique.","title":"Adding Stages to an application"},{"location":"sub_adding_stages_toc.html#section_gcf_vqw_rvb","text":"Each stage can have multiple stage actions. Each stage action presents itself as a button in the form's footer area and therefore the terms \u201cstage action\u201d, and \u201cstage button\u201d are used interchangeably. There are three types of stage actions: Submit \u2013 Submits the form data, and transitions the form to the next stage. A single stage can have multiple Submit buttons. Each Submit button may have different settings, and may transition the form to a different next stage. A stage that does not have any Submit buttons will be depicted as an \"End\" stage with a red square icon, however stage buttons may be added at any time. Save Draft \u2013 Temporarily stores the form's data so the user can return later to complete the rest of the form. A single stage can have multiple Save Draft buttons. Each button may have different settings, such as a unique message for the user. A stage is not required to have a Save Draft button. For more information, see Saving work as Draft . Cancel \u2013 Returns the form to its original state before the end-user started making modifications. The form remains within the same stage. A single stage can have only one Cancel button. A stage is not required to have a Cancel button. Every newly created stage, including the Start stage, is given by default a single Submit button and Cancel button as a starting point.","title":"Actions"},{"location":"sub_adding_stages_toc.html#section_rjf_wqw_rvb","text":"During the transition from one stage to the next, there are several activities that can take place: Send an Email, Call a Service, and Assign Users. The Visibility tab also allows the application designer to disable or hide any form item, or entire page, within a specific stage for a particular form. Leap provides control over which users can access or modify the Form's data at any particular stage. The setting of these permissions is done by clicking on a stage and navigating to Permissions , or by clicking the Visibility tab. For more information, see Application and Security overview .","title":"Activities"},{"location":"sub_adding_stages_toc.html#section_hjd_3rw_rvb","text":"Each stage action may define one (or more) conditional branch by clicking on the diamond icon below the stage object in the workflow diagram, or with the action selected by clicking on + Add conditional branch . A branch defines an alternate path the form takes when submitted. A branch must define a condition that determines when it will be followed. Branch conditions may be based on a user in/not in a role or the value of an item on the form. Each branch may have its own distinct activities that are executed when followed. Editing the message a user sees upon form submission The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. Redirecting users after form submission The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. Sending an email after a user submits a form You can send email notifications to managers or other users by adding an activity to the Submit button in a form. Populating information upon form submission using a web service Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. Assigning users to a role after submission You can dynamically assign roles to a form after form submission. Configuring behavior of a form on submission Once a user completes an HCL Leap form, you can send them to another stage of that form. Saving work as a draft Some applications cannot be completed by the user in one session. If your application is very large or complicated, you can allow users to save their work as a draft before submitting it. Scenario: hidden or read-only form items in Stages This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. Saving a PDF to a file location Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. Parent topic: Creating and managing applications","title":"Branching"},{"location":"sub_assigning_a_user.html","text":"Assigning users to a role after submission You can dynamically assign roles to a form after form submission. You can assign users to roles dynamically using a web service with data, or metadata captured from the form. Assign an approver or reviewer by creating rules based on the data from the form, or by who submitted the form. For example, you can create a workflow application with rules to determine who can send notification by email. To use the following instructions, you must have user Roles, such as \u201cManager\u201d, set to Open . For more information on setting roles, see Application and Security overview . Click the Workflow tab. Select a \"Submit\" stage in the diagram. Select the Activities tab. Click Add Activity . In the Activity Settings panel, select Assign Users . Assign By Service Call: To assign users via a service call, select Service Call . The Assign Users (by Service Call) window opens. If there are no existing activities, you see: There are no activities. Click here to create one. Select a service from the list in the Service tab. Services in the Service tab are populated by your administrator. To use these instructions, you require a service that is able to search for a user\u2019s manager. Click the Inputs tab. Map form fields to the input parameters of the service. For example, if your application asks for the user\u2019s name: Select Name from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. For example, you can map the outputs of the service to the Manager role: Select Manager Name from the Select source: window. Expand the directory so you see Member > Members . Select Members from the Select target : window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Now, the manager of the user who created the form can approve the form, but no other manager can do so. Assign By Value in Form: You can also assign users using the Value in Form option, such as a Single Line Entry. This option allows for more flexibility in determining what qualifies a user's assigned role. To assign a user a role from a form field, complete the following steps. Follow steps 1-4 in the task above. Select Value in Form . The applicable fields on the form appear in the \"Value in Form\" dropdown. Select the field that contains the value that represents the user to assign. Select the Role from the dropdown to which the user will be assigned. Parent topic: Adding Stages to an application","title":"Assigning users to a role after submission"},{"location":"sub_assigning_a_user.html#assigningausertoaformaftersubmission","text":"You can dynamically assign roles to a form after form submission. You can assign users to roles dynamically using a web service with data, or metadata captured from the form. Assign an approver or reviewer by creating rules based on the data from the form, or by who submitted the form. For example, you can create a workflow application with rules to determine who can send notification by email. To use the following instructions, you must have user Roles, such as \u201cManager\u201d, set to Open . For more information on setting roles, see Application and Security overview . Click the Workflow tab. Select a \"Submit\" stage in the diagram. Select the Activities tab. Click Add Activity . In the Activity Settings panel, select Assign Users . Assign By Service Call: To assign users via a service call, select Service Call . The Assign Users (by Service Call) window opens. If there are no existing activities, you see: There are no activities. Click here to create one. Select a service from the list in the Service tab. Services in the Service tab are populated by your administrator. To use these instructions, you require a service that is able to search for a user\u2019s manager. Click the Inputs tab. Map form fields to the input parameters of the service. For example, if your application asks for the user\u2019s name: Select Name from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. For example, you can map the outputs of the service to the Manager role: Select Manager Name from the Select source: window. Expand the directory so you see Member > Members . Select Members from the Select target : window. Click the connector icon located between the two windows. The connected source and target are displayed in the Assigned Inputs section of the page. Now, the manager of the user who created the form can approve the form, but no other manager can do so. Assign By Value in Form: You can also assign users using the Value in Form option, such as a Single Line Entry. This option allows for more flexibility in determining what qualifies a user's assigned role. To assign a user a role from a form field, complete the following steps. Follow steps 1-4 in the task above. Select Value in Form . The applicable fields on the form appear in the \"Value in Form\" dropdown. Select the field that contains the value that represents the user to assign. Select the Role from the dropdown to which the user will be assigned. Parent topic: Adding Stages to an application","title":"Assigning users to a role after submission"},{"location":"sub_editing_the_message_a_user_sees.html","text":"Editing the message a user sees upon form submission The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. In the Workflow tab, you can choose what message users see when they submit a form by editing the properties of the Submit button. Click the Workflow tab. Open the properties for any Submit button in any stage. You can control the message a user sees for every action button. Enter your message in the Action Completion Message field. When the user submits a form, they are shown the text you entered. Note: To show no dialog clear the message field. Parent topic: Adding Stages to an application","title":"Editing the message a user sees upon form submission"},{"location":"sub_editing_the_message_a_user_sees.html#editingthemessageauserseesaftercompletingaform","text":"The administrator of an HCL Leap application can edit the completion message a user sees when submitting a form. In the Workflow tab, you can choose what message users see when they submit a form by editing the properties of the Submit button. Click the Workflow tab. Open the properties for any Submit button in any stage. You can control the message a user sees for every action button. Enter your message in the Action Completion Message field. When the user submits a form, they are shown the text you entered. Note: To show no dialog clear the message field. Parent topic: Adding Stages to an application","title":"Editing the message a user sees upon form submission"},{"location":"sub_editing_the_url_a_user_sees.html","text":"Redirecting users after form submission The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. You can set Leap to redirect the user to another application, URL, form, or app page upon form submission. Redirecting users to a secondary URL is useful if the user must complete another application that is directly related to the first. The user is redirected to the second URL in a dialog when the first form is submitted. Click the Workflow tab. Select the desired Stage button in the diagram. In the Properties tab , under On action completion redirect to: , select one of the following options from the drop-down: Another Leap application Website URL A Form or App Page Parent topic: Adding Stages to an application","title":"Redirecting users after form submission"},{"location":"sub_editing_the_url_a_user_sees.html#editingtheurlauserseesaftersubmittingaform","text":"The administrator of an HCL Leap application can add a URL that is triggered when a form is submitted. You can set Leap to redirect the user to another application, URL, form, or app page upon form submission. Redirecting users to a secondary URL is useful if the user must complete another application that is directly related to the first. The user is redirected to the second URL in a dialog when the first form is submitted. Click the Workflow tab. Select the desired Stage button in the diagram. In the Properties tab , under On action completion redirect to: , select one of the following options from the drop-down: Another Leap application Website URL A Form or App Page Parent topic: Adding Stages to an application","title":"Redirecting users after form submission"},{"location":"sub_hidden_or_read_only_items_in_stages.html","text":"Scenario: hidden or read-only form items in Stages This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. The Vacation Request application is built with two sections: the top section contains fields the employee fills out to schedule vacation time. The bottom section of the form contains information for the manager's approval or rejection. When the users complete the form, they do not need to see the manager's portion. When managers review the submitted form, they must not modify the employee's submitted portion. In both parts of this example, marking items as hidden, or read-only is valuable. Tip: By building the user's and manager's portions of the form inside a Section, you can apply the hidden or read-only values to the entire section. Without using Sections, you must set the property for each individual form item. The Vacation Request form has three Stages: Start : The beginning phase where users view and complete the form for submission Approval : This stage was created by the form designer. When the user submits the form, it moves to the Approval stage and is processed by a manager. Completed : When the manager approves, or denies the request, the submitter is notified, and the form is considered closed. When the form is viewed in the Workflow tab, it is identical to how it appears the design environment. The main differences are the icon buttons on the upper right of each form item, and the addition of workflow buttons at the bottom of the form. You automatically view the section in the Start stage. For each form item, the following icons are available: : The Visibility icon. When clicked, this icon hides form items or a section on a particular Stage. : The Read-Only icon. When clicked, this icon makes a form item or section Read-Only in a Stage. To make the Vacation Request form hide the Manager's section of the form: In the Start stage, scroll down to the Manager's section and click the Visibility icon. A red line appears diagonally through the icon, representing that the section is now hidden from view in this stage. If you save and preview the form, the Manager's section is not visible. To make the user's portion of the form read-only: In the Approval stage, go to the top of the user's portion of the form. Click the Read-Only icon. A red line appears diagonally through the icon, representing that the section is now read-only. Using a basic example, this scenario described how to set properties on form items within Stages. Setting items or sections as hidden or read-only simplifies form design, yet allows for complex processes to be built into one form. Parent topic: Adding Stages to an application","title":"Scenario -- hidden or read-only form items in Stages"},{"location":"sub_hidden_or_read_only_items_in_stages.html#hiddenreadonlyitems","text":"This scenario uses a Vacation Request application to describe how to use multiple Stages to make sections of a form that is either hidden, or read-only. The Vacation Request application is built with two sections: the top section contains fields the employee fills out to schedule vacation time. The bottom section of the form contains information for the manager's approval or rejection. When the users complete the form, they do not need to see the manager's portion. When managers review the submitted form, they must not modify the employee's submitted portion. In both parts of this example, marking items as hidden, or read-only is valuable. Tip: By building the user's and manager's portions of the form inside a Section, you can apply the hidden or read-only values to the entire section. Without using Sections, you must set the property for each individual form item. The Vacation Request form has three Stages: Start : The beginning phase where users view and complete the form for submission Approval : This stage was created by the form designer. When the user submits the form, it moves to the Approval stage and is processed by a manager. Completed : When the manager approves, or denies the request, the submitter is notified, and the form is considered closed. When the form is viewed in the Workflow tab, it is identical to how it appears the design environment. The main differences are the icon buttons on the upper right of each form item, and the addition of workflow buttons at the bottom of the form. You automatically view the section in the Start stage. For each form item, the following icons are available: : The Visibility icon. When clicked, this icon hides form items or a section on a particular Stage. : The Read-Only icon. When clicked, this icon makes a form item or section Read-Only in a Stage. To make the Vacation Request form hide the Manager's section of the form: In the Start stage, scroll down to the Manager's section and click the Visibility icon. A red line appears diagonally through the icon, representing that the section is now hidden from view in this stage. If you save and preview the form, the Manager's section is not visible. To make the user's portion of the form read-only: In the Approval stage, go to the top of the user's portion of the form. Click the Read-Only icon. A red line appears diagonally through the icon, representing that the section is now read-only. Using a basic example, this scenario described how to set properties on form items within Stages. Setting items or sections as hidden or read-only simplifies form design, yet allows for complex processes to be built into one form. Parent topic: Adding Stages to an application","title":"Scenario: hidden or read-only form items in Stages"},{"location":"sub_saving_pdf.html","text":"Saving a PDF to a file location Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. File locations are whitelisted in the Leap_config.properties. Your file location can be any non-root directory. For example: storageBaseDirWhiteList = /Leap/PDFs Multiple locations can be whitelisted by separating them with a comma: storageBaseDirWhiteList = /Leap/locationA , /Leap/locationB The option for PDF Save Location appears in your PDF fill service configuration if a location has been whitelisted as described above. You need to map the location you want to save to the option in your service configuration. This can be done as an input item from the form or a constant (shown in the following graphic). The path must match exactly to what is whitelisted and the location must include the file name and path. If the file already exists a duplicate will be made - for example, sample.pdf, sample(1).pdf, etc. Parent topic: Adding Stages to an application","title":"Saving a PDF to a file location"},{"location":"sub_saving_pdf.html#savingpdf","text":"Determining where you want to save your filled PDF is useful considering how many processes \"pick up\" documents from watched folders. Designers have the option of saving the file to a specific location, as an attachment to the Leap submission record, or both. File locations are whitelisted in the Leap_config.properties. Your file location can be any non-root directory. For example: storageBaseDirWhiteList = /Leap/PDFs Multiple locations can be whitelisted by separating them with a comma: storageBaseDirWhiteList = /Leap/locationA , /Leap/locationB The option for PDF Save Location appears in your PDF fill service configuration if a location has been whitelisted as described above. You need to map the location you want to save to the option in your service configuration. This can be done as an input item from the form or a constant (shown in the following graphic). The path must match exactly to what is whitelisted and the location must include the file name and path. If the file already exists a duplicate will be made - for example, sample.pdf, sample(1).pdf, etc. Parent topic: Adding Stages to an application","title":"Saving a PDF to a file location"},{"location":"sub_sending_a_user_to_another_url.html","text":"Configuring behavior of a form on submission Once a user completes an HCL Leap form, you can send them to another stage of that form. After a user submits a form, you can show them the next stage of a form. For example, to confirm what they submitted by pressing a confirmation button, or to show a read-only copy of the information they submitted. You can also limit authenticated users from submitting multiple forms. Click the Workflow tab . Click the area outside the outline in the Workflow view. The form Properties displays on the side of the screen. In the Upon Submission : section, choose one of the following options: Show the success message page Show the success message in a dialog and then display a new form Show the success message in a dialog and then display the next stage of the form Parent topic: Adding Stages to an application","title":"Configuring behavior of a form on submission"},{"location":"sub_sending_a_user_to_another_url.html#sendingausertoanotherurlaftercompletingaform","text":"Once a user completes an HCL Leap form, you can send them to another stage of that form. After a user submits a form, you can show them the next stage of a form. For example, to confirm what they submitted by pressing a confirmation button, or to show a read-only copy of the information they submitted. You can also limit authenticated users from submitting multiple forms. Click the Workflow tab . Click the area outside the outline in the Workflow view. The form Properties displays on the side of the screen. In the Upon Submission : section, choose one of the following options: Show the success message page Show the success message in a dialog and then display a new form Show the success message in a dialog and then display the next stage of the form Parent topic: Adding Stages to an application","title":"Configuring behavior of a form on submission"},{"location":"sub_sending_an_email.html","text":"Sending an email after a user submits a form You can send email notifications to managers or other users by adding an activity to the Submit button in a form. You can send one or more email on a Submit action, or send one email to multiple email addresses. Click the Workflow tab. Select the desired Stage button in the diagram. The Properties panel displays on the side of the screen. In the Activities tab, click Add Activity . Select Send an Email. In the Activity Settings panel, you can: Manually add the email address of the recipient, a subject line, and a message, if required. Populate each of the fields with information from the form. Under each field, click Insert and select a form item from the list. Address an email to everyone in a predefined role by clicking Insert Item > Roles , and selecting the role that you want. Parent topic: Adding Stages to an application","title":"Sending an email after a user submits a form"},{"location":"sub_sending_an_email.html#sendinganemailafterauserhassubmittedaform","text":"You can send email notifications to managers or other users by adding an activity to the Submit button in a form. You can send one or more email on a Submit action, or send one email to multiple email addresses. Click the Workflow tab. Select the desired Stage button in the diagram. The Properties panel displays on the side of the screen. In the Activities tab, click Add Activity . Select Send an Email. In the Activity Settings panel, you can: Manually add the email address of the recipient, a subject line, and a message, if required. Populate each of the fields with information from the form. Under each field, click Insert and select a form item from the list. Address an email to everyone in a predefined role by clicking Insert Item > Roles , and selecting the role that you want. Parent topic: Adding Stages to an application","title":"Sending an email after a user submits a form"},{"location":"sub_use_service_to_populate_on_form_submission.html","text":"Populating information upon form submission using a web service Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. HCL Leap can look up user information for you using a web service call. For example, you can connect a manager with a user submitted form using an intranet directory search. Click the Workflow tab. Click the Add Activity button in a submit button on the diagram, or select the button and click Add Activity in the side panel. In Activity Settings , select Call a Service . For this example, select the directory for your company intranet. Click Configure Service . Click the Inputs tab. Map the form fields to the input parameters of the service. Select Current User from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. Map the outputs of the service to the Manager role. Select Manager Name from the Select source: window. In the Select target: window, choose a form item from the list. Click the connector icon located between the two windows to link the source and the target. After the source and target are linked, they appear in the Assigned Outputs area of the screen. Click OK to exit the Call a Service window. When the user clicks Submit , Leap calls a service to populate the manager\u2019s name into the selected form item. Parent topic: Adding Stages to an application","title":"Populating information upon form submission using a web service"},{"location":"sub_use_service_to_populate_on_form_submission.html#sendingamessagetoauserusingaservice","text":"Web services can perform many functions, such as sending data to other forms or applications. The following instructions describe how to use a web service to add information to a form automatically after it is submitted. HCL Leap can look up user information for you using a web service call. For example, you can connect a manager with a user submitted form using an intranet directory search. Click the Workflow tab. Click the Add Activity button in a submit button on the diagram, or select the button and click Add Activity in the side panel. In Activity Settings , select Call a Service . For this example, select the directory for your company intranet. Click Configure Service . Click the Inputs tab. Map the form fields to the input parameters of the service. Select Current User from the Select source: window. Select Search Name from the Select target: window. Click the connector icon located between the two windows to link the source and the target. The connected source and target are displayed in the Assigned Inputs section of the page. Click the Outputs tab. Map the outputs of the service to the Manager role. Select Manager Name from the Select source: window. In the Select target: window, choose a form item from the list. Click the connector icon located between the two windows to link the source and the target. After the source and target are linked, they appear in the Assigned Outputs area of the screen. Click OK to exit the Call a Service window. When the user clicks Submit , Leap calls a service to populate the manager\u2019s name into the selected form item. Parent topic: Adding Stages to an application","title":"Populating information upon form submission using a web service"},{"location":"tr_troubleshooting.html","text":"Troubleshooting HCL Leap The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues. Table 1. Known limitations of Leap Limitations Resolution HCL Connections Community Surveys are not available in Leap 8.6.0 and later versions. To add Surveys to your Connections application, you must use Leap 8.5 with Connections 4.5, or Leap 8.5.1 with Connections 5.0. Form item size limitations. When building a Leap application, you must not exceed the following size limits You cannot have more than 1000 data items in your form You cannot have more than 200 data items in your form DB2\u00ae has a page size limit for tables of 32kb. Each data item in a Leap application has a size limit. For example: - Single Line \u2013 200 bytes and Multiple line - Leap uses a CLOB data type to store the value of each multiple line entry data item. The limit to the number of characters stored in a CLOB is dependent on language and character set. The English limit is approximately 1 million characters.If the content of any given multiple line field exceeds the database allowance, you see a \u201c500 Internal Server Error\u201d message, and form submission fails. The full message is stored in the system log files. - Currency/Number \u2013 8 bytes - Attachment \u2013 108 bytes - Select One and Survey \u2013 size is based on the number of choices and questions If you receive the error The row length of the table exceeded a limit of \u201c32677\u201d bytes. (Table space \u201c\u201d.). SQLCODE=-670 , your form exceeds the maximum size. You must remove items from the form, or break the application into multiple forms. It is important to note that items create database columns, and contribute to the limit even when they are hidden on the form. Note: This is no longer applicable as of DB2 10.5 and newer, due to extended row size. Limit on the number of embedded sections. When designing a form in Leap, you can embed sections within sections to achieve the wanted layout. Do not embed more than 5 sections within one another. When using more than five embedded sections, it becomes difficult to select the action icons for a specific section. Exceeding 5 sections also results in forms not rendering properly. Printing Leap content Leap provides a print button. If there is no print button in the contents of your form, the web browser print function does not work well. To print out the contents shown in your browser, uses a screen capture. For more information, see Taking a screen capture in Windows\u2122 . Adding Groups to Leap applications. Leap cannot resolve users if they are members of nested groups. For example, your company LDAP contains a super group called \u201cManagers\u201d. This super group consists of several smaller groups, such as \u201cSupervisors\u201d, and \u201cShift Leaders\u201d. In the Access tab of Leap, you must add the \u201cSupervisors\u201d, and \u201cShift Leaders\u201d as groups individually, rather than using the \u201cManagers\u201d super group. Table 2. Leap Best Practices Issue Resolution Canonical URLs versus short URL in the ibm.nitro.NitroConfig.serverURI property of the Leap_config.properties file When accessing Leap, the ibm.nitro.NitroConfig.serverURI entry setting is different from the browser address base URI. If you are using a short URL format to design your application, you must set ibm.nitro.NitroConfig.serverURI entry with the canonical URL. For example, if your short URL is http://localhost:9080/apps, the canonical URL for the user is http://hostname:9080/apps. Using two different URLs means users must sign on twice, as the short URL is replaced by the canonical URL. It is a best practice to use the canonical URL whenever possible. Web Link and Website form items. When using the Web Link or Website form items in your application, ensure that you enter the correct URL to get the runtime result. If the link goes to an external site, you must enter the URL with a URL protocol. For example, enter the URL as http://www.ibm.com, rather than www.ibm.com. - If you enter the URL with no protocol, then the URL is considered relative the current location. The prefix for the relative URL is attached, which might result in errors. - If you enter the URL with a single slash '/', it resolves to a URL relative to the root of the host. When using the Website item in a Leap the URLs entered must begin with: http://, https://, ftp://, or ftps:// Leap users and groups When using WebSphere\u00ae Application Server to directly maintain users and groups, it is important to maintain integrity between the WebSphere Application Server users and Leap. If you change a user definition in WebSphere Application Server, and that user is used in Leap, the relationship might be corrupted. The user would no longer be able to access Leap. Uploading files in Leap If an application requires supplemental files, it is a best practice to use reference URLs, rather than uploading the files directly into the application. The option to include reference URLs is available in the Upload dialog from the Settings tab. Leap Preview mode To use the Leap Preview feature, you must ensure that your browser is configured to allow all pop-up windows. If your browser does not allow pop-up windows, users cannot see the preview window. Browser cookies must be enabled. To successfully log in Leap, you must have browser cookie enabled. If you have deployed Leap with WebSphere Application Server Community Edition as your application server, you must ensure that you have only one Leap window or tab running in your browser at any time. Attempting to log in to multiple Leap windows or tabs results in login errors. Table 3. Troubleshooting Leap errors Problem Resolution Building Leap applications in Safari with bidirectional languages Designing Leap applications with the Safari locale set to a bidirectional language results in extraneous horizontal scroll bars shown in each form cell. These scroll bars do not affect the rendering of the completed form at run time. Allowing non-ASCII administrative login characters If the Leap administrative user name or password contains non-ASCII characters, you must complete an additional configuration task. In WebSphere Application Server: 1. Log in to WebSphere Application Server administrative console, and select the server. 2. On the settings page for the selected application server, go to Server Infrastructure > Java and Process Management . 3. Go to Process Definition > Java Virtual Machine , and specify -Dclient.encoding.override=UTF-8 for Generic JVM Arguments. 4. Click OK , then Save 5. Restart the application server Table 4. General Leap information Topic Additional Information Using the Upgrade link on the Manage tab. You can upgrade an application with a new application definition using theLeap Upgrade feature. Upgrading replaces all access rules, business rules, formulas, interface options, Stages definitions, JavaScript\u2122, images, and service mappings with those in the new version. It then updates the data base definition to the model described by the new application, and merges existing data into that model. If data elements were removed in the new version, or their unique identifiers changed, the data associated with those elements is not migrated to the new application. Data elements that did not exist in the previous version, but were added in the new version, are added as columns to existing data records with a NULL value. Parent topic: Troubleshooting","title":"Troubleshooting Leap"},{"location":"tr_troubleshooting.html#troubleshooting-hcl-leap","text":"The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues. Table 1. Known limitations of Leap Limitations Resolution HCL Connections Community Surveys are not available in Leap 8.6.0 and later versions. To add Surveys to your Connections application, you must use Leap 8.5 with Connections 4.5, or Leap 8.5.1 with Connections 5.0. Form item size limitations. When building a Leap application, you must not exceed the following size limits You cannot have more than 1000 data items in your form You cannot have more than 200 data items in your form DB2\u00ae has a page size limit for tables of 32kb. Each data item in a Leap application has a size limit. For example: - Single Line \u2013 200 bytes and Multiple line - Leap uses a CLOB data type to store the value of each multiple line entry data item. The limit to the number of characters stored in a CLOB is dependent on language and character set. The English limit is approximately 1 million characters.If the content of any given multiple line field exceeds the database allowance, you see a \u201c500 Internal Server Error\u201d message, and form submission fails. The full message is stored in the system log files. - Currency/Number \u2013 8 bytes - Attachment \u2013 108 bytes - Select One and Survey \u2013 size is based on the number of choices and questions If you receive the error The row length of the table exceeded a limit of \u201c32677\u201d bytes. (Table space \u201c\u201d.). SQLCODE=-670 , your form exceeds the maximum size. You must remove items from the form, or break the application into multiple forms. It is important to note that items create database columns, and contribute to the limit even when they are hidden on the form. Note: This is no longer applicable as of DB2 10.5 and newer, due to extended row size. Limit on the number of embedded sections. When designing a form in Leap, you can embed sections within sections to achieve the wanted layout. Do not embed more than 5 sections within one another. When using more than five embedded sections, it becomes difficult to select the action icons for a specific section. Exceeding 5 sections also results in forms not rendering properly. Printing Leap content Leap provides a print button. If there is no print button in the contents of your form, the web browser print function does not work well. To print out the contents shown in your browser, uses a screen capture. For more information, see Taking a screen capture in Windows\u2122 . Adding Groups to Leap applications. Leap cannot resolve users if they are members of nested groups. For example, your company LDAP contains a super group called \u201cManagers\u201d. This super group consists of several smaller groups, such as \u201cSupervisors\u201d, and \u201cShift Leaders\u201d. In the Access tab of Leap, you must add the \u201cSupervisors\u201d, and \u201cShift Leaders\u201d as groups individually, rather than using the \u201cManagers\u201d super group. Table 2. Leap Best Practices Issue Resolution Canonical URLs versus short URL in the ibm.nitro.NitroConfig.serverURI property of the Leap_config.properties file When accessing Leap, the ibm.nitro.NitroConfig.serverURI entry setting is different from the browser address base URI. If you are using a short URL format to design your application, you must set ibm.nitro.NitroConfig.serverURI entry with the canonical URL. For example, if your short URL is http://localhost:9080/apps, the canonical URL for the user is http://hostname:9080/apps. Using two different URLs means users must sign on twice, as the short URL is replaced by the canonical URL. It is a best practice to use the canonical URL whenever possible. Web Link and Website form items. When using the Web Link or Website form items in your application, ensure that you enter the correct URL to get the runtime result. If the link goes to an external site, you must enter the URL with a URL protocol. For example, enter the URL as http://www.ibm.com, rather than www.ibm.com. - If you enter the URL with no protocol, then the URL is considered relative the current location. The prefix for the relative URL is attached, which might result in errors. - If you enter the URL with a single slash '/', it resolves to a URL relative to the root of the host. When using the Website item in a Leap the URLs entered must begin with: http://, https://, ftp://, or ftps:// Leap users and groups When using WebSphere\u00ae Application Server to directly maintain users and groups, it is important to maintain integrity between the WebSphere Application Server users and Leap. If you change a user definition in WebSphere Application Server, and that user is used in Leap, the relationship might be corrupted. The user would no longer be able to access Leap. Uploading files in Leap If an application requires supplemental files, it is a best practice to use reference URLs, rather than uploading the files directly into the application. The option to include reference URLs is available in the Upload dialog from the Settings tab. Leap Preview mode To use the Leap Preview feature, you must ensure that your browser is configured to allow all pop-up windows. If your browser does not allow pop-up windows, users cannot see the preview window. Browser cookies must be enabled. To successfully log in Leap, you must have browser cookie enabled. If you have deployed Leap with WebSphere Application Server Community Edition as your application server, you must ensure that you have only one Leap window or tab running in your browser at any time. Attempting to log in to multiple Leap windows or tabs results in login errors. Table 3. Troubleshooting Leap errors Problem Resolution Building Leap applications in Safari with bidirectional languages Designing Leap applications with the Safari locale set to a bidirectional language results in extraneous horizontal scroll bars shown in each form cell. These scroll bars do not affect the rendering of the completed form at run time. Allowing non-ASCII administrative login characters If the Leap administrative user name or password contains non-ASCII characters, you must complete an additional configuration task. In WebSphere Application Server: 1. Log in to WebSphere Application Server administrative console, and select the server. 2. On the settings page for the selected application server, go to Server Infrastructure > Java and Process Management . 3. Go to Process Definition > Java Virtual Machine , and specify -Dclient.encoding.override=UTF-8 for Generic JVM Arguments. 4. Click OK , then Save 5. Restart the application server Table 4. General Leap information Topic Additional Information Using the Upgrade link on the Manage tab. You can upgrade an application with a new application definition using theLeap Upgrade feature. Upgrading replaces all access rules, business rules, formulas, interface options, Stages definitions, JavaScript\u2122, images, and service mappings with those in the new version. It then updates the data base definition to the model described by the new application, and merges existing data into that model. If data elements were removed in the new version, or their unique identifiers changed, the data associated with those elements is not migrated to the new application. Data elements that did not exist in the previous version, but were added in the new version, are added as columns to existing data records with a NULL value. Parent topic: Troubleshooting","title":"Troubleshooting HCL Leap"},{"location":"tr_troubleshooting_and_support.html","text":"Troubleshooting and support Troubleshooting and support information for the HCL Leap. If you are experiencing a problem with the Leap: Refer to the documentation for the task you are performing or the product component you are working with. These topics may contain troubleshooting information for common problems. Refer to the Directory of worldwide contacts Web page and contact HCL Software Support for your region. Parent topic: Troubleshooting","title":"Troubleshooting and support"},{"location":"tr_troubleshooting_and_support.html#troubleshootingandsupport","text":"Troubleshooting and support information for the HCL Leap. If you are experiencing a problem with the Leap: Refer to the documentation for the task you are performing or the product component you are working with. These topics may contain troubleshooting information for common problems. Refer to the Directory of worldwide contacts Web page and contact HCL Software Support for your region. Parent topic: Troubleshooting","title":"Troubleshooting and support"},{"location":"tr_troubleshooting_toc.html","text":"Troubleshooting The following pages provide information on how to troubleshoot HCL Leap, and how to contact support. Troubleshooting and support Troubleshooting and support information for the HCL Leap. Troubleshooting HCL Leap The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues.","title":"Troubleshooting"},{"location":"tr_troubleshooting_toc.html#troubleshootingtoc","text":"The following pages provide information on how to troubleshoot HCL Leap, and how to contact support. Troubleshooting and support Troubleshooting and support information for the HCL Leap. Troubleshooting HCL Leap The following table contains information to help you troubleshoot your Leap product or applications. The table contains limitations, best practices, and known issues.","title":"Troubleshooting"},{"location":"tr_troubleshooting_wsdl_sd_tool.html","text":"Troubleshooting the WSDL service description generator - FAQ Use the following information to help you troubleshoot your WSDL service description generator. Is my schema valid? Make sure that all prefixes are bound to a namespace Usually schemas contains the following namespace declarations in <xsd:schema> : xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" When a schema includes or imports other schemas, make sure that the schema is accessible through the @schemaLocation. If the @schemaLocation is a URL, verify that you can access the URL and that the URL is indeed a schema. If the @schemaLocation is an absolute file path verify that the .xsd file exists in that path. If the @schemaLocation is a relative file path make sure that the .xsd file exists in that path relative to where the importing schema is stored. When a WSDL file is manually retrieved from the web and stored locally, you must clearly indicate the path. If the WSDL file imports an external schema with a relative URL, you must either change the schema location to point to the full URL, or save a copy of the schema and change the schema location to point to the local copy of the schema. Is my WSDL file valid? Check namespace declarations. Usually WSDL files contaims the following namespace declarations in <wsdl:definitions> : xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" Several WSDL file tags have an attribute @name. According to the WSDL schema, the @name is of type NCName. It is a string without any colons. For example, <wsdl:definitions name=\"ABCOrg:WebService\"> is invalid. Check the WSDL tags for case sensitivity errors. For example, <wsdl:porttype> is invalid, but <wsdl:portType> is valid. Make sure that the binding style is specified. Binding style can either be Document/Literal or RPC/Encoded. This information is declared in this style: wsdl:binding/soap:binding/@style . This example can either be Document or RPC. wsdl:binding/wsdl:operation/wsdl:input/soap:body/@used can either be Literal or Encoded. Make sure that the request URL is specified. This information is located here: wsdl:service/wsdl:port/soap:address/ @location . Make sure that for every <wsdl:port> under <wsdl:service> has a matching <wsdl:binding> . Make sure that all <wsdl:binding> has a matching <wsdl:portType> . Make sure that all <wsdl:input> and <wsdl:output> of all <wsdl:operation> under all <wsdl:portType> references a valid <wsdl:message> . Make sure that all <wsdl:message> contains at least one <wsdl:part> . If the WSDL binding style is Document/Literal, make sure that all <wsdl:part> uses @element and references an element declaration in a schema. If the WSDL binding style is RPC/Encoded, make sure that all <wsdl:part> uses @type and references an actual schema data type such as xsd:string , a schema <xsd:simpleType> , or a <xsd:complexType> . Is my service mapping reference correct? Incorrect references often happen on RPC/Encoded outbound mapping references. This is the format of the tool, with namespace omitted. <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> The following example uses a different SOAP convention that does not work with this tool: <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <return> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </return> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <soapVal> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </soapVal> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[message name]> <!--Succeeding section base on schema--> </[message name]> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> This is how RPC/Encoded declare a recurring simple type element: <element name=\"elem\" type=\"tns:ArrayOfString\"/> <complexType name=\"ArrayOfString\"> <complexContent> <restriction base=\"SOAP-ENC:Array\"> <attribute ref=\"SOAP-ENC:arrayType\" wsdl:arrayType=\"string[]/></></></> Then, the tool expects a SOAP message of the following format: \u2026 <elem> <item>\u2026</item> <item>\u2026</item> \u2026 </elem> \u2026 If the RPC/Encoded web service SOAP message uses a different convention, the tool does not work. For example, \u2026 <elem> <elem>\u2026</elem> <elem>\u2026</elem> \u2026 </elem> \u2026 Why are there missing parameters or no parameters in the generated service description? Make sure that the WSDL file has access to the schema. All imported and included schemas are accessible. Make sure that each operation has its matching messages and each message part has its matching schema declaration. For Document/Literal binding style, the message part should reference a schema element declaration. An RPC/Encoded binding style should reference a schema complex type declaration. Make sure that elements and attributes have a valid type. These types can either be a <simpleType> declaration, a <complexType> declaration, or a primitive schema data type such as xsd:string or xsd:boolean . The schema data type xsd:anyType is not mapped to a parameter. Make sure that the schema does not use <any> , <anyAttribute> or @abtract=true . If it does, you must manually add the required parameters and appropriate service mapping elements. Why does the web service respond with an Error 415 Unsupported media type? The tool assumes that the value of the constant Content-Type, which in turn is mapped as the HTTP header Content-Type. If the WSDL file uses SOAP 1.1, the Content-Type is set to text/xml. If the web service uses SOAP 1.2, then the Content-Type is set to Application/soap+xml. Why is my request-entity not being mapped correctly? By schema declaration and convention, inbound service mapping elements @targetRef are based on the inbound constant prototypicalInstance . It is constructed based on the declared schema, and for RPC/Encoded style binding, it also follows those conventions. Similarly, the outbound service mapping elements @sourceRef are based on an internally created prototypical instance, which is different from the inbound constant prototypicalInstance , but constructed in the similar fashion. Why is my targetType=STRING when I map to an XML and use XPath in my targetRef . If you use an inbound service mapping and use XPath in your targetRef , the targetType= is not set to STRING because of the service mapping element wrapper. Since <mapping target=\"request-entity\" targetType=\"XML\"> is set to XML, so all service mapping element child targetTypeType are set to STRING . Why am I getting a \u201cnamespace not binded\u201d error? Verify that all prefixes you use in all service mapping element references are binded. Namespace declarations are in the <serviceMapping> . Parent topic: Using the service description tool for WSDL web service","title":"Troubleshooting the WSDL service description generator - FAQ"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#troubleshootingthewsdlservicedescriptiongenerator","text":"Use the following information to help you troubleshoot your WSDL service description generator.","title":"Troubleshooting the WSDL service description generator - FAQ"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#is-my-schema-valid","text":"Make sure that all prefixes are bound to a namespace Usually schemas contains the following namespace declarations in <xsd:schema> : xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" When a schema includes or imports other schemas, make sure that the schema is accessible through the @schemaLocation. If the @schemaLocation is a URL, verify that you can access the URL and that the URL is indeed a schema. If the @schemaLocation is an absolute file path verify that the .xsd file exists in that path. If the @schemaLocation is a relative file path make sure that the .xsd file exists in that path relative to where the importing schema is stored. When a WSDL file is manually retrieved from the web and stored locally, you must clearly indicate the path. If the WSDL file imports an external schema with a relative URL, you must either change the schema location to point to the full URL, or save a copy of the schema and change the schema location to point to the local copy of the schema.","title":"Is my schema valid?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#is-my-wsdl-file-valid","text":"Check namespace declarations. Usually WSDL files contaims the following namespace declarations in <wsdl:definitions> : xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" targetNamespace=\"[value varies]\" xmlns:tns=\"[usually the same as targetNamespace]\" Several WSDL file tags have an attribute @name. According to the WSDL schema, the @name is of type NCName. It is a string without any colons. For example, <wsdl:definitions name=\"ABCOrg:WebService\"> is invalid. Check the WSDL tags for case sensitivity errors. For example, <wsdl:porttype> is invalid, but <wsdl:portType> is valid. Make sure that the binding style is specified. Binding style can either be Document/Literal or RPC/Encoded. This information is declared in this style: wsdl:binding/soap:binding/@style . This example can either be Document or RPC. wsdl:binding/wsdl:operation/wsdl:input/soap:body/@used can either be Literal or Encoded. Make sure that the request URL is specified. This information is located here: wsdl:service/wsdl:port/soap:address/ @location . Make sure that for every <wsdl:port> under <wsdl:service> has a matching <wsdl:binding> . Make sure that all <wsdl:binding> has a matching <wsdl:portType> . Make sure that all <wsdl:input> and <wsdl:output> of all <wsdl:operation> under all <wsdl:portType> references a valid <wsdl:message> . Make sure that all <wsdl:message> contains at least one <wsdl:part> . If the WSDL binding style is Document/Literal, make sure that all <wsdl:part> uses @element and references an element declaration in a schema. If the WSDL binding style is RPC/Encoded, make sure that all <wsdl:part> uses @type and references an actual schema data type such as xsd:string , a schema <xsd:simpleType> , or a <xsd:complexType> .","title":"Is my WSDL file valid?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#is-my-service-mapping-reference-correct","text":"Incorrect references often happen on RPC/Encoded outbound mapping references. This is the format of the tool, with namespace omitted. <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> The following example uses a different SOAP convention that does not work with this tool: <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <return> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </return> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <soapVal> <[part name]> <!--Succeeding section base on schema--> </[part name]> <[part name]> <!--Succeeding section base on schema--> </[part name]> \u2026 </soapVal> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> <SOAP-ENV:Envelope> <SOAP-ENV:Body> <tns:[operation name+\"Response\"]> <[message name]> <!--Succeeding section base on schema--> </[message name]> </tns:[operation name+\"Response\"]> <SOAP-ENV:Body> <SOAP-ENV:Envelope> This is how RPC/Encoded declare a recurring simple type element: <element name=\"elem\" type=\"tns:ArrayOfString\"/> <complexType name=\"ArrayOfString\"> <complexContent> <restriction base=\"SOAP-ENC:Array\"> <attribute ref=\"SOAP-ENC:arrayType\" wsdl:arrayType=\"string[]/></></></> Then, the tool expects a SOAP message of the following format: \u2026 <elem> <item>\u2026</item> <item>\u2026</item> \u2026 </elem> \u2026 If the RPC/Encoded web service SOAP message uses a different convention, the tool does not work. For example, \u2026 <elem> <elem>\u2026</elem> <elem>\u2026</elem> \u2026 </elem> \u2026","title":"Is my service mapping reference correct?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-are-there-missing-parameters-or-no-parameters-in-the-generated-service-description","text":"Make sure that the WSDL file has access to the schema. All imported and included schemas are accessible. Make sure that each operation has its matching messages and each message part has its matching schema declaration. For Document/Literal binding style, the message part should reference a schema element declaration. An RPC/Encoded binding style should reference a schema complex type declaration. Make sure that elements and attributes have a valid type. These types can either be a <simpleType> declaration, a <complexType> declaration, or a primitive schema data type such as xsd:string or xsd:boolean . The schema data type xsd:anyType is not mapped to a parameter. Make sure that the schema does not use <any> , <anyAttribute> or @abtract=true . If it does, you must manually add the required parameters and appropriate service mapping elements.","title":"Why are there missing parameters or no parameters in the generated service description?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-does-the-web-service-respond-with-an-error-415-unsupported-media-type","text":"The tool assumes that the value of the constant Content-Type, which in turn is mapped as the HTTP header Content-Type. If the WSDL file uses SOAP 1.1, the Content-Type is set to text/xml. If the web service uses SOAP 1.2, then the Content-Type is set to Application/soap+xml.","title":"Why does the web service respond with an Error 415 Unsupported media type?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-is-my-request-entity-not-being-mapped-correctly","text":"By schema declaration and convention, inbound service mapping elements @targetRef are based on the inbound constant prototypicalInstance . It is constructed based on the declared schema, and for RPC/Encoded style binding, it also follows those conventions. Similarly, the outbound service mapping elements @sourceRef are based on an internally created prototypical instance, which is different from the inbound constant prototypicalInstance , but constructed in the similar fashion.","title":"Why is my request-entity not being mapped correctly?"},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-is-my-targettypestring-when-i-map-to-an-xml-and-use-xpath-in-my-targetref","text":"If you use an inbound service mapping and use XPath in your targetRef , the targetType= is not set to STRING because of the service mapping element wrapper. Since <mapping target=\"request-entity\" targetType=\"XML\"> is set to XML, so all service mapping element child targetTypeType are set to STRING .","title":"Why is my targetType=STRING when I map to an XML and use XPath in my targetRef."},{"location":"tr_troubleshooting_wsdl_sd_tool.html#why-am-i-getting-a-namespace-not-binded-error","text":"Verify that all prefixes you use in all service mapping element references are binded. Namespace declarations are in the <serviceMapping> . Parent topic: Using the service description tool for WSDL web service","title":"Why am I getting a \u201cnamespace not binded\u201d error?"},{"location":"tut_roles_and_stages_OV.html","text":"Adding tables and workflow elements to a HCL Leap form This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial. Prerequisites This tutorial contains the following lessons: Tables \u2013 Adding tables to your form to collect data from users. Stages \u2013 Adding workflow to your form, turning it into an application. The Stages section covers both basic workflow and conditional workflow. Access \u2013 Adding permissions to the stages on your form, which allows specific people to access the form at different points in the workflow. If you have no experience with Leap, complete the Building a Survey application tutorial to learn the basics of building and deploying applications in Leap. This tutorial does not cover concepts of form design, deployment, or reviewing submitted data. Go to the Leap community on developerWorks , and import ExpenseReport.nitro_s into Leap. Use the following instructions to complete the partially complete Expense Report application. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Adding tables to forms Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. Adding workflow Stages to a form Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. Tutorial summary You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. Parent topic: Tutorials for app design","title":"Adding tables and workflow elements to a Leap form"},{"location":"tut_roles_and_stages_OV.html#addingworkflowtoaform","text":"This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial.","title":"Adding tables and workflow elements to a HCL Leap form"},{"location":"tut_roles_and_stages_OV.html#prerequisites","text":"This tutorial contains the following lessons: Tables \u2013 Adding tables to your form to collect data from users. Stages \u2013 Adding workflow to your form, turning it into an application. The Stages section covers both basic workflow and conditional workflow. Access \u2013 Adding permissions to the stages on your form, which allows specific people to access the form at different points in the workflow. If you have no experience with Leap, complete the Building a Survey application tutorial to learn the basics of building and deploying applications in Leap. This tutorial does not cover concepts of form design, deployment, or reviewing submitted data. Go to the Leap community on developerWorks , and import ExpenseReport.nitro_s into Leap. Use the following instructions to complete the partially complete Expense Report application. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Adding tables to forms Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. Adding workflow Stages to a form Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. Tutorial summary You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. Parent topic: Tutorials for app design","title":"Prerequisites"},{"location":"tut_roles_and_stages_SM.html","text":"Tutorial summary You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. In this tutorial, you learned how to: Add a Table to a form. Format the table headings Add page navigation to the form Add Stages to create workflow functionality Make form items, and entire form pages hidden and read-only in a particular stage Create Roles and assign users to Roles Assign Role permissions to specific stages For more information about Stages and Access Control, see the following topics: Adding Stages to an application Security overview . Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Tutorial summary"},{"location":"tut_roles_and_stages_SM.html#addingworkflowtoaform","text":"You successfully completed this tutorial, which demonstrated an application with workflow and access permissions. In this tutorial, you learned how to: Add a Table to a form. Format the table headings Add page navigation to the form Add Stages to create workflow functionality Make form items, and entire form pages hidden and read-only in a particular stage Create Roles and assign users to Roles Assign Role permissions to specific stages For more information about Stages and Access Control, see the following topics: Adding Stages to an application Security overview . Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Tutorial summary"},{"location":"tut_roles_and_stages_module1.html","text":"Adding tables to forms Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. In this lesson, learn how to: Add a Table to the form. Add form items as column headings in the table. Add page navigation buttons to the form. Estimated time required to complete this module: 20 minutes Add a table to the Expenses page For this tutorial, add a table for the user to submit a list of expenses. In the Manage tab, open the Expense Report application by clicking Edit. The Outline view displays all the forms and pages within an application. You can change the default names of forms and pages to more specific names. You can also move between form pages by clicking them in the Outline view. In the Outline view, click the Expenses page. The blank Expenses page is displayed. Add a section to the Expenses page, and extend it to span all columns. In the properties side panel, change the title of the section to \u201cItemized Expenses\u201d. Click the Display title bar check box so the title is displayed on the form. Expand the Specialized section of the Palette and add a Table to the form. To set the table headers, click the \u201chere\u201d link in the information window. A new child page is created for the table that stores the form items that are used as table column headers. A grid with one column and one row is displayed. Add the following form items to the Table page, either vertically, or horizontally. When the user enters data into the table, a window opens and displays the column headings as a list. If there are more column headings than space in the window, scroll bars are displayed to the user. You must decide whether you want users to scroll vertically, or horizontally, then build the column headers in that direction. Whether you build the list in the child page, the column headers are displayed horizontally in the table on the form. Expand the Common section of the Palette. Add a Date. Set the Hint to Date the expense was incurred. Add a Dropdown. In the properties side panel: set the title to \u201cType\u201d and set the hint to \u201cType of expense\u201d. Click the Edit Properties icon. Then click the Edit button in the Options: section. Enter the following options into the displayed value column, create row with the Add option icon after each: Air Travel, Car rental, Food, Hotel, Postage, Other Add a Single Line Entry. Set the Title to Description. Set the Width to Medium in the Properties side panel. Add a Currency. Set the Title to Amount. Set the Width to Short. Make all form items in the Table required by clicking the required box for each item. In the Outline view, click the Expenses page to continue building the form. On the Expenses page notice that the table headings are displayed horizontally. Expand the table to cover both columns in the grid. In the Properties side panel set the title of the table to \u201cYour Expenses\u201d. Enter a Hint. For example: Enter each itemized expense in the table. Save and preview the form. The Preview icon is located with the Save icon. When the preview is displayed, click Next to get to the Expenses page. In the validation error message window, click Continue. The error is displayed because you are leaving the first page of the form without entering data into mandatory fields. The table is then displayed with no entries. Click the Add a new entry icon to add test information to the table. A window is displayed containing the column headers displayed vertically, and they all fit in the window. If the table headers were entered onto the Table page horizontally, the user must scroll to see all table fields. Close the preview form to return to building the form. Set a formula on the table so the total of the submitted expenses is displayed in a separate Currency area. This total is supplied to the reviewer on the Approval page you create next. On the Expenses page, add a Currency form item beneath the table. Click the newly added currency field to reveal the properties side panel. Change the Title to Total Expense Amount. Click the Formula tab. From the Choose the function used to set the value of this item: select Table Sum. Click the Column entry field. A window opens for you to select a form item. Expand the tree until Amount is available. The formula is set. Add Page Navigation buttons to the end of the form. Save and preview the form. If you enter test data into the table, the numbers that are entered in the Amount columns are automatically added and displayed in the Total Expense Amount. Adding an approval page with more logic to the form The following steps describe how to create an approval page where a supervisor approves or denies the expense report. A rule is set so that if the reviewer denies the expense claim, they can provide a reason why the expense was denied. First, create a page in the form to use as the Approval page. It displays the Total Expense Amount from the Expenses page to the approver. In the Outline view, click the Add icon to add another page to the form. Change the name of the page to Approval. Add a Section and span the section across the two columns. In the properties side panel, change the title to \u201cExpense Approval\u201d, and select the Display title bar option. Add a Single Line Entry form item to the section. Change the name to Approver\u2019s Name. Add a Currency form item next. Change the title to Expense Amount to Approve Click the currency form item to reveal the properties side panel. The following substeps describe how to pull the total from the Total Expense Amount on the Expenses page into the Expense Amount to Approve form item. A rule is then set to make the amount read-only to the approver if its value is greater than zero. This way, the approver can see the amount, but cannot change it. In the properties side panel, select the Formula tab. From the Choose the function used to set the value of this item menu, select Assign. Select Total Expense Amount from the list of form items available. Click the Edit Rules icon and add a rule. In the When the following condition is true section, select Expense Amount to Approve from the first menu. Select Greater than from the second menu. Leave \u201cA fixed value\u201d selected and add the number 0 to the empty field. In the Perform this action section, select Expense Amount to Approve from the first menu. Select Disable from the second menu. Click Apply and Close. Add a Select One item in the section. Click the newly added select one to reveal the properties side panel. Set the Title to Do you approve this expense? Click the check box to make this item Required. Edit the Options: to Approve and Decline. Set the Choice Layout to Horizontal. Add a Multi-Line Entry beneath Expense Amount to Approve. Title the Multi-Line Entry: Reason for Declining: Click the Rules icon. This rule will hide this Multi-Line Entry item if the expense is approved. Click Add Rule. From the When this is true: section, select Do you approve this expense? Select Does not equal. Leave A fixed value selected and then select Approve from the next set of options. Select Reason for declining: from the Perform this action section. Select Hide from the next menu. Click Apply and Close. Add page navigation buttons to the end of the page. This set of buttons allows the user to see the comments of the approver if the Expense Report is rejected. In the next lesson, you will hide these navigation buttons, so they are displayed after the approver reviews the Expense Report. Save the form. The approval page is created, but is only used when a workflow is applied to the form. Creating a workflow with Stages is covered in the next section of the tutorial. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Adding tables to forms"},{"location":"tut_roles_and_stages_module1.html#addingworkflowtoaform","text":"Adding tables to your form is a useful way to gather information from users in a contained space. You can specify exactly what information you want the user to enter by selecting form items to use as the table headings. The user can add as many rows into the table as required to submit their data, but the table is contained within a predefined size on the page. In this lesson, learn how to: Add a Table to the form. Add form items as column headings in the table. Add page navigation buttons to the form. Estimated time required to complete this module: 20 minutes","title":"Adding tables to forms"},{"location":"tut_roles_and_stages_module1.html#lesson11","text":"For this tutorial, add a table for the user to submit a list of expenses. In the Manage tab, open the Expense Report application by clicking Edit. The Outline view displays all the forms and pages within an application. You can change the default names of forms and pages to more specific names. You can also move between form pages by clicking them in the Outline view. In the Outline view, click the Expenses page. The blank Expenses page is displayed. Add a section to the Expenses page, and extend it to span all columns. In the properties side panel, change the title of the section to \u201cItemized Expenses\u201d. Click the Display title bar check box so the title is displayed on the form. Expand the Specialized section of the Palette and add a Table to the form. To set the table headers, click the \u201chere\u201d link in the information window. A new child page is created for the table that stores the form items that are used as table column headers. A grid with one column and one row is displayed. Add the following form items to the Table page, either vertically, or horizontally. When the user enters data into the table, a window opens and displays the column headings as a list. If there are more column headings than space in the window, scroll bars are displayed to the user. You must decide whether you want users to scroll vertically, or horizontally, then build the column headers in that direction. Whether you build the list in the child page, the column headers are displayed horizontally in the table on the form. Expand the Common section of the Palette. Add a Date. Set the Hint to Date the expense was incurred. Add a Dropdown. In the properties side panel: set the title to \u201cType\u201d and set the hint to \u201cType of expense\u201d. Click the Edit Properties icon. Then click the Edit button in the Options: section. Enter the following options into the displayed value column, create row with the Add option icon after each: Air Travel, Car rental, Food, Hotel, Postage, Other Add a Single Line Entry. Set the Title to Description. Set the Width to Medium in the Properties side panel. Add a Currency. Set the Title to Amount. Set the Width to Short. Make all form items in the Table required by clicking the required box for each item. In the Outline view, click the Expenses page to continue building the form. On the Expenses page notice that the table headings are displayed horizontally. Expand the table to cover both columns in the grid. In the Properties side panel set the title of the table to \u201cYour Expenses\u201d. Enter a Hint. For example: Enter each itemized expense in the table. Save and preview the form. The Preview icon is located with the Save icon. When the preview is displayed, click Next to get to the Expenses page. In the validation error message window, click Continue. The error is displayed because you are leaving the first page of the form without entering data into mandatory fields. The table is then displayed with no entries. Click the Add a new entry icon to add test information to the table. A window is displayed containing the column headers displayed vertically, and they all fit in the window. If the table headers were entered onto the Table page horizontally, the user must scroll to see all table fields. Close the preview form to return to building the form. Set a formula on the table so the total of the submitted expenses is displayed in a separate Currency area. This total is supplied to the reviewer on the Approval page you create next. On the Expenses page, add a Currency form item beneath the table. Click the newly added currency field to reveal the properties side panel. Change the Title to Total Expense Amount. Click the Formula tab. From the Choose the function used to set the value of this item: select Table Sum. Click the Column entry field. A window opens for you to select a form item. Expand the tree until Amount is available. The formula is set. Add Page Navigation buttons to the end of the form. Save and preview the form. If you enter test data into the table, the numbers that are entered in the Amount columns are automatically added and displayed in the Total Expense Amount.","title":"Add a table to the Expenses page"},{"location":"tut_roles_and_stages_module1.html#approvalpagewithadditionallogic","text":"The following steps describe how to create an approval page where a supervisor approves or denies the expense report. A rule is set so that if the reviewer denies the expense claim, they can provide a reason why the expense was denied. First, create a page in the form to use as the Approval page. It displays the Total Expense Amount from the Expenses page to the approver. In the Outline view, click the Add icon to add another page to the form. Change the name of the page to Approval. Add a Section and span the section across the two columns. In the properties side panel, change the title to \u201cExpense Approval\u201d, and select the Display title bar option. Add a Single Line Entry form item to the section. Change the name to Approver\u2019s Name. Add a Currency form item next. Change the title to Expense Amount to Approve Click the currency form item to reveal the properties side panel. The following substeps describe how to pull the total from the Total Expense Amount on the Expenses page into the Expense Amount to Approve form item. A rule is then set to make the amount read-only to the approver if its value is greater than zero. This way, the approver can see the amount, but cannot change it. In the properties side panel, select the Formula tab. From the Choose the function used to set the value of this item menu, select Assign. Select Total Expense Amount from the list of form items available. Click the Edit Rules icon and add a rule. In the When the following condition is true section, select Expense Amount to Approve from the first menu. Select Greater than from the second menu. Leave \u201cA fixed value\u201d selected and add the number 0 to the empty field. In the Perform this action section, select Expense Amount to Approve from the first menu. Select Disable from the second menu. Click Apply and Close. Add a Select One item in the section. Click the newly added select one to reveal the properties side panel. Set the Title to Do you approve this expense? Click the check box to make this item Required. Edit the Options: to Approve and Decline. Set the Choice Layout to Horizontal. Add a Multi-Line Entry beneath Expense Amount to Approve. Title the Multi-Line Entry: Reason for Declining: Click the Rules icon. This rule will hide this Multi-Line Entry item if the expense is approved. Click Add Rule. From the When this is true: section, select Do you approve this expense? Select Does not equal. Leave A fixed value selected and then select Approve from the next set of options. Select Reason for declining: from the Perform this action section. Select Hide from the next menu. Click Apply and Close. Add page navigation buttons to the end of the page. This set of buttons allows the user to see the comments of the approver if the Expense Report is rejected. In the next lesson, you will hide these navigation buttons, so they are displayed after the approver reviews the Expense Report. Save the form. The approval page is created, but is only used when a workflow is applied to the form. Creating a workflow with Stages is covered in the next section of the tutorial. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Adding an approval page with more logic to the form"},{"location":"tut_roles_and_stages_module2.html","text":"Adding workflow Stages to a form Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. A Stage describes: The behavior of the form while it is in a stage, including what portions of the form are visible or read only. The flow of the form, determining navigation between stages. For example, a form goes to a manager for general expense approval, but to another manager if the amount of the expense exceeds a predefined amount. Who has access to the form while the form is in that stage. By default, each form has a Start and a Submitted stage. The Start stage is the beginning of the workflow, and describes a form that has not been completed or submitted by the user. After a form leaves the Start stage, it can never return to the Start stage. The Submitted stage describes a form that has reached the next part of the workflow. You may add other stages to your workflow to fit your use case. In this lesson, learn how to: Go to the Workflow tab. Add new stages and modify various stage properties. Make form items read-only in a specific stage. Make form pages read-only and hidden in specific stages. Set navigation between stages to create a workflow. Estimated time required to complete this module: 20 minutes Adding Stages to your form The workflow for this form is summarized as follows: The user accesses the form in the Start stage. When the user submits the form, it goes to the Awaiting Approval stage, where an approver can either accept or reject the Expense Report. If the reviewer accepts the Expense Report, the form goes to the Accepted stage. If the reviewer rejects the Expense Report, the form goes to the Approval Request stage so the submitter can make corrections and resubmit. Click the Workflow tab. The view is made of the diagram canvas and the properties side panel. In the Start stage, the user who enters data into the form does not need to see the Approval page. To ensure that the user cannot find their way to that page, hide it from view. Click the Visibility button at the top of the screen, then in the side panel, click the Hide icon for the Approval page. The Approval page is hidden from view when the form user first submits the form. Note: The hidden or read-only status applies to a form item in a particular stage. If you add another stage, the hidden or read-only status does not carry forward to the new stage. The user does not need to see the page navigation buttons to the Approval page. Hide them by clicking the Expenses page. Go to the page navigation buttons. In the properties side panel, click the eye icon to hide in this stage. The page navigation buttons are now hidden from view when the user submits the form. The page navigation buttons are only hidden in this stage. Create a stage to add the Approval page that is created in the previous section. Click the Add a new stage icon while the Start stage is in focus. A new stage is inserted after the Start stage and before the Submitted stage. Click the label \u201cStage n \u201d to change the name of the stage to \u201cApproval Request\u201d. This stage allows users to open the form again and edit the expense report if it is rejected by an approver. Click on the Visibility button at the top of the screen. Set the Approval page to read-only by clicking on the lock icon with the \u201cApproval Request\u201d stage selected. You want the user to see the comments that are written by the reviewer, but do not want the user to be able to modify the choices that are set by the reviewer. Add another stage, and title it Awaiting Approval. The form progresses to this stage after the user submits it. In the Visibility View, set the Basic Information and Expenses pages to be read-only. At the end of the form, Submit and Cancel buttons are automatically added. Click the Add Action icon, and add another Submit button. Click the Submit action on the diagram, or with the stage selected click the Edit Properties icon for the Submit button. Change the title to Accept. So users know whether their Expense Reports were accepted or rejected, send them an email. In the Action Completion Message: field, set it to read You have approved the submitter\u2019s expense report. They are notified by email of the approval. This message is shown to the approver every time they accept an expense report. Click the Activities tab. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject entry field, type Your Expense Report was accepted. In the Contents of the Email: box, write your email. For example, enter: Thank you for submitting your expense report. It was accepted, and payment will be made shortly. To view the approved report, click the following link: To insert a link to the form, click the Insert item: menu that is located in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. When the reviewer approves the expense report, the user receives an email at the address they provided on the Basic Information page. Now configure the second Submit button to use if the approver rejects the submitted form. With the stage selected, click the label for the second Submit button and change the title to \u201cDecline\u201d. In the Action Completion Message: field set it to read: You have rejected the submitter\u2019s request. They are notified to correct errors and resubmit the Expense Report. In the Next Stage: menu, select Approval Request. If the Expense Report is rejected, the user can reopen it to correct errors. Now set the stage to send an email to notify the submitter of the rejection. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject: entry field, type Your Expense Report was rejected. In the Contents of the Email: box, write your email. For example, enter: Your submitted expense report was rejected.Click the following link to review the report, make corrections and resubmit: To insert a link to the form, click the Insert item: menu in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. Go to the Approval Request stage. Set which stage the button activates by clicking on the submit button on the diagram and in the Properties side panel change the Next Stage to \u201cAwaiting Approval\u201d. When the approver receives the form to review, it is best if the submitted information is read-only. This way the reviewer cannot modify any data that the user submitted. When you set pages and form items as read-only in the Start stage, and must do so again in Approval Request stage. In the Visibility view, click the \u201cApproval Request\u201d stage and then click the lock icon next to the page to make it read-only in this stage. Now that the Approval Request stage is created, you must modify the Start stage so the form is routed to the Approval Request stage. Click the Start stage. Click the Edit Properties icon for Submit. Change the Action Completion Message: to read: Your data was submitted and will be reviewed soon. Change the Next Stage to \u201cApproval Request\u201d. Save your application. When the user completes and submits the form, it is sent to an approver for review. When the user submits the form, it goes from the Start to the Awaiting Approval stage. If the approver accepts, the form is sent to the Submitted stage, and the workflow is complete. If the approver rejects the Expense Report, it is sent to the Approval Request stage so the user can fix errors and resubmit. If the approver rejects the Expense Report, the form is sent to this stage so the user can open the form, change it, and resubmit. When the user submits the corrected form, it goes to the Awaiting Approval stage again. Optional: Applying conditional workflow to the form There is a rule on the form that states any expense reimbursement must be approved by a reviewer. However, you can create a stage in the workflow to request special approval for amounts larger than $2000. In the Workflow tab, create a stage and title it Special Approval. Create a second Submit button. Click label for the first Submit button to change the title to Accept. Set the Next stage: to Awaiting Approval. When the special request is approved, the form is sent to the main approver for review. Click label for the second Submit button to change the title to Reject. Set the Next stage: to Approval Request. Click \u201c+ Add Action\u201d in the properties side panel or hover over the stage card in the diagram and click the \u201c+\u201d to create a second submit button. Click the Edit Properties icon for new Submit button. Click the Visibility button. Click on the Actions section where the submit buttons are shown. Click the Rules icon for the new submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Less than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit2, but a different number can be appended if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply. The rule states that the button is hidden if the expense amount claimed is less than $2000. Now set the opposite rule on the first submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Greater than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit, but a number can be appended to that string if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply and Close. When the user opens the form, only one Submit button is visible. When the user clicks the Submit button, the form is sent to the appropriate stage based on the total amount of the expense. Note: Submit buttons are not available in Preview mode. You must deploy the form to test the rules that are set on the button. If you deploy the form, there is no difference in the appearance of the form because both buttons have the same name. When you click View Data, you see the additional workflow steps that are required for the form. The conditional workflow is set. In the next section, add access control to each stage so the Approval Request stage is set to one set of reviewers, while the Special Approval stage is set to another set of reviewers. Save the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Adding workflow Stages to a form"},{"location":"tut_roles_and_stages_module2.html#addingworkflowtoaform","text":"Leap uses Stages to add workflow to your form. Workflow describes various lifecycle steps that are associated with the form. Defining multiple connected Stages creates the workflow, where each stage defines its own form behavior, access rights, and navigation steps. In this tutorial, define the workflow steps that are required for the approval of the form. A Stage describes: The behavior of the form while it is in a stage, including what portions of the form are visible or read only. The flow of the form, determining navigation between stages. For example, a form goes to a manager for general expense approval, but to another manager if the amount of the expense exceeds a predefined amount. Who has access to the form while the form is in that stage. By default, each form has a Start and a Submitted stage. The Start stage is the beginning of the workflow, and describes a form that has not been completed or submitted by the user. After a form leaves the Start stage, it can never return to the Start stage. The Submitted stage describes a form that has reached the next part of the workflow. You may add other stages to your workflow to fit your use case. In this lesson, learn how to: Go to the Workflow tab. Add new stages and modify various stage properties. Make form items read-only in a specific stage. Make form pages read-only and hidden in specific stages. Set navigation between stages to create a workflow. Estimated time required to complete this module: 20 minutes","title":"Adding workflow Stages to a form"},{"location":"tut_roles_and_stages_module2.html#lesson21","text":"The workflow for this form is summarized as follows: The user accesses the form in the Start stage. When the user submits the form, it goes to the Awaiting Approval stage, where an approver can either accept or reject the Expense Report. If the reviewer accepts the Expense Report, the form goes to the Accepted stage. If the reviewer rejects the Expense Report, the form goes to the Approval Request stage so the submitter can make corrections and resubmit. Click the Workflow tab. The view is made of the diagram canvas and the properties side panel. In the Start stage, the user who enters data into the form does not need to see the Approval page. To ensure that the user cannot find their way to that page, hide it from view. Click the Visibility button at the top of the screen, then in the side panel, click the Hide icon for the Approval page. The Approval page is hidden from view when the form user first submits the form. Note: The hidden or read-only status applies to a form item in a particular stage. If you add another stage, the hidden or read-only status does not carry forward to the new stage. The user does not need to see the page navigation buttons to the Approval page. Hide them by clicking the Expenses page. Go to the page navigation buttons. In the properties side panel, click the eye icon to hide in this stage. The page navigation buttons are now hidden from view when the user submits the form. The page navigation buttons are only hidden in this stage. Create a stage to add the Approval page that is created in the previous section. Click the Add a new stage icon while the Start stage is in focus. A new stage is inserted after the Start stage and before the Submitted stage. Click the label \u201cStage n \u201d to change the name of the stage to \u201cApproval Request\u201d. This stage allows users to open the form again and edit the expense report if it is rejected by an approver. Click on the Visibility button at the top of the screen. Set the Approval page to read-only by clicking on the lock icon with the \u201cApproval Request\u201d stage selected. You want the user to see the comments that are written by the reviewer, but do not want the user to be able to modify the choices that are set by the reviewer. Add another stage, and title it Awaiting Approval. The form progresses to this stage after the user submits it. In the Visibility View, set the Basic Information and Expenses pages to be read-only. At the end of the form, Submit and Cancel buttons are automatically added. Click the Add Action icon, and add another Submit button. Click the Submit action on the diagram, or with the stage selected click the Edit Properties icon for the Submit button. Change the title to Accept. So users know whether their Expense Reports were accepted or rejected, send them an email. In the Action Completion Message: field, set it to read You have approved the submitter\u2019s expense report. They are notified by email of the approval. This message is shown to the approver every time they accept an expense report. Click the Activities tab. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject entry field, type Your Expense Report was accepted. In the Contents of the Email: box, write your email. For example, enter: Thank you for submitting your expense report. It was accepted, and payment will be made shortly. To view the approved report, click the following link: To insert a link to the form, click the Insert item: menu that is located in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. When the reviewer approves the expense report, the user receives an email at the address they provided on the Basic Information page. Now configure the second Submit button to use if the approver rejects the submitted form. With the stage selected, click the label for the second Submit button and change the title to \u201cDecline\u201d. In the Action Completion Message: field set it to read: You have rejected the submitter\u2019s request. They are notified to correct errors and resubmit the Expense Report. In the Next Stage: menu, select Approval Request. If the Expense Report is rejected, the user can reopen it to correct errors. Now set the stage to send an email to notify the submitter of the rejection. In the Activities section, click \u201c+ Add Activity\u201d to create one. Select \u201cSend an email\u201d as the Activity Type. From the To: menu, click \u201cInsert\u201d and select Email. In the Subject: entry field, type Your Expense Report was rejected. In the Contents of the Email: box, write your email. For example, enter: Your submitted expense report was rejected.Click the following link to review the report, make corrections and resubmit: To insert a link to the form, click the Insert item: menu in the text editor tools. From the menu, select Link to this form. The changes are automatically saved. Click the X or click outside the settings panel to close it. Go to the Approval Request stage. Set which stage the button activates by clicking on the submit button on the diagram and in the Properties side panel change the Next Stage to \u201cAwaiting Approval\u201d. When the approver receives the form to review, it is best if the submitted information is read-only. This way the reviewer cannot modify any data that the user submitted. When you set pages and form items as read-only in the Start stage, and must do so again in Approval Request stage. In the Visibility view, click the \u201cApproval Request\u201d stage and then click the lock icon next to the page to make it read-only in this stage. Now that the Approval Request stage is created, you must modify the Start stage so the form is routed to the Approval Request stage. Click the Start stage. Click the Edit Properties icon for Submit. Change the Action Completion Message: to read: Your data was submitted and will be reviewed soon. Change the Next Stage to \u201cApproval Request\u201d. Save your application. When the user completes and submits the form, it is sent to an approver for review. When the user submits the form, it goes from the Start to the Awaiting Approval stage. If the approver accepts, the form is sent to the Submitted stage, and the workflow is complete. If the approver rejects the Expense Report, it is sent to the Approval Request stage so the user can fix errors and resubmit. If the approver rejects the Expense Report, the form is sent to this stage so the user can open the form, change it, and resubmit. When the user submits the corrected form, it goes to the Awaiting Approval stage again.","title":"Adding Stages to your form"},{"location":"tut_roles_and_stages_module2.html#applyingconditionallogictoastage","text":"There is a rule on the form that states any expense reimbursement must be approved by a reviewer. However, you can create a stage in the workflow to request special approval for amounts larger than $2000. In the Workflow tab, create a stage and title it Special Approval. Create a second Submit button. Click label for the first Submit button to change the title to Accept. Set the Next stage: to Awaiting Approval. When the special request is approved, the form is sent to the main approver for review. Click label for the second Submit button to change the title to Reject. Set the Next stage: to Approval Request. Click \u201c+ Add Action\u201d in the properties side panel or hover over the stage card in the diagram and click the \u201c+\u201d to create a second submit button. Click the Edit Properties icon for new Submit button. Click the Visibility button. Click on the Actions section where the submit buttons are shown. Click the Rules icon for the new submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Less than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit2, but a different number can be appended if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply. The rule states that the button is hidden if the expense amount claimed is less than $2000. Now set the opposite rule on the first submit button. Click Add Rule. In the When this is true: section, click the menu. Select Show items on all pages. Click the same menu again and select Expense Amount to Approve. In the next menu, select Greater than or equals. In the blank field for A fixed value, enter $2000. In the Perform this action section, select the second Submit button in the start stage. A number is appended to the action button ID when there are more than one instance of the same class. For example, the ID for this item is Start - Submit - S_Submit, but a number can be appended to that string if you create and delete more than one Submit button. Select Hide from the next menu. Click Apply and Close. When the user opens the form, only one Submit button is visible. When the user clicks the Submit button, the form is sent to the appropriate stage based on the total amount of the expense. Note: Submit buttons are not available in Preview mode. You must deploy the form to test the rules that are set on the button. If you deploy the form, there is no difference in the appearance of the form because both buttons have the same name. When you click View Data, you see the additional workflow steps that are required for the form. The conditional workflow is set. In the next section, add access control to each stage so the Approval Request stage is set to one set of reviewers, while the Special Approval stage is set to another set of reviewers. Save the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Optional: Applying conditional workflow to the form"},{"location":"tut_roles_and_stages_module3.html","text":"Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. In this lesson, learn how to: Open to the Access tab. Know the difference between Closed and Open role types. Add a user type to the list of defined Roles. Assign users to the various Roles. Assign users to Stages. Estimated time that is required to complete this module: 20 minutes Applying access control through Roles Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. By default, the Access tab, three roles are already defined for you: Administrator \u2013 Users, or groups, with administrator privileges for an application. Initiator \u2013 Any user, or group, who can submit a form or initiate an application. You can set some applications to be available to all users, and some to be available to specific users, or groups. Record Owner \u2013 The user who submits the form. After a user initiates and submits a form, they become the Record Owner. Each role can be either Open or Closed. When a role is Open, it dynamically assigns users at run time. When a role is Closed, the users must be set on the Access screen, and are static. For example, in a form, you might have employees sign in and enter their names and employee numbers. If the role is Open, the application can pull information about the employees\u2019 superior from a company database and populate the form. For this tutorial, all roles must remain Closed. The users who submit Expense Reports are Initiators, and for this scenario the users who review the Expense Reports are Human Resources. As the Initiator role is already created, you must create the Human Resources role. Click the Access tab. Click the Add Role icon for the Record Owner role. A new role is created. Rename the new role Human Resources. Now that the roles are created, add members to the roles. Adding members to the roles determines who can access the application. There are four predefined user groups: All Authenticated Users : Any user who is authenticated with your organization. Users must sign in with a user ID and password to access the application. Anonymous Users : Any user who you want to work anonymously with the application. Anyone who has the link to the application can submit it, without signing in. Invited Users : Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Instance Creator : The user who submitted a form. You can also add your own Groups or Individual users to a role. In the Assign Users menu, select Initiator. The Initiator role automatically has All Authenticated Users added. Access for this role is complete. Select Human Resources from the Assign Users menu. In the Individual Users field, add your own name. As you manually enter Individual Users or Groups, Leap provides you with predictive matches based on your entry. These predictive matches are taken from your company LDAP, users that are configured in your IBM\u00ae WebSphere\u00ae Application Server, or IBM WebSphere Portal Server. By adding your name to the Human Resources Group, you are able to enter sample data into the form, and review all submitted responses. Click Add User icon. Now that access to submit and review a form is set, edit the properties of the individual roles. For example, you want Human Resources to review and approve the form, but the form must be read-only unless it is returned to the user. Remember the order of the workflow for our form: When the user submits the form, it moves from the Start stage to the Awaiting Approval stage. If a form is rejected because of errors, it is sent to the Approval Request stage, so the submitter can correct the errors and submit the form again. Go to Stage SettingsExpense Report, and select Start. You see that the Initiator has permission to Create and submit the form. Go to Stage SettingsExpense Report, and select Approval Request. For the Administrator, make Read and Delete are selected. These permissions give the Administrator the ability to see and delete submitted forms in this stage, but not to change the submitted data. For Record Owner, ensure Read and Update are selected. These permissions allow the person who submitted the form to edit the form in the case of errors, and submit it again for approval. For Human Resources, ensure the Read is enabled. Go to Stage SettingsExpense Report, and select Awaiting Approval . For the Administrator, make Read and Delete are selected. For Record Owner, ensure Read is selected. This permission allows the person who submitted the form to see it, but not change any data. For Human Resources, select Read, and Update. Although the information submitted by the user is read-only for the approver in Human Resources, the word Update is used to manage access settings. In this instance, the word Update means that an approver can use the Submit and Cancel buttons on the form. Update does NOT mean that the approver can update or manipulate the submitted data. Save the application. Click the Manage tab and deploy the application and enter sample data into the form. After you submit sample data, return to the form and click View Data from the Manage tab. Accept or reject the sample data to test the workflow elements you built into the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Applying access control through Roles"},{"location":"tut_roles_and_stages_module3.html#addingworkflowtoaform","text":"Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. In this lesson, learn how to: Open to the Access tab. Know the difference between Closed and Open role types. Add a user type to the list of defined Roles. Assign users to the various Roles. Assign users to Stages. Estimated time that is required to complete this module: 20 minutes","title":"Applying access control through Roles"},{"location":"tut_roles_and_stages_module3.html#applyingaccesscontrolthroughroles","text":"Access control defines who is able to view and modify the form in different stages. For example, only the form administrator can change the layout of the form, while user access is restricted to opening and submitting the form. Creating this access control is done with Roles. By default, the Access tab, three roles are already defined for you: Administrator \u2013 Users, or groups, with administrator privileges for an application. Initiator \u2013 Any user, or group, who can submit a form or initiate an application. You can set some applications to be available to all users, and some to be available to specific users, or groups. Record Owner \u2013 The user who submits the form. After a user initiates and submits a form, they become the Record Owner. Each role can be either Open or Closed. When a role is Open, it dynamically assigns users at run time. When a role is Closed, the users must be set on the Access screen, and are static. For example, in a form, you might have employees sign in and enter their names and employee numbers. If the role is Open, the application can pull information about the employees\u2019 superior from a company database and populate the form. For this tutorial, all roles must remain Closed. The users who submit Expense Reports are Initiators, and for this scenario the users who review the Expense Reports are Human Resources. As the Initiator role is already created, you must create the Human Resources role. Click the Access tab. Click the Add Role icon for the Record Owner role. A new role is created. Rename the new role Human Resources. Now that the roles are created, add members to the roles. Adding members to the roles determines who can access the application. There are four predefined user groups: All Authenticated Users : Any user who is authenticated with your organization. Users must sign in with a user ID and password to access the application. Anonymous Users : Any user who you want to work anonymously with the application. Anyone who has the link to the application can submit it, without signing in. Invited Users : Any anonymous user who receives a unique URL generated from within stages when an application changes from one stage to another. A user who is not normally given access to the form in that stage can use that URL to participate in the workflow in that instance. Instance Creator : The user who submitted a form. You can also add your own Groups or Individual users to a role. In the Assign Users menu, select Initiator. The Initiator role automatically has All Authenticated Users added. Access for this role is complete. Select Human Resources from the Assign Users menu. In the Individual Users field, add your own name. As you manually enter Individual Users or Groups, Leap provides you with predictive matches based on your entry. These predictive matches are taken from your company LDAP, users that are configured in your IBM\u00ae WebSphere\u00ae Application Server, or IBM WebSphere Portal Server. By adding your name to the Human Resources Group, you are able to enter sample data into the form, and review all submitted responses. Click Add User icon. Now that access to submit and review a form is set, edit the properties of the individual roles. For example, you want Human Resources to review and approve the form, but the form must be read-only unless it is returned to the user. Remember the order of the workflow for our form: When the user submits the form, it moves from the Start stage to the Awaiting Approval stage. If a form is rejected because of errors, it is sent to the Approval Request stage, so the submitter can correct the errors and submit the form again. Go to Stage SettingsExpense Report, and select Start. You see that the Initiator has permission to Create and submit the form. Go to Stage SettingsExpense Report, and select Approval Request. For the Administrator, make Read and Delete are selected. These permissions give the Administrator the ability to see and delete submitted forms in this stage, but not to change the submitted data. For Record Owner, ensure Read and Update are selected. These permissions allow the person who submitted the form to edit the form in the case of errors, and submit it again for approval. For Human Resources, ensure the Read is enabled. Go to Stage SettingsExpense Report, and select Awaiting Approval . For the Administrator, make Read and Delete are selected. For Record Owner, ensure Read is selected. This permission allows the person who submitted the form to see it, but not change any data. For Human Resources, select Read, and Update. Although the information submitted by the user is read-only for the approver in Human Resources, the word Update is used to manage access settings. In this instance, the word Update means that an approver can use the Submit and Cancel buttons on the form. Update does NOT mean that the approver can update or manipulate the submitted data. Save the application. Click the Manage tab and deploy the application and enter sample data into the form. After you submit sample data, return to the form and click View Data from the Manage tab. Accept or reject the sample data to test the workflow elements you built into the form. Parent topic: Adding tables and workflow elements to a HCL Leap form","title":"Applying access control through Roles"},{"location":"tut_survey_application_OV.html","text":"Building a Survey application This tutorial describes how to build a simple survey application with HCL Leap. No previous knowledge of Leap is required. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Building a survey with Leap This tutorial contains two sections. Tutorial summary You successfully built a basic Leap application. Parent topic: Tutorials for app design","title":"Building a Survey application"},{"location":"tut_survey_application_OV.html#buildingasurveyapplication","text":"This tutorial describes how to build a simple survey application with HCL Leap. No previous knowledge of Leap is required. Estimated time that is required to complete the entire tutorial: 50 - 60 minutes Building a survey with Leap This tutorial contains two sections. Tutorial summary You successfully built a basic Leap application. Parent topic: Tutorials for app design","title":"Building a Survey application"},{"location":"tut_survey_application_SM.html","text":"Tutorial summary You successfully built a basic Leap application. In this tutorial, you learned how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data For more detailed information about specific topics that are covered in this tutorial, see Creating and managing applications in the HCL Leap product documentation. Parent topic: Building a Survey application","title":"Tutorial summary"},{"location":"tut_survey_application_SM.html#buildingasurveyapplication","text":"You successfully built a basic Leap application. In this tutorial, you learned how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data For more detailed information about specific topics that are covered in this tutorial, see Creating and managing applications in the HCL Leap product documentation. Parent topic: Building a Survey application","title":"Tutorial summary"},{"location":"tut_survey_application_module1.html","text":"Building a survey with Leap This tutorial contains two sections. In the first section, Opening Leap and building a form, learn how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase In the second section, Application Management, learn how to: Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data The scenario: The coffee services in your office are not ideal. Every morning in the break room, you hear coworkers complain about the coffee, but nothing is being done to improve the coffee at work. Your Office Manager asks you to find out how your coworkers would like the coffee services changed. You must poll everyone in the office to get their opinions. Your options: Email Send out an email to all your coworkers and ask them to provide their opinions on the coffee and how it can be improved. If you send out a mass email, sporadic responses from people arrive throughout the day, cluttering up your inbox. You must then take the feedback from the emails and collate it in a spreadsheet program, and there is no easy way to track who did not answer. Create a survey Create a survey form in Leap. You email the survey link to your coworkers, and they go online to provide you with feedback. All results are stored in a database and are easy to review and sort, and your email inbox is not filled with the sporadic responses. Creating a survey is the option that you select. Note: Throughout the Leap documentation, the words \u201cform\u201d and \u201capplication\u201d are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather information that is submitted by users when they complete the form, and automatically store the submissions in a database. Estimated time that is required to complete this module: 50 - 60 minutes Opening Leap and building a form The following steps describe how to open a new Leap application and build a form. You want your coffee feedback to have: An area that contains the title of the form, and a description of the purpose of the form. Include the amount of time that is needed to complete the form. An area that contains the name of the submitter. Also included in this area if the form is the basic question: \"Do you drink the coffee that is brewed in the office?\" An area that contains the survey questions. Creating an application \u2013 When you start Leap, a screen is displayed with two tabs on the Forms toolbar: Use and Manage. The Use tab displays a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. Click New Application. Enter a descriptive Application Name and Application Description, and select Create. A blank form with a two-by-two grid is displayed. The grid automatically aligns form items with one another when you place them on the form, and expands as you add form items. You can add and delete columns and rows as needed by clicking the border bar surrounding the grid. Note: As you add sections and form items to the form, the grid automatically expands to include the additional form items. You can add extra rows to your form manually, but it is not required. If there are empty rows or columns in a completed form, they are not displayed when the form is previewed or deployed. When you design forms, there are two ways to add form items to your form: You can drag form items from the Palette onto the form You can select a location on the grid, then click a form item. The form item is placed into the grid location. You can build forms by placing form items directly on the form or grouping form items in Sections. For our coffee feedback form, we use Sections to organize the form items. Sections are useful for the following reasons: They group form items in a way that is easy for the user to understand. When the form is viewed, the sections have specific background colors that are based on the style that is applied to the form. They make applying complex form functionality easier. For example, our form has a rule to hide the survey until the user selects a specific option. Instead of setting the rule on every form item individually, the rule is on the section. The rule applies to every form item within the section. They allow the form designer, and the form user, to collapse and expand entire parts of the form. In longer forms, collapsing sections is useful, as it keeps the form submitter from being overwhelmed by too much information. If you finish building your form and decide to change the layout, moving sections of form items is much easier than moving each form item individually. Creating the general information area: The general information area contains the title of the survey, more information for the form submitter, and an estimated time for completion. Drag a Section onto the form. The Section is placed into the grid area, and is highlighted to show the section has focus. Notice that the Section contains a grid within it. Form items for a section are added to the grid of the section. Click the field spanning handle and drag it to extend the section over both columns. You can resize any form item to span across multiple rows or columns. Click a grid box, then select Image from the Palette. The image form item is added to the form. You can edit many form items directly on the form, but others require you to use the Properties side panel. To display the list of available options for any form item, click the item on the canvas. The Properties side panel opens. Click Add file, then Browse to locate the logo of your company. If you do not have a logo, browse to a small resolution image on your computer. Click Open to select the image, and OK to close the Add File or URL Link window. The image is added to the form. Add a Text item to the Image. This text item contains the name of the survey. In the Size menu, set the font size to Large, then and Bold. Type Workplace Coffee Feedback and click OK. The formatted text is inserted into the form. Note: You can adjust the spacing between form items by dragging the slider in the border bar. The mouse changes to a slider, and you can adjust the proportions of the form items. Add another Text item with the image. Using the field spanning handle, drag the form item to span both columns. Enter the following text: We\u2019d like your feedback on coffee services in the office. Complete the survey to provide your feedback. Time to complete survey: 3 minutes or less. Click OK to add the text to the form. Save the form, either by pressing Ctrl + S, or by clicking the Save icon. Creating the primary information area: Now, create the section that collects the name of the submitter, and asks the basic question of \u201cDo you drink the office coffee?\u201d You want to have 100% participation, but not everyone in the office might drink coffee. By allowing users to submit the survey with a negative response, you receive a complete set of data. Set a rule on the survey section to ask coffee-relevant questions only if the submitter indicates that they drink the office coffee. Add another Section to the form. Click the field spanning handle and drag it to extend the section over both columns. Click a grid box, then click Single Line Entry. The Single Line Entry is placed onto the form. Edit the title of the Single Line Entry directly on the form. Click the title of the item: \u201cSingle Line Entry\u201d. The text is highlighted, and is now editable. Change the text to read: Your Name. Click Add hint... and type \u201cEnter your given name and surname.\u201d The hint is displayed directly on the form. Tip: Adding information to the hint fields gives more information that helps the user complete your form. For example, in this form, you ask for the user name. The hint helps clarify whether you want given name and surname, given name only, or given , middle, and surname. You can also provide more clarification for users by inserting place holder text into each Single Line Entry item. Place holder text is available in the Properties side panel, and is available for any form item where the user must type information. For example, Single Line, Multi-Line, Currency, Number, and Email. In the Single Line Entry on the canvas, click the box that is labeled Click to set as required. Users must complete this field to submit the form. Select Select One from the Palette and put it in a grid area with the Your Name text item. The Properties side panel opens. Change the Title: to Do you drink the office coffee? Click the Required check box to make this question mandatory. In the Options: section, one option is automatically available. To add another option, click the Add option plus sign. Set the options to: Yes No, I drink other hot beverages. No, I don\u2019t drink hot beverages. Displayed Value and Saved Value \u2013 When you use any form item that has Set Options, two fields are displayed: Displayed Value and Saved value. As you type in the Displayed Value, the Saved Value is automatically updated with the same value. There are some cases where the Saved Value differs from the Displayed Value. For example, our Displayed Value questions are long. If you export the data from a Leap application to a spreadsheet, the selected answers are truncated and the data might be difficult to interpret. If you change the Saved Values of the three questions to \u201cYes\u201d, \u201cOther\u201d, and \u201cNo\u201d, or assign numerical values, the results are easier to understand. Click OK. Save your form and preview it. The Preview icon is located with the Save icon. Note: Ensure that your browser does not block pop-up windows, as the preview form opens in a new window or new tab, depending on your browser settings. Notice that the Submit and Cancel buttons are automatically added for you. While you can enter data into the form in Preview mode, you cannot submit a form until it is deployed. To return to building the form, close the tab or the browser window in which the preview opened. Creating the survey: Now create the section which contains the survey questions. This section has a rule set on it, so if the user selects \u201cNo, I drink other hot beverages\u201d or \u201cNo, I don\u2019t drink hot beverages\u201d, the survey is not displayed. First create the rule, then add the survey to the section. Click the border bar to access the row action menu. Select Insert Row (after). Click Section from the Palette, then click the form. Extend the section over both columns. Click the Rules icon. The Rules window opens. Click Add Rule. In the When this is true: section, select Do you drink coffee?. Set the operation to Does not equal. Leave A fixed value in the next menu and select Yes. In the Perform this action section, select Survey in the first menu. As you build the rule, it is automatic error checking is performed. If there is an error in the logic, either a warning sign or an error sign is displayed. As this rule contains no errors, a verification icon is displayed. Select Hide in the second menu. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user responds that they don't drink coffee, they are not shown the survey about what type of coffee they prefer. Now that the rule is set, add the survey questions using: Two Survey form items: one to ask what roast of coffee the employees prefer, the other to ask them questions about the coffee provided. A Select Many form item to provide more information about what they like or dislike about the coffee. A Multi-Line Entry form item to provide detailed comments. Select Survey from the Palette and add it to the section grid. Extend the survey over both columns. Set the following properties in the side panel: Title: \u2013 Coffee preference Hint: \u2013 What type of coffee roast do you prefer? Options: Dark Roast Medium Roast Light Roast Decaf Click OK. Change the survey question from the default \u201cClick to edit\u201d to I prefer to drink: Select Survey from the Palette and add it with the Coffee preference survey. Extend the survey over both columns. In the Properties panel, set the following properties: Title: \u2013 Please rank each question: Options: Displayed Value Saved Value Totally agree 5 Somewhat agree 4 Agree 3 No opinion 0 Somewhat disagree 2 Totally disagree 1 If you export the data to a spreadsheet program, each user\u2019s response displays as the numerical code, rather than the Displayed Value. Tabulation of results is easier as you can sort the submitted responses by Saved Value numerical indicator. Review the ranking labels. Ranking labels are displayed before and after the Displayed Value. Set the following properties: Select Display before and after labels. In the Before label: text box, typeAgree. In the After label: text box, typeDisagree. Change the survey question from the default \u201cClick to edit\u201d to: I like the coffee at work. Click Add question to add another row to the survey. Change the survey question to: If changes were made, I would drink more coffee. You can repeat this step to add more questions to the survey. An alternative to multiple survey questions is to add a Select Many form item where users can select multiple choices from a list. Click Select Many from the Palette and place it onto the form near the survey. Extend the Select Many form item over both columns. The properties panel opens. Note: You can change the orientation of the Select Many choices by changing the Choice Layout. Changes are made instantly on the form. You can also select a minimum and maximum number of choices the user can select. Set the following properties: Title: \u2013 I find the coffee in the office: Hint: \u2013 Select all that apply. Options: Too acidic Too bitter Too weak Too strong Goes cold too quickly Too gritty Perfect. No changes required. For example, you can require the user to select a minimum of two choices and a maximum of 5. Click OK. Save the form. To complete the survey form, add a Multi-Line Entry so users can submit other options, or opinions. Click Multi-Line Entry from the Palette and place it onto the form with the Select Many form item. Extend the Multi-Line Entry form item over both columns. The properties panel opens. Set the following properties: Title: \u2013 Please enter any specific suggestions you might have: Width: \u2013 Full width. Selecting Full width results in the space for entering data automatically adjusting to the size of the form in the browser window. Hint: \u2013 For example, a specific bean blend you\u2019d like us to try. Click OK. The functionality of the survey is now in place. When users complete the survey and submit it, they receive a visual confirmation on the screen that the survey is submitted, and by default, are shown the survey again. To prevent user confusion, and to prevent the user from submitting the form again, redirect the user to your company website after the form is submitted. Adding a redirect URL is done in the Workflow tab. By default, each form automatically has a Start stage and a Submitted stage. The Start stage contains the Submit and Cancel buttons that are seen when you preview the form. Click the Workflow tab. Click the Submit button node. The Properties panel opens. The Action Completion Message: has \u201cYour data has been successfully submitted.\u201d as the default message. You can leave the default, or change the text. In the Action Completion Redirect URL (optional): text entry area, enter the URL of your company website. Click the Design tab to return to the main body of the form. The coffee survey is now complete. Save and preview the form. Now that you have built a form, you must deploy it so it is available for users. Application management The following steps describe how to deploy a completed form, launch a form, enter sample data, review the submitted sample data, then delete the submitted sample data. Deploying an application \u2013 Deploying, or publishing forms is done in the Manage tab. Click the Manage tab. Click the Deploy link for your survey. The Deployment Settings window is displayed. Select Set deployment Period. Set the Start and Stop dates to span a two week window, starting today. Tip: It is useful to have a start and end date for some applications because users are forced to complete the form within a specific time frame. Click Start. The application is deployed. After the application is deployed, you need the URL to provide to your colleagues so they can complete the survey. There are two ways to get the URL: Click the Launch link. A browser window launches with the URL of the deployed form in the address bar. Notice that the Submit button on the end of the form is now available. Expand the information for the Coffee Feedback application by clicking the Show application details button for application. The link is provided on the screen in the URL Links section. Copy the URL for distribution to your coworkers. Updating an application after deployment \u2013 You can change an application at any time. However, you must deploy the application again for users to see your changes. There are two ways to change a deployed application: Update the deployed application, or stop the deployment, and then redeploy. To update a deployed application, in the Manage tab click the Edit link. A message is displayed to warn you that changing an application after it is deployed can affect previously collected data. Click Yes on the warning message. The form opens and is available for editing. Make the required changes to the form. Save the form again. Click the Manage tab, then click the Deploy link. Click Update. The application is redeployed with the updated form. You can also stop the deployment manually, make changes, then redeploy the application. If a deployment is stopped, the application is no longer available online. To stop a deployed application, click the Deploy link. The Deployment Settings window opens Click Stop. Note: If a user is completing the form when you stop, redeploy, or update an application, they receive an error message. The unsubmitted data is lost and the user must fill the form in again. Adding sample data to an application \u2013 Now that the form is complete and deployed, add some sample data. Click the Launch link. The application opens in a new browser window. Submit the form several times with various sample data. Here are some examples to try, but you can use your own combination of survey results. John Smith who drinks the office coffee. He prefers dark roast, and does not enjoy the office coffee because it is too weak and cold. Mary Jones who drinks only tea. Sam Wesson who drinks the office coffee. He likes a medium roast and like the coffee the way it is. He would like management to try a different roast combination by a local roast house. Ellen Steele who drinks the coffee, but prefers decaffeinated coffee. She would like the coffee to be weaker. Note: As you submit each survey, you see a message upon completion, and then are redirected to the company website. Viewing submitted data \u2013 After the sample data is added, return to Leap to review the submitted data. In the Manage tab, click the View Data link. The View Data screen is displayed in either a new tab or a new browser window, depending on your browser settings. On the View Data page, all submitted responses are summarized in a chart. Click Sam Wesson\u2019s name. His submitted form is displayed in the Application view. Deleting sample data \u2013 Now that you tested the form, it is highly recommended that you delete all sample responses to avoid interference with the actual data from your coworkers. There are two ways to delete the sample data: Delete individual entries from the View Data screen Update the deployment to delete previous records. To delete submitted data from the View Data screen: Select a sample record from the list so it is displayed in the Application view window. If the form is wider than the allotted screen space, scroll bars are displayed. Click Delete Record in the Application view window. Note: Clicking the x in that window closes the record, but does not delete it. To delete submitted data by updating the deployment: Close the View Data tab or browser window. You are on the Leap Manage screen. Click Deploy. The Deployment Settings window opens. Click the Advanced tab. Select the check box for Delete previous submissions. You are asked to confirm the deletion of the submitted data. Click OK. Click Update. Click the View Data link. The blank View Data page is displayed. The survey form is complete and ready to send to your coworkers. You can send out the survey link in an office-wide email. After two weeks, the survey deployment period ends, and you provide the survey results to the Office Manager. Parent topic: Building a Survey application","title":"Building a survey with Leap"},{"location":"tut_survey_application_module1.html#building-a-survey-with-leap","text":"This tutorial contains two sections. In the first section, Opening Leap and building a form, learn how to: Open a new application Add form items to the form Resize form items Edit the properties of a form item Set a rule so form items are hidden or visible on the form Make form items mandatory Redirect users after form submission Save the form Preview a form during the design phase In the second section, Application Management, learn how to: Deploy an application Launch an application Enter sample data into the application Review the submitted sample data Delete submitted sample data The scenario: The coffee services in your office are not ideal. Every morning in the break room, you hear coworkers complain about the coffee, but nothing is being done to improve the coffee at work. Your Office Manager asks you to find out how your coworkers would like the coffee services changed. You must poll everyone in the office to get their opinions. Your options: Email Send out an email to all your coworkers and ask them to provide their opinions on the coffee and how it can be improved. If you send out a mass email, sporadic responses from people arrive throughout the day, cluttering up your inbox. You must then take the feedback from the emails and collate it in a spreadsheet program, and there is no easy way to track who did not answer. Create a survey Create a survey form in Leap. You email the survey link to your coworkers, and they go online to provide you with feedback. All results are stored in a database and are easy to review and sort, and your email inbox is not filled with the sporadic responses. Creating a survey is the option that you select. Note: Throughout the Leap documentation, the words \u201cform\u201d and \u201capplication\u201d are both used to describe the output that is created by Leap. Forms are a single page, or collection of pages, that create the user interface with which people interact. When a form is combined with workflow, presentation logic and other elements of the Leap technology, it becomes an application. Applications gather information that is submitted by users when they complete the form, and automatically store the submissions in a database. Estimated time that is required to complete this module: 50 - 60 minutes","title":"Building a survey with Leap"},{"location":"tut_survey_application_module1.html#lesson11","text":"The following steps describe how to open a new Leap application and build a form. You want your coffee feedback to have: An area that contains the title of the form, and a description of the purpose of the form. Include the amount of time that is needed to complete the form. An area that contains the name of the submitter. Also included in this area if the form is the basic question: \"Do you drink the coffee that is brewed in the office?\" An area that contains the survey questions. Creating an application \u2013 When you start Leap, a screen is displayed with two tabs on the Forms toolbar: Use and Manage. The Use tab displays a list of all applications that are created by other users to which you have access. The Manage tab is where you create and manage applications. Click New Application. Enter a descriptive Application Name and Application Description, and select Create. A blank form with a two-by-two grid is displayed. The grid automatically aligns form items with one another when you place them on the form, and expands as you add form items. You can add and delete columns and rows as needed by clicking the border bar surrounding the grid. Note: As you add sections and form items to the form, the grid automatically expands to include the additional form items. You can add extra rows to your form manually, but it is not required. If there are empty rows or columns in a completed form, they are not displayed when the form is previewed or deployed. When you design forms, there are two ways to add form items to your form: You can drag form items from the Palette onto the form You can select a location on the grid, then click a form item. The form item is placed into the grid location. You can build forms by placing form items directly on the form or grouping form items in Sections. For our coffee feedback form, we use Sections to organize the form items. Sections are useful for the following reasons: They group form items in a way that is easy for the user to understand. When the form is viewed, the sections have specific background colors that are based on the style that is applied to the form. They make applying complex form functionality easier. For example, our form has a rule to hide the survey until the user selects a specific option. Instead of setting the rule on every form item individually, the rule is on the section. The rule applies to every form item within the section. They allow the form designer, and the form user, to collapse and expand entire parts of the form. In longer forms, collapsing sections is useful, as it keeps the form submitter from being overwhelmed by too much information. If you finish building your form and decide to change the layout, moving sections of form items is much easier than moving each form item individually. Creating the general information area: The general information area contains the title of the survey, more information for the form submitter, and an estimated time for completion. Drag a Section onto the form. The Section is placed into the grid area, and is highlighted to show the section has focus. Notice that the Section contains a grid within it. Form items for a section are added to the grid of the section. Click the field spanning handle and drag it to extend the section over both columns. You can resize any form item to span across multiple rows or columns. Click a grid box, then select Image from the Palette. The image form item is added to the form. You can edit many form items directly on the form, but others require you to use the Properties side panel. To display the list of available options for any form item, click the item on the canvas. The Properties side panel opens. Click Add file, then Browse to locate the logo of your company. If you do not have a logo, browse to a small resolution image on your computer. Click Open to select the image, and OK to close the Add File or URL Link window. The image is added to the form. Add a Text item to the Image. This text item contains the name of the survey. In the Size menu, set the font size to Large, then and Bold. Type Workplace Coffee Feedback and click OK. The formatted text is inserted into the form. Note: You can adjust the spacing between form items by dragging the slider in the border bar. The mouse changes to a slider, and you can adjust the proportions of the form items. Add another Text item with the image. Using the field spanning handle, drag the form item to span both columns. Enter the following text: We\u2019d like your feedback on coffee services in the office. Complete the survey to provide your feedback. Time to complete survey: 3 minutes or less. Click OK to add the text to the form. Save the form, either by pressing Ctrl + S, or by clicking the Save icon. Creating the primary information area: Now, create the section that collects the name of the submitter, and asks the basic question of \u201cDo you drink the office coffee?\u201d You want to have 100% participation, but not everyone in the office might drink coffee. By allowing users to submit the survey with a negative response, you receive a complete set of data. Set a rule on the survey section to ask coffee-relevant questions only if the submitter indicates that they drink the office coffee. Add another Section to the form. Click the field spanning handle and drag it to extend the section over both columns. Click a grid box, then click Single Line Entry. The Single Line Entry is placed onto the form. Edit the title of the Single Line Entry directly on the form. Click the title of the item: \u201cSingle Line Entry\u201d. The text is highlighted, and is now editable. Change the text to read: Your Name. Click Add hint... and type \u201cEnter your given name and surname.\u201d The hint is displayed directly on the form. Tip: Adding information to the hint fields gives more information that helps the user complete your form. For example, in this form, you ask for the user name. The hint helps clarify whether you want given name and surname, given name only, or given , middle, and surname. You can also provide more clarification for users by inserting place holder text into each Single Line Entry item. Place holder text is available in the Properties side panel, and is available for any form item where the user must type information. For example, Single Line, Multi-Line, Currency, Number, and Email. In the Single Line Entry on the canvas, click the box that is labeled Click to set as required. Users must complete this field to submit the form. Select Select One from the Palette and put it in a grid area with the Your Name text item. The Properties side panel opens. Change the Title: to Do you drink the office coffee? Click the Required check box to make this question mandatory. In the Options: section, one option is automatically available. To add another option, click the Add option plus sign. Set the options to: Yes No, I drink other hot beverages. No, I don\u2019t drink hot beverages. Displayed Value and Saved Value \u2013 When you use any form item that has Set Options, two fields are displayed: Displayed Value and Saved value. As you type in the Displayed Value, the Saved Value is automatically updated with the same value. There are some cases where the Saved Value differs from the Displayed Value. For example, our Displayed Value questions are long. If you export the data from a Leap application to a spreadsheet, the selected answers are truncated and the data might be difficult to interpret. If you change the Saved Values of the three questions to \u201cYes\u201d, \u201cOther\u201d, and \u201cNo\u201d, or assign numerical values, the results are easier to understand. Click OK. Save your form and preview it. The Preview icon is located with the Save icon. Note: Ensure that your browser does not block pop-up windows, as the preview form opens in a new window or new tab, depending on your browser settings. Notice that the Submit and Cancel buttons are automatically added for you. While you can enter data into the form in Preview mode, you cannot submit a form until it is deployed. To return to building the form, close the tab or the browser window in which the preview opened. Creating the survey: Now create the section which contains the survey questions. This section has a rule set on it, so if the user selects \u201cNo, I drink other hot beverages\u201d or \u201cNo, I don\u2019t drink hot beverages\u201d, the survey is not displayed. First create the rule, then add the survey to the section. Click the border bar to access the row action menu. Select Insert Row (after). Click Section from the Palette, then click the form. Extend the section over both columns. Click the Rules icon. The Rules window opens. Click Add Rule. In the When this is true: section, select Do you drink coffee?. Set the operation to Does not equal. Leave A fixed value in the next menu and select Yes. In the Perform this action section, select Survey in the first menu. As you build the rule, it is automatic error checking is performed. If there is an error in the logic, either a warning sign or an error sign is displayed. As this rule contains no errors, a verification icon is displayed. Select Hide in the second menu. Click Apply and Close to save your changes and close the Rules window. The rule is now set so when a user responds that they don't drink coffee, they are not shown the survey about what type of coffee they prefer. Now that the rule is set, add the survey questions using: Two Survey form items: one to ask what roast of coffee the employees prefer, the other to ask them questions about the coffee provided. A Select Many form item to provide more information about what they like or dislike about the coffee. A Multi-Line Entry form item to provide detailed comments. Select Survey from the Palette and add it to the section grid. Extend the survey over both columns. Set the following properties in the side panel: Title: \u2013 Coffee preference Hint: \u2013 What type of coffee roast do you prefer? Options: Dark Roast Medium Roast Light Roast Decaf Click OK. Change the survey question from the default \u201cClick to edit\u201d to I prefer to drink: Select Survey from the Palette and add it with the Coffee preference survey. Extend the survey over both columns. In the Properties panel, set the following properties: Title: \u2013 Please rank each question: Options: Displayed Value Saved Value Totally agree 5 Somewhat agree 4 Agree 3 No opinion 0 Somewhat disagree 2 Totally disagree 1 If you export the data to a spreadsheet program, each user\u2019s response displays as the numerical code, rather than the Displayed Value. Tabulation of results is easier as you can sort the submitted responses by Saved Value numerical indicator. Review the ranking labels. Ranking labels are displayed before and after the Displayed Value. Set the following properties: Select Display before and after labels. In the Before label: text box, typeAgree. In the After label: text box, typeDisagree. Change the survey question from the default \u201cClick to edit\u201d to: I like the coffee at work. Click Add question to add another row to the survey. Change the survey question to: If changes were made, I would drink more coffee. You can repeat this step to add more questions to the survey. An alternative to multiple survey questions is to add a Select Many form item where users can select multiple choices from a list. Click Select Many from the Palette and place it onto the form near the survey. Extend the Select Many form item over both columns. The properties panel opens. Note: You can change the orientation of the Select Many choices by changing the Choice Layout. Changes are made instantly on the form. You can also select a minimum and maximum number of choices the user can select. Set the following properties: Title: \u2013 I find the coffee in the office: Hint: \u2013 Select all that apply. Options: Too acidic Too bitter Too weak Too strong Goes cold too quickly Too gritty Perfect. No changes required. For example, you can require the user to select a minimum of two choices and a maximum of 5. Click OK. Save the form. To complete the survey form, add a Multi-Line Entry so users can submit other options, or opinions. Click Multi-Line Entry from the Palette and place it onto the form with the Select Many form item. Extend the Multi-Line Entry form item over both columns. The properties panel opens. Set the following properties: Title: \u2013 Please enter any specific suggestions you might have: Width: \u2013 Full width. Selecting Full width results in the space for entering data automatically adjusting to the size of the form in the browser window. Hint: \u2013 For example, a specific bean blend you\u2019d like us to try. Click OK. The functionality of the survey is now in place. When users complete the survey and submit it, they receive a visual confirmation on the screen that the survey is submitted, and by default, are shown the survey again. To prevent user confusion, and to prevent the user from submitting the form again, redirect the user to your company website after the form is submitted. Adding a redirect URL is done in the Workflow tab. By default, each form automatically has a Start stage and a Submitted stage. The Start stage contains the Submit and Cancel buttons that are seen when you preview the form. Click the Workflow tab. Click the Submit button node. The Properties panel opens. The Action Completion Message: has \u201cYour data has been successfully submitted.\u201d as the default message. You can leave the default, or change the text. In the Action Completion Redirect URL (optional): text entry area, enter the URL of your company website. Click the Design tab to return to the main body of the form. The coffee survey is now complete. Save and preview the form. Now that you have built a form, you must deploy it so it is available for users.","title":"Opening Leap and building a form"},{"location":"tut_survey_application_module1.html#lesson12","text":"The following steps describe how to deploy a completed form, launch a form, enter sample data, review the submitted sample data, then delete the submitted sample data. Deploying an application \u2013 Deploying, or publishing forms is done in the Manage tab. Click the Manage tab. Click the Deploy link for your survey. The Deployment Settings window is displayed. Select Set deployment Period. Set the Start and Stop dates to span a two week window, starting today. Tip: It is useful to have a start and end date for some applications because users are forced to complete the form within a specific time frame. Click Start. The application is deployed. After the application is deployed, you need the URL to provide to your colleagues so they can complete the survey. There are two ways to get the URL: Click the Launch link. A browser window launches with the URL of the deployed form in the address bar. Notice that the Submit button on the end of the form is now available. Expand the information for the Coffee Feedback application by clicking the Show application details button for application. The link is provided on the screen in the URL Links section. Copy the URL for distribution to your coworkers. Updating an application after deployment \u2013 You can change an application at any time. However, you must deploy the application again for users to see your changes. There are two ways to change a deployed application: Update the deployed application, or stop the deployment, and then redeploy. To update a deployed application, in the Manage tab click the Edit link. A message is displayed to warn you that changing an application after it is deployed can affect previously collected data. Click Yes on the warning message. The form opens and is available for editing. Make the required changes to the form. Save the form again. Click the Manage tab, then click the Deploy link. Click Update. The application is redeployed with the updated form. You can also stop the deployment manually, make changes, then redeploy the application. If a deployment is stopped, the application is no longer available online. To stop a deployed application, click the Deploy link. The Deployment Settings window opens Click Stop. Note: If a user is completing the form when you stop, redeploy, or update an application, they receive an error message. The unsubmitted data is lost and the user must fill the form in again. Adding sample data to an application \u2013 Now that the form is complete and deployed, add some sample data. Click the Launch link. The application opens in a new browser window. Submit the form several times with various sample data. Here are some examples to try, but you can use your own combination of survey results. John Smith who drinks the office coffee. He prefers dark roast, and does not enjoy the office coffee because it is too weak and cold. Mary Jones who drinks only tea. Sam Wesson who drinks the office coffee. He likes a medium roast and like the coffee the way it is. He would like management to try a different roast combination by a local roast house. Ellen Steele who drinks the coffee, but prefers decaffeinated coffee. She would like the coffee to be weaker. Note: As you submit each survey, you see a message upon completion, and then are redirected to the company website. Viewing submitted data \u2013 After the sample data is added, return to Leap to review the submitted data. In the Manage tab, click the View Data link. The View Data screen is displayed in either a new tab or a new browser window, depending on your browser settings. On the View Data page, all submitted responses are summarized in a chart. Click Sam Wesson\u2019s name. His submitted form is displayed in the Application view. Deleting sample data \u2013 Now that you tested the form, it is highly recommended that you delete all sample responses to avoid interference with the actual data from your coworkers. There are two ways to delete the sample data: Delete individual entries from the View Data screen Update the deployment to delete previous records. To delete submitted data from the View Data screen: Select a sample record from the list so it is displayed in the Application view window. If the form is wider than the allotted screen space, scroll bars are displayed. Click Delete Record in the Application view window. Note: Clicking the x in that window closes the record, but does not delete it. To delete submitted data by updating the deployment: Close the View Data tab or browser window. You are on the Leap Manage screen. Click Deploy. The Deployment Settings window opens. Click the Advanced tab. Select the check box for Delete previous submissions. You are asked to confirm the deletion of the submitted data. Click OK. Click Update. Click the View Data link. The blank View Data page is displayed. The survey form is complete and ready to send to your coworkers. You can send out the survey link in an office-wide email. After two weeks, the survey deployment period ends, and you provide the survey results to the Office Manager. Parent topic: Building a Survey application","title":"Application management"},{"location":"tut_tutorials_toc.html","text":"Tutorials for app design The HCL Leap tutorial section contains two tutorials to help you learn to use Leap. HCL Software U: Application development Building a Survey application This tutorial describes how to build a simple survey application with HCL Leap. Adding tables and workflow elements to a HCL Leap form This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial.","title":"Tutorials for form design"},{"location":"tut_tutorials_toc.html#tutorials-for-app-design","text":"The HCL Leap tutorial section contains two tutorials to help you learn to use Leap. HCL Software U: Application development Building a Survey application This tutorial describes how to build a simple survey application with HCL Leap. Adding tables and workflow elements to a HCL Leap form This tutorial provides information and lessons about more advanced Leap topics. Basic form design is not covered in this tutorial.","title":"Tutorials for app design"},{"location":"tut_video_overview.html","text":"HCL Software U: Application development Introduction to application development HLP-CD-101 Introduction to Application Development Parent topic: Tutorials for app design","title":"Video -- Creating and deploying an application using Leap"},{"location":"tut_video_overview.html#videoibmformsexperiencebuilder","text":"","title":"HCL Software U: Application development"},{"location":"tut_video_overview.html#section_pjl_n4m_lzb","text":"HLP-CD-101 Introduction to Application Development Parent topic: Tutorials for app design","title":"Introduction to application development"},{"location":"upgrade_application_design.html","text":"Upgrading an application design The upgrade feature allows an application design to be replaced by a new version. You many want to make significant changes to your application but do not want to affect the running version while you finalize the details. If you create a copy of the application, using export and import, you can make and test all changes. The copy can be edited, deployed, and records submitted without affecting the original application. Once you have completed the changes on the application copy, you can upgrade the original app with the export of the copy. The original app will maintain its application identification, but will also contain all the changes from the copy. Export an existing application: Select a local directory where the application file will stored. Select New Application > From Existing > Next . Choose the application from your local directory and click Create . Note: The imported application will have the same name as the original - edit the name to distinguish it from the original. It is also recommended that you change the access permissions so that others may not use the application while it is in development. Edit the new application to work on the next iteration of the app. This can be deployed and tested, without interfering with the original application. When satisfied, Export the new application (without data): In the original application, select Upgrade and choose the exported new application (ex. MyApp v2). Note: Do not check Replace submitted data . This will result in the older app (MyApp) being upgraded to the newer version. Decide if you are going to keep the copy for further future edits or delete it. Parent topic: Creating and managing applications","title":"Upgrading an application design"},{"location":"upgrade_application_design.html#untitled1","text":"The upgrade feature allows an application design to be replaced by a new version. You many want to make significant changes to your application but do not want to affect the running version while you finalize the details. If you create a copy of the application, using export and import, you can make and test all changes. The copy can be edited, deployed, and records submitted without affecting the original application. Once you have completed the changes on the application copy, you can upgrade the original app with the export of the copy. The original app will maintain its application identification, but will also contain all the changes from the copy. Export an existing application: Select a local directory where the application file will stored. Select New Application > From Existing > Next . Choose the application from your local directory and click Create . Note: The imported application will have the same name as the original - edit the name to distinguish it from the original. It is also recommended that you change the access permissions so that others may not use the application while it is in development. Edit the new application to work on the next iteration of the app. This can be deployed and tested, without interfering with the original application. When satisfied, Export the new application (without data): In the original application, select Upgrade and choose the exported new application (ex. MyApp v2). Note: Do not check Replace submitted data . This will result in the older app (MyApp) being upgraded to the newer version. Decide if you are going to keep the copy for further future edits or delete it. Parent topic: Creating and managing applications","title":"Upgrading an application design"},{"location":"upgradingleap_sec.html","text":"Upgrading The following topics describe how to upgrade Leap. Upgrading Leap on a traditional platform The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Parent topic: Deploying Leap","title":"Upgrading"},{"location":"upgradingleap_sec.html#upgradingleap_sec","text":"The following topics describe how to upgrade Leap. Upgrading Leap on a traditional platform The following instructions describe how to upgrade Leap by using the WebSphere\u00ae Application Server Administrative console. Parent topic: Deploying Leap","title":"Upgrading"},{"location":"wf_managing_the_files_associated_with_your_appl.html","text":"Managing the files associated with your application You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab You can upload files such as images, JavaScript\u2122, or CSS files from the Settings tab. Files are also uploaded using many form items, such as Media, Image, Button, Page Navigation, and Text, when creating your form. Once a file is uploaded, use the file manager to update, copy or delete files. HCL Leap maintains references on the relationships between the files and where they are placed on the form. The files stored in the file manager are also exported with the application. Uploading files for use in your application The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. Parent topic: Creating and managing applications","title":"Managing the files associated with your application"},{"location":"wf_managing_the_files_associated_with_your_appl.html#managingthefilesassociatedwithyourapplication","text":"You can upload a variety of files, such as images, for use with your application. Managing these embedded files is done in the Files section of the Settings tab You can upload files such as images, JavaScript\u2122, or CSS files from the Settings tab. Files are also uploaded using many form items, such as Media, Image, Button, Page Navigation, and Text, when creating your form. Once a file is uploaded, use the file manager to update, copy or delete files. HCL Leap maintains references on the relationships between the files and where they are placed on the form. The files stored in the file manager are also exported with the application. Uploading files for use in your application The following instructions describe how to upload files to Leap, and how to use the uploaded files within your application. Parent topic: Creating and managing applications","title":"Managing the files associated with your application"},{"location":"whats_new.html","text":"What's new in 9.3.5? For a full list of fixes by release, see this article . New features Bug fixes. 9.3.4 Bug fixes. Added support for Secrets in Kubernetes. For more information, see helm_admin_customsecret.md . 9.3.3 Support for Custom Widget API. For more information, see customwidgetapi_landing.md . Support for PostgreSQL databases. For more information, see create_postgresql_db.md . Admin Application Dashboard. For more information, see admin_application_dashboard.md . 9.3.2 Open Liberty support. For more information, see the following topics: deploy_container_kubernetes_openliberty.md 9.3.1 New Copy/Paste feature. The \"copy/paste\" feature enables the application author to copy an item from their form and paste it into another page/form/app page within the same application or another one on the same Leap server. For more information, see cr_copying_items.md . New Workflow Branching feature. The \"workflow branching\" feature enables the application author to specify a condition that changes where a submitted form is directed. For more information, see sub_adding_stages_toc.md#section_hjd_3rw_rvb . Improved HTML editor experience. Improved page navigation and validation behavior, including custom error handling with JavaScript API. Refreshed Workflow diagram UI. Administrative improvements: Beginning with this release, Leap has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. For more information, see leap_strict_csp.md . Kubernetes-friendly Container. Access to service descriptions may be restricted by user, group or special role (i.e. authenticated, anonymous, etc). For more information, see the following topics: ref_service_deploying_service_description.md co_configuration_properties.md 9.3 UI Improvements: Tabs across the top are replaced by a sidebar. Added breadcrumb navigation Updated the toolbar Item Properties are now shown in a side panel instead of a modal dialog. New Workflow Design. New apps will have two stages: Start and Submitted. Improved user experience for Action Properties and Submit Activities Improved user experience for Workflow Stage Visibility Improved user experience for Stage Properties and Roles/Permissions New Palette Items: App pages. App Pages provide a free-form app building canvas, and allow authors to build anything from simple welcome pages to complex dashboards. App pages differ from Forms, which provide a canvas that specifically defines an interface to collect and store data with a built-in function to submit a record and move it through workflow stages. For more information, see Creating an application and navigate to Step 4. DataGrid RichText Entry field Name Picker field Other: New service activity timing: before or after data is submitted Support for Role based rules allows authors to define a rule with the condition that a user is or is not in a particular role. For more information, see Creating rules in your application . Support for Stage based rules allows authors to define a rule with a condition that the form is or is not in a particular stage. New javascript functions are supported. For more information, see Interface objects . New options for redirecting: redirect to another Leap Application, web URL, form or app page. For more information, see Redirecting users after form submission . New form property Show print and delete buttons. User\u2019s can now determine where to save a filled PDF. For more information, see Saving a PDF to a file location. Ability to add a custom theme to be shared by multiple applications. 9.2.1 Support for the following: Oracle 19c: New features include: Embedding of forms without an <iframe> 9.2 New features include: New Application wizard Create an application directly from an existing Excel spreadsheet Send attachments in email notifications (including filled PDF\u2019s) Numerous visual and usability improvements, including: Double-click to open item properties One-click \u201ccopy to clipboard\u201d on URLs and embed codes Improved first-time-user experience Redesigned palette Additional confirmation prompts on irreversible actions Stylistic improvements to the \u201cManager\u201d page Addition of \u201chas value\u201d and \u201cnot\u201d operators for View Responses and the Data REST API Addition of \u201chas value\u201d and \u201chas no value\u201d for rules Improved experience for those using FlexNet licensing Print view enhancements Vertical table layout option (for wide tables) Removed application size limit Use the \u201cData Label\u201d property mark-up is instrumented to allow for easier manipulation Better default logging on failed service calls Attachment clean-up service now configurable Include record UID in exported spreadsheets General fixes and security patches 9.1 New features include: PDF document integration enhancements: Store filled PDFs to a network drive Map Table items to tables in a PDF Ability to flatten a filled PDF New JavaScript API functions: app.getLocation() item.setColumnHeaders() and item.getColumnHeaders() for Table items A new \u201cCustom Attribute\u201d property Full accessibility of the date picker Ability to render HCL Leap applications within ElectronJS desktop applications New applications now have a middle \u201cSubmitted\u201d stage by default Option to block UI interaction while a service call is executing Ability to hide the \u201cUse\u201d tab General fixes and minor improvements 9.0 New features include: New JavaScript API functions: BO.isValid() , BO.getInvalidMessages() , and app.showMessage() . \"Reply To\" capability for email notifications. Allow attachments to be viewed in browser instead of downloading. Display Data Label property in View Responses. Custom JavaScript editor is now resizable. Design-time usability improvements for service calls. General and security fixes. 8.6.4.2 Support for the following versions: Oracle 12c and 11g 10.5 and 11.x 8.5.5 and 9 Java\u2122 7 Derby 10.10.2 ICU 55.1 New features include: An updated Styles tab to enable easy customization of an application's appearance through changes to colors, fonts and other style attributes. Use the provided Customize action to customized your theme and then use the theme export and import functionality to style other applications with the same theme. Previously available styling features, like the ability to add additional custom CSS are still available and contribute to the overall look of an application, but are not edited or modified as part of the new theme customization feature. For more information, see Styling your application with a custom theme . Application owners can now import a set of data from a spreadsheet into an application. An Import Data button for each application is provided in View Responses. Data can be imported from recent versions of xls and xlsx and the data must conform to specific application constraints and setup requirements. For more information, see Importing data in view responses . Application designers will now have the choice to store filled PDF documents as an attachment as part of a submitted record, rather than simply returning the filled PDF to the user. For more information, see Mapping form items to PDF fields and storing the filled PDF . General and security fixes. 8.6.3 Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: An easy-to-use Format feature. Line of Business users can enter simple expressions samples of the required format to set format parameters. More advanced users can enter regular expressions. A customizable error message is also available for this feature. Post deployment window containing all the details that are required to start using your application. After you deploy an application, the window opens and describes the\u201cNext Steps\u201d available. Send the launch URL to your users so they can access the application. URLs for viewing responses, charts, and other options are also displayed. The post deployment dialog is also displayed when you import and deploy an application. When you import an existing application, you can choose to remove users from theAccess page. Clearing the previously added users ensures only the people you add to the application have access. After importing an application, use theAccess page to review and modify the existing permissions. The editor for adding rich text to your application was updated. The Data Access Rest API contains additional filtering parameters to allow more specific refinement of the response data. The following API usability enhancements were added: Simplified JSON requests and response structures. New metadata option Automatic generation of swagger files for applications. A new Service Configuration window where you can quickly set up your application to make JSON service calls. For more information, see cr_in_app_service.md . The addition of a new configuration flag that disables the embedding of your application into other web sites. General usability enhancements include: Carbon Copy and Blind Carbon Copy fields for Stage Action emails. New Welcome text on the Manage page. On the Manage page, you can access the Summary Charts URL. This link takes a user with the appropriate permission settings to the stand-alone Summary Chart page. Security fixes. General bug fixes. 8.6.2 Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: A new Events tab for easier management of custom JavaScript\u2122 within an application. The Events tab displays all JavaScript used within an application. A new Alterntative text tag for Image and Media form items. To increase the accessibility of your form, you can now add alternative text to the Image and Media form items. You can now import a list of choices from a spreadsheet into Select One , Select Many , and Dropdown form items. The lists can be comma separated, or space separated. If you copy two columns of choices from a spreadsheet, the first column is set as the Displayed Value, and the second column set as the Saved Value. In the Settings tab, under Files , you can now download any previously uploaded file. A Java 2 Connector (J2C) provider is now supported for use in the HTTP Service Transport with . A new openURL query parameter so you can dynamically set a application to open at run time. The Media form item is supported in Google Chrome via HTML5. Two new JavaScript functions were added to the User Interface Objects: setTabTitle and setTabTitleList . The amount of Stage Action data an application can have has been increased. General and security fixes. 8.6.1 Support for the following versions: Oracle 11g 10.5 8.5.5 Java 7 Derby 10.10.2 New features include: Document Integration : Where compliance or regulatory requirements mandate it, integrating captured data with existing documents can be an important part of the overall solution. These output documents can be provided for precise printing, document signing or archiving. Using a Service Configuration, you can map form items to PDF items. When the user clicks a button, the PDF is populated. For more information, see document integration . integration features Render parameters : Two public render parameters were added to provide additional portlet-to-portlet communication. For more information, see ref_public_render_parameters.md Page refresh setting : A new page refresh setting is available in the Shared Settings . This property lets you set whether the portal page is refreshed when the form is submitted. For more information, see in_portlet_selecting_application_using_edit_shared_setting.md . Support for non-default portal context root : The Leap Portlet now supports portal with a non-default context root, or an empty context root. Script Portlet and DDC samples : Two new samples are available for usingwith . Both samples are available on the developerWorks\u00ae wiki: DDC integration Script Portlet integration Additional in-product help : If you're new to , blue help bubbles describe the basic function of each page or section, as well as provide additional help resources. Additional hover help, and context sensitive help were added throughout the application. JSON is now supported in the : HTTP Transport JavaScript Data Access Rest API New JavaScript functionality : New JavaScript functions were added to the User Interface Objects. Forms Tab : Moving items in an application : You can now move form items between pages of a form. For more information, see cr_moving_items_on_a_form.md . Order of forms in a application : You can change the order of the forms within an application by dragging and dropping them in the Outline view. When the application is deployed and launched, the first form in the application becomes the default form seen by the user. Warning message on Save : does not support multiple people editing the same application. If you and another user edit the same application, and the other user saves changes while you are still editing, a warning message is now displayed asking if you want to overwrite the changes made by the other user. Date item loads current date : A new property is available for the Date field. When selected, if the user leaves the Date field empty, the current date is loaded upon form submission. If the user fills in the date field, the date supplied by the user is used. Single and Multi-Line entries uppercase : This new feature, located in the Basic tab of the Properties window lets you automatically change the user's entered text into upper case letters. Hiding Table buttons for Add, Edit, and Delete : In the Advanced tab for a Table , you can now set that no buttons are displayed with your table. The buttons can be enabled using JavaScript, if required. Manage Tab : Default sort order : Default sort order was changed so the most recently changed applications are listed at the top. Now you can quickly find recently modified applications. Alphabetical sorting is still available, but no longer the default. Redeploy after saving : When you edit an application, and save the changes you must redeploy the application for the changes to be implemented. A visual indicator is now displayed as a reminder when an application has changes that have not been deployed. Adding tags to an application : When you create a new application, you can add tags at the same time. Tags are used to search for applications in the Manage screen. Previously, you could only add tags to your application after it was created and listed in the Manage tab. Tags are separated by spaces, so if you need to make a multiple-word tag, use an underscore between the words. Access Tab : The \"All Authenticated Users\" group cannot be added to any role that has Edit permissions. Users can still be assigned individually, or as groups, to roles with edit permissions. This prevents your application from showing up in the Manage Tab for all authenticated users, and from their applications appearing on your Manage tab. You see only the applications you created, or those to which you have edit permissions. Rules : Naming Rules : You can now name and rename rules. Providing unique, descriptive names to rules makes them easier to find when building your application. See which item is used in a Rule : When a form item has a rule enabled, the Rules icon for the item contains a check mark. The check mark lets you quickly see which form items are involved in a rule. Stages : Stage Description : When you create a new Stage, you can add a detailed description. Adding descriptions is useful if you will have several similarly named stages that perform slightly different portions of the workflow. Rich Text Action Completion Message : The Action Completion Message is now a rich text field. Success message after submission : When a user completes and submits a form, the new default is to take the user away from the form and display the Action Completion Message. This reduces user confusion as they no longer see an empty, reloaded form on the screen. The existing options for the action taken upon form submission are still available in the Edit Form Properties window. View Responses : Individual Print, Email, and Delete buttons added : Print, email and delete buttons were added to each record row, so you can access them without opening each individual record. Email option contains the link to the record : The email operation emails the link to both print and launch the record. New fields added to Responses screen : \u201cCreated on\u201dand \u201cLast Updated By\u201d were added to the table so you can see additional information on each submitted form. Selected results open in a new window : When you click on a submitted record, it opens in a window, rather than in a side pane. Default view changed : When you click the View Responses link, the default view is now Responses , rather than Summary . A number of upgrade routine fixes, accessibility, and usability changes were implemented. Values entered into the password item are not stored in your application. Since the password is never stored, it is never exported or shown in any field. The password field is empty when the form is rendered in its next stage. Using the password for calling server-side services during stage transitions still work as the value is included as part of the submitted data and not stored as part of the application record.","title":"What's new?"},{"location":"whats_new.html#whatsnew","text":"For a full list of fixes by release, see this article .","title":"What's new in 9.3.5?"},{"location":"whats_new.html#section_zml_blt_b1c","text":"Bug fixes.","title":"New features"},{"location":"whats_new.html#section_y12_hlh_jzb","text":"Bug fixes. Added support for Secrets in Kubernetes. For more information, see helm_admin_customsecret.md .","title":"9.3.4"},{"location":"whats_new.html#section_f3b_htl_2yb","text":"Support for Custom Widget API. For more information, see customwidgetapi_landing.md . Support for PostgreSQL databases. For more information, see create_postgresql_db.md . Admin Application Dashboard. For more information, see admin_application_dashboard.md .","title":"9.3.3"},{"location":"whats_new.html#section_um3_2mt_2xb","text":"Open Liberty support. For more information, see the following topics: deploy_container_kubernetes_openliberty.md","title":"9.3.2"},{"location":"whats_new.html#section_vzz_w4p_rvb","text":"New Copy/Paste feature. The \"copy/paste\" feature enables the application author to copy an item from their form and paste it into another page/form/app page within the same application or another one on the same Leap server. For more information, see cr_copying_items.md . New Workflow Branching feature. The \"workflow branching\" feature enables the application author to specify a condition that changes where a submitted form is directed. For more information, see sub_adding_stages_toc.md#section_hjd_3rw_rvb . Improved HTML editor experience. Improved page navigation and validation behavior, including custom error handling with JavaScript API. Refreshed Workflow diagram UI. Administrative improvements: Beginning with this release, Leap has a limited capability to restrict the rendering of Leap Forms using a \u201cStrict CSP\u201d policy. For more information, see leap_strict_csp.md . Kubernetes-friendly Container. Access to service descriptions may be restricted by user, group or special role (i.e. authenticated, anonymous, etc). For more information, see the following topics: ref_service_deploying_service_description.md co_configuration_properties.md","title":"9.3.1"},{"location":"whats_new.html#93","text":"UI Improvements: Tabs across the top are replaced by a sidebar. Added breadcrumb navigation Updated the toolbar Item Properties are now shown in a side panel instead of a modal dialog. New Workflow Design. New apps will have two stages: Start and Submitted. Improved user experience for Action Properties and Submit Activities Improved user experience for Workflow Stage Visibility Improved user experience for Stage Properties and Roles/Permissions New Palette Items: App pages. App Pages provide a free-form app building canvas, and allow authors to build anything from simple welcome pages to complex dashboards. App pages differ from Forms, which provide a canvas that specifically defines an interface to collect and store data with a built-in function to submit a record and move it through workflow stages. For more information, see Creating an application and navigate to Step 4. DataGrid RichText Entry field Name Picker field Other: New service activity timing: before or after data is submitted Support for Role based rules allows authors to define a rule with the condition that a user is or is not in a particular role. For more information, see Creating rules in your application . Support for Stage based rules allows authors to define a rule with a condition that the form is or is not in a particular stage. New javascript functions are supported. For more information, see Interface objects . New options for redirecting: redirect to another Leap Application, web URL, form or app page. For more information, see Redirecting users after form submission . New form property Show print and delete buttons. User\u2019s can now determine where to save a filled PDF. For more information, see Saving a PDF to a file location. Ability to add a custom theme to be shared by multiple applications.","title":"9.3"},{"location":"whats_new.html#921","text":"Support for the following: Oracle 19c: New features include: Embedding of forms without an <iframe>","title":"9.2.1"},{"location":"whats_new.html#92","text":"New features include: New Application wizard Create an application directly from an existing Excel spreadsheet Send attachments in email notifications (including filled PDF\u2019s) Numerous visual and usability improvements, including: Double-click to open item properties One-click \u201ccopy to clipboard\u201d on URLs and embed codes Improved first-time-user experience Redesigned palette Additional confirmation prompts on irreversible actions Stylistic improvements to the \u201cManager\u201d page Addition of \u201chas value\u201d and \u201cnot\u201d operators for View Responses and the Data REST API Addition of \u201chas value\u201d and \u201chas no value\u201d for rules Improved experience for those using FlexNet licensing Print view enhancements Vertical table layout option (for wide tables) Removed application size limit Use the \u201cData Label\u201d property mark-up is instrumented to allow for easier manipulation Better default logging on failed service calls Attachment clean-up service now configurable Include record UID in exported spreadsheets General fixes and security patches","title":"9.2"},{"location":"whats_new.html#91","text":"New features include: PDF document integration enhancements: Store filled PDFs to a network drive Map Table items to tables in a PDF Ability to flatten a filled PDF New JavaScript API functions: app.getLocation() item.setColumnHeaders() and item.getColumnHeaders() for Table items A new \u201cCustom Attribute\u201d property Full accessibility of the date picker Ability to render HCL Leap applications within ElectronJS desktop applications New applications now have a middle \u201cSubmitted\u201d stage by default Option to block UI interaction while a service call is executing Ability to hide the \u201cUse\u201d tab General fixes and minor improvements","title":"9.1"},{"location":"whats_new.html#90","text":"New features include: New JavaScript API functions: BO.isValid() , BO.getInvalidMessages() , and app.showMessage() . \"Reply To\" capability for email notifications. Allow attachments to be viewed in browser instead of downloading. Display Data Label property in View Responses. Custom JavaScript editor is now resizable. Design-time usability improvements for service calls. General and security fixes.","title":"9.0"},{"location":"whats_new.html#8642","text":"Support for the following versions: Oracle 12c and 11g 10.5 and 11.x 8.5.5 and 9 Java\u2122 7 Derby 10.10.2 ICU 55.1 New features include: An updated Styles tab to enable easy customization of an application's appearance through changes to colors, fonts and other style attributes. Use the provided Customize action to customized your theme and then use the theme export and import functionality to style other applications with the same theme. Previously available styling features, like the ability to add additional custom CSS are still available and contribute to the overall look of an application, but are not edited or modified as part of the new theme customization feature. For more information, see Styling your application with a custom theme . Application owners can now import a set of data from a spreadsheet into an application. An Import Data button for each application is provided in View Responses. Data can be imported from recent versions of xls and xlsx and the data must conform to specific application constraints and setup requirements. For more information, see Importing data in view responses . Application designers will now have the choice to store filled PDF documents as an attachment as part of a submitted record, rather than simply returning the filled PDF to the user. For more information, see Mapping form items to PDF fields and storing the filled PDF . General and security fixes.","title":"8.6.4.2"},{"location":"whats_new.html#863","text":"Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: An easy-to-use Format feature. Line of Business users can enter simple expressions samples of the required format to set format parameters. More advanced users can enter regular expressions. A customizable error message is also available for this feature. Post deployment window containing all the details that are required to start using your application. After you deploy an application, the window opens and describes the\u201cNext Steps\u201d available. Send the launch URL to your users so they can access the application. URLs for viewing responses, charts, and other options are also displayed. The post deployment dialog is also displayed when you import and deploy an application. When you import an existing application, you can choose to remove users from theAccess page. Clearing the previously added users ensures only the people you add to the application have access. After importing an application, use theAccess page to review and modify the existing permissions. The editor for adding rich text to your application was updated. The Data Access Rest API contains additional filtering parameters to allow more specific refinement of the response data. The following API usability enhancements were added: Simplified JSON requests and response structures. New metadata option Automatic generation of swagger files for applications. A new Service Configuration window where you can quickly set up your application to make JSON service calls. For more information, see cr_in_app_service.md . The addition of a new configuration flag that disables the embedding of your application into other web sites. General usability enhancements include: Carbon Copy and Blind Carbon Copy fields for Stage Action emails. New Welcome text on the Manage page. On the Manage page, you can access the Summary Charts URL. This link takes a user with the appropriate permission settings to the stand-alone Summary Chart page. Security fixes. General bug fixes.","title":"8.6.3"},{"location":"whats_new.html#862","text":"Support for the following versions: Oracle 12c and 11g 10.5 8.5.5 Java 7 Derby 10.10.2 ICU 55.1 New features include: A new Events tab for easier management of custom JavaScript\u2122 within an application. The Events tab displays all JavaScript used within an application. A new Alterntative text tag for Image and Media form items. To increase the accessibility of your form, you can now add alternative text to the Image and Media form items. You can now import a list of choices from a spreadsheet into Select One , Select Many , and Dropdown form items. The lists can be comma separated, or space separated. If you copy two columns of choices from a spreadsheet, the first column is set as the Displayed Value, and the second column set as the Saved Value. In the Settings tab, under Files , you can now download any previously uploaded file. A Java 2 Connector (J2C) provider is now supported for use in the HTTP Service Transport with . A new openURL query parameter so you can dynamically set a application to open at run time. The Media form item is supported in Google Chrome via HTML5. Two new JavaScript functions were added to the User Interface Objects: setTabTitle and setTabTitleList . The amount of Stage Action data an application can have has been increased. General and security fixes.","title":"8.6.2"},{"location":"whats_new.html#861","text":"Support for the following versions: Oracle 11g 10.5 8.5.5 Java 7 Derby 10.10.2 New features include: Document Integration : Where compliance or regulatory requirements mandate it, integrating captured data with existing documents can be an important part of the overall solution. These output documents can be provided for precise printing, document signing or archiving. Using a Service Configuration, you can map form items to PDF items. When the user clicks a button, the PDF is populated. For more information, see document integration . integration features Render parameters : Two public render parameters were added to provide additional portlet-to-portlet communication. For more information, see ref_public_render_parameters.md Page refresh setting : A new page refresh setting is available in the Shared Settings . This property lets you set whether the portal page is refreshed when the form is submitted. For more information, see in_portlet_selecting_application_using_edit_shared_setting.md . Support for non-default portal context root : The Leap Portlet now supports portal with a non-default context root, or an empty context root. Script Portlet and DDC samples : Two new samples are available for usingwith . Both samples are available on the developerWorks\u00ae wiki: DDC integration Script Portlet integration Additional in-product help : If you're new to , blue help bubbles describe the basic function of each page or section, as well as provide additional help resources. Additional hover help, and context sensitive help were added throughout the application. JSON is now supported in the : HTTP Transport JavaScript Data Access Rest API New JavaScript functionality : New JavaScript functions were added to the User Interface Objects. Forms Tab : Moving items in an application : You can now move form items between pages of a form. For more information, see cr_moving_items_on_a_form.md . Order of forms in a application : You can change the order of the forms within an application by dragging and dropping them in the Outline view. When the application is deployed and launched, the first form in the application becomes the default form seen by the user. Warning message on Save : does not support multiple people editing the same application. If you and another user edit the same application, and the other user saves changes while you are still editing, a warning message is now displayed asking if you want to overwrite the changes made by the other user. Date item loads current date : A new property is available for the Date field. When selected, if the user leaves the Date field empty, the current date is loaded upon form submission. If the user fills in the date field, the date supplied by the user is used. Single and Multi-Line entries uppercase : This new feature, located in the Basic tab of the Properties window lets you automatically change the user's entered text into upper case letters. Hiding Table buttons for Add, Edit, and Delete : In the Advanced tab for a Table , you can now set that no buttons are displayed with your table. The buttons can be enabled using JavaScript, if required. Manage Tab : Default sort order : Default sort order was changed so the most recently changed applications are listed at the top. Now you can quickly find recently modified applications. Alphabetical sorting is still available, but no longer the default. Redeploy after saving : When you edit an application, and save the changes you must redeploy the application for the changes to be implemented. A visual indicator is now displayed as a reminder when an application has changes that have not been deployed. Adding tags to an application : When you create a new application, you can add tags at the same time. Tags are used to search for applications in the Manage screen. Previously, you could only add tags to your application after it was created and listed in the Manage tab. Tags are separated by spaces, so if you need to make a multiple-word tag, use an underscore between the words. Access Tab : The \"All Authenticated Users\" group cannot be added to any role that has Edit permissions. Users can still be assigned individually, or as groups, to roles with edit permissions. This prevents your application from showing up in the Manage Tab for all authenticated users, and from their applications appearing on your Manage tab. You see only the applications you created, or those to which you have edit permissions. Rules : Naming Rules : You can now name and rename rules. Providing unique, descriptive names to rules makes them easier to find when building your application. See which item is used in a Rule : When a form item has a rule enabled, the Rules icon for the item contains a check mark. The check mark lets you quickly see which form items are involved in a rule. Stages : Stage Description : When you create a new Stage, you can add a detailed description. Adding descriptions is useful if you will have several similarly named stages that perform slightly different portions of the workflow. Rich Text Action Completion Message : The Action Completion Message is now a rich text field. Success message after submission : When a user completes and submits a form, the new default is to take the user away from the form and display the Action Completion Message. This reduces user confusion as they no longer see an empty, reloaded form on the screen. The existing options for the action taken upon form submission are still available in the Edit Form Properties window. View Responses : Individual Print, Email, and Delete buttons added : Print, email and delete buttons were added to each record row, so you can access them without opening each individual record. Email option contains the link to the record : The email operation emails the link to both print and launch the record. New fields added to Responses screen : \u201cCreated on\u201dand \u201cLast Updated By\u201d were added to the table so you can see additional information on each submitted form. Selected results open in a new window : When you click on a submitted record, it opens in a window, rather than in a side pane. Default view changed : When you click the View Responses link, the default view is now Responses , rather than Summary . A number of upgrade routine fixes, accessibility, and usability changes were implemented. Values entered into the password item are not stored in your application. Since the password is never stored, it is never exported or shown in any field. The password field is empty when the form is rendered in its next stage. Using the password for calling server-side services during stage transitions still work as the value is included as part of the submitted data and not stored as part of the application record.","title":"8.6.1"},{"location":"wi_adding_html_fragments_to_a_form.html","text":"Adding HTML fragments to a form Using the HTML Fragment item, you can add HTML anywhere in your form. From the Palette, click Specialized toolbar. Drop an HTML Fragment item onto the form. Click HTML, click to edit... and enter your HTML code. Note: Any application Cascading Style Sheets (CSS) used by the form are also applied to the HTML code you enter in the HTML Fragment form item. To see the CSS associated with your form, click the Styles tab. Parent topic: Adding specialized form items","title":"Adding HTML fragments to a form"},{"location":"wi_adding_html_fragments_to_a_form.html#addinghtmlfragmentstoaform","text":"Using the HTML Fragment item, you can add HTML anywhere in your form. From the Palette, click Specialized toolbar. Drop an HTML Fragment item onto the form. Click HTML, click to edit... and enter your HTML code. Note: Any application Cascading Style Sheets (CSS) used by the form are also applied to the HTML code you enter in the HTML Fragment form item. To see the CSS associated with your form, click the Styles tab. Parent topic: Adding specialized form items","title":"Adding HTML fragments to a form"},{"location":"wi_adding_media_to_a_form.html","text":"Adding media to a form You can add media to the form anywhere you place the Media form item. The Media item supports .avi, .mpeg, .mpg, .wmv, .wma, .mov, .mp3, .mp4, and .swf file types. When you use the Media item in an HCL Leap application, it is important to use a media type that renders properly in the supported browsers that you expect your users to use. The ability to render a specific media type is dependent on the browser configuration and which plug-ins they installed. Note: Ensure that you have proper spacing between Media form items and other form items that require pop-ups, such as Calendar . If these types of form items are too close together, the Media item blocks the pop-ups of the other form items. In the Palette, click Specialized . The list of specialized form items expands. Select Media and drop it onto the form. The properties side panel appears so you can configure the media file. Click Add file to upload a file, or point to a URL that hosts the file. Or you can select previously uploaded media from the Media drop-down menu. To set a media item to display on an iPad, click Use a file on the internet . Set the URL for the file, then select Maintain a link to the file only . Click OK . Configure the viewing options by adjusting the Show Control , Auto Start , and Loop radio buttons. Adjust the height and width of the view with the fields provided. Your changes are saved automatically. Parent topic: Adding specialized form items","title":"Adding media to a form"},{"location":"wi_adding_media_to_a_form.html#addingmediatoaform","text":"You can add media to the form anywhere you place the Media form item. The Media item supports .avi, .mpeg, .mpg, .wmv, .wma, .mov, .mp3, .mp4, and .swf file types. When you use the Media item in an HCL Leap application, it is important to use a media type that renders properly in the supported browsers that you expect your users to use. The ability to render a specific media type is dependent on the browser configuration and which plug-ins they installed. Note: Ensure that you have proper spacing between Media form items and other form items that require pop-ups, such as Calendar . If these types of form items are too close together, the Media item blocks the pop-ups of the other form items. In the Palette, click Specialized . The list of specialized form items expands. Select Media and drop it onto the form. The properties side panel appears so you can configure the media file. Click Add file to upload a file, or point to a URL that hosts the file. Or you can select previously uploaded media from the Media drop-down menu. To set a media item to display on an iPad, click Use a file on the internet . Set the URL for the file, then select Maintain a link to the file only . Click OK . Configure the viewing options by adjusting the Show Control , Auto Start , and Loop radio buttons. Adjust the height and width of the view with the fields provided. Your changes are saved automatically. Parent topic: Adding specialized form items","title":"Adding media to a form"},{"location":"wi_adding_tables_to_a_form.html","text":"Adding tables to a form The Table form item enables the user to add complex entries to a form. You can use the Table form item to create a section where a user can submit repeated data. For example, in a job application you can build a table that asks for work history. You can create columns such as the \u201cCompany Name\u201d, \u201cJob Title\u201d, \u201cStart Date\u201d, and \u201cEnd Date\u201d. The user can add as many rows under these columns as required to provide their work history. In many cases, it is not feasible to add individual items for each repeating element as you cannot know in advance how many repeating elements the use requires. To achieve this functionality, the Table form item contains the following two complimentary elements: Child form \u2013 The Child form is a supporting form that contains the form items that collect the repeated data. In the \u201cwork history\u201d example, the child form contains a Date form item for collecting the \u201cStart Date\u201d of a previous job. A child form is similar to a regular form, however it is limited to a single page. When a user completes their job history, the child form is shown in a dialog box. The user can enter as many rows as required to submit a complete job history. In the Outline view, the child form is called \"Table\", and is listed as a subset of the parent page. Table display \u2013 The Table display shows the data entries that are collected by the child form. The columns in the table represent the individual items from the child form. The visibility of specific columns in the table is configurable in the properties side panel. In the Palette, click Specialized . The list of specialized form items expands. Select Table , and drop it onto the form. Adding the table creates a Table child form in the Outline view. In the table, click the link to access the child form, and define the table columns by selecting form items from the Common Palette. Ensure that you give each form item a specific name as the items added to the Table child form become column titles for the table. For example, if you insert a Single Line Entry form item to record someone\u2019s name, you must change the title of the item, or the table on the will display \u201cSingle Line Entry\u201d. The title of the form item is not helpful to users. You will then have to manually adjust the item name using the Properties side panel. When you have built your table, go to the Outline view on the right side of the screen and click the parent Page . You are returned to the main form design area. The table appears on the form, and the titles of the table items are displayed as column headers. Parent topic: Adding specialized form items","title":"Adding tables to a form"},{"location":"wi_adding_tables_to_a_form.html#addinglinesdynamicallytoaform","text":"The Table form item enables the user to add complex entries to a form. You can use the Table form item to create a section where a user can submit repeated data. For example, in a job application you can build a table that asks for work history. You can create columns such as the \u201cCompany Name\u201d, \u201cJob Title\u201d, \u201cStart Date\u201d, and \u201cEnd Date\u201d. The user can add as many rows under these columns as required to provide their work history. In many cases, it is not feasible to add individual items for each repeating element as you cannot know in advance how many repeating elements the use requires. To achieve this functionality, the Table form item contains the following two complimentary elements: Child form \u2013 The Child form is a supporting form that contains the form items that collect the repeated data. In the \u201cwork history\u201d example, the child form contains a Date form item for collecting the \u201cStart Date\u201d of a previous job. A child form is similar to a regular form, however it is limited to a single page. When a user completes their job history, the child form is shown in a dialog box. The user can enter as many rows as required to submit a complete job history. In the Outline view, the child form is called \"Table\", and is listed as a subset of the parent page. Table display \u2013 The Table display shows the data entries that are collected by the child form. The columns in the table represent the individual items from the child form. The visibility of specific columns in the table is configurable in the properties side panel. In the Palette, click Specialized . The list of specialized form items expands. Select Table , and drop it onto the form. Adding the table creates a Table child form in the Outline view. In the table, click the link to access the child form, and define the table columns by selecting form items from the Common Palette. Ensure that you give each form item a specific name as the items added to the Table child form become column titles for the table. For example, if you insert a Single Line Entry form item to record someone\u2019s name, you must change the title of the item, or the table on the will display \u201cSingle Line Entry\u201d. The title of the form item is not helpful to users. You will then have to manually adjust the item name using the Properties side panel. When you have built your table, go to the Outline view on the right side of the screen and click the parent Page . You are returned to the main form design area. The table appears on the form, and the titles of the table items are displayed as column headers. Parent topic: Adding specialized form items","title":"Adding tables to a form"},{"location":"wi_echoing_text_with_a_text_item.html","text":"Echoing text with a Text item You can use the Text item to echo text, or build a summary page. Use the Text item from the Palette to create a header or title for your form. You can also use it to echo text, make a summary page, or to add a user\u2019s name to the beginning of a form. The following instructions describe how to create a summary page on your form. The summary page displays a read-only version of the changes a user made before confirming a change. For example, if your application is a checkout feature where users enter billing and shipping information, you can set an echo text page to confirm their billing and shipping addresses before completing and confirming the order. In the Outline view insert a page by clicking the Ellipses (\u2026) icon for Page 1 and selecting \u201c+ Add Form Page\u201d. An empty form page appears. Drop a Text item onto the form. Click the newly created text item. The properties side panel opens. Enter the name of the Text item in the text area. For example, you might enter \u201cSummary Page\u201d. Under the Content: heading, click Insert item . Select the page and item you want to display on the summary page. Repeat for all of the items in your form you want to summarize. You can separate the selected items by spaces, commas, line breaks, or other formatting. Parent topic: Adding specialized form items","title":"Echoing text with a Text item"},{"location":"wi_echoing_text_with_a_text_item.html#echoingtextwithatextwidget","text":"You can use the Text item to echo text, or build a summary page. Use the Text item from the Palette to create a header or title for your form. You can also use it to echo text, make a summary page, or to add a user\u2019s name to the beginning of a form. The following instructions describe how to create a summary page on your form. The summary page displays a read-only version of the changes a user made before confirming a change. For example, if your application is a checkout feature where users enter billing and shipping information, you can set an echo text page to confirm their billing and shipping addresses before completing and confirming the order. In the Outline view insert a page by clicking the Ellipses (\u2026) icon for Page 1 and selecting \u201c+ Add Form Page\u201d. An empty form page appears. Drop a Text item onto the form. Click the newly created text item. The properties side panel opens. Enter the name of the Text item in the text area. For example, you might enter \u201cSummary Page\u201d. Under the Content: heading, click Insert item . Select the page and item you want to display on the summary page. Repeat for all of the items in your form you want to summarize. You can separate the selected items by spaces, commas, line breaks, or other formatting. Parent topic: Adding specialized form items","title":"Echoing text with a Text item"},{"location":"wi_introduction_to_specialized_form_items.html","text":"Adding specialized form items You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Echoing text with a Text item You can use the Text item to echo text, or build a summary page. Adding tables to a form The Table form item enables the user to add complex entries to a form. Adding HTML fragments to a form Using the HTML Fragment item, you can add HTML anywhere in your form. Adding media to a form You can add media to the form anywhere you place the Media form item. Parent topic: Creating and managing applications","title":"Adding specialized form items"},{"location":"wi_introduction_to_specialized_form_items.html#introductiontospecializedwidgets","text":"You can use specialized form items to style text, echo text back, create dynamic lines, or add HTML. Echoing text with a Text item You can use the Text item to echo text, or build a summary page. Adding tables to a form The Table form item enables the user to add complex entries to a form. Adding HTML fragments to a form Using the HTML Fragment item, you can add HTML anywhere in your form. Adding media to a form You can add media to the form anywhere you place the Media form item. Parent topic: Creating and managing applications","title":"Adding specialized form items"},{"location":"widget_instantiation.html","text":"Widget Instantiation The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. instantiate() is called with the following arguments: context : an object containing useful meta-data, including: locale : the locale of current page. This is useful for displaying messages in the correct language or for dealing with locale preferences (ex. number formatting). mode : one of 'design' (authoring), 'preview' (previewing), or 'run' (running app). The widget's behaviour may need to be tailored based on the context, for example disabling some behaviours in 'design' mode. domNode : the parent DOM node into which the widget's DOM must be placed. The custom widget code must not manipulate the parent node or anything outside of it. initialProps : these will be the initial set of property values as chosen by the app author. eventManager : for triggering events. For example, eventManager.fireEvent('onChange') . The returned object is expected to supply the following functions: getValue() : required for data widgets. setValue(value) : required for data widgets. setProperty(propName, propValue) : required for all widgets. getDisplayTitle() : (optional) for display widget's title in various parts of the UI. setDisabled(isDisabled) : (optional) to tailor the widget's behaviour when disabled and enabled. setErrorMessage(errorMessage) : (optional) for the widget to report validation errors. errorMessage will be null if the data is valid. setRequired(isRequired) : (optional) to tailor the widget's behaviour when the data is required, or not required. getOptions() : (optional) see Widgets with Options . validateValue(value) : (optional) - see Validation . getJSAPIFacade() : (optional) returns an object that supplies additional custom functions that will be available to app authors to use in their custom JavaScript. Special care must be taken to ensure that app authors have a limited range of possibilities and cannot take over the whole page with their custom JavaScript. When Leap's secure sandbox mode is enabled ( secureJS=true ), an author's custom JavaScript cannot access any variables prefixed with a double-underscore. The widget creator is free to decide how they want to code and manage the widget instance internally. Parent topic: Custom Widget API","title":"Widget Instantiation"},{"location":"widget_instantiation.html#widget_instantiation","text":"The widget instantiate() function is called when an instance of the custom widget needs to be created. The function is expected to return an object that allows Leap to interact with the instantiated widget. instantiate() is called with the following arguments: context : an object containing useful meta-data, including: locale : the locale of current page. This is useful for displaying messages in the correct language or for dealing with locale preferences (ex. number formatting). mode : one of 'design' (authoring), 'preview' (previewing), or 'run' (running app). The widget's behaviour may need to be tailored based on the context, for example disabling some behaviours in 'design' mode. domNode : the parent DOM node into which the widget's DOM must be placed. The custom widget code must not manipulate the parent node or anything outside of it. initialProps : these will be the initial set of property values as chosen by the app author. eventManager : for triggering events. For example, eventManager.fireEvent('onChange') . The returned object is expected to supply the following functions: getValue() : required for data widgets. setValue(value) : required for data widgets. setProperty(propName, propValue) : required for all widgets. getDisplayTitle() : (optional) for display widget's title in various parts of the UI. setDisabled(isDisabled) : (optional) to tailor the widget's behaviour when disabled and enabled. setErrorMessage(errorMessage) : (optional) for the widget to report validation errors. errorMessage will be null if the data is valid. setRequired(isRequired) : (optional) to tailor the widget's behaviour when the data is required, or not required. getOptions() : (optional) see Widgets with Options . validateValue(value) : (optional) - see Validation . getJSAPIFacade() : (optional) returns an object that supplies additional custom functions that will be available to app authors to use in their custom JavaScript. Special care must be taken to ensure that app authors have a limited range of possibilities and cannot take over the whole page with their custom JavaScript. When Leap's secure sandbox mode is enabled ( secureJS=true ), an author's custom JavaScript cannot access any variables prefixed with a double-underscore. The widget creator is free to decide how they want to code and manage the widget instance internally. Parent topic: Custom Widget API","title":"Widget Instantiation"},{"location":"widget_internationalization.html","text":"Internationalization Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. For example: label: 'Yes/No', can be written as label: { \"default\": 'Yes/No', \"fr\": 'Oui/No', \"de\": 'Ja/Nein' }, The property names are expected to match the lang attribute of the current HTML page. For example, \"fr\": 'Oui/No' matches <html lang=\"fr\"> . If there is no match, then the \"default\" property will be used as a fallback. The following widget attributes are globalizable: label description category > label properties > (property) > label properties > (property) > defaultValue properties > (property) > options > (option) > title Parent topic: Custom Widget API","title":"Internationalization"},{"location":"widget_internationalization.html#widget_internationalization","text":"Certain attributes of the widget definition can be displayed to app authors working in different locales. To support multiple languages during authoring, some properties can be specified as \"multi-string\" objects rather than a plain string values. For example: label: 'Yes/No', can be written as label: { \"default\": 'Yes/No', \"fr\": 'Oui/No', \"de\": 'Ja/Nein' }, The property names are expected to match the lang attribute of the current HTML page. For example, \"fr\": 'Oui/No' matches <html lang=\"fr\"> . If there is no match, then the \"default\" property will be used as a fallback. The following widget attributes are globalizable: label description category > label properties > (property) > label properties > (property) > defaultValue properties > (property) > options > (option) > title Parent topic: Custom Widget API","title":"Internationalization"},{"location":"widget_javaapi.html","text":"Usage of JavaScript API Custom widgets can use Leap's JavaScript API to help achieve their objectives. The API can be accessed via the global NitroApplication object or by the passed-in context object. For example, the following is a widget that renders itself appropriately based on the form's currently selected page: const myPageNavigator = { ... instantiate: function (context, domNode) { if (context.mode === 'run' || context.mode === 'preview') { const currentPage = context.page; context.form.getPageIds().forEach((pageId) => { const page = context.form.getPage(pageId); const btn = document.createElement('button'); btn.innerHTML = makeHTMLSafe(page.getTitle()); if (page === currentPage) { btn.setAttribute('disabled', 'true'); } else { btn.addEventListener('click', () => { context.form.selectPage(pageId); }); } domNode.appendChild(btn); }); } else { ... } return { ... }; } } Parent topic: Custom Widget API","title":"Usage of JavaScript API"},{"location":"widget_javaapi.html#widget_javaapi","text":"Custom widgets can use Leap's JavaScript API to help achieve their objectives. The API can be accessed via the global NitroApplication object or by the passed-in context object. For example, the following is a widget that renders itself appropriately based on the form's currently selected page: const myPageNavigator = { ... instantiate: function (context, domNode) { if (context.mode === 'run' || context.mode === 'preview') { const currentPage = context.page; context.form.getPageIds().forEach((pageId) => { const page = context.form.getPage(pageId); const btn = document.createElement('button'); btn.innerHTML = makeHTMLSafe(page.getTitle()); if (page === currentPage) { btn.setAttribute('disabled', 'true'); } else { btn.addEventListener('click', () => { context.form.selectPage(pageId); }); } domNode.appendChild(btn); }); } else { ... } return { ... }; } } Parent topic: Custom Widget API","title":"Usage of JavaScript API"},{"location":"widget_upgrade.html","text":"Upgrading The exact techniques for upgrading widgets from one major version to the next has not yet been established. The intention is to solicit feedback from the community on how best to achieve this. Parent topic: Custom Widget API","title":"Upgrading"},{"location":"widget_upgrade.html#widget_upgrade","text":"The exact techniques for upgrading widgets from one major version to the next has not yet been established. The intention is to solicit feedback from the community on how best to achieve this. Parent topic: Custom Widget API","title":"Upgrading"},{"location":"widget_validation.html","text":"Validation Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. This can be done by supplying a validateValue() function, which returns one of the following values: null : indicates the value is valid An error message : the returned error message will be displayed to the app user in some contexts (ex. when attempting to go the next page). It is responsibility of the custom widget to render itself appropriately based on its state of validity. Note: The widget's setErrorMessage function will be triggered whenever the validity changes, due to contraints on the datatype or custom validation from the validateValue() function. Note: Any additional validation provided by the custom widget via a validateValue() function will not be enforced on the server; however, it will prevent the form from being submitted by the user in the browser. Parent topic: Custom Widget API","title":"Validation"},{"location":"widget_validation.html#widget_validation","text":"Some intrinsic validation will be done according to the type and constraints declared in the widget's datatype property; however, it might be necessary for a widget to supply its own custom validation logic. This can be done by supplying a validateValue() function, which returns one of the following values: null : indicates the value is valid An error message : the returned error message will be displayed to the app user in some contexts (ex. when attempting to go the next page). It is responsibility of the custom widget to render itself appropriately based on its state of validity. Note: The widget's setErrorMessage function will be triggered whenever the validity changes, due to contraints on the datatype or custom validation from the validateValue() function. Note: Any additional validation provided by the custom widget via a validateValue() function will not be enforced on the server; however, it will prevent the form from being submitted by the user in the browser. Parent topic: Custom Widget API","title":"Validation"},{"location":"widget_versioning.html","text":"Versioning This topic describes the widget's version . The widget version must follow \"Semantic Versioning\" ( semver.org ) practices of MAJOR.MINOR.PATCH . The following behaviours are expected: PATCH increment (ex. 1.0.0 > 1.0.1) For backwards compatible bug fixes. Authors : any widgets already declared with the same minor version will automatically start using the newest patch version. Newly added widgets will use the newest patch version. End-Users : any widgets declared with the same minor version will automatically start using the newest patch version. MINOR increment (ex. 1.0.1 > 1.1.0) For new functionality that is backwards compatible. Authors : any widgets already declared with the same major version will automatically start using the newest minor version. Newly added widgets will use the new minor version. New optional widget properties might appear to the app author. End-Users : any widgets declared with the same major version will automatically start using the newest minor version. End-users might experience some noticeable improvements. MAJOR increment (ex. 1.1.0 > 2.0.0) For major changes that are not backwards compatible. Authors : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. The customer will decide which major versions of the widget will display on the palette. See \"Upgrading\" below for more information. End-Users : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. See \" Upgrading for more information. Note: This Custom Widget API will also follow \"semver\" practices. Parent topic: Custom Widget API","title":"Versioning"},{"location":"widget_versioning.html#widget_versioning","text":"This topic describes the widget's version . The widget version must follow \"Semantic Versioning\" ( semver.org ) practices of MAJOR.MINOR.PATCH . The following behaviours are expected: PATCH increment (ex. 1.0.0 > 1.0.1) For backwards compatible bug fixes. Authors : any widgets already declared with the same minor version will automatically start using the newest patch version. Newly added widgets will use the newest patch version. End-Users : any widgets declared with the same minor version will automatically start using the newest patch version. MINOR increment (ex. 1.0.1 > 1.1.0) For new functionality that is backwards compatible. Authors : any widgets already declared with the same major version will automatically start using the newest minor version. Newly added widgets will use the new minor version. New optional widget properties might appear to the app author. End-Users : any widgets declared with the same major version will automatically start using the newest minor version. End-users might experience some noticeable improvements. MAJOR increment (ex. 1.1.0 > 2.0.0) For major changes that are not backwards compatible. Authors : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. The customer will decide which major versions of the widget will display on the palette. See \"Upgrading\" below for more information. End-Users : any widgets already declared with a different major version will remain at that major version. The declaration of previous major versions of widgets must be retained by the customer or failures may occur. See \" Upgrading for more information. Note: This Custom Widget API will also follow \"semver\" practices. Parent topic: Custom Widget API","title":"Versioning"},{"location":"widgets_examples.html","text":"Examples Note: The examples mentioned here are deployed with Leap. To access them, modify the provided URLs to include your server hostname. Full Example - Display Widget See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_PageNavHeader_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE Full Example - Data Widget See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_YesNo_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE Full Example - React Material UI Widget Coming soon to https://github.com/HCL-TECH-SOFTWARE Parent topic: Custom Widget API","title":"Examples"},{"location":"widgets_examples.html#widgets_examples","text":"Note: The examples mentioned here are deployed with Leap. To access them, modify the provided URLs to include your server hostname.","title":"Examples"},{"location":"widgets_examples.html#section_xxx_b3n_jyb","text":"See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_PageNavHeader_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE","title":"Full Example - Display Widget"},{"location":"widgets_examples.html#section_ivr_c3n_jyb","text":"See http://yourleapserver.com/apps/custom-widgets/samples/acme/Acme_YesNo_Widget.js Other examples will be coming soon to https://github.com/HCL-TECH-SOFTWARE","title":"Full Example - Data Widget"},{"location":"widgets_examples.html#section_tj2_mdn_jyb","text":"Coming soon to https://github.com/HCL-TECH-SOFTWARE Parent topic: Custom Widget API","title":"Full Example - React Material UI Widget"},{"location":"widgets_limitations.html","text":"Known limitations Complex Data : Widgets that need to store complex data are expected to use a \"parsable\" string value (ex. JSON ). There is no mechanism to handle customized rendering of this value in some parts of the product (ex. Print View), or to customize searching/filtering based on the intricacies of the complex value. Containers : There is no support for custom container widgets, those being widgets that contain other widgets, such as a collapsible section. Full Custom Properties : There is no mechanism to supply 100% custom properties. Properties of the custom widget will be from a set of common prescribed types. In-line Editing : There is no mechanism to support the app author in direct in-line editing of a widget's properties on the canvas. Multilingual Apps : There is no mechanism (beyond an app author's custom JavaScript) to allow app authors to supply property values for an application that is to be used by end-users who speak different languages. Author-Defined Data Constraints - There are limited mechanisms for app authors to define data constraints on the values supplied by end-users. Values can be constrained in the UI by the custom widget itself, or by the author's custom JavaScript. Parent topic: Custom Widget API","title":"Known limitations"},{"location":"widgets_limitations.html#widgets_limitations","text":"Complex Data : Widgets that need to store complex data are expected to use a \"parsable\" string value (ex. JSON ). There is no mechanism to handle customized rendering of this value in some parts of the product (ex. Print View), or to customize searching/filtering based on the intricacies of the complex value. Containers : There is no support for custom container widgets, those being widgets that contain other widgets, such as a collapsible section. Full Custom Properties : There is no mechanism to supply 100% custom properties. Properties of the custom widget will be from a set of common prescribed types. In-line Editing : There is no mechanism to support the app author in direct in-line editing of a widget's properties on the canvas. Multilingual Apps : There is no mechanism (beyond an app author's custom JavaScript) to allow app authors to supply property values for an application that is to be used by end-users who speak different languages. Author-Defined Data Constraints - There are limited mechanisms for app authors to define data constraints on the values supplied by end-users. Values can be constrained in the UI by the custom widget itself, or by the author's custom JavaScript. Parent topic: Custom Widget API","title":"Known limitations"},{"location":"widgets_options.html","text":"Widgets with Options Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author. Author-Defined Options If a widget requires app authors to define their own options, define a property with both id and propType set to a value of \"customOptions\" . Example: const myWidgetDefintion = { ... properties: [ { id: \"customOptions\", propType: \"customOptions\", label: \"Options\" }, ... ], ... Note: An id of 'customOptions' is meaningful to Leap. All other custom property id's are arbitrary. Hardcoded Options If the widget's options are hardcoded, add a getOptions() function to your widget. Example: const myWidgetDefintion = { ... getOptions : function () { return [{title: 'Yes', value: 'yes'}, {title: 'No', value: 'no'}]; }, ... }; Parent topic: Custom Widget API","title":"Widgets with Options"},{"location":"widgets_options.html#widgets_options","text":"Widgets that allow the end-user to select from a set of options require specific treatment. This includes widgets such as dropdowns, radio groups, or checkbox groups. These options could be hardcoded in the custom widget, or defined by the app author.","title":"Widgets with Options"},{"location":"widgets_options.html#section_gdf_tfn_jyb","text":"If a widget requires app authors to define their own options, define a property with both id and propType set to a value of \"customOptions\" . Example: const myWidgetDefintion = { ... properties: [ { id: \"customOptions\", propType: \"customOptions\", label: \"Options\" }, ... ], ... Note: An id of 'customOptions' is meaningful to Leap. All other custom property id's are arbitrary.","title":"Author-Defined Options"},{"location":"widgets_options.html#section_rnj_wfn_jyb","text":"If the widget's options are hardcoded, add a getOptions() function to your widget. Example: const myWidgetDefintion = { ... getOptions : function () { return [{title: 'Yes', value: 'yes'}, {title: 'No', value: 'no'}]; }, ... }; Parent topic: Custom Widget API","title":"Hardcoded Options"},{"location":"widgets_security.html","text":"Security Considerations This topic describes security considerations for Custom Widget API. It is the responsibility of the widget creator to avoid script injection attacks by ensuring that values are sanitized or escaped properly before placing them into the DOM. In general, the widget creator is responsible for following secure engineering practices. The custom widget code has full access to the page, but it should not call product functions, manipulate the product's JavaScript values, or interact with the product's DOM nodes in any way that is not prescribed by this API. Doing so could jeporadize the security of the product and break your custom widgets in future product releases. As stated above, special care must be taken when supplying a getJSAPIFacade() function to expose additional widget capabilities for app authors to leverage in their custom JavaScript. These functions should provide tightly constrained interactions with the custom widget, with no possibility for script injection or access to the widget's internal objects or its DOM, or those of the product. The \"facade\" naming is a reminder that the app author's code should only get references to values and objects that are necessary and \"safe\". It is the responsibility of widget creators and Leap administrators to ensure that only trusted stable resources are loaded into Leap's pages. The specified additional resources will be loaded directly into the user's browser (by injecting them as-written into the <head> of the page). There will be no additional vetting or sanitizing of resources by Leap. It is not recommended for a customer to rely on resources that they do not tightly control (ie. avoid usage of libraries from a 3rd-party CDN). Strict CSP support requires a special nonce='#!#cspNonce!#!' attribute on <script> tags. For example: ibm.nitro.NitroConfig.runtimeResources.4 = <script nonce='#!#cspNonce!#!' src='https://myWidgets.example.com/MyYesNoWidget.js'></script> Parent topic: Custom Widget API","title":"Security Considerations"},{"location":"widgets_security.html#widgets_security","text":"This topic describes security considerations for Custom Widget API. It is the responsibility of the widget creator to avoid script injection attacks by ensuring that values are sanitized or escaped properly before placing them into the DOM. In general, the widget creator is responsible for following secure engineering practices. The custom widget code has full access to the page, but it should not call product functions, manipulate the product's JavaScript values, or interact with the product's DOM nodes in any way that is not prescribed by this API. Doing so could jeporadize the security of the product and break your custom widgets in future product releases. As stated above, special care must be taken when supplying a getJSAPIFacade() function to expose additional widget capabilities for app authors to leverage in their custom JavaScript. These functions should provide tightly constrained interactions with the custom widget, with no possibility for script injection or access to the widget's internal objects or its DOM, or those of the product. The \"facade\" naming is a reminder that the app author's code should only get references to values and objects that are necessary and \"safe\". It is the responsibility of widget creators and Leap administrators to ensure that only trusted stable resources are loaded into Leap's pages. The specified additional resources will be loaded directly into the user's browser (by injecting them as-written into the <head> of the page). There will be no additional vetting or sanitizing of resources by Leap. It is not recommended for a customer to rely on resources that they do not tightly control (ie. avoid usage of libraries from a 3rd-party CDN). Strict CSP support requires a special nonce='#!#cspNonce!#!' attribute on <script> tags. For example: ibm.nitro.NitroConfig.runtimeResources.4 = <script nonce='#!#cspNonce!#!' src='https://myWidgets.example.com/MyYesNoWidget.js'></script> Parent topic: Custom Widget API","title":"Security Considerations"},{"location":"widgets_thirdpartylibraries.html","text":"Incorporating third-party libraries This topic describes incorporating third-party libraries. 3rd-party libraries are expected to be bundled and loaded in an isolated manner so that they do not pollute the global namespace or interfere with the product code, in the current release or future releases Usage of the product's 3rd-party libraries is not supported; these may change or be removed at any time. Parent topic: Custom Widget API","title":"Incorporating third-party libraries"},{"location":"widgets_thirdpartylibraries.html#widgets_thirdpartylibraries","text":"This topic describes incorporating third-party libraries. 3rd-party libraries are expected to be bundled and loaded in an isolated manner so that they do not pollute the global namespace or interfere with the product code, in the current release or future releases Usage of the product's 3rd-party libraries is not supported; these may change or be removed at any time. Parent topic: Custom Widget API","title":"Incorporating third-party libraries"}]} \ No newline at end of file diff --git a/docs/9.3.5/sitemap.xml.gz b/docs/9.3.5/sitemap.xml.gz index e42fb56..bea8957 100644 Binary files a/docs/9.3.5/sitemap.xml.gz and b/docs/9.3.5/sitemap.xml.gz differ diff --git a/theme_overrides/assets/images/MX_laptop.png b/theme_overrides/assets/images/MX_laptop.png index 7a5b456..b86da9d 100644 Binary files a/theme_overrides/assets/images/MX_laptop.png and b/theme_overrides/assets/images/MX_laptop.png differ diff --git a/theme_overrides/assets/images/MX_laptop_ORG.png b/theme_overrides/assets/images/MX_laptop_ORG.png new file mode 100644 index 0000000..7a5b456 Binary files /dev/null and b/theme_overrides/assets/images/MX_laptop_ORG.png differ