diff --git a/docs/README.md b/docs/README.md
index 04e3314c53..9ccce95db1 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -67,7 +67,7 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
| [About component](core/about.component.md)  | Shows a general version and status overview of the installed ADF library. | [Source](../lib/core/about/about.component.ts) |
-| [Buttons menu component](core/buttons-menu.component.md) | Displays buttons on a responsive menu. | [Source](../lib/core/buttons-menu/buttons-menu.component.ts) |
+| [Buttons menu component](core/buttons-menu.component.md) | Displays buttons on a responsive menu. | [Source](../lib/core/buttons-menu/buttons-menu.component.ts) |
| [Card view component](core/card-view.component.md) | Displays a configurable property list renderer. | [Source](../lib/core/card-view/components/card-view/card-view.component.ts) |
| [Comment list component](core/comment-list.component.md) | Shows a list of comments. | [Source](../lib/core/comments/comment-list.component.ts) |
| [Comments component](core/comments.component.md) | Displays comments from users involved in a specified task or content and allows an involved user to add a comment to a task or a content. | [Source](../lib/core/comments/comments.component.ts) |
@@ -76,8 +76,8 @@ for more information about installing and using the source code.
| [Empty list component](core/empty-list.component.md) | Displays a message indicating that a list is empty. | [Source](../lib/core/datatable/components/datatable/empty-list.component.ts) |
| [Form field component](core/form-field.component.md) | Represents a UI field in a form. | [Source](../lib/core/form/components/form-field/form-field.component.ts) |
| [Form list component](core/form-list.component.md) | Shows forms as a list. | [Source](../lib/core/form/components/form-list.component.ts) |
-| [Form component](core/form.component.md) | Shows a Form from APS | [Source](../lib/core/form/components/form.component.ts) |
-| [Start form component](core/start-form.component.md) | Displays the Start Form for a process. | [Source](../lib/core/form/components/start-form.component.ts) |
+| [Form component](core/form.component.md) | Shows a [`Form`](../../lib/process-services/task-list/models/form.model.ts) from APS | [Source](../lib/core/form/components/form.component.ts) |
+| [Start form component](core/start-form.component.md) | Displays the Start [`Form`](../../lib/process-services/task-list/models/form.model.ts) for a process. | [Source](../lib/core/form/components/start-form.component.ts) |
| [Text mask component](core/text-mask.component.md) | Implements text field input masks. | [Source](../lib/core/form/components/widgets/text/text-mask.component.ts) |
| [Info drawer layout component](core/info-drawer-layout.component.md) | Displays a sidebar-style information panel. | [Source](../lib/core/info-drawer/info-drawer-layout.component.ts) |
| [Info drawer component](core/info-drawer.component.md) | Displays a sidebar-style information panel with tabs. | [Source](../lib/core/info-drawer/info-drawer.component.ts) |
@@ -95,7 +95,7 @@ for more information about installing and using the source code.
| [Empty content component](core/empty-content.component.md) | Provides a generic "Empty Content" placeholder for components. | [Source](../lib/core/templates/empty-content/empty-content.component.ts) |
| [Error content component](core/error-content.component.md) | Displays info about a specific error. | [Source](../lib/core/templates/error-content/error-content.component.ts) |
| [Toolbar divider component](core/toolbar-divider.component.md) | Divides groups of elements in a Toolbar with a visual separator. | [Source](../lib/core/toolbar/toolbar-divider.component.ts) |
-| [Toolbar title component](core/toolbar-title.component.md) | Supplies custom HTML to be included in a Toolbar component title. | [Source](../lib/core/toolbar/toolbar-title.component.ts) |
+| [Toolbar title component](core/toolbar-title.component.md) | Supplies custom HTML to be included in a [Toolbar component](../core/toolbar.component.md) title. | [Source](../lib/core/toolbar/toolbar-title.component.ts) |
| [Toolbar component](core/toolbar.component.md) | Simple container for headers, titles, actions and breadcrumbs. | [Source](../lib/core/toolbar/toolbar.component.ts) |
| [User info component](core/user-info.component.md) | Shows user information. | [Source](../lib/core/userinfo/components/user-info.component.ts) |
| [Viewer component](core/viewer.component.md) | Displays content from an ACS repository. | [Source](../lib/core/viewer/components/viewer.component.ts) |
@@ -118,7 +118,7 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| [Form field model](core/form-field.model.md) | Contains the value and metadata for a field of a Form component. | [Source](../lib/core/form/components/widgets/core/form-field.model.ts) |
+| [Form field model](core/form-field.model.md) | Contains the value and metadata for a field of a [`Form`](../../lib/process-services/task-list/models/form.model.ts) component. | [Source](../lib/core/form/components/widgets/core/form-field.model.ts) |
| [Product version model](core/product-version.model.md) | Contains version and license information classes for Alfresco products. | [Source](../lib/core/models/product-version.model.ts) |
| [User process model](core/user-process.model.md) | Represents a Process Services user. | [Source](../lib/core/models/user-process.model.ts) |
| [Bpm user model](core/bpm-user.model.md) | Contains information about a Process Services user. | [Source](../lib/core/userinfo/models/bpm-user.model.ts) |
@@ -130,23 +130,23 @@ for more information about installing and using the source code.
| ---- | ----------- | ----------- |
| [File size pipe](core/file-size.pipe.md) | Converts a number of bytes to the equivalent in KB, MB, etc. | [Source](../lib/core/pipes/file-size.pipe.ts) |
| [Format space pipe](core/format-space.pipe.md) | Replaces all the white space in a string with a supplied character. | [Source](../lib/core/pipes/format-space.pipe.ts) |
-| [Full name pipe](core/full-name.pipe.md) | Joins the first and last name properties from a UserProcessModel object into a single string. | [Source](../lib/core/pipes/full-name.pipe.ts) |
+| [Full name pipe](core/full-name.pipe.md) | Joins the first and last name properties from a [`UserProcessModel`](../core/user-process.model.md) object into a single string. | [Source](../lib/core/pipes/full-name.pipe.ts) |
| [Mime type icon pipe](core/mime-type-icon.pipe.md) | Retrieves an icon to represent a MIME type. | [Source](../lib/core/pipes/mime-type-icon.pipe.ts) |
| [Node name tooltip pipe](core/node-name-tooltip.pipe.md) | Formats the tooltip for a Node. | [Source](../lib/core/pipes/node-name-tooltip.pipe.ts) |
| [Text highlight pipe](core/text-highlight.pipe.md) | Adds highlighting to words or sections of text that match a search string. | [Source](../lib/core/pipes/text-highlight.pipe.ts) |
| [Time ago pipe](core/time-ago.pipe.md) | Converts a recent past date into a number of days ago. | [Source](../lib/core/pipes/time-ago.pipe.ts) |
-| [User initial pipe](core/user-initial.pipe.md) | Takes the name fields of a UserProcessModel object and extracts and formats the initials. | [Source](../lib/core/pipes/user-initial.pipe.ts) |
+| [User initial pipe](core/user-initial.pipe.md) | Takes the name fields of a [`UserProcessModel`](../core/user-process.model.md) object and extracts and formats the initials. | [Source](../lib/core/pipes/user-initial.pipe.ts) |
## Services
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| [Card item types service](core/card-item-types.service.md) | Maps type names to field component types for the Card View component. | [Source](../lib/core/card-view/services/card-item-types.service.ts) |
-| [Card view update service](core/card-view-update.service.md) | Reports edits and clicks within fields of a Card View component. | [Source](../lib/core/card-view/services/card-view-update.service.ts) |
+| [Card item types service](core/card-item-types.service.md) | Maps type names to field component types for the [Card View component](../core/card-view.component.md). | [Source](../lib/core/card-view/services/card-item-types.service.ts) |
+| [Card view update service](core/card-view-update.service.md) | Reports edits and clicks within fields of a [Card View component](../core/card-view.component.md). | [Source](../lib/core/card-view/services/card-view-update.service.ts) |
| [Activiti alfresco service](core/activiti-alfresco.service.md) | Gets Alfresco Repository folder content based on a Repository account configured in Alfresco Process Services (APS). | [Source](../lib/core/form/services/activiti-alfresco.service.ts) |
-| [Form rendering service](core/form-rendering.service.md) | Maps a form field type string onto the corresponding form widget component type. | [Source](../lib/core/form/services/form-rendering.service.ts) |
+| [Form rendering service](core/form-rendering.service.md) | Maps a form field type string onto the corresponding form [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) component type. | [Source](../lib/core/form/services/form-rendering.service.ts) |
| [Form service](core/form.service.md) | Implements Process Services form methods | [Source](../lib/core/form/services/form.service.ts) |
-| [Node service](core/node.service.md) | Gets Alfresco Repository node metadata and creates nodes with metadata. | [Source](../lib/core/form/services/node.service.ts) |
+| [Node service](core/node.service.md) | Gets Alfresco Repository node metadata and creates nodes with metadata. | [Source](../lib/core/form/services/node.service.ts) |
| [Process content service](core/process-content.service.md) | Manipulates content related to a Process Instance or Task Instance in APS. | [Source](../lib/core/form/services/process-content.service.ts) |
| [Alfresco api service](core/alfresco-api.service.md) | Provides access to an initialized **AlfrescoJSApi** instance. | [Source](../lib/core/services/alfresco-api.service.ts) |
| [Apps process service](core/apps-process.service.md) | Gets details of the Process Services apps that are deployed for the user. | [Source](../lib/core/services/apps-process.service.ts) |
@@ -167,7 +167,7 @@ for more information about installing and using the source code.
| [Nodes api service](core/nodes-api.service.md) | Accesses and manipulates ACS document nodes using their node IDs. | [Source](../lib/core/services/nodes-api.service.ts) |
| [Notification service](core/notification.service.md) | Shows a notification message with optional feedback. | [Source](../lib/core/services/notification.service.ts) |
| [Page title service](core/page-title.service.md) | Sets the page title. | [Source](../lib/core/services/page-title.service.ts) |
-| [People content service](core/people-content.service.md) | Gets information about a Content Services user. | [Source](../lib/core/services/people-content.service.ts) |
+| [People content service](core/people-content.service.md) | Gets information about a Content Services user. | [Source](../lib/core/services/people-content.service.ts) |
| [People process service](core/people-process.service.md) | Gets information about Process Services users. | [Source](../lib/core/services/people-process.service.ts) |
| [Renditions service](core/renditions.service.md)  | Manages prearranged conversions of content to different formats. | [Source](../lib/core/services/renditions.service.ts) |
| [Search configuration service](core/search-configuration.service.md) | Provides fine control of parameters to a search. | [Source](../lib/core/services/search-configuration.service.ts) |
@@ -181,9 +181,9 @@ for more information about installing and using the source code.
| [User preferences service](core/user-preferences.service.md) | Stores preferences for the app and for individual components. | [Source](../lib/core/services/user-preferences.service.ts) |
| [Bpm user service](core/bpm-user.service.md) | Gets information about the current Process Services user. | [Source](../lib/core/userinfo/services/bpm-user.service.ts) |
| [Ecm user service](core/ecm-user.service.md) | Gets information about a Content Services user. | [Source](../lib/core/userinfo/services/ecm-user.service.ts) |
-| _Download zip service_ | _Not currently documented_ | [Source](../lib/core/services/download-zip.service.ts) |
-| _Jwt helper service_ | _Not currently documented_ | [Source](../lib/core/services/jwt-helper.service.ts) |
-| _Identity user service_ | _Not currently documented_ | [Source](../lib/core/userinfo/services/identity-user.service.ts) |
+| _[Download zip service](../../lib/core/services/download-zip.service.ts)_ | _Not currently documented_ | [Source](../lib/core/services/download-zip.service.ts) |
+| _[Jwt helper service](../../lib/core/services/jwt-helper.service.ts)_ | _Not currently documented_ | [Source](../lib/core/services/jwt-helper.service.ts) |
+| _[`Identity`](../../e2e/actions/APS-cloud/identity.ts) user service_ | _Not currently documented_ | [Source](../lib/core/userinfo/services/identity-user.service.ts) |
## Widgets
@@ -228,17 +228,17 @@ for more information about installing and using the source code.
| [Add permission panel component](content-services/add-permission-panel.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission-panel.component.ts) |
| [Add permission component](content-services/add-permission.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission.component.ts) |
| [Permission list component](content-services/permission-list.component.md) | Shows node permissions as a table. | [Source](../lib/content-services/permission-manager/components/permission-list/permission-list.component.ts) |
-| [Search check list component](content-services/search-check-list.component.md) | Implements a checklist widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-check-list/search-check-list.component.ts) |
+| [Search check list component](content-services/search-check-list.component.md) | Implements a checklist [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) for the [Search Filter component](../content-services/search-filter.component.md). | [Source](../lib/content-services/search/components/search-check-list/search-check-list.component.ts) |
| [Search chip list component](content-services/search-chip-list.component.md) | Displays search criteria as a set of "chips". | [Source](../lib/content-services/search/components/search-chip-list/search-chip-list.component.ts) |
| [Search control component](content-services/search-control.component.md) | Displays a input text that shows find-as-you-type suggestions. | [Source](../lib/content-services/search/components/search-control.component.ts) |
-| [Search date range component](content-services/search-date-range.component.md) | Implements a date range widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-date-range/search-date-range.component.ts) |
+| [Search date range component](content-services/search-date-range.component.md) | Implements a date range [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) for the [Search Filter component](../content-services/search-filter.component.md). | [Source](../lib/content-services/search/components/search-date-range/search-date-range.component.ts) |
| [Search filter component](content-services/search-filter.component.md) | Represents a main container component for custom search and faceted search settings. | [Source](../lib/content-services/search/components/search-filter/search-filter.component.ts) |
-| [Search number range component](content-services/search-number-range.component.md) | Implements a number range widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-number-range/search-number-range.component.ts) |
-| [Search radio component](content-services/search-radio.component.md) | Implements a radio button list widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-radio/search-radio.component.ts) |
-| [Search slider component](content-services/search-slider.component.md) | Implements a numeric slider widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-slider/search-slider.component.ts) |
+| [Search number range component](content-services/search-number-range.component.md) | Implements a number range [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) for the [Search Filter component](../content-services/search-filter.component.md). | [Source](../lib/content-services/search/components/search-number-range/search-number-range.component.ts) |
+| [Search radio component](content-services/search-radio.component.md) | Implements a radio button list [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) for the [Search Filter component](../content-services/search-filter.component.md). | [Source](../lib/content-services/search/components/search-radio/search-radio.component.ts) |
+| [Search slider component](content-services/search-slider.component.md) | Implements a numeric slider [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) for the [Search Filter component](../content-services/search-filter.component.md). | [Source](../lib/content-services/search/components/search-slider/search-slider.component.ts) |
| [Search sorting picker component](content-services/search-sorting-picker.component.md) | Provides an ability to select one of the predefined sorting definitions for search results: | [Source](../lib/content-services/search/components/search-sorting-picker/search-sorting-picker.component.ts) |
-| [Search text component](content-services/search-text.component.md) | Implements a text input widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-text/search-text.component.ts) |
-| [Search component](content-services/search.component.md) | Searches items for supplied search terms. | [Source](../lib/content-services/search/components/search.component.ts) |
+| [Search text component](content-services/search-text.component.md) | Implements a text input [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) for the [Search Filter component](../content-services/search-filter.component.md). | [Source](../lib/content-services/search/components/search-text/search-text.component.ts) |
+| [Search component](content-services/search.component.md) | Searches items for supplied search terms. | [Source](../lib/content-services/search/components/search.component.ts) |
| [Sites dropdown component](content-services/sites-dropdown.component.md) | Displays a dropdown menu to show and interact with the sites of the current user. | [Source](../lib/content-services/site-dropdown/sites-dropdown.component.ts) |
| [Like component](content-services/like.component.md) | Allows a user to add "likes" to an item. | [Source](../lib/content-services/social/like.component.ts) |
| [Rating component](content-services/rating.component.md) | Allows a user to add ratings to an item. | [Source](../lib/content-services/social/rating.component.ts) |
@@ -250,7 +250,7 @@ for more information about installing and using the source code.
| [Upload button component](content-services/upload-button.component.md) | Activates a file upload. | [Source](../lib/content-services/upload/components/upload-button.component.ts) |
| [Upload drag area component](content-services/upload-drag-area.component.md) | Adds a drag and drop area to upload files to ACS. | [Source](../lib/content-services/upload/components/upload-drag-area.component.ts) |
| [Upload version button component](content-services/upload-version-button.component.md)  | Activates a file version upload. | [Source](../lib/content-services/upload/components/upload-version-button.component.ts) |
-| [Version list component](content-services/version-list.component.md)  | Displays the version history of a node in a Version Manager component. | [Source](../lib/content-services/version-manager/version-list.component.ts) |
+| [Version list component](content-services/version-list.component.md)  | Displays the version history of a node in a [Version Manager component](../content-services/version-manager.component.md). | [Source](../lib/content-services/version-manager/version-list.component.ts) |
| [Version manager component](content-services/version-manager.component.md)  | Displays the version history of a node with the ability to upload a new version. | [Source](../lib/content-services/version-manager/version-manager.component.ts) |
| [Webscript component](content-services/webscript.component.md) | Provides access to Webscript features. | [Source](../lib/content-services/webscript/webscript.component.ts) |
@@ -284,12 +284,12 @@ for more information about installing and using the source code.
| ---- | ----------- | ----------- |
| [Content node dialog service](content-services/content-node-dialog.service.md) | Displays and manages dialogs for selecting content to open, copy or upload. | [Source](../lib/content-services/content-node-selector/content-node-dialog.service.ts) |
| [Custom resources service](content-services/custom-resources.service.md) | Manages Document List information that is specific to a user. | [Source](../lib/content-services/document-list/services/custom-resources.service.ts) |
-| [Document actions service](content-services/document-actions.service.md) | Implements the document menu actions for the Document List component. | [Source](../lib/content-services/document-list/services/document-actions.service.ts) |
-| [Document list service](content-services/document-list.service.md) | Implements node operations used by the Document List component. | [Source](../lib/content-services/document-list/services/document-list.service.ts) |
-| [Folder actions service](content-services/folder-actions.service.md) | Implements the folder menu actions for the Document List component. | [Source](../lib/content-services/document-list/services/folder-actions.service.ts) |
+| [Document actions service](content-services/document-actions.service.md) | Implements the document menu actions for the [Document List component](../content-services/document-list.component.md). | [Source](../lib/content-services/document-list/services/document-actions.service.ts) |
+| [Document list service](content-services/document-list.service.md) | Implements node operations used by the [Document List component](../content-services/document-list.component.md). | [Source](../lib/content-services/document-list/services/document-list.service.ts) |
+| [Folder actions service](content-services/folder-actions.service.md) | Implements the folder menu actions for the [Document List component](../content-services/document-list.component.md). | [Source](../lib/content-services/document-list/services/folder-actions.service.ts) |
| [Node permission dialog service](content-services/node-permission-dialog.service.md) | Displays dialogs to let the user set node permissions. | [Source](../lib/content-services/permission-manager/services/node-permission-dialog.service.ts) |
| [Node permission service](content-services/node-permission.service.md) | Manages role permissions for content nodes. | [Source](../lib/content-services/permission-manager/services/node-permission.service.ts) |
-| [Search filter service](content-services/search-filter.service.md) | Registers widgets for use with the Search Filter component. | [Source](../lib/content-services/search/components/search-filter/search-filter.service.ts) |
+| [Search filter service](content-services/search-filter.service.md) | Registers widgets for use with the [Search Filter component](../content-services/search-filter.component.md). | [Source](../lib/content-services/search/components/search-filter/search-filter.service.ts) |
| [Search query builder service](content-services/search-query-builder.service.md) | Stores information from all the custom search and faceted search widgets, compiles and runs the final search query. | [Source](../lib/content-services/search/search-query-builder.service.ts) |
| [Rating service](content-services/rating.service.md) | Manages ratings for items in Content Services. | [Source](../lib/content-services/social/services/rating.service.ts) |
| [Tag service](content-services/tag.service.md) | Manages tags in Content Services. | [Source](../lib/content-services/tag/services/tag.service.ts) |
@@ -352,9 +352,9 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| [Process filter service](process-services/process-filter.service.md) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../lib/process-services/process-list/services/process-filter.service.ts) |
-| [Process service](process-services/process.service.md) | Manages Process Instances, Process Variables, and Process Audit Log. | [Source](../lib/process-services/process-list/services/process.service.ts) |
-| [Task filter service](process-services/task-filter.service.md) | Manage Task Filters, which are pre-configured Task Instance queries. | [Source](../lib/process-services/task-list/services/task-filter.service.ts) |
+| [Process filter service](process-services/process-filter.service.md) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../lib/process-services/process-list/services/process-filter.service.ts) |
+| [Process service](process-services/process.service.md) | Manages Process Instances, Process Variables, and Process Audit Log. | [Source](../lib/process-services/process-list/services/process.service.ts) |
+| [Task filter service](process-services/task-filter.service.md) | Manage Task Filters, which are pre-configured Task Instance queries. | [Source](../lib/process-services/task-list/services/task-filter.service.ts) |
| [Tasklist service](process-services/tasklist.service.md) | Manages Task Instances. | [Source](../lib/process-services/task-list/services/tasklist.service.ts) |
@@ -375,25 +375,26 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
| [App list cloud component](process-services-cloud/app-list-cloud.component.md) | Shows all deployed cloud application instances. | [Source](../lib/process-services-cloud/src/lib/app-list-cloud/components/app-list-cloud.component.ts) |
+| [Edit process filter cloud component](process-services-cloud/edit-process-filter-cloud.component.md) | Shows Process Filter Details. | [Source](../lib/process-services-cloud/src/lib/process-cloud/process-filters-cloud/edit-process-filter-cloud.component.ts) |
| [Process filters cloud component](process-services-cloud/process-filters-cloud.component.md) | Lists all available process filters and allows to select a filter. | [Source](../lib/process-services-cloud/src/lib/process-cloud/process-filters-cloud/process-filters-cloud.component.ts) |
| [Process list cloud component](process-services-cloud/process-list-cloud.component.md) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../lib/process-services-cloud/src/lib/process-list-cloud/components/process-list-cloud.component.ts) |
| [Start task cloud component](process-services-cloud/start-task-cloud.component.md) | Creates/Starts new task for the specified app | [Source](../lib/process-services-cloud/src/lib/start-task-cloud/components/start-task-cloud.component.ts) |
| [Edit task filter cloud component](process-services-cloud/edit-task-filter-cloud.component.md) | Shows Task Filter Details. | [Source](../lib/process-services-cloud/src/lib/task-cloud/task-filters-cloud/edit-task-filter-cloud.component.ts) |
| [Task filters cloud component](process-services-cloud/task-filters-cloud.component.md) | Shows all available filters. | [Source](../lib/process-services-cloud/src/lib/task-cloud/task-filters-cloud/task-filters-cloud.component.ts) |
| [Task list cloud component](process-services-cloud/task-list-cloud.component.md) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../lib/process-services-cloud/src/lib/task-list-cloud/components/task-list-cloud.component.ts) |
-| _App details cloud component_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/app-list-cloud/components/app-details-cloud.component.ts) |
-| _People cloud component_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/start-task-cloud/components/people-cloud/people-cloud.component.ts) |
+| _[App details cloud component](../../lib/process-services-cloud/src/lib/app-list-cloud/components/app-details-cloud.component.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/app-list-cloud/components/app-details-cloud.component.ts) |
+| _[People cloud component](../../lib/process-services-cloud/src/lib/start-task-cloud/components/people-cloud/people-cloud.component.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/start-task-cloud/components/people-cloud/people-cloud.component.ts) |
## Services
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| _Apps process cloud service_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/app-list-cloud/services/apps-process-cloud.service.ts) |
-| _Process filter cloud service_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/process-cloud/services/process-filter-cloud.service.ts) |
-| _Process list cloud service_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/process-list-cloud/services/process-list-cloud.service.ts) |
-| _Start task cloud service_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/start-task-cloud/services/start-task-cloud.service.ts) |
-| _Task filter cloud service_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/task-cloud/services/task-filter-cloud.service.ts) |
-| _Task list cloud service_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/task-list-cloud/services/task-list-cloud.service.ts) |
+| _[Apps process cloud service](../../lib/process-services-cloud/src/lib/app-list-cloud/services/apps-process-cloud.service.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/app-list-cloud/services/apps-process-cloud.service.ts) |
+| _[Process filter cloud service](../../lib/process-services-cloud/src/lib/process-cloud/services/process-filter-cloud.service.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/process-cloud/services/process-filter-cloud.service.ts) |
+| _[Process list cloud service](../../lib/process-services-cloud/src/lib/process-list-cloud/services/process-list-cloud.service.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/process-list-cloud/services/process-list-cloud.service.ts) |
+| _[Start task cloud service](../../lib/process-services-cloud/src/lib/start-task-cloud/services/start-task-cloud.service.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/start-task-cloud/services/start-task-cloud.service.ts) |
+| _[Task filter cloud service](../../lib/process-services-cloud/src/lib/task-cloud/services/task-filter-cloud.service.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/task-cloud/services/task-filter-cloud.service.ts) |
+| _[Task list cloud service](../../lib/process-services-cloud/src/lib/task-list-cloud/services/task-list-cloud.service.ts)_ | _Not currently documented_ | [Source](../lib/process-services-cloud/src/lib/task-list-cloud/services/task-list-cloud.service.ts) |
@@ -412,15 +413,13 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| _Dynamic component_ | _Not currently documented_ | [Source](../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts) |
-| _Dynamic tab component_ | _Not currently documented_ | [Source](../lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts) |
+| [Dynamic component](extensions/dynamic.component.md)  | Displays dynamically-loaded extension components. | [Source](../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts) |
## Services
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| _Extension loader service_ | _Not currently documented_ | [Source](../lib/extensions/src/lib/services/extension-loader.service.ts) |
-| _Extension service_ | _Not currently documented_ | [Source](../lib/extensions/src/lib/services/extension.service.ts) |
+| [Extension service](extensions/extension.service.md)  | Manages and runs basic extension functionality. | [Source](../lib/extensions/src/lib/services/extension.service.ts) |
@@ -439,7 +438,7 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| [Widget component](insights/widget.component.md) | Base class for standard and custom widget classes. | [Source](../lib/insights/analytics-process/components/widgets/widget.component.ts) |
+| [Widget component](insights/widget.component.md) | Base class for standard and custom [widget](../../e2e/pages/adf/process_services/widgets/widget.ts) classes. | [Source](../lib/insights/analytics-process/components/widgets/widget.component.ts) |
| [Analytics generator component](insights/analytics-generator.component.md) | Generates and shows charts | [Source](../lib/insights/analytics-process/components/analytics-generator.component.ts) |
| [Analytics report list component](insights/analytics-report-list.component.md) | Shows a list of all available reports | [Source](../lib/insights/analytics-process/components/analytics-report-list.component.ts) |
| [Analytics component](insights/analytics.component.md) | Shows the charts related to the reportId passed as input | [Source](../lib/insights/analytics-process/components/analytics.component.ts) |
diff --git a/docs/extensions/README.md b/docs/extensions/README.md
index 18869aa949..a084157e61 100644
--- a/docs/extensions/README.md
+++ b/docs/extensions/README.md
@@ -16,14 +16,13 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| _Dynamic component_ | _Not currently documented_ | [Source](../../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts) |
-| _Dynamic tab component_ | _Not currently documented_ | [Source](../../lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts) |
+| [Dynamic component](dynamic.component.md)  | Displays dynamically-loaded extension components. | [Source](../../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts) |
+| [Dynamic tab component](dynamic-tab.component.md)  | Displays dynamically-loaded extensions with tabs. | [Source](../../lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts) |
## Services
| Name | Description | Source link |
| ---- | ----------- | ----------- |
-| _Extension loader service_ | _Not currently documented_ | [Source](../../lib/extensions/src/lib/services/extension-loader.service.ts) |
-| _Extension service_ | _Not currently documented_ | [Source](../../lib/extensions/src/lib/services/extension.service.ts) |
+| [Extension service](extension.service.md)  | Manages and runs basic extension functionality. | [Source](../../lib/extensions/src/lib/services/extension.service.ts) |
diff --git a/docs/extensions/dynamic-tab.component.md b/docs/extensions/dynamic-tab.component.md
new file mode 100644
index 0000000000..29b4132b10
--- /dev/null
+++ b/docs/extensions/dynamic-tab.component.md
@@ -0,0 +1,18 @@
+---
+Title: Dynamic Tab Component
+Added: v3.0.0
+Status: Experimental
+Last reviewed: 2018-12-17
+---
+
+# [Dynamic Tab Component](../../lib/core/about/about.component.ts "Defined in about.component.ts")
+
+Displays dynamically-loaded extensions with tabs.
+
+## Class members
+
+## Details
+
+## See also
+
+- Dynamic component
diff --git a/docs/extensions/dynamic.component.md b/docs/extensions/dynamic.component.md
new file mode 100644
index 0000000000..0e139a3556
--- /dev/null
+++ b/docs/extensions/dynamic.component.md
@@ -0,0 +1,58 @@
+---
+Title: Dynamic Component
+Added: v3.0.0
+Status: Experimental
+Last reviewed: 2018-12-17
+---
+
+# [Dynamic Component](../../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts "Defined in dynamic.component.ts")
+
+Displays dynamically-loaded extension components.
+
+## Class members
+
+### Properties
+
+| Name | Type | Default value | Description |
+| ---- | ---- | ------------- | ----------- |
+| data | `any` | | Data for the dynamically-loaded component instance. |
+| id | `string` | | Unique ID string for the component to show. |
+
+## Details
+
+Use the Dynamic component to create extensible apps
+(ie, apps that provide a generalized UI structure where the specific content
+can be "plugged in" by other developers). The `id` property refers to a
+component that has previously been registered using the `setComponents` method
+of the [Extension service](../../lib/extensions/src/lib/services/extension.service.ts):
+
+```ts
+// Registering the extension components.
+extensionService.setComponents({
+ 'plugInName.components.docList': DocumentListComponent.
+ 'plugInName.components.login': LoginComponent,
+ ...
+});
+```
+
+```html
+
+
+
+```
+
+Use this to provide the extension developer with a standard layout that
+contains placeholders defined by instances of the Dynamic component. The
+developer can then register any desired components to correspond to the
+defined component IDs. For example, the extensible app might be shipped
+with the standard [Document List component](../content-services/document-list.component.md) registered against `plugInName.components.docList`.
+The extension developer can replace this with a custom class
+simply by registering that class with `setComponents` before use.
+
+## See also
+
+- [Extension service](../../lib/extensions/src/lib/services/extension.service.ts)
+- [Dynamic tab component](../../lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts)
diff --git a/docs/extensions/extension.service.md b/docs/extensions/extension.service.md
new file mode 100644
index 0000000000..a1e5f81af0
--- /dev/null
+++ b/docs/extensions/extension.service.md
@@ -0,0 +1,69 @@
+---
+Title: Extension Service
+Added: v3.0.0
+Status: Experimental
+Last reviewed: 2018-12-17
+---
+
+# [Extension Service](../../lib/extensions/src/lib/services/extension.service.ts "Defined in extension.service.ts")
+
+Manages and runs basic extension functionality.
+
+## Class members
+
+### Methods
+
+- **evaluateRule**(ruleId: `string`, context: [`RuleContext`](../../lib/extensions/src/lib/config/rule.extensions.ts)): `boolean`
+ Evaluates a rule.
+ - _ruleId:_ `string` - ID of the rule to evaluate
+ - _context:_ [`RuleContext`](../../lib/extensions/src/lib/config/rule.extensions.ts) - Parameter object for the evaluator with details of app state
+ - **Returns** `boolean` - True if the rule passed, false otherwise
+- **getActionById**(id: `string`): [`ActionRef`](../../lib/extensions/src/lib/config/action.extensions.ts)
+ Retrieves an action using its ID value.
+ - _id:_ `string` - The ID value to look for
+ - **Returns** [`ActionRef`](../../lib/extensions/src/lib/config/action.extensions.ts) - Action or null if not found
+- **getAuthGuards**(ids: `string[]`): `Array>`
+ Retrieves one or more auth guards using an array of ID values.
+ - _ids:_ `string[]` - Array of ID value to look for
+ - **Returns** `Array>` - Array of auth guards or empty array if none were found
+- **getComponentById**(id: `string`): `Type<>`
+ Retrieves a registered [extension component](../../lib/extensions/src/lib/services/component-register.service.ts) using its ID value.
+ - _id:_ `string` - The ID value to look for
+ - **Returns** `Type<>` - The component or null if not found
+- **getEvaluator**(key: `string`): `RuleEvaluator`
+ Retrieves a RuleEvaluator function using its key name.
+ - _key:_ `string` - Key name to look for
+ - **Returns** `RuleEvaluator` - RuleEvaluator or null if not found
+- **getRouteById**(id: `string`): [`RouteRef`](../../lib/extensions/src/lib/config/routing.extensions.ts)
+ Retrieves a route using its ID value.
+ - _id:_ `string` - The ID value to look for
+ - **Returns** [`RouteRef`](../../lib/extensions/src/lib/config/routing.extensions.ts) - The route or null if not found
+- **getRuleById**(id: `string`): [`RuleRef`](../../lib/extensions/src/lib/config/rule.extensions.ts)
+ Retrieves a rule using its ID value.
+ - _id:_ `string` - The ID value to look for
+ - **Returns** [`RuleRef`](../../lib/extensions/src/lib/config/rule.extensions.ts) - The rule or null if not found
+- **load**(): [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts)`>`
+ Loads and registers an extension config file and plugins (specified by path properties).
+ - **Returns** [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts)`>` - The loaded config data
+- **runExpression**(value: `string`, context?: `any`): `any`
+ Runs a lightweight expression stored in a string.
+ - _value:_ `string` - String containing the expression or literal value
+ - _context:_ `any` - (Optional) Parameter object for the expression with details of app state
+ - **Returns** `any` - Result of evaluated expression, if found, or the literal value otherwise
+- **setAuthGuards**(values: `Function`)
+ Adds one or more new auth guards to the existing set.
+ - _values:_ `Function` - The new auth guards to add
+- **setComponents**(values: `Function`)
+ Adds one or more new components to the existing set.
+ - _values:_ `Function` - The new components to add
+- **setEvaluators**(values: `Function`)
+ Adds one or more new rule evaluators to the existing set.
+ - _values:_ `Function` - The new evaluators to add
+- **setup**(config: [`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts))
+ Registers extensions from a config object.
+ - _config:_ [`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts) - Object with config data
+
+## Details
+
+Use the methods of this service to add extensibility features to your app. You can find further
+details in the [App extensions](../user-guide/app-extensions.md) page.
diff --git a/docs/user-guide/README.md b/docs/user-guide/README.md
index a0425ccfd4..240543ebe8 100644
--- a/docs/user-guide/README.md
+++ b/docs/user-guide/README.md
@@ -13,6 +13,7 @@ on an item below to see the corresponding guide page.
- [Angular Material Design](angular-material-design.md)
- [Form Extensibility and Customisation](extensibility.md)
- [Internationalization in ADF](internationalization.md)
+- [App extensions](app-extensions.md)
- [Theming](theming.md)
- [Transclusion](transclusion.md)
- [Typography](typography.md)
diff --git a/docs/user-guide/app-extensions.md b/docs/user-guide/app-extensions.md
new file mode 100644
index 0000000000..6beee65f68
--- /dev/null
+++ b/docs/user-guide/app-extensions.md
@@ -0,0 +1,276 @@
+---
+Title: App extensions
+Added: 3.0.0
+---
+
+# App extensions
+
+ADF lets you simplify the app developer's task by providing an **extensible app**
+as a starting point.
+
+An extensible app is designed with _extension points_, which are
+placeholders where components and other content
+can be "plugged in" to provide functionality. The app may be supplied with
+default content for the extension points but the idea is that a developer can
+easily replace this with custom content as necessary. An organization might find this
+useful, for example, if they want to create a family of apps with consistent
+appearance and behavior. One developer can produce an extensible app that
+can then be adapted by other developers to create the various apps in the
+family.
+
+## Contents
+
+- [Extension points](#extension-points)
+- [Extensibility features](#extensibility-features)
+- [Setting up an app for extensibility](#setting-up-an-app-for-extensibility)
+- [Creating extensions](#creating-extensions)
+ - [Routes](#routes)
+ - [Actions](#actions)
+ - [Rules](#rules)
+ - [Features](#features)
+
+## Extension points
+
+A pluggable extension is implemented by a class or data object that provides
+its functionality. The class or object is then registered in the app with a
+key/ID string that is used to reference it. The general idea is that only the
+ID string is used directly in the main app code to designate the extension point,
+while the actual implementation is loaded and registered separately. In this respect,
+extension points work somewhat like
+[translation keys](internationalization.md) - the key is used to mark
+a place in the app where the actual content will be supplied dynamically.
+
+## Extensibility features
+
+ADF provides a number of features that offer extension points or help
+with extensibility in general:
+
+- **Components**: The [Dynamic component](../extensions/dynamic.component.md) and Dynamic Tab component
+ have no content of their own but they have an `id` property that
+ references a registered component extension ID. The referenced component
+ will be added as a child of the Dynamic component at runtime.
+- **Routes**: These are registered as key/ID strings that resolve to standard
+ Angular routes. This feature can be used, say, that a click on a list item
+ should send the user _somewhere_ but leave the actual destination up to the
+ developer.
+- **Auth guards**: Routes can be protected by auth guards
+ to prevent unauthorized users from accessing pages they shouldn't see.
+- **Rules**: These are tests that produce a boolean result depending on the app state.
+ The extensible app can use them with _features_ or `ngIf` directives, for example, to show or
+ hide content in certain conditions. The exact conditions, however, are chosen
+ by the developer who extends the app.
+- **Actions**: The extensible app can define a set of **application actions** that
+ perform basic operations in the app. These are each referenced by a unique key
+ string and can take a data value as a parameter. Items from this set can then
+ be referenced by extension actions. These contain their own key/ID string along
+ with the name of an application action to trigger and a "payload" value to pass
+ as a parameter. The payload can either be a string (to represent a static message,
+ say) or an expression that calculates a result from app state. The expression could,
+ for example, return the current user's name, the currently selected list item or a
+ string composed from several data items.
+- **Features**: What counts as a "feature" varies according to the application but
+ it is intended to mean any salient piece of functionality that can be
+ customized by extensions. For example, a toolbar, navigation bar,
+ login page or tools menu might all be regarded as features. Any of these
+ features could be extended in a variety of ways. A menu, say, might support custom
+ commands that are implemented by actions with each command enabled or disabled
+ depending on the value returned by a rule.
+
+## Setting up an app for extensibility
+
+You can register component classes for use with the [Dynamic component](../extensions/dynamic.component.md)
+or Dynamic Tab component using the `setComponents` method of the
+[Extension service](../extensions/extension.service.md) (see the Dynamic component page for further details
+and code samples). The service also has `setAuthGuards` and
+`setEvaluators` methods that behave analogously.
+
+The recommended way to provide the set of application actions (ie, the built-in
+actions that can be referenced by extension actions) is to use the scheme
+defined by [@ngrx/store](https://gist.github.com/btroncone/a6e4347326749f938510).
+Briefly, the idea is that all app state is stored centrally and
+can only be updated by functions triggered by named command strings (eg, "ADD_USER",
+"CLEAR_SELECTION", "NEW_DOCUMENT", etc). ADF's extensibility features are designed
+to fit in neatly with @ngrx/store but it has many other advantages, as described on
+the website.
+
+## Creating extensions
+
+The set of basic classes, evaluators and actions provided by the app can be used to set up extensions.
+The easiest way to configure the extension functionality is with an extension config
+file. The structure of this file (in JSON format) follows the basic pattern shown
+below:
+
+```json
+{
+ "$id": "unique.id",
+ "$name": "extension.name",
+ "$version": "1.0.0",
+ "$vendor": "author.name",
+ "$license": "license",
+ "$runtime": "1.5.0",
+ "$description": "some description",
+
+ "routes": [ ... ],
+ "actions": [ ... ],
+ "rules": [ ... ],
+ "features": { ... }
+}
+```
+
+You can use the `load` method of the [Extension service](../extensions/extension.service.md) to read the file into a
+convenient object that implements the [`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts) and [`ExtensionRef`](../../lib/extensions/src/lib/config/extension.config.ts) interfaces.
+Note that the `extension.schema.json` file contains a [JSON schema](http://json-schema.org/)
+that allows for format checking and also text completion in some editors.
+
+### Routes
+
+The `routes` array in the config contains objects like those shown in the
+following example:
+
+```json
+"routes": [
+ {
+ "id": "plugin1.routes.customTrash",
+ "path": "ext/customtrash",
+ "component": "yourCustomTrash.component.id",
+ "layout": "app.layout.main",
+ "auth": ["app.auth"],
+ "data": {
+ "title": "Custom Trashcan"
+ }
+ },
+ ...
+ ]
+```
+
+You can access routes from the config using the `getRouteById` method of the
+[Extension service,](../extensions/extension.service.md) which returns a [`RouteRef`](../../lib/extensions/src/lib/config/routing.extensions.ts) object. Note that the references
+to the component and auth guards are extension IDs,
+[as described above](#extension-points).
+
+### Actions
+
+The `actions` array has the following structure:
+
+```json
+ "actions": [
+ {
+ "id": "plugin1.actions.settings",
+ "type": "NAVIGATE_URL",
+ "payload": "/settings"
+ },
+ {
+ "id": "plugin1.actions.info",
+ "type": "SNACKBAR_INFO",
+ "payload": "I'm a nice little popup raised by extension."
+ },
+ {
+ "id": "plugin1.actions.node-name",
+ "type": "SNACKBAR_INFO",
+ "payload": "$('Action for ' + context.selection.first.entry.name)"
+ },
+ ...
+ ]
+```
+
+The [Extension service](../extensions/extension.service.md) defines a `getActionById` method that returns an
+`ActionRef` object corresponding to an item from this array.
+
+The `type` property refers to an action type that must be provided by the
+app (eg, the "SNACKBAR_INFO" in the example presumably just shows a standard snackbar
+message).
+
+By default, the `payload` is just an ordinary string that can be used for
+a message, URL or other static text data. However, you can also define a
+JavaScript expression here by surrounding it with `$( ... )`. The expression
+has access to an object named `context` which typically contains information
+about the app state. You can supply the object that contains this data via the
+`runExpression` method of the [Extension service,](../extensions/extension.service.md) which actually evaluates the
+expression. Note that the result of the expression doesn't necessarily
+have to be a string.
+
+### Rules
+
+The simplest type of rule is configured as shown below:
+
+```json
+"rules": [
+ {
+ "id": "app.trashcan",
+ "type": "app.navigation.isTrashcan"
+ },
+ ...
+ ]
+```
+
+The `type` is the ID of a `RuleEvaluator` function that has been registered using
+the `setEvaluators` method of the [Extension service](../extensions/extension.service.md).
+The evaluator is a boolean function that represents whether a certain
+condition is true or false (eg, whether an item is selected, whether the user
+has certain options enabled, etc). The evaluator has access to a context object
+that is supplied from the app during the call to `evaluateRule` (defined in
+the Extension service).
+
+A more complex rule can take other rules as parameters:
+
+```json
+"rules": [
+ {
+ "id": "app.toolbar.favorite.canAdd",
+ "type": "core.every",
+ "parameters": [
+ { "type": "rule", "value": "app.selection.canAddFavorite" },
+ { "type": "rule", "value": "app.navigation.isNotRecentFiles" },
+ { "type": "rule", "value": "app.navigation.isNotSharedFiles" },
+ { "type": "rule", "value": "app.navigation.isNotSearchResults" }
+ ]
+ }
+ ]
+```
+
+This is mainly useful for creating "metarules" that require certain
+relationships to hold among the parameter rules. A few useful metarules
+are defined in the
+[core.evaluators.ts](../lib/extensions/evaluators/core.evaluators.ts) file:
+
+- `every`: Returns true only if all the parameter rules return true
+- `some`: Returns true if one or more of the parameter rules return true
+- `not`: Returns true only if all the parameter rules return false
+
+Note that parameter rules can also recursively invoke their own rules, etc.
+
+### Features
+
+The `features` object does not have any defined structure but the intention
+is that each key in the object corresponds to the name of a salient feature
+of the app that can be extended. The object or array that matches the key
+name contains parameters that modify the behavior of the feature, possibly
+using actions, rules, etc, defined elsewhere in the config. Suppose, for
+example, the app has a tools menu that can be extended with extra commands.
+The properties for a new command might include:
+
+- The title shown in the menu
+- An icon shown next to the title
+- The action that is activated when the command is selected
+- A rule that determines whether or not the command is enabled
+
+A `features` object to add an extra item to this menu might look like
+the following:
+
+```json
+"features": {
+ "toolmenu": [
+ {
+ "id": "app.toolmenu.givebiscuit",
+ "title": "Give a biscuit to the selected user",
+ "icon": "icons/GiveBiscuit.svg",
+ "actions": {
+ "click": "GIVE_BISCUIT"
+ },
+ "rules": {
+ "visible": "app.biscuits.notempty"
+ }
+ }
+ ]
+}
+```
diff --git a/lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts b/lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts
index ef7afd3c84..a76ada9cd0 100644
--- a/lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts
+++ b/lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts
@@ -38,7 +38,10 @@ export class DynamicExtensionComponent implements OnChanges, OnDestroy {
@ViewChild('content', { read: ViewContainerRef })
content: ViewContainerRef;
+ /** Unique ID string for the component to show. */
@Input() id: string;
+
+ /** Data for the dynamically-loaded component instance. */
@Input() data: any;
private componentRef: ComponentRef;
diff --git a/lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts b/lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts
index cce0dcc322..c40f3e4a8b 100644
--- a/lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts
+++ b/lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts
@@ -38,6 +38,7 @@ export class DynamicTabComponent implements OnInit, OnChanges, OnDestroy {
@ViewChild('content', { read: ViewContainerRef })
content: ViewContainerRef;
+ /** Unique ID string for the component to show. */
@Input()
id: string;
diff --git a/lib/extensions/src/lib/services/extension.service.ts b/lib/extensions/src/lib/services/extension.service.ts
index 58e86f2954..1c2b88ace6 100644
--- a/lib/extensions/src/lib/services/extension.service.ts
+++ b/lib/extensions/src/lib/services/extension.service.ts
@@ -43,6 +43,10 @@ export class ExtensionService {
private componentRegister: ComponentRegisterService
) {}
+ /**
+ * Loads and registers an extension config file and plugins (specified by path properties).
+ * @returns The loaded config data
+ */
async load(): Promise {
const config = await this.loader.load(
this.configPath,
@@ -52,6 +56,10 @@ export class ExtensionService {
return config;
}
+ /**
+ * Registers extensions from a config object.
+ * @param config Object with config data
+ */
setup(config: ExtensionConfig) {
if (!config) {
console.warn('Extension configuration not found');
@@ -69,36 +77,68 @@ export class ExtensionService {
this.routes = this.loader.getRoutes(config);
}
+ /**
+ * Adds one or more new rule evaluators to the existing set.
+ * @param values The new evaluators to add
+ */
setEvaluators(values: { [key: string]: RuleEvaluator }) {
if (values) {
this.evaluators = Object.assign({}, this.evaluators, values);
}
}
+ /**
+ * Adds one or more new auth guards to the existing set.
+ * @param values The new auth guards to add
+ */
setAuthGuards(values: { [key: string]: Type<{}> }) {
if (values) {
this.authGuards = Object.assign({}, this.authGuards, values);
}
}
+ /**
+ * Adds one or more new components to the existing set.
+ * @param values The new components to add
+ */
setComponents(values: { [key: string]: Type<{}> }) {
this.componentRegister.setComponents(values);
}
+ /**
+ * Retrieves a route using its ID value.
+ * @param id The ID value to look for
+ * @returns The route or null if not found
+ */
getRouteById(id: string): RouteRef {
return this.routes.find((route) => route.id === id);
}
+ /**
+ * Retrieves one or more auth guards using an array of ID values.
+ * @param ids Array of ID value to look for
+ * @returns Array of auth guards or empty array if none were found
+ */
getAuthGuards(ids: string[]): Array> {
return (ids || [])
.map((id) => this.authGuards[id])
.filter((guard) => guard);
}
+ /**
+ * Retrieves an action using its ID value.
+ * @param id The ID value to look for
+ * @returns Action or null if not found
+ */
getActionById(id: string): ActionRef {
return this.actions.find((action) => action.id === id);
}
+ /**
+ * Retrieves a RuleEvaluator function using its key name.
+ * @param key Key name to look for
+ * @returns RuleEvaluator or null if not found
+ */
getEvaluator(key: string): RuleEvaluator {
if (key && key.startsWith('!')) {
const fn = this.evaluators[key.substring(1)];
@@ -109,6 +149,12 @@ export class ExtensionService {
return this.evaluators[key];
}
+ /**
+ * Evaluates a rule.
+ * @param ruleId ID of the rule to evaluate
+ * @param context Parameter object for the evaluator with details of app state
+ * @returns True if the rule passed, false otherwise
+ */
evaluateRule(ruleId: string, context: RuleContext): boolean {
const ruleRef = this.getRuleById(ruleId);
@@ -126,14 +172,30 @@ export class ExtensionService {
return false;
}
+ /**
+ * Retrieves a registered extension component using its ID value.
+ * @param id The ID value to look for
+ * @returns The component or null if not found
+ */
getComponentById(id: string) {
return this.componentRegister.getComponentById(id);
}
+ /**
+ * Retrieves a rule using its ID value.
+ * @param id The ID value to look for
+ * @returns The rule or null if not found
+ */
getRuleById(id: string): RuleRef {
return this.rules.find((ref) => ref.id === id);
}
+ /**
+ * Runs a lightweight expression stored in a string.
+ * @param value String containing the expression or literal value
+ * @param context Parameter object for the expression with details of app state
+ * @returns Result of evaluated expression, if found, or the literal value otherwise
+ */
runExpression(value: string, context?: any) {
const pattern = new RegExp(/\$\((.*\)?)\)/g);
const matches = pattern.exec(value);
diff --git a/tools/doc/doctool.config.json b/tools/doc/doctool.config.json
index 7f2d8fc8a4..93c684b8be 100644
--- a/tools/doc/doctool.config.json
+++ b/tools/doc/doctool.config.json
@@ -65,6 +65,7 @@
"datatable-adapter.interface": "DataTableAdapter",
"datatable.component": "DataTableComponent",
"document-library.model": "NodePaging",
+ "dynamic.component": "DynamicExtensionComponent",
"form-field-validator.interface": "FormFieldValidator",
"header.component": "HeaderLayoutComponent",
"inherited-button.directive": "InheritPermissionDirective",
@@ -82,6 +83,7 @@
},
"undocStoplist": [
"model",
+ "component-register.service",
"context-menu-holder",
"data-column-list",
"card-view-[a-z]+item",
@@ -90,6 +92,7 @@
"content-action-list",
"empty-folder-content",
"empty-list",
+ "extension-loader.service",
"loading-template",
"no-content-template",
"card-view-content-proxy",
diff --git a/tools/doc/tools/typeLinker.js b/tools/doc/tools/typeLinker.js
index 10584ae08b..1a83a87cc9 100644
--- a/tools/doc/tools/typeLinker.js
+++ b/tools/doc/tools/typeLinker.js
@@ -1,5 +1,5 @@
"use strict";
-exports.__esModule = true;
+Object.defineProperty(exports, "__esModule", { value: true });
var path = require("path");
var fs = require("fs");
/*
@@ -25,7 +25,7 @@ var includedNodeTypes = [
"link", "text"
];
var docFolder = path.resolve("docs");
-var adfLibNames = ["core", "content-services", "insights", "process-services", "process-services-cloud"];
+var adfLibNames = ["core", "content-services", "insights", "process-services", "process-services-cloud", "extensions"];
var externalNameLinks;
function processDocs(mdCache, aggData, errorMessages) {
initPhase(aggData);
@@ -99,8 +99,9 @@ function updateFile(tree, pathname, aggData, _errorMessages) {
}
}
}
- else if ((node.children) && (node.type !== "heading")) {
+ else if ((node.children) && (node.type !== "heading")) { //((node.type === "paragraph") || (node.type === "tableCell")) {
node.children.forEach(function (child, index) {
+ var _a;
if ((child.type === "text") || (child.type === "inlineCode")) {
var newNodes = handleLinksInBodyText(aggData, child.value, child.type === 'inlineCode');
(_a = node.children).splice.apply(_a, [index, 1].concat(newNodes));
@@ -108,7 +109,6 @@ function updateFile(tree, pathname, aggData, _errorMessages) {
else {
traverseMDTree(child);
}
- var _a;
});
} /*else if (node.children) {
node.children.forEach(child => {
diff --git a/tools/doc/tools/typeLinker.ts b/tools/doc/tools/typeLinker.ts
index 39488a7748..3f1eff8bd4 100644
--- a/tools/doc/tools/typeLinker.ts
+++ b/tools/doc/tools/typeLinker.ts
@@ -35,7 +35,7 @@ const includedNodeTypes = [
];
const docFolder = path.resolve("docs");
-const adfLibNames = ["core", "content-services", "insights", "process-services", "process-services-cloud"];
+const adfLibNames = ["core", "content-services", "insights", "process-services", "process-services-cloud", "extensions"];
let externalNameLinks;