From 2c49de6070a9c71ae32d5b062af653127951692d Mon Sep 17 00:00:00 2001 From: Andy Stark <30621568+therealandeeee@users.noreply.github.com> Date: Mon, 10 Sep 2018 11:11:25 +0100 Subject: [PATCH] [ADF-3514] Added transclusions sections to doc files (#3756) * [ADF-3514] Added transclusion sections and guide page * [ADF-3514] Updated tables of contents where needed * [ADF-3514] Updated index files --- docs/README.md | 28 +- docs/content-services/README.md | 26 +- .../permission-list.component.md | 6 +- .../search-control.component.md | 33 +- .../upload-drag-area.component.md | 24 ++ docs/core/README.md | 34 +- docs/core/accordion-group.component.md | 5 + docs/core/accordion.component.md | 9 +- docs/core/buttons-menu.component.md | 7 +- docs/core/datatable.component.md | 160 +++------ docs/core/empty-list.component.md | 59 ++++ docs/core/form.component.md | 30 +- docs/core/header.component.md | 21 +- docs/core/info-drawer-layout.component.md | 19 +- docs/core/info-drawer.component.md | 14 +- docs/core/login.component.md | 76 ++-- docs/core/sidebar-action-menu.component.md | 15 +- docs/core/sidenav-layout.component.md | 6 + docs/core/toolbar.component.md | 86 ++--- docs/core/viewer.component.md | 330 +++++++++--------- docs/docassets/images/custom-footer.png | Bin 25673 -> 13809 bytes docs/docassets/images/custom-header.png | Bin 19493 -> 11711 bytes docs/process-services/README.md | 2 +- docs/process-services/apps-list.component.md | 5 +- .../people-search.component.md | 14 +- .../process-attachment-list.component.md | 25 +- .../process-list.component.md | 27 +- .../task-attachment-list.component.md | 25 +- docs/process-services/task-list.component.md | 30 +- docs/user-guide/README.md | 1 + docs/user-guide/transclusion.md | 41 +++ docs/versionIndex.md | 11 + tools/doc/doctool.config.json | 3 +- tools/doc/tools/toc.js | 23 +- tools/doc/yamlTemplates/property.ejs | 2 + 35 files changed, 682 insertions(+), 515 deletions(-) create mode 100644 docs/core/empty-list.component.md create mode 100644 docs/user-guide/transclusion.md diff --git a/docs/README.md b/docs/README.md index c8b97a254e..c29f7a26fb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,6 +37,7 @@ See the [Tutorials index](tutorials/README.md) for the full list. - [Form Extensibility and Customisation](user-guide/extensibility.md) - [Internationalization in ADF](user-guide/internationalization.md) - [Theming](user-guide/theming.md) +- [Transclusion](user-guide/transclusion.md) - [Typography](user-guide/typography.md) - [Walkthrough - adding indicators to highlight information about a node](user-guide/metadata-indicators.md) @@ -58,7 +59,7 @@ for more information about installing and using the source code. | Name | Description | Source link | | ---- | ----------- | ----------- | | [About component](core/about.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | This component allow you to have a general overview of the version of ADF installed and the status of the Content service and Process service. | [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) | | [Accordion group component](core/accordion-group.component.md) | Adds a collapsible panel to an accordion menu. | [Source](../lib/core/collapsable/accordion-group.component.ts) | | [Accordion component](core/accordion.component.md) | Creates a collapsible accordion menu. | [Source](../lib/core/collapsable/accordion.component.ts) | @@ -66,6 +67,7 @@ for more information about installing and using the source code. | [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) | | [Data column component](core/data-column.component.md) | Defines column properties for DataTable, Tasklist, Document List and other components. | [Source](../lib/core/data-column/data-column.component.ts) | | [Datatable component](core/datatable.component.md) | Displays data as a table with customizable columns and presentation. | [Source](../lib/core/datatable/components/datatable/datatable.component.ts) | +| [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) | A form field in an APS form. | [Source](../lib/core/form/components/form-field/form-field.component.ts) | | [Form list component](core/form-list.component.md) | Shows APS 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) | @@ -74,12 +76,13 @@ for more information about installing and using the source code. | [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) | | [Language menu component](core/language-menu.component.md) | Displays all the languages that are present in the "app.config.json" or the default one (EN). | [Source](../lib/core/language-menu/language-menu.component.ts) | -| [Login component](core/login.component.md) | Authenticates to Alfresco Content Services and Alfresco Process Services. | [Source](../lib/core/login/components/login.component.ts) | +| [Header component](core/header.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Reusable header for Alfresco applications. | [Source](../lib/core/layout/components/header/header.component.ts) | +| [Sidebar action menu component](core/sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts) | +| [Sidenav layout component](core/sidenav-layout.component.md) | Displays the standard three-region ADF application layout. | [Source](../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts) | +| [Login component](core/login.component.md) | Authenticates to Alfresco Content Services and or Alfresco Process Services. | [Source](../lib/core/login/components/login.component.ts) | | [Infinite pagination component](core/infinite-pagination.component.md) | Adds "infinite" pagination to the component it is used with. | [Source](../lib/core/pagination/infinite-pagination.component.ts) | | [Pagination component](core/pagination.component.md) | Adds pagination to the component it is used with. | [Source](../lib/core/pagination/pagination.component.ts) | | [Host settings component](core/host-settings.component.md) ![Internal](docassets/images/InternalIcon.png) | Validates the URLs for ACS and APS and saves them in the user's local storage | [Source](../lib/core/settings/host-settings.component.ts) | -| [Sidebar action menu component](core/sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts) | -| [Sidenav layout component](core/sidenav-layout.component.md) | Displays the standard three-region ADF application layout. | [Source](../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts) | | [Sorting picker component](core/sorting-picker.component.md) | Selects from a set of predefined sorting definitions and directions. | [Source](../lib/core/sorting-picker/sorting-picker.component.ts) | | [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) | @@ -122,7 +125,7 @@ for more information about installing and using the source code. | [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 object and extracts and formats the initials. | [Source](../lib/core/pipes/user-initial.pipe.ts) | ## Services @@ -133,7 +136,7 @@ for more information about installing and using the source code. | [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 an APS form field type string onto the corresponding form widget 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) | @@ -153,7 +156,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) ![Deprecated](docassets/images/DeprecatedIcon.png) | 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) | @@ -219,7 +222,7 @@ for more information about installing and using the source code. | [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 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 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) | @@ -307,13 +310,14 @@ for more information about installing and using the source code. | [Process instance tasks component](process-services/process-instance-tasks.component.md) | Lists both the active and completed tasks associated with a particular process instance | [Source](../lib/process-services/process-list/components/process-instance-tasks.component.ts) | | [Process list component](process-services/process-list.component.md) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../lib/process-services/process-list/components/process-list.component.ts) | | [Start process component](process-services/start-process.component.md) | Starts a process. | [Source](../lib/process-services/process-list/components/start-process.component.ts) | +| [Attach form component](process-services/attach-form.component.md) | This component can be used when there is no form attached to a task and we want to add one. | [Source](../lib/process-services/task-list/components/attach-form.component.ts) | | [Checklist component](process-services/checklist.component.md) | Shows the checklist task functionality. | [Source](../lib/process-services/task-list/components/checklist.component.ts) | | [Start task component](process-services/start-task.component.md) | Creates/Starts new task for the specified app | [Source](../lib/process-services/task-list/components/start-task.component.ts) | | [Task details component](process-services/task-details.component.md) | Shows the details of the task ID passed in as input. | [Source](../lib/process-services/task-list/components/task-details.component.ts) | | [Task filters component](process-services/task-filters.component.md) | Shows all available filters. | [Source](../lib/process-services/task-list/components/task-filters.component.ts) | | [Task header component](process-services/task-header.component.md) | Shows all the information related to a task. | [Source](../lib/process-services/task-list/components/task-header.component.ts) | | [Task list component](process-services/task-list.component.md) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../lib/process-services/task-list/components/task-list.component.ts) | -| [Task standalone component](process-services/task-standalone.component.md) | This component can be used when there is no form attached to a task. | [Source](../lib/process-services/task-list/components/task-standalone.component.ts) | +| [Task standalone component](process-services/task-standalone.component.md) | This component can be used when the task doesn't belong to any processes. | [Source](../lib/process-services/task-list/components/task-standalone.component.ts) | ## Directives @@ -333,9 +337,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) | diff --git a/docs/content-services/README.md b/docs/content-services/README.md index 29e22e1b8e..47be042b94 100644 --- a/docs/content-services/README.md +++ b/docs/content-services/README.md @@ -22,17 +22,17 @@ for more information about installing and using the source code. | [Add permission panel component](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](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](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](search-check-list.component.md) | Implements a checklist widget 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 check list component](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 chip list component](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](search-control.component.md) | Displays a input text which shows find-as-you-type suggestions. | [Source](../../lib/content-services/search/components/search-control.component.ts) | -| [Search date range component](search-date-range.component.md) | Implements a date range widget 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 date range component](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 filter component](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](search-number-range.component.md) | Implements a number range widget 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](search-radio.component.md) | Implements a radio button list widget 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](search-slider.component.md) | Implements a numeric slider widget for the [Search Filter component](../content-services/search-filter.component.md). | [Source](../../lib/content-services/search/components/search-slider/search-slider.component.ts) | +| [Search number range component](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](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](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 sorting picker component](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](search-text.component.md) | Implements a text input widget 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](search.component.md) | Searches items for supplied search terms. | [Source](../../lib/content-services/search/components/search.component.ts) | +| [Search text component](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](search.component.md) | Searches items for supplied search terms. | [Source](../../lib/content-services/search/components/search.component.ts) | | [Sites dropdown component](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](like.component.md) | Allows a user to add "likes" to an item. | [Source](../../lib/content-services/social/like.component.ts) | | [Rating component](rating.component.md) | Allows a user to add ratings to an item. | [Source](../../lib/content-services/social/rating.component.ts) | @@ -43,7 +43,7 @@ for more information about installing and using the source code. | [Upload button component](upload-button.component.md) | Activates a file upload. | [Source](../../lib/content-services/upload/components/upload-button.component.ts) | | [Upload drag area component](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](upload-version-button.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Activates a file version upload. | [Source](../../lib/content-services/upload/components/upload-version-button.component.ts) | -| [Version list component](version-list.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | 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 list component](version-list.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Displays the version history of a node in a Version Manager component. | [Source](../../lib/content-services/version-manager/version-list.component.ts) | | [Version manager component](version-manager.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | 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](webscript.component.md) | Provides access to Webscript features. | [Source](../../lib/content-services/webscript/webscript.component.ts) | @@ -72,12 +72,12 @@ for more information about installing and using the source code. | ---- | ----------- | ----------- | | [Content node dialog service](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](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](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](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](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) | +| [Document actions service](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](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](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) | | [Node permission dialog service](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](node-permission.service.md) | Manages role permissions for content nodes. | [Source](../../lib/content-services/permission-manager/services/node-permission.service.ts) | -| [Search filter service](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 filter service](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 query builder service](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](rating.service.md) | Manages ratings for items in Content Services. | [Source](../../lib/content-services/social/services/rating.service.ts) | | [Tag service](tag.service.md) | Manages tags in Content Services. | [Source](../../lib/content-services/tag/services/tag.service.ts) | @@ -88,4 +88,4 @@ for more information about installing and using the source code. | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Search Widget interface](search-widget.interface.md) | Specifies required properties for [Search filter component](../content-services/search-filter.component.md) widgets. | [Source](../../lib/content-services/search/search-widget.interface.ts) | +| [Search Widget interface](search-widget.interface.md) | Specifies required properties for Search filter component widgets. | [Source](../../lib/content-services/search/search-widget.interface.ts) | diff --git a/docs/content-services/permission-list.component.md b/docs/content-services/permission-list.component.md index 8f9201ba13..e6cc0273e7 100644 --- a/docs/content-services/permission-list.component.md +++ b/docs/content-services/permission-list.component.md @@ -17,8 +17,10 @@ Shows node permissions as a table. ``` -If permissions list is empty, `No permissions` text is displayed, -or custom template can be added: +### [Transclusions](../user-guide/transclusion.md) + +When the list is empty, the contents will simply say "No permissions" by default, +but you can also supply your own content: ```html diff --git a/docs/content-services/search-control.component.md b/docs/content-services/search-control.component.md index 16b571b1d6..865ebe63f3 100644 --- a/docs/content-services/search-control.component.md +++ b/docs/content-services/search-control.component.md @@ -20,6 +20,21 @@ Displays a input text which shows find-as-you-type suggestions. ``` +### [Transclusions](../user-guide/transclusion.md) + +You can show your own custom template when no results are found for the search: + +```html + + + + YOUR CUSTOM MESSAGE + + +``` + ## Class members ### Properties @@ -53,21 +68,3 @@ Below is an example of a component that uses the search control. In this example (submit)="onSearchSubmit($event)"> ``` - -### Customizable template for no result - -You can show your own custom template when no results are found for the search: - -```html - - - - YOUR CUSTOM MESSAGE - - -``` - -Place the `adf-empty-search-result` tag inside the `adf-search-control` and then within it, put -whatever content you want to show for an "empty" result. diff --git a/docs/content-services/upload-drag-area.component.md b/docs/content-services/upload-drag-area.component.md index 159ba5db91..04b48851ce 100644 --- a/docs/content-services/upload-drag-area.component.md +++ b/docs/content-services/upload-drag-area.component.md @@ -8,6 +8,17 @@ Last reviewed: 2018-08-07 Adds a drag and drop area to upload files to ACS. +## Contents + +- [Basic Usage](#basic-usage) + - [Transclusions](#transclusions) +- [Class members](#class-members) + - [Properties](#properties) + - [Events](#events) +- [Details](#details) + - [Intercepting uploads](#intercepting-uploads) + - [Example](#example) + ## Basic Usage ```html @@ -29,6 +40,19 @@ export class AppComponent { } ``` +### [Transclusions](../user-guide/transclusion.md) + +You can supply any content in the `` to display +as the drag/drop target: + +```html + +
+ DRAG HERE +
+
+``` + ## Class members ### Properties diff --git a/docs/core/README.md b/docs/core/README.md index 8a5a37f9ab..46c031d7d6 100644 --- a/docs/core/README.md +++ b/docs/core/README.md @@ -11,8 +11,8 @@ for more information about installing and using the source code. | Name | Description | Source link | | ---- | ----------- | ----------- | -| [About component](about.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | This component allow you to have a general overview of the version of ADF installed and the status of the [Content service](../core/content.service.md) and [Process service](../process-services/process.service.md). | [Source](../../lib/core/about/about.component.ts) | -| [Buttons menu component](buttons-menu.component.md) | Displays buttons on a responsive menu. | [Source](../../lib/core/buttons-menu/buttons-menu.component.ts) | +| [About component](about.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | This component allow you to have a general overview of the version of ADF installed and the status of the Content service and Process service. | [Source](../../lib/core/about/about.component.ts) | +| [Buttons menu component](buttons-menu.component.md) | Displays buttons on a responsive menu. | [Source](../../lib/core/buttons-menu/buttons-menu.component.ts) | | [Card view component](card-view.component.md) | Displays a configurable property list renderer. | [Source](../../lib/core/card-view/components/card-view/card-view.component.ts) | | [Accordion group component](accordion-group.component.md) | Adds a collapsible panel to an accordion menu. | [Source](../../lib/core/collapsable/accordion-group.component.ts) | | [Accordion component](accordion.component.md) | Creates a collapsible accordion menu. | [Source](../../lib/core/collapsable/accordion.component.ts) | @@ -20,25 +20,27 @@ for more information about installing and using the source code. | [Comments component](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) | | [Data column component](data-column.component.md) | Defines column properties for DataTable, Tasklist, Document List and other components. | [Source](../../lib/core/data-column/data-column.component.ts) | | [Datatable component](datatable.component.md) | Displays data as a table with customizable columns and presentation. | [Source](../../lib/core/datatable/components/datatable/datatable.component.ts) | +| [Empty list component](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](form-field.component.md) | A form field in an APS form. | [Source](../../lib/core/form/components/form-field/form-field.component.ts) | | [Form list component](form-list.component.md) | Shows APS forms as a list. | [Source](../../lib/core/form/components/form-list.component.ts) | -| [Form component](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](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) | +| [Form component](form.component.md) | Shows a Form from APS | [Source](../../lib/core/form/components/form.component.ts) | +| [Start form component](start-form.component.md) | Displays the Start Form for a process. | [Source](../../lib/core/form/components/start-form.component.ts) | | [Text mask component](text-mask.component.md) | Implements text field input masks. | [Source](../../lib/core/form/components/widgets/text/text-mask.component.ts) | | [Info drawer layout component](info-drawer-layout.component.md) | Displays a sidebar-style information panel. | [Source](../../lib/core/info-drawer/info-drawer-layout.component.ts) | | [Info drawer component](info-drawer.component.md) | Displays a sidebar-style information panel with tabs. | [Source](../../lib/core/info-drawer/info-drawer.component.ts) | | [Language menu component](language-menu.component.md) | Displays all the languages that are present in the "app.config.json" or the default one (EN). | [Source](../../lib/core/language-menu/language-menu.component.ts) | -| [Login component](login.component.md) | Authenticates to Alfresco Content Services and Alfresco Process Services. | [Source](../../lib/core/login/components/login.component.ts) | +| [Header component](header.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Reusable header for Alfresco applications. | [Source](../../lib/core/layout/components/header/header.component.ts) | +| [Sidebar action menu component](sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts) | +| [Sidenav layout component](sidenav-layout.component.md) | Displays the standard three-region ADF application layout. | [Source](../../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts) | +| [Login component](login.component.md) | Authenticates to Alfresco Content Services and or Alfresco Process Services. | [Source](../../lib/core/login/components/login.component.ts) | | [Infinite pagination component](infinite-pagination.component.md) | Adds "infinite" pagination to the component it is used with. | [Source](../../lib/core/pagination/infinite-pagination.component.ts) | | [Pagination component](pagination.component.md) | Adds pagination to the component it is used with. | [Source](../../lib/core/pagination/pagination.component.ts) | | [Host settings component](host-settings.component.md) ![Internal](../docassets/images/InternalIcon.png) | Validates the URLs for ACS and APS and saves them in the user's local storage | [Source](../../lib/core/settings/host-settings.component.ts) | -| [Sidebar action menu component](sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts) | -| [Sidenav layout component](sidenav-layout.component.md) | Displays the standard three-region ADF application layout. | [Source](../../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts) | | [Sorting picker component](sorting-picker.component.md) | Selects from a set of predefined sorting definitions and directions. | [Source](../../lib/core/sorting-picker/sorting-picker.component.ts) | | [Empty content component](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](error-content.component.md) | Displays info about a specific error. | [Source](../../lib/core/templates/error-content/error-content.component.ts) | | [Toolbar divider component](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](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 title component](toolbar-title.component.md) | Supplies custom HTML to be included in a Toolbar component title. | [Source](../../lib/core/toolbar/toolbar-title.component.ts) | | [Toolbar component](toolbar.component.md) | Simple container for headers, titles, actions and breadcrumbs. | [Source](../../lib/core/toolbar/toolbar.component.ts) | | [User info component](user-info.component.md) | Shows user information. | [Source](../../lib/core/userinfo/components/user-info.component.ts) | | [Viewer component](viewer.component.md) | Displays content from an ACS repository. | [Source](../../lib/core/viewer/components/viewer.component.ts) | @@ -60,7 +62,7 @@ for more information about installing and using the source code. | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Form field model](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) | +| [Form field model](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) | | [Comment process model](comment-process.model.md) | Represents a comment added to a Process Services task or process instance. | [Source](../../lib/core/models/comment-process.model.ts) | | [Product version model](product-version.model.md) | Contains version and license information classes for Alfresco products. | [Source](../../lib/core/models/product-version.model.ts) | | [User process model](user-process.model.md) | Represents a Process Services user. | [Source](../../lib/core/models/user-process.model.ts) | @@ -76,18 +78,18 @@ for more information about installing and using the source code. | [Node name tooltip pipe](node-name-tooltip.pipe.md) | Formats the tooltip for a Node. | [Source](../../lib/core/pipes/node-name-tooltip.pipe.ts) | | [Text highlight pipe](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](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](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) | +| [User initial pipe](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) | ## Services | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Card item types service](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](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) | +| [Card item types service](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](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) | | [Activiti alfresco service](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](form-rendering.service.md) | Maps an APS form field type string onto the corresponding form [widget component](../insights/widget.component.md) type. | [Source](../../lib/core/form/services/form-rendering.service.ts) | +| [Form rendering service](form-rendering.service.md) | Maps an APS form field type string onto the corresponding form widget component type. | [Source](../../lib/core/form/services/form-rendering.service.ts) | | [Form service](form.service.md) | Implements Process Services form methods | [Source](../../lib/core/form/services/form.service.ts) | -| [Node service](node.service.md) | Gets Alfresco Repository node metadata and creates nodes with metadata. | [Source](../../lib/core/form/services/node.service.ts) | +| [Node service](node.service.md) | Gets Alfresco Repository node metadata and creates nodes with metadata. | [Source](../../lib/core/form/services/node.service.ts) | | [Process content service](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](alfresco-api.service.md) | Provides access to an initialized **AlfrescoJSApi** instance. | [Source](../../lib/core/services/alfresco-api.service.ts) | | [Apps process service](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) | @@ -107,7 +109,7 @@ for more information about installing and using the source code. | [Nodes api service](nodes-api.service.md) | Accesses and manipulates ACS document nodes using their node IDs. | [Source](../../lib/core/services/nodes-api.service.ts) | | [Notification service](notification.service.md) | Shows a notification message with optional feedback. | [Source](../../lib/core/services/notification.service.ts) | | [Page title service](page-title.service.md) | Sets the page title. | [Source](../../lib/core/services/page-title.service.ts) | -| [People content service](people-content.service.md) | Gets information about a Content Services user. | [Source](../../lib/core/services/people-content.service.ts) | +| [People content service](people-content.service.md) | Gets information about a Content Services user. | [Source](../../lib/core/services/people-content.service.ts) | | [People process service](people-process.service.md) | Gets information about Process Services users. | [Source](../../lib/core/services/people-process.service.ts) | | [Renditions service](renditions.service.md) ![Deprecated](../docassets/images/DeprecatedIcon.png) | Manages prearranged conversions of content to different formats. | [Source](../../lib/core/services/renditions.service.ts) | | [Search configuration service](search-configuration.service.md) | Provides fine control of parameters to a search. | [Source](../../lib/core/services/search-configuration.service.ts) | @@ -134,5 +136,5 @@ for more information about installing and using the source code. | Name | Description | Source link | | ---- | ----------- | ----------- | | [Data Table Adapter interface](datatable-adapter.interface.md) | Defines how table data is supplied to DataTable and Tasklist components. | [Source](../../lib/core/datatable/data/datatable-adapter.ts) | -| [Form Field Validator interface](form-field-validator.interface.md) | Defines how the input fields of [`Form`](../../lib/process-services/task-list/models/form.model.ts) and Task Details components are validated. | [Source](../../lib/core/form/components/widgets/core/form-field-validator.ts) | +| [Form Field Validator interface](form-field-validator.interface.md) | Defines how the input fields of Form and Task Details components are validated. | [Source](../../lib/core/form/components/widgets/core/form-field-validator.ts) | | [Search Configuration interface](search-configuration.interface.md) | Provides fine control of parameters to a search. | [Source](../../lib/core/services/search-configuration.service.ts) | diff --git a/docs/core/accordion-group.component.md b/docs/core/accordion-group.component.md index 101df471da..ecac199612 100644 --- a/docs/core/accordion-group.component.md +++ b/docs/core/accordion-group.component.md @@ -35,6 +35,11 @@ export class MyComponent implements OnInit { } ``` +### [Transclusions](../user-guide/transclusion.md) + +Any content can be trancluded inside this component, since its purpose is to +define a section in a surrounding [Accordion component](accordion.component.md). + ## Class members ### Properties diff --git a/docs/core/accordion.component.md b/docs/core/accordion.component.md index 07536dd28f..849087e917 100644 --- a/docs/core/accordion.component.md +++ b/docs/core/accordion.component.md @@ -35,14 +35,19 @@ export class MyComponent implements OnInit { } ``` +### [Transclusions](../user-guide/transclusion.md) + +Content for the accordion menu is transcluded within one or more +[Accordion group components](accordion-group.component.md) + ## Details An accordion menu contains several panels of content, only one of which is visible at any time. The hidden panels are collapsed down to just the title and pushed together (like the bellows of an accordion) while the visible panel fills the remaining space in the menu. -Use one or more [Accordion Group](accordion-group.component.md) subcomponents to define the panels and set their -properties (title, selection status, etc). +Use one or more [Accordion Group](accordion-group.component.md) subcomponents to transclude the content +for the panels and set their properties (title, selection status, etc). ### Example diff --git a/docs/core/buttons-menu.component.md b/docs/core/buttons-menu.component.md index 33a38e9a34..253c143aae 100644 --- a/docs/core/buttons-menu.component.md +++ b/docs/core/buttons-menu.component.md @@ -12,12 +12,14 @@ Displays buttons on a responsive menu. ## Basic Usage +### [Transclusions](../user-guide/transclusion.md) + Place the buttons for the menu inside this component's HTML tags. They must use the following structure: ```html - + + +
+ + + +``` + +For example, the image below shows a toolbar with a +[Breadcrumb component](../content-services/breadcrumb.component.md) title, and then some buttons +pushed to the right by a spacer: + +![](../docassets/images/adf-toolbar-02.png) + ## Class members ### Properties @@ -47,55 +78,6 @@ Simple container for headers, titles, actions and breadcrumbs. ## Details -### Custom title - -You can use any HTML layout or Angular component as the content of the title section by -using the `` subcomponent instead of the "title" attribute: - -```html - - - - - ... - -``` - -![](../docassets/images/adf-toolbar-02.png) - -### Divider - -You can divide groups of elements with a visual separator ``: - -```html - - - - - - -``` - -### Spacer - -You can split the toolbar into separate sections at the left and right of the screen -with the `adf-toolbar--spacer` CSS class. In the following example, the toolbar title -element is rendered to the left but all the buttons are pushed to the right side: - -```html - - - ... - - -
- - - - -
-``` - ### Dropdown menu The following example shows how to create a dropdown menu. The code is based diff --git a/docs/core/viewer.component.md b/docs/core/viewer.component.md index a34ec370c7..a78858a7d6 100644 --- a/docs/core/viewer.component.md +++ b/docs/core/viewer.component.md @@ -13,6 +13,7 @@ See it live: [Viewer Quickstart](https://embed.plnkr.co/iTuG1lFIXfsP95l6bDW6/) ## Contents - [Basic usage](#basic-usage) + - [Transclusions](#transclusions) - [Class members](#class-members) - [Properties](#properties) - [Events](#events) @@ -23,13 +24,8 @@ See it live: [Viewer Quickstart](https://embed.plnkr.co/iTuG1lFIXfsP95l6bDW6/) - [Supported file formats](#supported-file-formats) - [Content Renditions](#content-renditions) - [Configuring PDF.js library](#configuring-pdfjs-library) - - [Custom toolbar](#custom-toolbar) - - [Custom toolbar buttons](#custom-toolbar-buttons) - - [Custom sidebar](#custom-sidebar) - - [Custom thumbnails](#custom-thumbnails) - - [Custom "Open With" menu](#custom-open-with-menu) - - [Custom "More actions" menu](#custom-more-actions-menu) - [Extending the Viewer](#extending-the-viewer) + - [Custom layout](#custom-layout) - [See also](#see-also) ## Basic usage @@ -66,6 +62,12 @@ Note that if you have a URL which contains a shared link ID, you should extract ID portion and use it with the `sharedLinkId` property rather than using the whole URL with `urlFile`. +### [Transclusions](../user-guide/transclusion.md) + +The [Viewer component](../core/viewer.component.md) lets you transclude content for the toolbar (and toolbar buttons), +the sidebar, thumbnails, and the "Open with" and "More actions" menus. +See the [Custom layout](#custom-layout) section for full details of all available tranclusions. + ## Class members ### Properties @@ -261,164 +263,6 @@ new CopyWebpackPlugin([ The [Viewer component](../core/viewer.component.md) now should be able to display PDF files. -### Custom toolbar - -You can replace the standard viewer toolbar with your own custom implementation: - -```html - - -

toolbar

-
-
-``` - -Everything you put inside the "adf-viewer-toolbar" tags will be rendered instead of the -standard toolbar. - -### Custom toolbar buttons - -If you are happy with the custom toolbar's behaviour but want to add some extra buttons -then you can do so as shown in the following example: - -```html - - - - - - - -``` - -The result should look like this: - -![Custom Toolbar Actions](../docassets/images/viewer-toolbar-actions.png) - -### Custom sidebar - -The [Viewer component](../core/viewer.component.md) also supports custom sidebar components and layouts. -Set the `allowSidebar` property to `true` to enable this feature. - -The custom sidebar can be injected in two different ways: - -- using transclusion -- using a template **(only works when using the viewer with fileNodeId)** - -#### Using transclusion - -```html - - -

My info

-
-
-``` - -Everything you put inside the "adf-viewer-sidebar" tags will be rendered. - -#### Using template injection (only works when using the viewer with fileNodeId) - -```html - - - - -``` - -### Custom thumbnails - -The PDF viewer comes with its own default list of thumbnails but you can replace this -by providing a custom template and binding to the context property `viewer` to access the PDFJS.PDFViewer -instance. - -![PDF thumbnails](../docassets/images/pdf-thumbnails.png) - -#### Using template injection - -```javascript -import { Component, Input } from '@angular/core'; - -@Component({ - selector: 'custom-thumbnails', - template: '

Custom Thumbnails Component

' -}) -export class CustomThumbnailsComponent { - @Input() pdfViewer: any; - - ... -} -``` - -```html - - - - - -``` - -### Custom "Open With" menu - -You can enable a custom "Open With" menu by providing at least one action inside the -`adf-viewer-open-with` tag: - -```html - - - - - - - - - -``` - -![Open with](../docassets/images/viewer-open-with.png) - -### Custom "More actions" menu - -You can enable a custom "More actions" menu by providing at least one action inside the `adf-viewer-more-actions` tag: - -```html - - - - - - - - - -``` - -![More actions](../docassets/images/viewer-more-actions.png) - ### Extending the Viewer You can define your own custom handle to handle other file formats that are not yet supported by @@ -465,6 +309,164 @@ You can define multiple `adf-viewer-extension` templates if required: ``` +### Custom layout + +The [Viewer component](../core/viewer.component.md) lets you transclude custom content in several different places as +explained in the sections below. + +#### Custom toolbar + +You can replace the standard viewer toolbar with your own custom implementation: + +```html + + +

toolbar

+
+
+``` + +Everything you put inside the "adf-viewer-toolbar" tags will be rendered instead of the +standard toolbar. + +#### Custom toolbar buttons + +If you are happy with the custom toolbar's behaviour but want to add some extra buttons +then you can do so as shown in the following example: + +```html + + + + + + + +``` + +The result should look like this: + +![Custom Toolbar Actions](../docassets/images/viewer-toolbar-actions.png) + +#### Custom sidebar + +The [Viewer component](../core/viewer.component.md) also supports custom sidebar components and layouts. +Set the `allowSidebar` property to `true` to enable this feature. + +The custom sidebar can be injected in two different ways. The first way is to use +transclusion, which will display all content placed inside the `` element: + +```html + + +

My info

+
+
+``` + +The second way to customize the sidebar is to use template injection but note that this only works +when using the viewer with `fileNodeId`. + +```html + + + + +``` + +#### Custom thumbnails + +The PDF viewer comes with its own default list of thumbnails but you can replace this +by providing a custom template and binding to the context property `viewer` to access the PDFJS.PDFViewer +instance. + +![PDF thumbnails](../docassets/images/pdf-thumbnails.png) + +Provide the custom template as in the following example: + +```javascript +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'custom-thumbnails', + template: '

Custom Thumbnails Component

' +}) +export class CustomThumbnailsComponent { + @Input() pdfViewer: any; + + ... +} +``` + +```html + + + + + +``` + +#### Custom "Open With" menu + +You can enable a custom "Open With" menu by providing at least one action inside the +`adf-viewer-open-with` tag: + +```html + + + + + + + + + +``` + +![Open with](../docassets/images/viewer-open-with.png) + +#### Custom "More actions" menu + +You can enable a custom "More actions" menu by providing at least one action inside the `adf-viewer-more-actions` tag: + +```html + + + + + + + + + +``` + +![More actions](../docassets/images/viewer-more-actions.png) + ## See also - [Document List component](../content-services/document-list.component.md) diff --git a/docs/docassets/images/custom-footer.png b/docs/docassets/images/custom-footer.png index 0f7fcd554c1a1fb8a514800de7d5a0df1ad3747d..f7d1e82877349c972f9a419987057552a49493c5 100644 GIT binary patch delta 11243 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 H_Vxb(UN6wt diff --git a/docs/docassets/images/custom-header.png b/docs/docassets/images/custom-header.png index 244fc8fc50b8eac26040f5511f7b5bd89120bee5..7abf0e85086635b4a519667d1ac4d2edf3447440 100644 GIT binary patch delta 9129 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 delta 16972 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 fDh{}n^ZK5+$)-INN ``` -You can also show a custom template if there are no apps present: +### [Transclusions](../user-guide/transclusion.md) + +You can show custom content when there are no apps available by supplying an +`` section: ```html ``` +### [Transclusions](../user-guide/transclusion.md) + +You can provide a title for the search header and a label for the action button using +special sub-components in the body of the `` element: + +```html + + Custom title + Custom label + +``` + ## Class members ### Properties @@ -41,7 +53,7 @@ Searches users/people. [results]="peopleSearch$"> {{ 'TASK_DETAILS.LABELS.ADD_PEOPLE' | translate }} {{ 'PEOPLE.ADD_USER' | translate }} - + ``` diff --git a/docs/process-services/process-attachment-list.component.md b/docs/process-services/process-attachment-list.component.md index 76599a0bb3..2cc8ad47a8 100644 --- a/docs/process-services/process-attachment-list.component.md +++ b/docs/process-services/process-attachment-list.component.md @@ -36,6 +36,23 @@ export class MyCustomProcessAttachmentComponent { } ``` +### [Transclusions](../user-guide/transclusion.md) + +Any content inside the `` element will be shown when +the list is empty: + +```html + +
+
+``` + +![custom-no-content-drag-drop-template-sample](../docassets/images/custom-no-content-drag-drop-template.png) + +A default template will be used if you don't supply a custom one to override it: + +![default-no-content-template-sample](../docassets/images/default-no-content-template.png) + ## Class members ### Properties @@ -84,11 +101,3 @@ a custom _no content template_ (using <adf-empty-list>) to invite the user to ``` - -If the List is empty, the custom no-content template we passed is displayed. - -![custom-no-content-drag-drop-template-sample](../docassets/images/custom-no-content-drag-drop-template.png) - -A default template will be used if you don't supply a custom one to override it: - -![default-no-content-template-sample](../docassets/images/default-no-content-template.png) diff --git a/docs/process-services/process-list.component.md b/docs/process-services/process-list.component.md index a2913414e2..cc907366ed 100644 --- a/docs/process-services/process-list.component.md +++ b/docs/process-services/process-list.component.md @@ -11,13 +11,13 @@ Renders a list containing all the process instances matched by the parameters sp ## Contents - [Basic Usage](#basic-usage) + - [Transclusions](#transclusions) - [Class members](#class-members) - [Properties](#properties) - [Events](#events) - [Details](#details) - [Setting Sorting Order for the list](#setting-sorting-order-for-the-list) - [Pagination strategy](#pagination-strategy) - - [Show custom template when processList is empty](#show-custom-template-when-processlist-is-empty) - [See also](#see-also) ## Basic Usage @@ -31,6 +31,19 @@ Renders a list containing all the process instances matched by the parameters sp ``` +### [Transclusions](../user-guide/transclusion.md) + +Any content inside an `` sub-component will be shown +when the process list is empty: + +```html + + + Your Content + + +``` + ## Class members ### Properties @@ -170,18 +183,6 @@ The Process Instance List also supports pagination: ``` -### Show custom template when processList is empty - -You can add your own template or message as shown in the example below: - -```html - - - Your Content - - -``` - ## See also - [Data column component](../core/data-column.component.md) diff --git a/docs/process-services/task-attachment-list.component.md b/docs/process-services/task-attachment-list.component.md index 1072b0a10a..de9505e7a7 100644 --- a/docs/process-services/task-attachment-list.component.md +++ b/docs/process-services/task-attachment-list.component.md @@ -19,6 +19,23 @@ Displays attached documents on a specified task. ``` +### [Transclusions](../user-guide/transclusion.md) + +Any content inside the `` element will be displayed +when the list is empty: + +```html + +
+
+``` + +![custom-no-content-drag-drop-template-sample](../docassets/images/custom-no-content-drag-drop-template.png) + +A default "no content" template is displayed if you don't supply one to override it: + +![default-no-content-template-sample](../docassets/images/default-no-content-template.png) + ## Class members ### Properties @@ -38,10 +55,6 @@ Displays attached documents on a specified task. ## Details -If the List is empty, a default "no content" template is displayed. - -![default-no-content-template-sample](../docassets/images/default-no-content-template.png) - ### How to Add Drag and Drop Functionality You can wrap the component with an [Upload Drag Area component](../content-services/upload-drag-area.component.md) @@ -90,7 +103,3 @@ export class MyCustomTaskAttachmentComponent { ``` [Upload Drag Area Component](../content-services/upload-drag-area.component.md) - -If the List is empty, the custom no-content template we passed is displayed. - -![custom-no-content-drag-drop-template-sample](../docassets/images/custom-no-content-drag-drop-template.png) diff --git a/docs/process-services/task-list.component.md b/docs/process-services/task-list.component.md index 2f6d9d5844..86255ba55e 100644 --- a/docs/process-services/task-list.component.md +++ b/docs/process-services/task-list.component.md @@ -11,6 +11,7 @@ Renders a list containing all the tasks matched by the parameters specified. ## Contents - [Basic Usage](#basic-usage) + - [Transclusions](#transclusions) - [Class members](#class-members) - [Properties](#properties) - [Events](#events) @@ -20,7 +21,6 @@ Renders a list containing all the tasks matched by the parameters specified. - [Pagination strategy](#pagination-strategy) - [DataTableAdapter example](#datatableadapter-example) - [DataColumn Features](#datacolumn-features) - - [Show custom template when tasklist is empty](#show-custom-template-when-tasklist-is-empty) - [See also](#see-also) ## Basic Usage @@ -33,6 +33,19 @@ Renders a list containing all the tasks matched by the parameters specified. ``` +### [Transclusions](../user-guide/transclusion.md) + +Any content inside an `` sub-component will be shown +when the task list is empty: + +```html + + + Your Content + + +``` + ## Class members ### Properties @@ -47,13 +60,10 @@ Renders a list containing all the tasks matched by the parameters specified. | multiselect | `boolean` | false | Toggles multiple row selection, renders checkboxes at the beginning of each row | | name | `string` | | Name of the tasklist. | | page | `number` | 0 | The page number of the tasks to fetch. | -| start | `number` | 0 | Another approach to specify which page you want load. | | processDefinitionId | `string` | | The Definition Id of the process. | | processDefinitionKey | `string` | | (**Deprecated:** 2.4.0) The Definition Key of the process. | | processInstanceId | `string` | | The Instance Id of the process. | -| taskId | `string` | | The taskId you want to be fetched. | | selectFirstRow | `boolean` | true | Toggles default selection of the first row | -| includeProcessInstance | `boolean` | false | Include the process instance info | | selectionMode | `string` | "single" | Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode, you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | | size | `number` | | The number of tasks to fetch. Default value: 25. | | sort | `string` | | Define the sort order of the tasks. Possible values are : `created-desc`, `created-asc`, `due-desc`, `due-asc` | @@ -213,18 +223,6 @@ typical tasklist. You can customize the styling of a column and also add features like tooltips and automatic translation of column titles. See the [`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) page for more information about these features. -### Show custom template when tasklist is empty - -You can add your own template or message as shown in the example below: - -```html - - - Your Content - - -``` - ## See also - [Data column component](../core/data-column.component.md) diff --git a/docs/user-guide/README.md b/docs/user-guide/README.md index 82d8a556bf..8f68ea18a4 100644 --- a/docs/user-guide/README.md +++ b/docs/user-guide/README.md @@ -9,6 +9,7 @@ on an item below to see the corresponding guide page. - [Form Extensibility and Customisation](extensibility.md) - [Internationalization in ADF](internationalization.md) - [Theming](theming.md) +- [Transclusion](transclusion.md) - [Typography](typography.md) - [Walkthrough - adding indicators to highlight information about a node](metadata-indicators.md) diff --git a/docs/user-guide/transclusion.md b/docs/user-guide/transclusion.md new file mode 100644 index 0000000000..78d5a7c099 --- /dev/null +++ b/docs/user-guide/transclusion.md @@ -0,0 +1,41 @@ +--- +Added: v2.6.0 +--- + +# Transclusion + +Several components in ADF make use of **transclusion**, which is the technique +of incorporating user-supplied content in the body of a standard component. In +most cases, this is used to make small customizations (for example, the various +list components let you supply custom content to show when the list is empty). +However, there are also a few "containers" whose entire content is set by the user +with the container itself being mainly for convenient display and formatting +(for example, the [Accordion component](../core/accordion.component.md)). + +You supply the content you want to transclude between the opening and closing tags of +the main component. In a few cases, this content can be completely free-form as with +the body section of the [Login component](../core/login.component.md): + +```html + +
+
Your extra content
+
+
+``` + +More often, though, the main component makes use of one or more sub-components to add +structure to the transclusion. For example, the [Login component](../core/login.component.md) +also has sub-components for the header and footer regions in addition to the free-form +content of the body: + +```html + + My custom HTML for the footer + +``` + +![Custom login footer example](../docassets/images/custom-footer.png) + +The doc pages for the components that use transclusion contain full details of all +supported sub-components and their usage. \ No newline at end of file diff --git a/docs/versionIndex.md b/docs/versionIndex.md index 849d1920a7..45309c35e9 100644 --- a/docs/versionIndex.md +++ b/docs/versionIndex.md @@ -6,12 +6,22 @@ of components organized by ADF libraries. ## Versions +- [v2.5.0](#v250) - [v2.4.0](#v240) - [v2.3.0](#v230) - [v2.2.0](#v220) - [v2.1.0](#v210) - [v2.0.0](#v200) + +## v2.5.0 + +**Released:** 2018-08-14 ([Release notes](https://community.alfresco.com/docs/DOC-7993))
+**APS compatible version:** v1.6.4+
+**ACS compatible version:** v5.2.3
+ +No new components added. + ## v2.4.0 **Released:** 2018-06-21 ([Release notes](https://community.alfresco.com/docs/DOC-7397))
@@ -166,6 +176,7 @@ of components organized by ADF libraries. - [Dropdown breadcrumb component](content-services/dropdown-breadcrumb.component.md) - [Ecm user model](core/ecm-user.model.md) - [Ecm user service](core/ecm-user.service.md) +- [Empty list component](core/empty-list.component.md) - [Favorites api service](core/favorites-api.service.md) - [File draggable directive](content-services/file-draggable.directive.md) - [File size pipe](core/file-size.pipe.md) diff --git a/tools/doc/doctool.config.json b/tools/doc/doctool.config.json index b06892c8b7..607668d4c4 100644 --- a/tools/doc/doctool.config.json +++ b/tools/doc/doctool.config.json @@ -19,8 +19,7 @@ "toc" ], "dev": [ - "tsInfo", - "typeLinker" + "toc" ] }, "statusIcons": { diff --git a/tools/doc/tools/toc.js b/tools/doc/tools/toc.js index 38d80d56cd..9236ed15a4 100644 --- a/tools/doc/tools/toc.js +++ b/tools/doc/tools/toc.js @@ -4,6 +4,7 @@ var fs = require("fs"); var remark = require("remark"); //var tocGenerator = require("mdast-util-toc"); var replaceSection = require("mdast-util-heading-range"); +var tostring = require("mdast-util-to-string"); var ejs = require("ejs"); @@ -117,18 +118,26 @@ function makeToc(tree) { var headings = nav.headings(h => (h.depth > 1) && - (h.depth <= maxTocHeadingDepth) && - !((h.children[0].type === "text") && (h.children[0].value === "Contents")) + (h.depth <= maxTocHeadingDepth) //&& + //!((h.children[0].type === "text") && (h.children[0].value === "Contents")) ); var context = {headings: []}; headings.forEach(heading => { - context.headings.push({ - "level": heading.item.depth - 2, - "title": heading.textValue, - "anchor": "#" + heading.textValue.toLowerCase().replace(/ /g, "-").replace(/[\.,'"`$]/g ,"") - }) + var linkTitle = ""; + + if (!((heading.item.children[0].type === "text") && (heading.item.children[0].value === "Contents"))) { + linkTitle = tostring(heading.item).trim(); + } + + if (linkTitle !== "") { + context.headings.push({ + "level": heading.item.depth - 2, + "title": linkTitle, + "anchor": "#" + linkTitle.toLowerCase().replace(/ /g, "-").replace(/[\.,'"`$]/g ,"") + }) + }; }); var templateName = path.resolve(templateFolder, "toc.ejs"); diff --git a/tools/doc/yamlTemplates/property.ejs b/tools/doc/yamlTemplates/property.ejs index 8ace72fe32..de1bfd5cfe 100644 --- a/tools/doc/yamlTemplates/property.ejs +++ b/tools/doc/yamlTemplates/property.ejs @@ -13,10 +13,12 @@ <% child.decorators.forEach(dec => { -%> - name: <%= dec.name %> arguments: +<%_if (typeof dec.arguments !== "undefined") { -%> <% Object.keys(dec.arguments).forEach(argName => { -%> - id: <%= argName %> value: <%- dec.arguments[argName] %> <% }) %> +<% } -%> <%_ }) -%> <% } -%> syntax: