From 54f4a07f53e1f3d7c9347ce98344a3fffafb1e7a Mon Sep 17 00:00:00 2001
From: Andy Stark <30621568+therealandeeee@users.noreply.github.com>
Date: Fri, 25 Aug 2017 17:27:09 +0100
Subject: [PATCH] [ADF-1453] Restructure README.md files (#2239)
* ADF-1453: Restructured Activiti Analytics readme
* ADF-1453: Restructured Activiti Diagrams readme
* ADF-1453: Restructured Activiti Form readme
* ADF-1453: Restructured Activiti Process List readme
* ADF-1453: Restructured Activiti Task List readme
* ADF-1453: Restructured Alfresco Core readme
* [ADF-1453] Restructured DataTable readme
* [ADF-1453] Restructured Document List readme
* [ADF-1453] Restructured Login readme
* [ADF-1453] Restructured Alfresco Search readme
* [ADF-1453] Restructured Alfresco Social readme
* [ADF-1453] Restructured Alfresco Tag readme
* [ADF-1453] Restructured Alfresco User Info readme
* [ADF-1453] Restructured Alfresco Viewer readme
* [ADF-1453] Restructured Alfresco Webscript readme
* [ADF-1453] Fixed table display glitch
* [ADF-1453] Fixed Markdown lint errors in readme files
* [ADF-1453] Adding missing fileUploadDelete event to table in Upload readme
* [ADF-1453] Resolved merge conflict with Upload readme
* [ADF-1453] Changes from npm run doc
---
ng2-components/README.md | 141 +--
.../ng2-activiti-analytics/README.md | 136 +--
.../ng2-activiti-diagrams/README.md | 64 +-
ng2-components/ng2-activiti-form/README.md | 341 +++---
.../ng2-activiti-processlist/README.md | 216 ++--
.../ng2-activiti-tasklist/README.md | 395 ++++---
ng2-components/ng2-alfresco-core/README.md | 992 +++++++++++-------
.../ng2-alfresco-core/docs/adf-toolbar-01.png | Bin 0 -> 14044 bytes
.../ng2-alfresco-core/docs/adf-toolbar-02.png | Bin 0 -> 36976 bytes
.../ng2-alfresco-core/docs/adf-toolbar-03.png | Bin 0 -> 14016 bytes
.../ng2-alfresco-core/docs/adf-toolbar-04.png | Bin 0 -> 33228 bytes
.../ng2-alfresco-core/docs/adf-toolbar-05.png | Bin 0 -> 14432 bytes
.../ng2-alfresco-core/docs/adf-toolbar-06.png | Bin 0 -> 14208 bytes
.../ng2-alfresco-core/docs/adf-toolbar-07.png | Bin 0 -> 14724 bytes
.../ng2-alfresco-datatable/README.md | 241 +++--
.../docs/assets/basic.png | Bin 0 -> 20119 bytes
.../ng2-alfresco-documentlist/README.md | 306 +++---
ng2-components/ng2-alfresco-login/README.md | 99 +-
ng2-components/ng2-alfresco-search/README.md | 119 ++-
ng2-components/ng2-alfresco-social/README.md | 91 +-
ng2-components/ng2-alfresco-tag/README.md | 86 +-
ng2-components/ng2-alfresco-upload/README.md | 170 +--
.../ng2-alfresco-userinfo/README.md | 65 +-
ng2-components/ng2-alfresco-viewer/README.md | 161 +--
.../ng2-alfresco-webscript/README.md | 77 +-
25 files changed, 2034 insertions(+), 1666 deletions(-)
create mode 100644 ng2-components/ng2-alfresco-core/docs/adf-toolbar-01.png
create mode 100644 ng2-components/ng2-alfresco-core/docs/adf-toolbar-02.png
create mode 100644 ng2-components/ng2-alfresco-core/docs/adf-toolbar-03.png
create mode 100644 ng2-components/ng2-alfresco-core/docs/adf-toolbar-04.png
create mode 100644 ng2-components/ng2-alfresco-core/docs/adf-toolbar-05.png
create mode 100644 ng2-components/ng2-alfresco-core/docs/adf-toolbar-06.png
create mode 100644 ng2-components/ng2-alfresco-core/docs/adf-toolbar-07.png
create mode 100644 ng2-components/ng2-alfresco-datatable/docs/assets/basic.png
diff --git a/ng2-components/README.md b/ng2-components/README.md
index 6da5fea421..05e2b010b8 100644
--- a/ng2-components/README.md
+++ b/ng2-components/README.md
@@ -26,60 +26,18 @@
### Components
-
-- [adf-card-view](ng2-alfresco-core/README.md)
-- [adf-card-view-textitem](ng2-alfresco-core/README.md)
-- [adf-card-view-mapitem](ng2-alfresco-core/README.md)
-- [adf-card-view-item-dispatcher](ng2-alfresco-core/README.md)
-- [adf-card-view-dateitem](ng2-alfresco-core/README.md)
-- [adf-toolbar](ng2-alfresco-core/README.md)
-- [adf-toolbar-title](ng2-alfresco-core/README.md)
-- [adf-context-menu-holder](ng2-alfresco-core/README.md)
-- [adf-accordion](ng2-alfresco-core/README.md)
-- [adf-accordion-group](ng2-alfresco-core/README.md)
+
### Directives
-
-- [adf-card-view-content-proxy](ng2-alfresco-core/README.md)
-- [adf-context-menu](ng2-alfresco-core/README.md)
-- [adf-mdl-textfield](ng2-alfresco-core/README.md)
-- [adf-mdl-menu](ng2-alfresco-core/README.md)
-- [adf-upload](ng2-alfresco-core/README.md)
+
## Content service
### Components
-
-- [adf-search-control](ng2-alfresco-search/README.md)
-- [adf-search](ng2-alfresco-search/README.md)
-- [adf-search-autocomplete](ng2-alfresco-search/README.md)
-- [adf-upload-button](ng2-alfresco-upload/README.md)
-- [adf-upload-drag-area](ng2-alfresco-upload/README.md)
-- [adf-file-uploading-list](ng2-alfresco-upload/README.md)
-- [adf-file-uploading-dialog](ng2-alfresco-upload/README.md)
-- [adf-file-uploading-list-row](ng2-alfresco-upload/README.md)
-- [adf-sites-dropdown](ng2-alfresco-documentlist/README.md)
-- [adf-content-node-selector](ng2-alfresco-documentlist/README.md)
-- [adf-document-menu-action](ng2-alfresco-documentlist/README.md)
-- [adf-dropdown-breadcrumb](ng2-alfresco-documentlist/README.md)
-- [adf-breadcrumb](ng2-alfresco-documentlist/README.md)
-- [adf-document-list](ng2-alfresco-documentlist/README.md)
-- [adf-pagination](ng2-alfresco-core/src/components/pagination/pagination.md)
-- [adf-empty-list](ng2-alfresco-datatable/README.md)
-- [adf-datatable](ng2-alfresco-datatable/README.md)
-- [adf-datatable-cell](ng2-alfresco-datatable/README.md)
-- [adf-viewer](ng2-alfresco-viewer/README.md)
-- [adf-userinfo](ng2-alfresco-userinfo/README.md)
-- [adf-rating](ng2-alfresco-social/README.md)
-- [adf-like](ng2-alfresco-social/README.md)
-- [adf-tag-node-list](ng2-alfresco-tag/README.md)
-- [adf-tag-list](ng2-alfresco-tag/README.md)
-- [adf-tag-node-actions-list](ng2-alfresco-tag/README.md)
-- [adf-login](ng2-alfresco-login/README.md)
-- [adf-webscript-get](ng2-alfresco-webscript/README.md)
+
@@ -88,103 +46,14 @@
### components
-
-- [adf-diagram-publish-task](ng2-activiti-diagrams/README.md)
-- [adf-start-process](ng2-activiti-processlist/README.md)
-- [adf-process-instance-list](ng2-activiti-processlist/README.md)
-- [adf-process-instance-variables](ng2-activiti-processlist/README.md)
-- [adf-process-instance-tasks](ng2-activiti-processlist/README.md)
-- [adf-process-instance-header](ng2-activiti-processlist/README.md)
-- [adf-process-instance-details](ng2-activiti-processlist/README.md)
-- [adf-process-instance-filters](ng2-activiti-processlist/README.md)
-- [adf-process-instance-comments](ng2-activiti-processlist/README.md)
-- [adf-process-attachment-list](ng2-activiti-processlist/README.md)
-- [adf-create-process-attachment](ng2-activiti-processlist/README.md)
-- [adf-form-field](ng2-activiti-form/README.md)
-- [adf-start-form](ng2-activiti-form/README.md)
-- [adf-content](ng2-activiti-form/README.md)
-- [adf-form](ng2-activiti-form/README.md)
-- [adf-form-list](ng2-activiti-form/README.md)
-- [adf-diagram](ng2-activiti-diagrams/README.md)
-- [adf-diagram-sequence-flow](ng2-activiti-diagrams/README.md)
-- [adf-tasklist](ng2-activiti-tasklist/README.md)
-- [adf-filters](ng2-activiti-tasklist/README.md)
-- [adf-task-details](ng2-activiti-tasklist/README.md)
-- [adf-start-task](ng2-activiti-tasklist/README.md)
-- [adf-task-header](ng2-activiti-tasklist/README.md)
-- [adf-people-list](ng2-activiti-tasklist/README.md)
-- [adf-task-attachment-list](ng2-activiti-tasklist/README.md)
-- [adf-people-search](ng2-activiti-tasklist/README.md)
-- [adf-people](ng2-activiti-tasklist/README.md)
-- [adf-comments](ng2-activiti-tasklist/README.md)
-- [adf-create-task-attachment](ng2-activiti-tasklist/README.md)
-- [adf-comment-list](ng2-activiti-tasklist/README.md)
-- [adf-checklist](ng2-activiti-tasklist/README.md)
-- [adf-apps](ng2-activiti-tasklist/README.md)
-- [adf-analytics-report-parameters](ng2-activiti-analytics/README.md)
-- [adf-analytics](ng2-activiti-analytics/README.md)
-- [adf-analytics-report-list](ng2-activiti-analytics/README.md)
-- [adf-analytics-report-heat-map](ng2-activiti-analytics/README.md)
-- [adf-analytics-generator](ng2-activiti-analytics/README.md)
+
## Services
-
-- [ContextMenuService](ng2-alfresco-core/src/components/context-menu/context-menu.service.ts)
-- [FileUploadService](ng2-alfresco-upload/src/services/file-uploading.service.ts)
-- [DocumentListService](ng2-alfresco-documentlist/src/services/document-list.service.ts)
-- [NodeActionsService](ng2-alfresco-documentlist/src/services/node-actions.service.ts)
-- [FolderActionsService](ng2-alfresco-documentlist/src/services/folder-actions.service.ts)
-- [DocumentActionsService](ng2-alfresco-documentlist/src/services/document-actions.service.ts)
-- [ProcessService](ng2-activiti-processlist/src/services/process.service.ts)
-- [ProcessUploadService](ng2-activiti-processlist/src/services/process-upload.service.ts)
-- [WidgetVisibilityService](ng2-activiti-form/src/services/widget-visibility.service.ts)
-- [NodeService](ng2-activiti-form/src/services/node.service.ts)
-- [FormService](ng2-activiti-form/src/services/form.service.ts)
-- [FormRenderingService](ng2-activiti-form/src/services/form-rendering.service.ts)
-- [EcmModelService](ng2-activiti-form/src/services/ecm-model.service.ts)
-- [ActivitiContentService](ng2-activiti-form/src/services/activiti-content-service.ts)
-- [ActivitiAlfrescoContentService](ng2-activiti-form/src/services/activiti-alfresco.service.ts)
-- [CardViewUpdateService](ng2-alfresco-core/src/services/card-view-update.service.ts)
-- [SearchService](ng2-alfresco-core/src/services/search.service.ts)
-- [SitesApiService](ng2-alfresco-core/src/services/sites-api.service.ts)
-- [SharedLinksApiService](ng2-alfresco-core/src/services/shared-links-api.service.ts)
-- [SearchApiService](ng2-alfresco-core/src/services/search-api.service.ts)
-- [NodesApiService](ng2-alfresco-core/src/services/nodes-api.service.ts)
-- [PeopleApiService](ng2-alfresco-core/src/services/people-api.service.ts)
-- [FavoritesApiService](ng2-alfresco-core/src/services/favorites-api.service.ts)
-- [DiscoveryApiService](ng2-alfresco-core/src/services/discovery-api.service.ts)
-- [DeletedNodesApiService](ng2-alfresco-core/src/services/deleted-nodes-api.service.ts)
-- [UserPreferencesService](ng2-alfresco-core/src/services/user-preferences.service.ts)
-- [UploadService](ng2-alfresco-core/src/services/upload.service.ts)
-- [TranslationService](ng2-alfresco-core/src/services/translation.service.ts)
-- [ThumbnailService](ng2-alfresco-core/src/services/thumbnail.service.ts)
-- [StorageService](ng2-alfresco-core/src/services/storage.service.ts)
-- [AlfrescoApiService](ng2-alfresco-core/src/services/alfresco-api.service.ts)
-- [RenditionsService](ng2-alfresco-core/src/services/renditions.service.ts)
-- [LogService](ng2-alfresco-core/src/services/log.service.ts)
-- [NotificationService](ng2-alfresco-core/src/services/notification.service.ts)
-- [CookieService](ng2-alfresco-core/src/services/cookie.service.ts)
-- [ContentService](ng2-alfresco-core/src/services/content.service.ts)
-- [AuthenticationService](ng2-alfresco-core/src/services/authentication.service.ts)
-- [AlfrescoSettingsService](ng2-alfresco-core/src/services/alfresco-settings.service.ts)
-- [AlfrescoContentService](ng2-alfresco-core/src/services/alfresco-content.service.ts)
-- [AppConfigService](ng2-alfresco-core/src/services/app-config.service.ts)
-- [DiagramsService](ng2-activiti-diagrams/src/services/diagrams.service.ts)
-- [DiagramColorService](ng2-activiti-diagrams/src/services/diagram-color.service.ts)
-- [RaphaelService](ng2-activiti-diagrams/src/components/raphael/raphael.service.ts)
-- [BpmUserService](ng2-alfresco-userinfo/src/services/bpm-user.service.ts)
-- [EcmUserService](ng2-alfresco-userinfo/src/services/ecm-user.service.ts)
-- [RenderingQueueService](ng2-alfresco-viewer/src/services/rendering-queue.services.ts)
-- [RatingService](ng2-alfresco-social/src/services/rating.service.ts)
-- [TagService](ng2-alfresco-tag/src/services/tag.service.ts)
-- [TaskListService](ng2-activiti-tasklist/src/services/tasklist.service.ts)
-- [ProcessUploadService](ng2-activiti-tasklist/src/services/process-upload.service.ts)
-- [PeopleService](ng2-activiti-tasklist/src/services/people.service.ts)
-- [AnalyticsService](ng2-activiti-analytics/src/services/analytics.service.ts)
+
You can browse all the components at the following address:
diff --git a/ng2-components/ng2-activiti-analytics/README.md b/ng2-components/ng2-activiti-analytics/README.md
index e6e2bfa8c8..fee1c5fa05 100644
--- a/ng2-components/ng2-activiti-analytics/README.md
+++ b/ng2-components/ng2-activiti-analytics/README.md
@@ -1,72 +1,41 @@
-# Activiti Analytics Components
+# Activiti Analytics library
+
+Contains the Activiti Analytics component and other related components.
-- [Prerequisites](#prerequisites)
-- [Install](#install)
-- [Activiti Analytics List Component](#activiti-analytics-list-component)
- * [Properties](#properties)
- * [Events](#events)
- [Activiti Analytics Component](#activiti-analytics-component)
- * [Properties](#properties-1)
- * [Events](#events-1)
+ * [Basic Usage](#basic-usage)
+ + [Properties](#properties)
+ + [Events](#events)
+- [Activiti Analytics List Component](#activiti-analytics-list-component)
+ * [Basic Usage](#basic-usage-1)
+ + [Properties](#properties-1)
+ + [Events](#events-1)
- [Analytics Generator Component](#analytics-generator-component)
- * [Properties](#properties-2)
- * [Events](#events-2)
-- [Build from sources](#build-from-sources)
-- [NPM scripts](#npm-scripts)
-- [Demo](#demo)
-- [License](#license)
+ * [Basic Usage](#basic-usage-2)
+ + [Properties](#properties-2)
+ + [Events](#events-2)
+- [Project Information](#project-information)
+ * [Prerequisites](#prerequisites)
+ * [Install](#install)
+ * [Build from sources](#build-from-sources)
+ * [NPM scripts](#npm-scripts)
+ * [Demo](#demo)
+ * [License](#license)
-## Prerequisites
-
-Before you start using this development framework, make sure you have installed all required software and done all the
-necessary configurations, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
-
-> If you plan to use this component with projects generated by Angular CLI, you can read more in [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
-
-## Install
-
-```sh
-npm install ng2-activiti-analytics
-```
-
-## Activiti Analytics List Component
-
-The component shows the list of all the available reports
-
-```html
-
-
-```
-
-### Properties
-
-| Name | Type | Required | Default | Description |
-| --- | --- | --- | --- | --- |
-| appId | string | optional | | The application id |
-| layoutType | string | required | | Define the layout of the apps. There are two possible values: GRID or LIST. LIST is the default value|
-| selectFirst | boolean | optional | false | Change the value to true if you want to select the first item in the list as default|
-
-### Events
-
-| Name | Description |
-| --- | --- |
-| onSuccess | The event is emitted when the report list is loaded |
-| onError | The event is emitted when an error occurs during the loading |
-| reportClick | The event is emitted when the report in the list is selected |
-
## Activiti Analytics Component
The component shows the charts related to the reportId passed as input
+### Basic Usage
+
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | --- |
@@ -94,7 +63,7 @@ You can also hide chart parameters UI by setting the `hideParameters` to `true`:

-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -103,10 +72,40 @@ You can also hide chart parameters UI by setting the `hideParameters` to `true`:
| reportSaved | The event is emitted when a report is saved |
| reportDeleted | The event is emitted when a report is deleted |
+## Activiti Analytics List Component
+
+The component shows the list of all the available reports
+
+### Basic Usage
+
+```html
+
+
+```
+
+#### Properties
+
+| Name | Type | Required | Default | Description |
+| --- | --- | --- | --- | --- |
+| appId | string | optional | | The application id |
+| layoutType | string | required | | Define the layout of the apps. There are two possible values: GRID or LIST. LIST is the default value|
+| selectFirst | boolean | optional | false | Change the value to true if you want to select the first item in the list as default|
+
+#### Events
+
+| Name | Description |
+| --- | --- |
+| onSuccess | The event is emitted when the report list is loaded |
+| onError | The event is emitted when an error occurs during the loading |
+| reportClick | The event is emitted when the report in the list is selected |
+
## Analytics Generator Component
The component generates and shows the charts
+### Basic Usage
+
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | -- |
| reportId | string | The report id |
| reportParamQuery | ReportQuery | The object contains all the parameters that the report needs |
-### Events
+#### Events
| Name | Description |
| --- | --- |
| onSuccess | Raised when the charts are loaded |
| onError | Raised when an error occurs during the loading |
-## Build from sources
+## Project Information
+
+### Prerequisites
+
+Before you start using this development framework, make sure you have installed all required software and done all the
+necessary configurations, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
+
+> If you plan to use this component with projects generated by Angular CLI, you can read more in [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
+
+### Install
+
+```sh
+npm install ng2-activiti-analytics
+```
+
+### Build from sources
You can build the component from sources with the following commands:
@@ -140,7 +154,7 @@ npm run build
> The `build` task rebuilds all the code, runs tslint, license checks
> and other quality check tools before performing unit testing.
-## NPM scripts
+### NPM scripts
| Command | Description |
| --- | --- |
@@ -149,7 +163,7 @@ npm run build
| npm run test-browser | Run unit tests in the browser
| npm run coverage | Run unit tests and display code coverage report |
-## Demo
+### Demo
Please check the demo folder for a demo project
@@ -159,6 +173,6 @@ npm install
npm start
```
-## License
+### License
[Apache Version 2.0](https://github.com/Alfresco/alfresco-ng2-components/blob/master/LICENSE)
diff --git a/ng2-components/ng2-activiti-diagrams/README.md b/ng2-components/ng2-activiti-diagrams/README.md
index 4876506240..99ec59b036 100644
--- a/ng2-components/ng2-activiti-diagrams/README.md
+++ b/ng2-components/ng2-activiti-diagrams/README.md
@@ -1,38 +1,31 @@
-# Activiti Diagrams Component
+# Activiti Diagrams library
+
+Contains the Activiti Diagram component.
-- [Prerequisites](#prerequisites)
-- [Install](#install)
- [Activiti Diagram Component](#activiti-diagram-component)
- * [Properties](#properties)
- * [Events](#events)
-- [Build from sources](#build-from-sources)
-- [NPM scripts](#npm-scripts)
-- [Demo](#demo)
-- [License](#license)
+ * [Basic Usage](#basic-usage)
+ + [Properties](#properties)
+ + [Events](#events)
+- [Project Information](#project-information)
+ * [Prerequisites](#prerequisites)
+ * [Install](#install)
+ * [Build from sources](#build-from-sources)
+ * [NPM scripts](#npm-scripts)
+ * [Demo](#demo)
+ * [License](#license)
-## Prerequisites
-
-Before you start using this development framework, make sure you have installed all required software and done all the
-necessary configurations, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
-
-> If you plan to use this component with projects generated by Angular CLI, you can read more in [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
-
-## Install
-
-```sh
-npm install ng2-activiti-diagrams
-```
-
## Activiti Diagram Component
+### Basic Usage
+
This component shows the diagram of a process.
```html
@@ -49,7 +42,7 @@ The below component shows the diagram of a running process instance with the act
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | -- |
@@ -60,14 +53,29 @@ The below component shows the diagram of a running process instance with the act
| width | number | |
| height | number | |
-### Events
+#### Events
| Name | Description |
| --- | --- |
| onSuccess | Raised when the diagrams elements are loaded |
| onError | Raised when an error occurs during loading |
-## Build from sources
+## Project Information
+
+### Prerequisites
+
+Before you start using this development framework, make sure you have installed all required software and done all the
+necessary configurations, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
+
+> If you plan to use this component with projects generated by Angular CLI, you can read more in [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
+
+### Install
+
+```sh
+npm install ng2-activiti-diagrams
+```
+
+### Build from sources
You can build the component from sources with the following commands:
@@ -79,7 +87,7 @@ npm run build
> The `build` task rebuilds all the code, runs tslint, license checks
> and other quality check tools before performing unit testing.
-## NPM scripts
+### NPM scripts
| Command | Description |
| --- | --- |
@@ -88,7 +96,7 @@ npm run build
| npm run test-browser | Run unit tests in the browser
| npm run coverage | Run unit tests and display code coverage report |
-## Demo
+### Demo
Please check the demo folder for a demo project
@@ -98,6 +106,6 @@ npm install
npm start
```
-## License
+### License
[Apache Version 2.0](https://github.com/Alfresco/alfresco-ng2-components/blob/master/LICENSE)
diff --git a/ng2-components/ng2-activiti-form/README.md b/ng2-components/ng2-activiti-form/README.md
index ab6aa26ef0..5018f424e1 100644
--- a/ng2-components/ng2-activiti-form/README.md
+++ b/ng2-components/ng2-activiti-form/README.md
@@ -1,4 +1,6 @@
-# APS Form Component
+# APS Form library
+
+Contains the Activiti Form component and other related components and services.
@@ -7,40 +9,45 @@
- [Library Contents](#library-contents)
* [Components](#components)
* [Services](#services)
-- [Prerequisites](#prerequisites)
-- [Install](#install)
-- [Form Component](#form-component)
- * [Properties](#properties)
+- [Activiti Form component](#activiti-form-component)
+ * [Basic Usage](#basic-usage)
+ + [Properties](#properties)
+ + [Advanced properties](#advanced-properties)
+ + [Events](#events)
+ * [Details](#details)
+ + [Custom empty form template](#custom-empty-form-template)
+ + [Controlling outcome execution behaviour](#controlling-outcome-execution-behaviour)
+ [Form Field Validators](#form-field-validators)
- [Custom set of validators](#custom-set-of-validators)
- [Custom validator example](#custom-validator-example)
- * [Advanced properties](#advanced-properties)
- * [Events](#events)
- * [Custom empty form template](#custom-empty-form-template)
- * [Controlling outcome execution behaviour](#controlling-outcome-execution-behaviour)
- [Activiti Content Component](#activiti-content-component)
- * [Properties](#properties-1)
- * [Events](#events-1)
+ * [Basic Usage](#basic-usage-1)
+ + [Properties](#properties-1)
+ + [Events](#events-1)
- [ADF Form List Component](#adf-form-list-component)
- * [Properties](#properties-2)
+ * [Basic Usage](#basic-usage-2)
+ + [Properties](#properties-2)
- [FormService Service](#formservice-service)
- * [Events](#events-2)
- * [Methods](#methods)
-- [Common scenarios](#common-scenarios)
- * [Changing field value based on another field](#changing-field-value-based-on-another-field)
- * [Listen all form Events](#listen-all-form-events)
+ * [Basic Usage](#basic-usage-3)
+ + [Events](#events-2)
+ + [Methods](#methods)
+- [Other documentation](#other-documentation)
+ * [Common scenarios](#common-scenarios)
+ + [Changing field value based on another field](#changing-field-value-based-on-another-field)
+ + [Listen all form Events](#listen-all-form-events)
- [See also](#see-also)
-- [Build from sources](#build-from-sources)
-- [NPM scripts](#npm-scripts)
-- [Demo](#demo)
-- [License](#license)
+- [Project Information](#project-information)
+ * [Prerequisites](#prerequisites)
+ * [Install](#install)
+ * [Build from sources](#build-from-sources)
+ * [NPM scripts](#npm-scripts)
+ * [Demo](#demo)
+ * [License](#license)
-See it live: [Form Quickstart](https://embed.plnkr.co/YSLXTqb3DtMhVJSqXKkE/)
-
## Library Contents
### Components
@@ -57,22 +64,11 @@ See it live: [Form Quickstart](https://embed.plnkr.co/YSLXTqb3DtMhVJSqXKkE/)
- NodeService
- WidgetVisibilityService
-## Prerequisites
+## Activiti Form component
-Before you start using this development framework, make sure you have installed all required software and done all the
-necessary configuration, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
+The component shows a Form from Activiti (see it live: [Form Quickstart](https://embed.plnkr.co/YSLXTqb3DtMhVJSqXKkE/))
-> If you plan to use this component with projects generated by Angular CLI, you can read more in [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
-
-## Install
-
-```sh
-npm install ng2-activiti-form
-```
-
-## Form Component
-
-The component shows a Form from Activiti
+### Basic Usage
```html
```
-### Properties
-
-The recommended set of properties can be found in the following table:
+#### Properties
| Name | Type | Default | Description |
| --- | --- | --- | --- |
@@ -169,7 +163,116 @@ The recommended set of properties can be found in the following table:
| saveMetadata | boolean | false | Store the value of the form as metadata. |
| path | string | | Path of the folder where to store the metadata. |
| nameNode | string | true | Name to assign to the new node where the metadata are stored. |
-| fieldValidators | FormFieldValidator[] | *see below* | Contains a list of form field validator instances. |
+| fieldValidators | FormFieldValidator[] | See [Form Field Validators](#form-field-validators) section below | Contains a list of form field validator instances. |
+
+#### Advanced properties
+
+ The following properties are for complex customisation purposes:
+
+| Name | Type | Default | Description |
+| --- | --- | --- | --- |
+| form | FormModel | | Underlying form model instance. |
+| showDebugButton | boolean | false | Toggle debug options. |
+| debugMode | boolean | false | Toggle debug mode, allows displaying additional data for development and debugging purposes. |
+
+#### Events
+
+| Name | Return Type | Description |
+| --- | --- | --- |
+| formLoaded | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form is loaded or reloaded. |
+| formSaved | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form is submitted with `Save` or custom outcomes. |
+| formCompleted | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form is submitted with `Complete` outcome. |
+| formDataRefreshed | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form values are refreshed due to a data property change |
+| executeOutcome | [FormOutcomeEvent](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form-outcome-event.model.ts) | Invoked when any outcome is executed, default behaviour can be prevented via `event.preventDefault()` |
+| onError | any | Invoked at any error |
+
+### Details
+
+All `form*` events receive an instance of the `FormModel` as event argument for ease of development:
+
+**MyView.component.html**
+
+```html
+
+
+```
+
+**MyView.component.ts**
+
+```ts
+onFormSaved(form: FormModel) {
+ console.log(form);
+}
+```
+
+#### Custom empty form template
+
+You can add a template that will be show if no form definition has been found
+
+```html
+
+
+
+
Empty form
+
+
+
+
+```
+
+#### Controlling outcome execution behaviour
+
+If absolutely needed it is possible taking full control over form outcome execution by means of `executeOutcome` event.
+This event is fired upon each outcome execution, both system and custom ones.
+
+You can prevent default behaviour by calling `event.preventDefault()`.
+This allows for example having custom form validation scenarios and/or additional validation summary presentation.
+
+Alternatively you may want just running additional code on outcome execution without suppressing default one.
+
+**MyView.component.html**
+
+```html
+
+
+```
+
+**MyView.component.ts**
+
+```ts
+import { FormOutcomeEvent } from 'ng2-activiti-form';
+
+export class MyView {
+
+ validateForm(event: FormOutcomeEvent) {
+ let outcome = event.outcome;
+
+ // you can also get additional properties of outcomes
+ // if you defined them within outcome definition
+
+ if (outcome) {
+ let form = outcome.form;
+ if (form) {
+ // check/update the form here
+ event.preventDefault();
+ }
+ }
+ }
+
+}
+```
+
+There are two additional functions that can be of a great value when controlling outcomes:
+
+- `saveTaskForm()` - saves current form
+- `completeTaskForm(outcome?: string)` - save and complete form with a given outcome name
+
+**Please note that if `event.preventDefault()` is not called then default outcome behaviour
+will also be executed after your custom code.**
#### Form Field Validators
@@ -301,124 +404,19 @@ Now if you run the application and try to enter "admin" in one of the text field

-### Advanced properties
-
- The following properties are for complex customisation purposes:
-
-| Name | Type | Default | Description |
-| --- | --- | --- | --- |
-| form | FormModel | | Underlying form model instance. |
-| showDebugButton | boolean | false | Toggle debug options. |
-| debugMode | boolean | false | Toggle debug mode, allows displaying additional data for development and debugging purposes. |
-
-### Events
-
-| Name | Return Type | Description |
-| --- | --- | --- |
-| formLoaded | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form is loaded or reloaded. |
-| formSaved | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form is submitted with `Save` or custom outcomes. |
-| formCompleted | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form is submitted with `Complete` outcome. |
-| formDataRefreshed | [FormModel](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form.model.ts) | Invoked when form values are refreshed due to a data property change |
-| executeOutcome | [FormOutcomeEvent](https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-activiti-form/src/components/widgets/core/form-outcome-event.model.ts) | Invoked when any outcome is executed, default behaviour can be prevented via `event.preventDefault()` |
-| onError | any | Invoked at any error |
-
-All `form*` events receive an instance of the `FormModel` as event argument for ease of development:
-
-**MyView.component.html**
-
-```html
-
-
-```
-
-**MyView.component.ts**
-
-```ts
-onFormSaved(form: FormModel) {
- console.log(form);
-}
-```
-
-### Custom empty form template
-
-You can add a template that will be show if no form definition has been found
-
-```html
-
-
-
-
Empty form
-
-
-
-
-```
-
-### Controlling outcome execution behaviour
-
-If absolutely needed it is possible taking full control over form outcome execution by means of `executeOutcome` event.
-This event is fired upon each outcome execution, both system and custom ones.
-
-You can prevent default behaviour by calling `event.preventDefault()`.
-This allows for example having custom form validation scenarios and/or additional validation summary presentation.
-
-Alternatively you may want just running additional code on outcome execution without suppressing default one.
-
-**MyView.component.html**
-
-```html
-
-
-```
-
-**MyView.component.ts**
-
-```ts
-import { FormOutcomeEvent } from 'ng2-activiti-form';
-
-export class MyView {
-
- validateForm(event: FormOutcomeEvent) {
- let outcome = event.outcome;
-
- // you can also get additional properties of outcomes
- // if you defined them within outcome definition
-
- if (outcome) {
- let form = outcome.form;
- if (form) {
- // check/update the form here
- event.preventDefault();
- }
- }
- }
-
-}
-```
-
-There are two additional functions that can be of a great value when controlling outcomes:
-
-- `saveTaskForm()` - saves current form
-- `completeTaskForm(outcome?: string)` - save and complete form with a given outcome name
-
-**Please note that if `event.preventDefault()` is not called then default outcome behaviour
-will also be executed after your custom code.**
-
## Activiti Content Component
The component shows the content preview.
+### Basic Usage
+
```html
-
```
-### Properties
+#### Properties
The recommended set of properties can be found in the following table:
@@ -426,7 +424,7 @@ The recommended set of properties can be found in the following table:
| --- | --- | --- | --- |
| contentId | string | | The content id to show. |
-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -436,13 +434,15 @@ The recommended set of properties can be found in the following table:
The component shows the activiti forms as a list.
+### Basic Usage
+
```html
```
-### Properties
+#### Properties
The recommended set of properties can be found in the following table:
@@ -452,6 +452,8 @@ The recommended set of properties can be found in the following table:
## FormService Service
+### Basic Usage
+
```ts
import { FormService, FormEvent, FormFieldEvent } from 'ng2-activiti-form';
@@ -477,7 +479,7 @@ class MyComponent {
}
```
-### Events
+#### Events
| Name | Args Type | Description |
| --- | --- | --- |
@@ -492,7 +494,7 @@ class MyComponent {
| validateForm | ValidateFormEvent | Raised each time a form is validated. You can use it to provide custom validation or prevent default behaviour. |
| validateFormField | ValidateFormFieldEvent | Raised each time a form field is validated. You can use it to provide custom validation or prevent default behaviour.|
-### Methods
+#### Methods
| Name | Params | Returns | Description |
| --- | --- | --- | --- |
@@ -519,9 +521,11 @@ class MyComponent {
| getWorkflowGroups\ | (filter: string, groupId?: string) | Observable\ | |
| getWorkflowUsers\ | (filter: string, groupId?: string) | Observable\ | |
-## Common scenarios
+## Other documentation
-### Changing field value based on another field
+### Common scenarios
+
+#### Changing field value based on another field
Create a simple Form with a dropdown widget (id: `type`), and a multiline text (id: `description`).
@@ -544,7 +548,7 @@ The result should be as following:

-### Listen all form Events
+#### Listen all form Events
If you want to listen all the events fired in the form you can subscribe to this Subject :
@@ -560,7 +564,22 @@ formService.formEvents.subscribe((event: Event) => {
- [Form Stencils with Angular 2](docs/stencils.md)
- [Form Extensibility and Customisation](docs/extensibility.md).
-## Build from sources
+## Project Information
+
+### Prerequisites
+
+Before you start using this development framework, make sure you have installed all required software and done all the
+necessary configuration, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
+
+> If you plan to use this component with projects generated by Angular CLI, you can read more in [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
+
+### Install
+
+```sh
+npm install ng2-activiti-form
+```
+
+### Build from sources
You can build the component from sources with the following commands:
@@ -572,7 +591,7 @@ npm run build
> The `build` task rebuilds all the code, runs tslint, license checks
> and other quality check tools before performing unit testing.
-## NPM scripts
+### NPM scripts
| Command | Description |
| --- | --- |
@@ -581,7 +600,7 @@ npm run build
| npm run test-browser | Run unit tests in the browser
| npm run coverage | Run unit tests and display code coverage report |
-## Demo
+### Demo
Please check the demo folder for a demo project
@@ -591,6 +610,6 @@ npm install
npm start
```
-## License
+### License
[Apache Version 2.0](https://github.com/Alfresco/alfresco-ng2-components/blob/master/LICENSE)
\ No newline at end of file
diff --git a/ng2-components/ng2-activiti-processlist/README.md b/ng2-components/ng2-activiti-processlist/README.md
index 0a9d1ab98a..2441e92bdd 100644
--- a/ng2-components/ng2-activiti-processlist/README.md
+++ b/ng2-components/ng2-activiti-processlist/README.md
@@ -1,71 +1,75 @@
-# Activiti Process List Component
+# Activiti Process List library
+
+Contains the Activiti Process Instance List component and other related components and classes.
-- [Prerequisites](#prerequisites)
-- [Install](#install)
- [Activiti Process Instance List](#activiti-process-instance-list)
- * [Properties](#properties)
- * [Events](#events)
+ * [Basic Usage](#basic-usage)
+ + [Properties](#properties)
+ + [Events](#events)
+ * [Details](#details)
- [Process Filters Component](#process-filters-component)
- * [Properties](#properties-1)
- * [Events](#events-1)
- * [How filter the activiti process filters](#how-filter-the-activiti-process-filters)
-- [FilterParamsModel](#filterparamsmodel)
- * [How to create an accordion menu with the processes filter](#how-to-create-an-accordion-menu-with-the-processes-filter)
+ * [Basic Usage](#basic-usage-1)
+ + [Properties](#properties-1)
+ + [Events](#events-1)
+ * [Details](#details-1)
+ + [How filter the activiti process filters](#how-filter-the-activiti-process-filters)
+ + [FilterParamsModel](#filterparamsmodel)
+ + [How to create an accordion menu with the processes filter](#how-to-create-an-accordion-menu-with-the-processes-filter)
- [Start Process component](#start-process-component)
- * [Properties](#properties-2)
- * [Events](#events-2)
+ * [Basic Usage](#basic-usage-2)
+ + [Properties](#properties-2)
+ + [Events](#events-2)
- [Process Details component](#process-details-component)
- * [Properties](#properties-3)
- * [Events](#events-3)
+ * [Basic Usage](#basic-usage-3)
+ + [Properties](#properties-3)
+ + [Events](#events-3)
- [Process Instance Details Header component](#process-instance-details-header-component)
- * [Properties](#properties-4)
- * [Events](#events-4)
+ * [Basic Usage](#basic-usage-4)
+ + [Properties](#properties-4)
+ + [Events](#events-4)
- [Process Instance Tasks component](#process-instance-tasks-component)
- * [Properties](#properties-5)
- * [Events](#events-5)
+ * [Basic Usage](#basic-usage-5)
+ + [Properties](#properties-5)
+ + [Events](#events-5)
- [Process Instance Comments component](#process-instance-comments-component)
- * [Properties](#properties-6)
+ * [Basic Usage](#basic-usage-6)
+ + [Properties](#properties-6)
- [Process Attachment List component](#process-attachment-list-component)
- * [Properties](#properties-7)
- * [Events](#events-6)
+ * [Basic Usage](#basic-usage-7)
+ + [Properties](#properties-7)
+ + [Events](#events-6)
- [Create Process Attachment component](#create-process-attachment-component)
- * [Properties](#properties-8)
- * [Events](#events-7)
+ * [Basic Usage](#basic-usage-8)
+ + [Properties](#properties-8)
+ + [Events](#events-7)
- [Process Audit Directive](#process-audit-directive)
- * [Properties](#properties-9)
+ * [Basic Usage](#basic-usage-9)
+ + [Properties](#properties-9)
+ [Events](#events-8)
-- [Build from sources](#build-from-sources)
-- [NPM scripts](#npm-scripts)
-- [Demo](#demo)
-- [License](#license)
+- [Project Information](#project-information)
+ * [Prerequisites](#prerequisites)
+ * [Install](#install)
+ * [Build from sources](#build-from-sources)
+ * [NPM scripts](#npm-scripts)
+ * [Demo](#demo)
+ * [License](#license)
-Displays lists of process instances both active and completed, using any defined process filter, and renders details for any chosen instance.
-
-## Prerequisites
-
-Before you start using this development framework, make sure you have installed all required software and done all the
-necessary configuration [prerequisites](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
-
-> If you plan using this component with projects generated by Angular CLI, please refer to the following article: [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
-
-## Install
-
-```sh
-npm install ng2-activiti-processlist
-```
+
## Activiti Process Instance List
This component renders a list containing all the process instances matched by the parameters specified.
+### Basic Usage
+
**app.component.html**
```html
@@ -75,7 +79,7 @@ This component renders a list containing all the process instances matched by th
```
-### Properties
+#### Properties
| Name | Description |
| --- | --- |
@@ -83,9 +87,17 @@ This component renders a list containing all the process instances matched by th
| processDefinitionKey | The processDefinitionKey of the process. |
| state | Define state of the processes. Possible values are `running`, `completed` and `all` |
| sort | Define sort of the processes. Possible values are `created-desc`, `created-asc`, `ended-desc`, `ended-asc` |
-| schemaColumn | List of columns to display in the process instances datatable |
+| schemaColumn | List of columns to display in the process instances datatable (see the [Details](#details) section below) |
-Example:
+#### Events
+
+- **rowClick**: Emitted when a row in the process list is clicked
+- **onSuccess**: Emitted when the list of process instances has been loaded successfully from the server
+- **onError**: Emitted when an error is encountered loading the list of process instances from the server
+
+### Details
+
+Example value for the schemaColumn property (see [Properties](#properties) section above):
```json
[
@@ -96,20 +108,11 @@ Example:
]
```
-### Events
-
-- **rowClick**: Emitted when a row in the process list is clicked
-- **onSuccess**: Emitted when the list of process instances has been loaded successfully from the server
-- **onError**: Emitted when an error is encountered loading the list of process instances from the server
-
## Process Filters Component
-Process filters are a collection of criteria used to filter process instances, which may be customized
-by users. This component displays a list of available filters and allows the user to select any given
-filter as the active filter.
+Collection of criteria used to filter process instances, which may be customized by users.
-The most common usage is in driving a process instance list to allow the user to choose which
-process instances are displayed in the list.
+### Basic Usage
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
-| --- | --- | --- | --- |
+| --- | --- | --- |
| filterParam | [FilterParamsModel](#filterparamsmodel) | The params to filter the task filter. If there is no match the default one (first filter of the list) is selected |
| appId | string | Display filters available to the current user for the application with the specified ID. |
| appName | string | Display filters available to the current user for the application with the specified name. |
@@ -128,7 +131,7 @@ process instances are displayed in the list.
If both `appId` and `appName` are specified then `appName` will take precedence and `appId` will be ignored.
-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -136,7 +139,15 @@ If both `appId` and `appName` are specified then `appName` will take precedence
| onError | Raised when an error occurs |
| filterClick | Raised when the user selects a filter from the list |
-### How filter the activiti process filters
+### Details
+
+This component displays a list of available filters and allows the user to select any given
+filter as the active filter.
+
+The most common usage is in driving a process instance list to allow the user to choose which
+process instances are displayed in the list.
+
+#### How filter the activiti process filters
```html
```
-You can use inside the filterParam one of the following property.
+You can use inside the filterParam one of the properties defined by [FilterParamsModel](#filterparamsmodel) (see below).
-## FilterParamsModel
+#### FilterParamsModel
```json
{
@@ -162,7 +173,7 @@ You can use inside the filterParam one of the following property.
| name | string | The name of the task filter, lowercase is checked. |
| index | number | Zero-based position of the filter in the array. |
-### How to create an accordion menu with the processes filter
+#### How to create an accordion menu with the processes filter
You can create an accordion menu using the AccordionComponent that wrap the activiti task filter.
The AccordionComponent is exposed by the alfresco-core.
@@ -188,6 +199,8 @@ The AccordionComponent is exposed by the alfresco-core.
Displays Start Process, allowing the user to specify some basic details needed to start a new process instance.
+### Basic Usage
+
```html
@@ -195,14 +208,14 @@ Displays Start Process, allowing the user to specify some basic details needed t
```

-### Properties
+#### Properties
| Name | Description |
| --- | --- |
| appId | (required): Limit the list of processes which can be started to those contained in the specified app |
| variables | Variables in input to the process [RestVariable](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-activiti-rest-api/docs/RestVariable.md)|
-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -212,7 +225,9 @@ Displays Start Process, allowing the user to specify some basic details needed t
## Process Details component
-This component displays detailed information on a specified process instance
+Displays detailed information on a specified process instance
+
+### Basic Usage
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | --- |
| processInstanceId | string | (required): The numeric ID of the process instance to display |
-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -236,7 +251,9 @@ This component displays detailed information on a specified process instance
## Process Instance Details Header component
-This is a sub-component of the process details component, which renders some general information about the selected process.
+Sub-component of the process details component, which renders some general information about the selected process.
+
+### Basic Usage
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | --- |
| processInstanceId | string | (**required**): The ID of the process instance to display tasks for |
| showRefreshButton | boolean | (default: `true`): Whether to show a refresh button next to the list of tasks to allow this to be updated from the server |
-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -283,13 +302,15 @@ Lists both the active and completed tasks associated with a particular process i
Displays comments associated with a particular process instance and allows the user to add new comments
+### Basic Usage
+
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | --- |
@@ -297,7 +318,9 @@ Displays comments associated with a particular process instance and allows the u
## Process Attachment List component
-This component displays attached documents on a specified process instance
+Displays attached documents on a specified process instance
+
+### Basic Usage
```html
If you plan using this component with projects generated by Angular CLI, please refer to the following article: [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
+
+### Install
+
+```sh
+npm install ng2-activiti-processlist
+```
+
+### Build from sources
You can build component from sources with the following commands:
@@ -394,7 +436,7 @@ npm run build
> The `build` task rebuilds all the code, runs tslint, license checks
> and other quality check tools before performing unit testing.
-## NPM scripts
+### NPM scripts
| Command | Description |
| --- | --- |
@@ -403,7 +445,7 @@ npm run build
| npm run test-browser | Run unit tests in the browser
| npm run coverage | Run unit tests and display code coverage report |
-## Demo
+### Demo
Please check the demo folder for a demo project
@@ -413,6 +455,6 @@ npm install
npm start
```
-## License
+### License
[Apache Version 2.0](https://github.com/Alfresco/alfresco-ng2-components/blob/master/LICENSE)
diff --git a/ng2-components/ng2-activiti-tasklist/README.md b/ng2-components/ng2-activiti-tasklist/README.md
index 53aeb2a54e..53b8494545 100644
--- a/ng2-components/ng2-activiti-tasklist/README.md
+++ b/ng2-components/ng2-activiti-tasklist/README.md
@@ -1,90 +1,99 @@
-# APS Task List Component
+# Activiti Task List library
+
+Contains the Activiti Task List component and other related components and classes.
-- [Prerequisites](#prerequisites)
-- [Install](#install)
-- [Activiti Task List](#activiti-task-list)
- * [DataColumn Properties](#datacolumn-properties)
- * [Events](#events)
- * [Properties](#properties)
-- [Activiti Task Details](#activiti-task-details)
- * [Properties](#properties-1)
- * [Events](#events-1)
- * [Custom 'empty Activiti Task Details' template](#custom-empty-activiti-task-details-template)
+- [Activiti Task List component](#activiti-task-list-component)
+ * [Basic Usage](#basic-usage)
+ + [Properties](#properties)
+ + [Events](#events)
+ * [Details](#details)
+ + [DataTableAdapter example](#datatableadapter-example)
+ + [DataColumn Properties](#datacolumn-properties)
+- [Activiti Task Details component](#activiti-task-details-component)
+ * [Basic Usage](#basic-usage-1)
+ + [Properties](#properties-1)
+ + [Events](#events-1)
+ * [Details](#details-1)
+ + [Custom 'empty Activiti Task Details' template](#custom-empty-activiti-task-details-template)
- [Activiti Apps Component](#activiti-apps-component)
- * [Properties](#properties-2)
- * [Events](#events-2)
- * [How filter the activiti apps](#how-filter-the-activiti-apps)
-- [Activiti Filter](#activiti-filter)
- * [Properties](#properties-3)
- * [Events](#events-3)
- * [How filter the activiti task filters](#how-filter-the-activiti-task-filters)
- * [FilterParamsModel](#filterparamsmodel)
- * [How to create an accordion menu with the task filter](#how-to-create-an-accordion-menu-with-the-task-filter)
+ * [Basic Usage](#basic-usage-2)
+ + [Properties](#properties-2)
+ + [Events](#events-2)
+ * [Details](#details-2)
+ + [How filter the activiti apps](#how-filter-the-activiti-apps)
+- [Activiti Filter component](#activiti-filter-component)
+ * [Basic Usage](#basic-usage-3)
+ + [Properties](#properties-3)
+ + [Events](#events-3)
+ * [Details](#details-3)
+ + [How filter the activiti task filters](#how-filter-the-activiti-task-filters)
+ + [FilterParamsModel](#filterparamsmodel)
+ + [How to create an accordion menu with the task filter](#how-to-create-an-accordion-menu-with-the-task-filter)
- [Activiti Checklist Component](#activiti-checklist-component)
- * [Properties](#properties-4)
+ * [Basic Usage](#basic-usage-4)
+ + [Properties](#properties-4)
- [Task Attachment List Component](#task-attachment-list-component)
- * [Properties](#properties-5)
- * [Events](#events-4)
+ * [Basic Usage](#basic-usage-5)
+ + [Properties](#properties-5)
+ + [Events](#events-4)
- [Create Task Attachment Component](#create-task-attachment-component)
- * [Properties](#properties-6)
+ * [Basic Usage](#basic-usage-6)
+ + [Properties](#properties-6)
+ [Events](#events-5)
-- [Activiti Task Header](#activiti-task-header)
- * [Properties](#properties-7)
- * [Events](#events-6)
-- [TaskDetailsModel](#taskdetailsmodel)
+- [Activiti Task Header component](#activiti-task-header-component)
+ * [Basic Usage](#basic-usage-7)
+ + [Properties](#properties-7)
+ + [Events](#events-6)
+ * [Details](#details-4)
+ + [TaskDetailsModel](#taskdetailsmodel)
- [Task People Component](#task-people-component)
- * [Properties](#properties-8)
+ * [Basic Usage](#basic-usage-8)
+ + [Properties](#properties-8)
+ [Events](#events-7)
+ * [Details](#details-5)
+ [How to customize the people component behavior](#how-to-customize-the-people-component-behavior)
+ [Involve People single click and close search](#involve-people-single-click-and-close-search)
+ [Involve People single click without close search](#involve-people-single-click-without-close-search)
+ [Involve People double click and close search](#involve-people-double-click-and-close-search)
+ [Involve People double double without close search](#involve-people-double-double-without-close-search)
- [ADF Comments Component](#adf-comments-component)
- * [Properties](#properties-9)
+ * [Basic Usage](#basic-usage-9)
+ + [Properties](#properties-9)
+ [Events](#events-8)
- [Start Task Component](#start-task-component)
- * [Properties](#properties-10)
+ * [Basic Usage](#basic-usage-10)
+ + [Properties](#properties-10)
+ [Events](#events-9)
-- [Task Audit Directive](#task-audit-directive)
- * [Properties](#properties-11)
+- [People Search component](#people-search-component)
+ * [Basic Usage](#basic-usage-11)
+ + [Properties](#properties-11)
+ [Events](#events-10)
-- [People Search](#people-search)
- * [Properties](#properties-12)
- * [Events](#events-11)
- * [How to use](#how-to-use)
-- [Build from sources](#build-from-sources)
-- [NPM scripts](#npm-scripts)
-- [Demo](#demo)
-- [License](#license)
+ * [Details](#details-6)
+- [Task Audit Directive](#task-audit-directive)
+ * [Basic Usage](#basic-usage-12)
+ + [Properties](#properties-12)
+ + [Events](#events-11)
+- [Project Information](#project-information)
+ * [Prerequisites](#prerequisites)
+ * [Install](#install)
+ * [Build from sources](#build-from-sources)
+ * [NPM scripts](#npm-scripts)
+ * [Demo](#demo)
+ * [License](#license)
-Displays lists of process instances both active and completed, using any defined process filter, and
-render details of any chosen instance.
+## Activiti Task List component
-## Prerequisites
+Renders a list containing all the tasks matched by the parameters specified.
-Before you start using this development framework, make sure you have installed all required software and done all the
-necessary configuration [prerequisites](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
-
-> If you plan using this component with projects generated by Angular CLI, please refer to the following article: [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
-
-## Install
-
-```sh
-npm install ng2-activiti-tasklist
-```
-
-## Activiti Task List
-
-This component renders a list containing all the tasks matched by the parameters specified.
+### Basic Usage
```html
```
-### DataColumn Properties
+#### Properties
+
+| Name | Type | Default | Description |
+| --- | --- | --- | --- |
+| appId | string || The id of the app. |
+| processDefinitionKey | string || The processDefinitionKey of the process. |
+| processInstanceId | string || The processInstanceId of the process. |
+| assignment | string || The assignment of the process.
Possible values are:
assignee : where the current user is the assignee
candidate: where the current user is a task candidate
group_x: where the task is assigned to a group where the current user is a member of.
no value: where the current user is involved
|
+| state | string || Define state of the processes. Possible values are: `completed`, `active` |
+| hasIcon | boolean | true | Toggle the icon on the left . |
+| landingTaskId | string | | Define which task id should be selected after the reloading. If the task id doesn't exist or nothing is passed it will select the first task |
+| sort | string | | Define the sort of the processes. Possible values are : `created-desc`, `created-asc`, `due-desc`, `due-asc` |
+| data | DataTableAdapter | | JSON object that represent the number and the type of the columns that you want show (see the [example](#datatableadapter-example) section below) |
+
+#### Events
+
+| Name | Description |
+| --- | --- |
+| onSuccess | Raised when the task list is loaded |
+| rowClick | Raised when the task in the list is clicked |
+
+### Details
+
+This component displays lists of process instances both active and completed, using any defined process filter, and
+render details of any chosen instance.
+
+#### DataTableAdapter example
+
+```json
+[
+ {"type": "text", "key": "id", "title": "Id"},
+ {"type": "text", "key": "name", "title": "Name", "cssClass": "full-width name-column", "sortable": true},
+ {"type": "text", "key": "formKey", "title": "Form Key", "sortable": true},
+ {"type": "text", "key": "created", "title": "Created", "sortable": true}
+]
+```
+
+#### DataColumn Properties
Here's the list of available properties you can define for a Data Column definition.
@@ -120,41 +166,11 @@ Here's the list of available properties you can define for a Data Column definit
| sr-title | string | | Screen reader title, used for accessibility purposes |
| class | string | | Additional CSS class to be applied to column (header and cells) |
-### Events
+## Activiti Task Details component
-| Name | Description |
-| --- | --- |
-| onSuccess | Raised when the task list is loaded |
-| rowClick | Raised when the task in the list is clicked |
+Shows the details of the task id passed in input
-### Properties
-
-| Name | Type | Default | Description |
-| --- | --- | --- | --- |
-| appId | string || The id of the app. |
-| processDefinitionKey | string || The processDefinitionKey of the process. |
-| processInstanceId | string || The processInstanceId of the process. |
-| assignment | string || The assignment of the process.
Possible values are:
assignee : where the current user is the assignee
candidate: where the current user is a task candidate
group_x: where the task is assigned to a group where the current user is a member of.
no value: where the current user is involved
|
-| state | string || Define state of the processes. Possible values are: `completed`, `active` |
-| hasIcon | boolean | true | Toggle the icon on the left . |
-| landingTaskId | string | | Define which task id should be selected after the reloading. If the task id doesn't exist or nothing is passed it will select the first task |
-| sort | string | | Define the sort of the processes. Possible values are : `created-desc`, `created-asc`, `due-desc`, `due-asc` |
-| data | DataTableAdapter | | JSON object that represent the number and the type of the columns that you want show |
-
-Example:
-
-```json
-[
- {"type": "text", "key": "id", "title": "Id"},
- {"type": "text", "key": "name", "title": "Name", "cssClass": "full-width name-column", "sortable": true},
- {"type": "text", "key": "formKey", "title": "Form Key", "sortable": true},
- {"type": "text", "key": "created", "title": "Created", "sortable": true}
-]
-```
-
-## Activiti Task Details
-
-The component shows the details of the task id passed in input
+### Basic Usage
```html
```
-### Properties
+#### Properties
| Name | Type | Default | Description |
| --- | --- | --- | --- |
@@ -181,7 +197,7 @@ The component shows the details of the task id passed in input
| showChecklist | boolean | true | Toggle `Checklist` feature for Header component |
| fieldValidators | FormFieldValidator[] | [] | Field validators for use with the form. |
-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -192,7 +208,9 @@ The component shows the details of the task id passed in input
| executeOutcome | Raised when any outcome is executed, default behaviour can be prevented via `event.preventDefault()` |
| onError | Raised at any error |
-### Custom 'empty Activiti Task Details' template
+### Details
+
+#### Custom 'empty Activiti Task Details' template
By default the Activiti Task Details provides the following message for the empty task details:
@@ -217,7 +235,9 @@ Note that can put any HTML content as part of the template, including other Angu
## Activiti Apps Component
-The component shows all the available apps.
+Shows all available apps.
+
+### Basic Usage
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | --- |
| layoutType | string | (**required**) Define the layout of the apps. There are two possible values: GRID or LIST. |
| filtersAppId | Object | Provide a way to filter the apps to show. |
-### Events
+#### Events
| Name | Description |
| --- | --- |
| appClick | Raised when an app entry is clicked |
-### How filter the activiti apps
+### Details
+
+#### How filter the activiti apps
If you want to show some specific apps you can specify them through the filtersAppId parameters
@@ -267,15 +289,17 @@ You can use inside the filter one of the following property
}
```
-## Activiti Filter
+## Activiti Filter component
-The component shows all the available filters.
+Shows all available filters.
+
+### Basic Usage
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | --- |
@@ -286,7 +310,7 @@ The component shows all the available filters.
If both `appId` and `appName` are specified then `appName` will take precedence and `appId` will be ignored.
-### Events
+#### Events
| Name | Description |
| --- | --- |
@@ -294,7 +318,9 @@ If both `appId` and `appName` are specified then `appName` will take precedence
| onSuccess | Raised when the list is loaded |
| onError | Raised if there is an error during the loading |
-### How filter the activiti task filters
+### Details
+
+#### How filter the activiti task filters
```html
```
-### Properties
+#### Properties
| Name | Type | Description |
| --- | --- | --- |
@@ -363,9 +391,12 @@ The component shows the checklist task functionality.
| readOnlyForm | boolean | Toggle readonly state of the form. Enforces all form widgets render readonly if enabled. |
| assignee | string | (**required**) The assignee id where the subtasks are assigned to. |
+
## Task Attachment List Component
-This component displays attached documents on a specified task
+Displays attached documents on a specified task
+
+### Basic Usage
```html
```
-### Properties
+#### Properties
| Name | Type | Default | Description |
| --- | --- | --- | --- |
@@ -437,13 +471,18 @@ The purpose of the component is to populate the local variable called `propertie

-### Events
+#### Events
| Name | Description |
| --- | --- |
| claim | Raised when the task is claimed. |
-## TaskDetailsModel
+### Details
+
+The purpose of the component is to populate the local variable called `properties` (array of CardViewModel), with all the information that we want to display.
+
+
+#### TaskDetailsModel
```json
{
@@ -457,7 +496,9 @@ The purpose of the component is to populate the local variable called `propertie
## Task People Component
-This component displays involved users to a specified task
+Displays involved users to a specified task
+
+### Basic Usage
```html
+```
+
+#### Properties
+
+| Name | Type | Description |
+| --- | --- | --- |
+| results | Observable | The params to show people list |
+
+#### Events
+
+| Name | Description |
+| --- | --- |
+| searchPeople | Raised when the search people with new keyword |
+| success | Raised when select the user and click action button |
+| closeSearch | Raised when click the clse button |
+
+### Details
+
+ ```html
+
+ {{ 'TASK_DETAILS.LABELS.ADD_PEOPLE' | translate }}
+ {{ 'PEOPLE.ADD_USER' | translate }}
+
+
+```
+
## Task Audit Directive
-This directive provide a way to fetch the Task Audit information in the pdf or json format.
+Provides a way to fetch the Task Audit information in the pdf or json format.
+
+### Basic Usage
```html
```
-### Modes
+### Details
+
+Used by attaching to an element or component.
+
+#### Modes
Directive supports several modes:
@@ -146,7 +588,7 @@ It is also possible combining modes together.
...
```
-#### Click mode
+##### Click mode
For the click mode you can provide additional attributes for the File Dialog:
@@ -168,12 +610,12 @@ For the click mode you can provide additional attributes for the File Dialog:
```
-#### Drop mode
+##### Drop mode
For the moment upload directive supports only Files (single or multiple).
Support for Folders and `accept` filters is subject to implement.
-### Events
+#### Events
Once a single or multiple files are dropped on the decorated element the `upload-files` [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) is raised.
The DOM event is configured to have `bubbling` enabled, so any component up the component tree can handle, process or prevent it:
@@ -227,7 +669,7 @@ detail: {
}
```
-### Styling
+#### Styling
The decorated element gets `adf-upload__dragging` CSS class name in the class list every time files are dragged over it.
This allows changing look and feel of your components in case additional visual indication is required,
@@ -256,10 +698,52 @@ for example you may want drawing a dashed border around the table row on drag:
}
```
+## Context Menu directive
+
+### Basic Usage
+
+```html
+
+
+```
+
+```ts
+@Component({
+ selector: 'my-component'
+})
+export class MyComponent implements OnInit {
+
+ menuItems: any[];
+
+ constructor() {
+ this.menuItems = [
+ { title: 'Item 1', subject: new Subject() },
+ { title: 'Item 2', subject: new Subject() },
+ { title: 'Item 3', subject: new Subject() }
+ ];
+ }
+
+ ngOnInit() {
+ this.menuItems.forEach(l => l.subject.subscribe(item => this.commandCallback(item)));
+ }
+
+ commandCallback(item) {
+ alert(`Executing ${item.title} command.`);
+ }
+
+}
+```
+
+### Details
+
+See **Demo Shell** or **DocumentList** implementation for more details and use cases.
+
## Alfresco Api Service
Provides access to initialized **AlfrescoJSApi** instance.
+### Basic Usage
+
```ts
export class MyComponent implements OnInit {
@@ -276,6 +760,8 @@ export class MyComponent implements OnInit {
}
```
+### Details
+
**Note for developers**: _the TypeScript declaration files for Alfresco JS API
are still under development and some Alfresco APIs may not be accessed
via your favourite IDE's intellisense or TypeScript compiler.
@@ -289,11 +775,17 @@ api.nodes.addNode('-root-', body, {});
## AppConfigService
+Supports app configuration settings, stored server side.
+
+### Details
+
The `AppConfigService` service provides support for loading and accessing global application configuration settings that you store on the server side in the form of a JSON file.
-> You may need this service when deploying your ADF-based application to production servers.
-> There can be more than one server running web apps with different settings, like different addresses for Alfresco Content/Process services.
-> Or there is a need to change global settings for all the clients.
+You may need this service when deploying your ADF-based application to production servers.
+
+There can be more than one server running web apps with different settings, like different addresses for Alfresco Content/Process services.
+
+Or there is a need to change global settings for all the clients.
The service is already pre-configured to look for the "app.config.json" file in the application root address.
@@ -357,7 +849,7 @@ export class AppComponent {
Your custom components can also benefit from the `AppConfigService`,
you can put an unlimited number of settings and optionally a nested JSON hierarchy.
-### Different configurations based on environment settings
+#### Different configurations based on environment settings
The CoreModule allows you to provide custom application configuration path.
That means you can evaluate the final file name based on conditions, for example environment settings:
@@ -379,9 +871,9 @@ if (process.env.ENV === 'production') {
})
```
-### Variable substitution in configuration strings
+#### Variable substitution in configuration strings
-The `AppConfigService` also supports a limited set of variable substitutions to greatly simplify certain scenarios.
+The `AppConfigService` also supports a limited set of variable substitutions to greatly simplify certain scenarios.
```json
{
@@ -400,9 +892,9 @@ The supported variables are:
| hostname | `location.hostname` |
| port | `location.port` |
-### Unit testing
+#### Unit testing
-You can also provide custom values for the entire service.
+You can also provide custom values for the entire service.
This might become handy when creating unit tests.
```ts
@@ -423,11 +915,14 @@ describe('MyTest', () => {
```
In the example above custom values are applied on the top of all the values the `AppConfigService` has previously loaded.
-If there is an 'app.config.json' file loaded at unit test run time then your custom values will overwrite exiting values with the same keys if present.
+If there is an 'app.config.json' file loaded at unit test run time then your custom values will overwrite exiting values with the same keys if present.
## User Preferences Service
-The `UserPreferencesService` allows you to store preferences for the components.
+Stores preferences for components.
+
+### Details
+
The preferences are bound to a particular `prefix` so the application can switch between different profiles on demand.
For example upon login you can set the `prefix` as current username:
@@ -476,6 +971,10 @@ Known properties:
## Notification Service
+Shows a notification message with optional feedback.
+
+### Details
+
The Notification Service is implemented on top of the Angular 2 Material Design snackbar.
Use this service to show a notification message, and optionally get feedback from it.
@@ -484,13 +983,13 @@ import { NotificationService } from 'ng2-alfresco-core';
export class MyComponent implements OnInit {
- constructor(private notificationService: NotificationService) {
+ constructor(private notificationService: NotificationService) {
}
ngOnInit() {
this.notificationService.openSnackMessage('test', 200000).afterDismissed().subscribe(() => {
console.log('The snack-bar was dismissed');
- });
+ });
}
}
```
@@ -500,7 +999,7 @@ import { NotificationService } from 'ng2-alfresco-core';
export class MyComponent implements OnInit {
- constructor(private notificationService: NotificationService) {
+ constructor(private notificationService: NotificationService) {
}
ngOnInit() {
@@ -511,88 +1010,11 @@ export class MyComponent implements OnInit {
}
```
-## Context Menu directive
-
-_See **Demo Shell** or **DocumentList** implementation for more details and use cases._
-
-```html
-
-
-```
-
-```ts
-@Component({
- selector: 'my-component'
-})
-export class MyComponent implements OnInit {
-
- menuItems: any[];
-
- constructor() {
- this.menuItems = [
- { title: 'Item 1', subject: new Subject() },
- { title: 'Item 2', subject: new Subject() },
- { title: 'Item 3', subject: new Subject() }
- ];
- }
-
- ngOnInit() {
- this.menuItems.forEach(l => l.subject.subscribe(item => this.commandCallback(item)));
- }
-
- commandCallback(item) {
- alert(`Executing ${item.title} command.`);
- }
-
-}
-```
-
-## Accordion Component
-
-The component provides a way to easily create an accordion menu. You can customize the header and the icon.
-
-```html
-
-
-
-
-
-```
-
-```ts
-@Component({
- selector: 'my-component'
-})
-export class MyComponent implements OnInit {
-
- titleHeading: string;
-
- constructor() {
- this.titleHeading = 'My Group';
- }
-
-}
-```
-
-### Properties
-
-| Name | Type | Description |
-| --- | --- | --- |
-| heading | string | The header title. |
-| isSelected | boolean | Define if the accordion group is selected or not. |
-| headingIcon | string | The material design icon. |
-| hasAccordionIcon | boolean | Define if the accordion (expand) icon needs to be shown or not, the default value is true |
-
## Authentication Service
-The authentication service is used inside the [login component](../ng2-alfresco-login) and is possible to find there an example of how to use it.
+Provides authentication for use with the Login component.
-### Events
-
-| Name | Description |
-| --- | --- |
-| onLogin | Raised when user logs in |
-| onLogout | Raised when user logs out |
+### Basic Usage
**app.component.ts**
@@ -614,227 +1036,24 @@ export class AppComponent {
}
```
-## ADF Card View
+#### Events
-The CardViewComponent is a configurable property list renderer. You define the property list, the CardViewComponent does the rest. Each property represents a card view item (a row) in the card view component. At the time of writing two different kind of card view item (property type) is supported out of the box ([text](#card-text-item) item and [date](#card-date-item) item) but you can define your own custom types as well.
+| Name | Description |
+| --- | --- |
+| onLogin | Raised when user logs in |
+| onLogout | Raised when user logs out |
-```html
-
-
+### Details
-```
+The authentication service is used inside the [login component](../ng2-alfresco-login) and is possible to find there an example of how to use it.
-
+## Translation service
-### Properties
+Supports localisation.
-| Name | Type | Description |
-| --- | --- | --- |
-| properties | [CardViewItem](#cardviewitem)[] | (**required**) The custom view to render |
-| editable | boolean | If the component editable or not |
+### Details
-### Editing
-
-The card view can optionally allow its properties to be edited. You can control the editing of the properties in two level.
-- **global level** - *via the editable parameter of the card-view.component*
-- **property level** - *in each property via the editable attribute*
-
-If you set the global editable parameter to false, no properties can be edited regardless of what is set inside the property.
-
-### Defining properties
-
-Properties is an array of models which one by one implements the CardViewItem interface.
-
-```js
-export interface CardViewItem {
- label: string;
- value: any;
- key: string;
- default?: any;
- type: string;
- displayValue: string;
- editable?: boolean;
-}
-```
-
-At the moment three models are defined out of the box:
-
-- **[CardViewTextItemModel](#card-text-item)** - *for text items*
-- **[CardViewMapItemModel](#card-map-item)** - *for map items*
-- **[CardViewDateItemModel](#card-date-item)** - *for date items*
-
-Each of them are extending the abstract CardViewBaseItemModel class, and each of them are adding some custom functionality to the basic behaviour.
-
-```js
- this.properties = [
- new CardViewTextItemModel({
- label: 'Name',
- value: 'Spock',
- key: 'name',
- default: 'default bar' ,
- multiline: false
- }),
- new CardViewMapItemModel({
- label: 'My map',
- value: new Map([['999', 'My Value']]),
- key: 'map',
- default: 'default map value' ,
- clickable: true
- }),
- new CardViewDateItemModel({
- label: 'Birth of date',
- value: someDate,
- key: 'birth-of-date',
- default: new Date(),
- format: '',
- editable: true
- }),
- ...
-]
-```
-
-### Card Text Item
-
-CardViewTextItemModel is a property type for text properties.
-
-```js
-const textItemProperty = new CardViewTextItemModel(options);
-```
-
-#### Options
-
-| Name | Type | Default | Description |
-| --- | --- | --- | --- |
-| label* | string | --- | The label to render |
-| value* | any | --- | The original value |
-| key* | string | --- | the key of the property. Have an important role when editing the property. |
-| default | any | --- | The default value to render in case the value is empty |
-| displayValue* | string | --- | The value to render |
-| editable | boolean | false | Whether the property editable or not |
-| clickable | boolean | false | Whether the property clickable or not |
-| multiline | string | false | Single or multiline text |
-
-### Card Map Item
-
-CardViewMapItemModel is a property type for map properties.
-
-```js
-const mapItemProperty = new CardViewMapItemModel(options);
-```
-
-#### Options
-
-| Name | Type | Default | Description |
-| --- | --- | --- | --- |
-| label* | string | --- | The label to render |
-| value* | Map | --- | A map that contains the key value pairs |
-| key* | string | --- | the key of the property. Have an important role when editing the property. |
-| default | any | --- | The default value to render in case the value is empty |
-| displayValue* | string | --- | The value to render |
-| clickable | boolean | false | Whether the property clickable or not |
-
-### Card Date Item
-
-CardViewDateItemModel is a property type for date properties.
-
-```js
-const dateItemProperty = new CardViewDateItemModel(options);
-```
-
-#### Options
-
-| Name | Type | Default | Description |
-| --- | --- | --- | --- |
-| label* | string | --- | The label to render |
-| value* | any | --- | The original value |
-| key* | string | --- | the key of the property. Have an important role when editing the property. |
-| default | any | --- | The default value to render in case the value is empty |
-| displayValue* | string | --- | The value to render |
-| editable | boolean | false | Whether the property editable or not |
-| format | boolean | "MMM DD YYYY" | any format that momentjs accepts |
-
-### Defining your custom card Item
-
-Card item components are loaded dynamically, which makes you able to define your own custom component for the custom card item type.
-
-Let's consider you want to have a **stardate** type to display Captain Picard's birthday (47457.1). For this, you need to do the following steps.
-
-#### 1. Define the model for the custom type
-
-Your model has to extend the CardViewBaseItemModel and implement the CardViewItem interface.
-*(You can check how the CardViewTextItemModel is implemented for further guidance.)*
-
-```js
-export class CardViewStarDateItemModel extends CardViewBaseItemModel implements CardViewItem {
- type: string = 'star-date';
-
- get displayValue() {
- return this.convertToStarDate(this.value) || this.default;
- }
-
- private convertToStarDate(starTimeStamp: number): string {
- // Do the magic
- }
-}
-```
-
-The most important part of this model is the value of the **type** attribute. This is how the Card View component will be able to recognise which component is needed to render it dynamically.
-
-The type is a **hyphen-separated-lowercase-words** string (just like how I wrote it). This will be converted to a PascalCase (or UpperCamelCase) string to find the right component. In our case the Card View component will look for the CardView**StarDate**ItemComponent.
-
-#### 2. Define the component for the custom type
-
-As discussed in the previous step the only important thing here is the naming of your component class ( **CardViewStarDateItemComponent**). Since the selector is not used in this case, you can give any selector name to it, but it makes sense to follow the angular standards.
-
-```js
-@Component({
- selector: 'card-view-stardateitem' // For example
- ...
-})
-export class CardViewStarDateItemComponent {
- @Input()
- property: CardViewStarDateItemModel;
-
- @Input()
- editable: boolean;
-
- constructor(private cardViewUpdateService: CardViewUpdateService) {}
-
- isEditble() {
- return this.editable && this.property.editable;
- }
-
- showStarDatePicker() {
- ...
- }
-}
-
-```
-To make your component editable, you can have a look on either the CardViewTextItemComponent' or on the CardViewDateItemComponent's source.
-
-#### 3. Add you custom component to your module's entryComponents list
-
-For Angular to be able to load your custom component dynamically, you have to register your component in your modules entryComponents.
-
-```js
-@NgModule({
- imports: [...],
- declarations: [
- CardViewStarDateItemComponent
- ],
- entryComponents: [
- CardViewStarDateItemComponent
- ],
- exports: [...]
-})
-export class MyModule {}
-```
-
-## TranslationService
-
-### Registering translation sources
+#### Registering translation sources
In order to enable localisation support you will need to create a `/resources/i18n/en.json` file
and register its parent `i18n` folder with your component or application module.
@@ -870,7 +1089,7 @@ assets/ng2-alfresco-core/i18n/en.json
You can register as many entries as you would like.
-### Switching languages
+#### Switching languages
Depending on your application, you may want to have buttons or dropdown menus to allow language selection for the end users.
@@ -894,7 +1113,22 @@ class MyComponent {
* getRendition(nodeId: string, encoding: string)
* isRenditionAvailable(nodeId: string, encoding: string)
-## Build from sources
+## Project Information
+
+### Prerequisites
+
+Before you start using this development framework, make sure you have installed all required software and done all the
+necessary configuration, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
+
+> If you plan using this component with projects generated by Angular CLI, please refer to the following article: [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
+
+### Install
+
+```sh
+npm install ng2-alfresco-core
+```
+
+### Build from sources
You can build component from sources with the following commands:
@@ -906,7 +1140,7 @@ npm run build
> The `build` task rebuilds all the code, runs tslint, license checks
> and other quality check tools before performing unit testing.
-## NPM scripts
+### NPM scripts
| Command | Description |
| --- | --- |
@@ -915,7 +1149,7 @@ npm run build
| npm run test-browser | Run unit tests in the browser
| npm run coverage | Run unit tests and display code coverage report |
-## Demo
+### Demo
Please check the demo folder for a demo project
@@ -925,6 +1159,6 @@ npm install
npm start
```
-## License
+### License
[Apache Version 2.0](https://github.com/Alfresco/alfresco-ng2-components/blob/master/LICENSE)
diff --git a/ng2-components/ng2-alfresco-core/docs/adf-toolbar-01.png b/ng2-components/ng2-alfresco-core/docs/adf-toolbar-01.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca81330cd206bc772e66b3a3315a596bdafc5663
GIT binary patch
literal 14044
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
I%)s}50GmGD3;+NC
literal 0
HcmV?d00001
diff --git a/ng2-components/ng2-alfresco-core/docs/adf-toolbar-02.png b/ng2-components/ng2-alfresco-core/docs/adf-toolbar-02.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e81967f3e8bca680bdfe1b98f5142d0f75ced42
GIT binary patch
literal 36976
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