Increase timeout and modify login async (#4795)

* increase timeout and modify login async

* run e2e if testing is changed

* improve cdk fix

* fix travis update projects

* disable ghostMode lite server

* lint fix

* fix timeout

* multiple try

* Update content-services-e2e.sh

* Update search-e2e.sh

* Update process-services-e2e.sh

* Update core-e2e.sh

* Update protractor.conf.ts

* fix unit

* remove async

* increqase notification time

* 3 parallel

* dix path issue in save

* small refactor protractor ts

* fix save

* create license check first script adf cli

* modify regex check

* refactor notification history component

* decrease notification

* fix notification message problem

* fix test

* update packages wit high risk

* revert cahnge login sso e2e

* fix dep

* fix documentation duplication and issue

* fix after review

* fix after review

* try 6 parallel test

* back to 3 parallel test no real time improve with 6
This commit is contained in:
Eugenio Romano 2019-06-06 16:47:50 +01:00 committed by GitHub
parent 99f4b07878
commit 5e54cd4d43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
118 changed files with 2335 additions and 2768 deletions

View File

@ -15,7 +15,7 @@ branches:
only:
- master
- development
- /.*old-env.*/
- /.*old-env.*/
- /.*next-release.*/
- /.*beta.*/
- /.*greenkeeper.*/
@ -59,9 +59,9 @@ jobs:
script:
./scripts/travis/deploy/deploy.sh
- stage: Update children projects dependency #Update children projects dependency
name: Update Generator
name: Update Related Project
if: tag =~ .*beta.*
script: ./scripts/travis/e2e/update-project.sh
script: ./scripts/update-project.sh
- stage: e2e Test
name: core
script: ./scripts/travis/e2e/core-e2e.sh

View File

@ -25,6 +25,8 @@
<adf-language-menu></adf-language-menu>
</mat-menu>
<adf-notification-history menuPositionX="before" menuPositionY="above"></adf-notification-history>
</adf-layout-header>
</ng-template>
</adf-sidenav-layout-header>

View File

@ -1,5 +1,5 @@
<div id="attachment-task-list" *ngIf="taskId">
<div class="adf-no-form-container">
<div>
<adf-upload-drag-area
[rootFolderId]="taskId">

View File

@ -103,11 +103,13 @@ for more information about installing and using the source code.
| [Login Dialog Panel component](core/components/login-dialog-panel.component.md) | Shows and manages a login dialog. | [Source](../lib/core/login/components/login-dialog-panel.component.ts) |
| [Login Dialog component](core/components/login-dialog.component.md) | Allows a user to perform a login via a dialog. | [Source](../lib/core/login/components/login-dialog.component.ts) |
| [Login component](core/components/login.component.md) | Authenticates to Alfresco Content Services and Alfresco Process Services. | [Source](../lib/core/login/components/login.component.ts) |
| [Notification History component](core/components/notification-history.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | This component is in the current status just an experimental component. | |
| The main purpose of the Notification history component is list all the notification received in the current session. They will disappear from the list after the refresh. | [Source](../lib/core/notification-history/notification-history.component.ts) | |
| [Pagination Component](core/components/pagination.component.md) | Adds pagination to the component it is used with. | [Source](../lib/core/pagination/pagination.component.ts) |
| [Sidebar action menu component](core/components/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/components/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/components/sorting-picker.component.md) | Selects from a set of predefined sorting definitions and directions. | [Source](../lib/core/sorting-picker/sorting-picker.component.ts) |
| [Start Form component](core/components/start-form.component.md) | Displays the Start Form for a process. | [Source](../lib/core/form/components/start-form.component.ts) |
| [Start Form component](core/components/start-form.component.md) | Displays the Start Form for a process. | [Source](../lib/process-services/form/start-form.component.ts) |
| [Text Mask directive](core/components/text-mask.component.md) | Implements text field input masks. | [Source](../lib/core/form/components/widgets/text/text-mask.component.ts) |
| [Toolbar Divider Component](core/components/toolbar-divider.component.md) | Divides groups of elements in a Toolbar with a visual separator. | [Source](../lib/core/toolbar/toolbar-divider.component.ts) |
| [Toolbar Title Component](core/components/toolbar-title.component.md) | Supplies custom HTML to be included in a Toolbar component title. | [Source](../lib/core/toolbar/toolbar-title.component.ts) |
@ -158,7 +160,7 @@ for more information about installing and using the source code.
| [Format Space pipe](core/pipes/format-space.pipe.md) | Replaces all the white space in a string with a supplied character. | [Source](../lib/core/pipes/format-space.pipe.ts) |
| [Full name pipe](core/pipes/full-name.pipe.md) | Joins the first and last name properties from a UserProcessModel object into a single string. | [Source](../lib/core/pipes/full-name.pipe.ts) |
| [Mime Type Icon pipe](core/pipes/mime-type-icon.pipe.md) | Retrieves an icon to represent a MIME type. | [Source](../lib/core/pipes/mime-type-icon.pipe.ts) |
| [Multi Value pipe](core/pipes/multi-value.pipe.md) | Takes an array of strings and turns it into one string where items are separated by a separator. The default separator applied to the list is ', ', however, you can set your own separator in the params of the pipe. | [Source](../lib/core/pipes/multi-value.pipe.ts) |
| [](core/pipes/multi-value.pipe.md) | Takes an array of strings and turns it into one string where items are separated by a separator. The default separator applied to the list is ', ', however, you can set your own separator in the params of the pipe. | [Source](../lib/core/pipes/multi-value.pipe.ts) |
| [Node Name Tooltip pipe](core/pipes/node-name-tooltip.pipe.md) | Formats the tooltip for a Node. | [Source](../lib/core/pipes/node-name-tooltip.pipe.ts) |
| [Text Highlight pipe](core/pipes/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/pipes/time-ago.pipe.md) | Converts a recent past date into a number of days ago. | [Source](../lib/core/pipes/time-ago.pipe.ts) |
@ -410,7 +412,7 @@ for more information about installing and using the source code.
| [Edit Task Filter Cloud component](process-services-cloud/components/edit-task-filter-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Edits task filter details. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts) |
| [Form cloud custom outcomes component](process-services-cloud/components/form-cloud-custom-outcome.component.md) | Supplies custom outcome buttons to be included in Form cloud component. | [Source](../lib/process-services-cloud/src/lib/form/components/form-cloud-custom-outcomes.component.ts) |
| [Form cloud component](process-services-cloud/components/form-cloud.component.md) | Shows a form from Process Services. | [Source](../lib/process-services-cloud/src/lib/form/components/form-cloud.component.ts) |
| [Form definition selector Cloud componet](process-services-cloud/components/form-definition-selector-cloud.component.md) | Allows one form to be selected. | [Source](../lib/process-services-cloud/src/lib/form-definition-selector/components/form-definition-selector-cloud.component.ts) |
| [Form definition selector Cloud componet](process-services-cloud/components/form-definition-selector-cloud.component.md) | Allows one form to be selected. | [Source](../lib/process-services-cloud/src/lib/form/components/form-definition-selector-cloud.component.ts) |
| [Group Cloud component](process-services-cloud/components/group-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches Groups. | [Source](../lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts) |
| [People Cloud Component](process-services-cloud/components/people-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Allows one or more users to be selected (with auto-suggestion) based on the input parameters. | [Source](../lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts) |
| [Process Filters Cloud Component](process-services-cloud/components/process-filters-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Lists all available process filters and allows to select a filter. | [Source](../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.ts) |
@ -419,7 +421,7 @@ for more information about installing and using the source code.
| [Start Process Cloud Component](process-services-cloud/components/start-process-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Starts a process. | [Source](../lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts) |
| [Start Task Cloud Component](process-services-cloud/components/start-task-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Creates/starts a new task for the specified app. | [Source](../lib/process-services-cloud/src/lib/task/start-task/components/start-task-cloud.component.ts) |
| [Task Filters Cloud component](process-services-cloud/components/task-filters-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all available filters. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.ts) |
| [Form cloud component](process-services-cloud/components/task-form-cloud.component.md) | Shows a form for a task. | [Source](../lib/process-services-cloud/src/lib/form/components/task-form-cloud.component.ts) |
| [Form cloud component](process-services-cloud/components/task-form-cloud.component.md) | Shows a form for a task. | [Source](../lib/process-services-cloud/src/lib/task/task-form/components/task-form-cloud.component.ts) |
| [Task Header Cloud Component](process-services-cloud/components/task-header-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all the information related to a task. | [Source](../lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts) |
| [Task List Cloud component](process-services-cloud/components/task-list-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../lib/process-services-cloud/src/lib/task/task-list/components/task-list-cloud.component.ts) |

View File

@ -20,7 +20,7 @@ You can find further information about released versions of ADF in the
[version index](versionIndex.md) and the [release notes](release-notes/README.md).
| ADF version | Content Services | Process Services |
| -- | -- | -- |
| --- | --- | --- |
| [3.2.0](versionIndex.md#v320) - [3.2.1](versionIndex.md#v321) | **Full test:** v6.1.0 <br/> **Smoke test:** v5.2.4 | **Full test:** v7.1.0 (latest CI pipeline build), v1.9.0 <br/>**Smoke test:** v1.8.1 |
| [3.1.0](versionIndex.md#v310) | **Full test:** v6.1.0 RC7 <br/> **Smoke test:** v5.2.4 | **Full test:** v2.0.0 (latest CI pipeline build), v1.9.0 <br/>**Smoke test:** v1.8.1 |
| [3.0.0](versionIndex.md#v300) | **Full test:** v6.1.0 RC7 <br/> **Smoke test:** v5.2.4 | **Full test:** v2.0.0 (latest CI pipeline build), v1.9.0 <br/>**Smoke test:** v1.8.1 |

View File

@ -11,7 +11,7 @@ Defines the Image Resolver function used by the [Document List Component](../com
## Definitions
- `type` **[ImageResolver](../../../lib/content-services/document-list/data/image-resolver.model.ts)** = (row: [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts), column: [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts)) => `string`
- `type` **[`ImageResolver`](../../../lib/content-services/document-list/data/image-resolver.model.ts)** = (row: [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts), column: [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts)) => `string`
- _row:_ [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts) - Data that defines the row
- _column:_ [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) - Data that defines the column
- **Returns** File path for the image

View File

@ -11,7 +11,7 @@ Defines the Row Filter function used by the [Document List Component](../compone
## Definitions
- `type` **[RowFilter](../../../lib/content-services/document-list/data/row-filter.model.ts)** = (value: [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts), index: `number`, array: [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts)`[]`) => any
- `type` **[`RowFilter`](../../../lib/content-services/document-list/data/row-filter.model.ts)** = (value: [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts), index: `number`, array: [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts)`[]`) => any
- _value:_ [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts) - Data that defines the row
- _index:_ `number` - Index of the row within the list
- _array:_ [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts)`[]` - The full set of rows for the list

View File

@ -48,7 +48,7 @@ Implements node operations used by the [Document List component](../components/d
- _nodeId:_ `string` -
- _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) -
- _includeFields:_ `string[]` -
- _where:_ `string` - (Optional)
- _where:_ `string` - (Optional)
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`DocumentLoaderNode`](../../../lib/content-services/document-list/models/document-folder.model.ts)`>` -
- **moveNode**(nodeId: `string`, targetParentId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>`<br/>

View File

@ -0,0 +1,28 @@
---
Title: Notification History component
Added: v3.3.0
Status: Experimental
Last reviewed: 2019-06-05
---
# [Notification History component](../../../lib/core/notification-history/notification-history.component.ts "Defined in notification-history.component.ts")
This component is in the current status just an experimental component.
The main purpose of the [Notification history component](../../core/components/notification-history.component.md) is list all the notification received in the current session. They will disappear from the list after the refresh.
![Notification history component](../../docassets/notification-history-component.png)
## Basic Usage
```html
<adf-notification-history [menuPositionX]="'before'" [menuPositionY]="'above'"></adf-notification-history>
```
## Class members
### Properties
| Name | Type | Default value | Description |
| ---- | ---- | ------------- | ----------- |
| menuPositionX | `string` | "after" | Custom choice for opening the menu at the bottom. Can be `before` or `after`. |
| menuPositionY | `string` | "below" | Custom choice for opening the menu at the bottom. Can be `above` or `below`. |

View File

@ -28,22 +28,21 @@ Shows a notification message with optional feedback.
- _action:_ `string` - Caption for the response button
- _config:_ `number|MatSnackBarConfig` - (Optional) Time before notification disappears after being shown or MatSnackBarConfig object
- **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>` - Information/control object for the SnackBar
- **showError**(message: `string`, action: `string`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>`<br/>
Rase error message
- _message:_ `string` - The message (or resource key) to show.
- _action:_ `string` - Caption for the response button
- **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>` - Information/control object for the SnackBar
- **showInfo**(message: `string`, action: `string`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>`<br/>
Rase info message
- _message:_ `string` - The message (or resource key) to show.
- _action:_ `string` - Caption for the response button
- **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>` - Information/control object for the SnackBar
- **showWarning**(message: `string`, action: `string`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>`<br/>
Rase warning message
- _message:_ `string` - The message (or resource key) to show.
- _action:_ `string` - Caption for the response button
- **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>` - Information/control object for the SnackBar
- **showError**(message: `string`, action?: `string`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>`<br/>
Rase error message
- _message:_ `string` - Text message or translation key for the message.
- _action:_ `string` - (Optional) Action name
- **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>` -
- **showInfo**(message: `string`, action?: `string`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>`<br/>
Rase info message
- _message:_ `string` - Text message or translation key for the message.
- _action:_ `string` - (Optional) Action name
- **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>` -
- **showWarning**(message: `string`, action?: `string`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>`<br/>
Rase warning message
- _message:_ `string` - Text message or translation key for the message.
- _action:_ `string` - (Optional) Action name
- **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`<any>` -
## Details

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -16,7 +16,7 @@ Manages and runs basic extension functionality.
- **evaluateRule**(ruleId: `string`, context?: [`RuleContext`](../../../lib/extensions/src/lib/config/rule.extensions.ts)): `boolean`<br/>
Evaluates a rule.
- _ruleId:_ `string` - ID of the rule to evaluate
- _context:_ [`RuleContext`](../../../lib/extensions/src/lib/config/rule.extensions.ts) - (Optional) (optional) Custom rule execution context.
- _context:_ [`RuleContext`](../../../lib/extensions/src/lib/config/rule.extensions.ts) - (Optional) Custom rule execution context.
- **Returns** `boolean` - True if the rule passed, false otherwise
- **getActionById**(id: `string`): [`ActionRef`](../../../lib/extensions/src/lib/config/action.extensions.ts)<br/>
Retrieves an action using its ID value.

View File

@ -9,7 +9,7 @@ This page lists all third party libraries that ADF depends on.
## Libraries
| Name | Version | License |
| -- | -- | -- |
| --- | --- | --- |
| [@alfresco/adf-content-services](https://github.com/Alfresco/alfresco-ng2-components) | 3.2.0-beta6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
| [@alfresco/adf-core](https://github.com/Alfresco/alfresco-ng2-components) | 3.2.0-beta6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
| [@alfresco/adf-extensions](https://github.com/Alfresco/alfresco-ng2-components) | 3.2.0-beta6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |

View File

@ -10,7 +10,7 @@ with links to their licenses.
## Libraries
| Name | Version | License |
| -- | -- | -- |
| --- | --- | --- |
| [@angular/compiler](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) |
| [@angular/core](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) |
| [alfresco-components](https://github.com/Alfresco/alfresco-ng2-components) | 2.7.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |

View File

@ -9,7 +9,7 @@ This page lists all third party libraries that ADF v3.1.0 depends on.
## Libraries
| Name | Version | License |
| -- | -- | -- |
| --- | --- | --- |
| [@alfresco/adf-content-services](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
| [@alfresco/adf-core](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
| [@alfresco/adf-extensions](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |

View File

@ -9,7 +9,7 @@ This page lists all third party libraries that ADF v3.2.0 depends on.
## Libraries
| Name | Version | License |
| -- | -- | -- |
| --- | --- | --- |
| [@alfresco/adf-content-services](https://github.com/Alfresco/alfresco-ng2-components) | 3.2.0-beta6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
| [@alfresco/adf-core](https://github.com/Alfresco/alfresco-ng2-components) | 3.2.0-beta6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
| [@alfresco/adf-extensions](https://github.com/Alfresco/alfresco-ng2-components) | 3.2.0-beta6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |

View File

@ -29,8 +29,8 @@ Searches Groups.
| appName | `string` | | Name of the application. If specified this shows the users who have access to the app. |
| mode | `string` | | User selection mode (single/multiple). |
| preSelectGroups | [`GroupModel`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`[]` | \[] | Array of users to be pre-selected. This pre-selects all users in multi selection mode and only the first user of the array in single selection mode. |
| searchGroupsControl | `FormControl` | new FormControl() | FormControl to search the group. |
| roles | `string[]` | \[] | Role names of the groups to be listed. |
| searchGroupsControl | `FormControl` | new FormControl() | FormControl to search the group |
| title | `string` | | Title of the field |
### Events

View File

@ -28,9 +28,9 @@ Allows one or more users to be selected (with auto-suggestion) based on the inpu
| mode | `string` | | User selection mode (single/multiple). |
| preSelectUsers | [`IdentityUserModel`](../../../lib/core/userinfo/models/identity-user.model.ts)`[]` | | Array of users to be pre-selected. All users in the array are pre-selected in multi selection mode, but only the first user is pre-selected in single selection mode. Mandatory properties are: id, email, username |
| roles | `string[]` | | Role names of the users to be listed. |
| searchUserCtrl | `FormControl` | new FormControl() | FormControl to search the user |
| title | `string` | | Placeholder translation key |
| searchUserCtrl | `FormControl` | new FormControl() | FormControl to search the users. |
| validate | `Boolean` | false | This flag enables the validation on the preSelectUsers passed as input. In case the flag is true the components call the [identity service](../../../lib/testing/src/lib/core/actions/identity/identity.service.ts) to verify the validity of the information passed as input. Otherwise, no check will be done. |
| validate | `Boolean` | false | This flag enables the validation on the preSelectUsers passed as input. In case the flag is true the components call the identity service to verify the validity of the information passed as input. Otherwise, no check will be done. |
### Events

View File

@ -5,18 +5,10 @@ Status: Active
Last reviewed: 2019-04-17
---
# [Task form cloud component](../../../lib/process-services-cloud/src/lib/form/components/task-form-cloud.component.ts "Defined in task-form-cloud.component.ts")
# [Task form cloud component](../../../lib/process-services-cloud/src/lib/task/task-form/components/task-form-cloud.component.ts "Defined in task-form-cloud.component.ts")
Shows a [`form`](../../../lib/process-services-cloud/src/lib/form/models/form-cloud.model.ts) for a task.
## Contents
- [Basic Usage](#basic-usage)
- [Class members](#class-members)
- [Properties](#properties)
- [Events](#events)
- [See also](#see-also)
## Basic Usage
```html
@ -33,27 +25,27 @@ Shows a [`form`](../../../lib/process-services-cloud/src/lib/form/models/form-cl
| Name | Type | Default value | Description |
| ---- | ---- | ------------- | ----------- |
| appName | `string` | | App id to fetch corresponding form and values. |
| taskId | `string` | | Task id to fetch corresponding form and values. |
| readOnly | `boolean` | false | Toggle readonly state of the task. |
| showCancelButton | `boolean` | true | Toggle rendering of the `Cancel` button. |
| showCompleteButton | `boolean` | true | Toggle rendering of the `Complete` button. |
| showRefreshButton | `boolean` | false | Toggle rendering of the `Refresh` button. |
| showValidationIcon | `boolean` | true | Toggle rendering of the `Validation` icon. |
| showCancelButton | `boolean` | true | Toggle rendering of the `Cancel` outcome button. |
| showCompleteButton | `boolean` | true | Toggle rendering of the `Complete` outcome button. |
| readOnly | `boolean` | false | Toggle readOnly state of the task. |
| taskId | `string` | | Task id to fetch corresponding form and values. |
### Events
| Name | Type | Description |
| ---- | ---- | ----------- |
| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormCloud`](../../../lib/process-services-cloud/src/lib/form/models/form-cloud.model.ts)`>` | Emitted when the form is saved. |
| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormCloud`](../../../lib/process-services-cloud/src/lib/form/models/form-cloud.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. |
| taskCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`string`>` | Emitted when the task is completed. |
| taskClaimed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`string`>` | Emitted when the task is claimed. |
| taskUnclaimed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`string`>` | Emitted when the task is unclaimed. |
| cancelClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`string`>` | Emitted when the cancel button is clicked. |
| cancelClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<string>` | Emitted when the cancel button is clicked. |
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<any>` | Emitted when any error occurs. |
| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormCloud`](../../../lib/process-services-cloud/src/lib/form/models/form-cloud.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. |
| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormCloud`](../../../lib/process-services-cloud/src/lib/form/models/form-cloud.model.ts)`>` | Emitted when the form is saved. |
| taskClaimed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<string>` | Emitted when the task is claimed. |
| taskCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<string>` | Emitted when the task is completed. |
| taskUnclaimed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<string>` | Emitted when the task is unclaimed. |
## See also
- [Form component](./form-cloud.component.md)
- [Form field model](../../core/models/form-field.model.md)
- [Form cloud service](../services/form-cloud.service.md)
- [Form component](./form-cloud.component.md)
- [Form field model](../../core/models/form-field.model.md)
- [Form cloud service](../services/form-cloud.service.md)

View File

@ -16,9 +16,12 @@ Gets details of deployed apps for the current user.
- **getDeployedApplicationsByStatus**(status: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ApplicationInstanceModel`](../../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`[]>`<br/>
Gets a list of deployed apps for this user by status.
- _status:_ `string` - Required status value
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ApplicationInstanceModel`](../../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`[]>` - The list of deployed apps.
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ApplicationInstanceModel`](../../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`[]>` - The list of deployed apps
- **hasDeployedApps**(): `boolean`<br/>
You can override the behaviour by defining the required applications in app.config.json against the property `alfresco-deployed-apps`. The service will fetch the deployed apps only when there are no apps defined in the app.config.json
- **Returns** `boolean` -
- **loadApps**()<br/>
## Details

View File

@ -45,6 +45,10 @@ class MyComponent {
- _appName:_ `string` -
- **Returns** `string` -
- **getDropDownJsonData**(url: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FormFieldOption`](../../../lib/core/form/components/widgets/core/form-field-option.ts)`[]>`<br/>
Parses JSON data to create a corresponding form.
- _url:_ `string` - String data to make the request
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FormFieldOption`](../../../lib/core/form/components/widgets/core/form-field-option.ts)`[]>` - Array of FormFieldOption object
- **getForm**(appName: `string`, taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<any>`<br/>
Gets a form definition.
- _appName:_ `string` - Name of the app
@ -74,7 +78,7 @@ class MyComponent {
- **parseForm**(json: `any`, data?: [`TaskVariableCloud`](../../../lib/process-services-cloud/src/lib/form/models/task-variable-cloud.model.ts)`[]`, readOnly: `boolean` = `false`): [`FormCloud`](../../../lib/process-services-cloud/src/lib/form/models/form-cloud.model.ts)<br/>
Parses JSON data to create a corresponding form.
- _json:_ `any` - JSON data to create the form
- _data:_ [`TaskVariableCloud`](../../../lib/process-services-cloud/src/lib/form/models/task-variable-cloud.model.ts)`[]` - (Optional) (Optional) Values for the form's fields
- _data:_ [`TaskVariableCloud`](../../../lib/process-services-cloud/src/lib/form/models/task-variable-cloud.model.ts)`[]` - (Optional) Values for the form's fields
- _readOnly:_ `boolean` - Toggles whether or not the form should be read-only
- **Returns** [`FormCloud`](../../../lib/process-services-cloud/src/lib/form/models/form-cloud.model.ts) - [Form](../../../lib/process-services/task-list/models/form.model.ts) created from the JSON specification
- **saveTaskForm**(appName: `string`, taskId: `string`, formId: `string`, formValues: [`FormValues`](../../../lib/core/form/components/widgets/core/form-values.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`<br/>

View File

@ -46,6 +46,10 @@ Manages task cloud.
- _appName:_ `string` - Name of the app
- _taskId:_ `string` - ID of the task whose details you want
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Task details
- **isTaskEditable**(taskDetails: [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)): `boolean`<br/>
Validate if a task is editable.
- _taskDetails:_ [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts) - task details object
- **Returns** `boolean` - Boolean value if the task is editable
- **unclaimTask**(appName: `string`, taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`<br/>
Un-claims a task.
- _appName:_ `string` - Name of the app

View File

@ -246,8 +246,8 @@ Two new methods has been added into the alfresco-js-api to support retrieve the
| API | Name | HTTP method | URL | Description |
| --- | ---- | ----------- | --- | ----------- |
| _ActivitiPublicRestApi.[TaskApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api-legacy/activiti-rest-api/docs/TaskApi.md)_ | [**getTaskAuditJson**](https://github.com/Alfresco/alfresco-js-api/blob/a82ce3bbe56cb0944f8771d14193704b571adf96/src/alfresco-activiti-rest-api/docs/TaskApi.md#getTaskAuditJson) | **GET** | /api/enterprise/tasks/{taskId}/audit | Retrieve audit infromation in json format |
| _ActivitiPublicRestApi.[TaskApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api-legacy/activiti-rest-api/docs/TaskApi.md)_ | [**getTaskAuditPdf**](https://github.com/Alfresco/alfresco-js-api/blob/a82ce3bbe56cb0944f8771d14193704b571adf96/src/alfresco-activiti-rest-api/docs/TaskApi.md#getTaskAuditPdf) | **GET** | /app/rest/tasks/{taskId}/audit | Retrieve the task audit infromation in pdf format |
| _ActivitiPublicRestApi.[`TaskApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api-legacy/activiti-rest-api/docs/TaskApi.md)_ | [**getTaskAuditJson**](https://github.com/Alfresco/alfresco-js-api/blob/a82ce3bbe56cb0944f8771d14193704b571adf96/src/alfresco-activiti-rest-api/docs/TaskApi.md#getTaskAuditJson) | **GET** | /api/enterprise/tasks/{taskId}/audit | Retrieve audit infromation in json format |
| _ActivitiPublicRestApi.[`TaskApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api-legacy/activiti-rest-api/docs/TaskApi.md)_ | [**getTaskAuditPdf**](https://github.com/Alfresco/alfresco-js-api/blob/a82ce3bbe56cb0944f8771d14193704b571adf96/src/alfresco-activiti-rest-api/docs/TaskApi.md#getTaskAuditPdf) | **GET** | /app/rest/tasks/{taskId}/audit | Retrieve the task audit infromation in pdf format |
For further details about those endepoints please refer to the [official documentation](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-activiti-rest-api/docs/TaskApi.md)
@ -343,7 +343,7 @@ Release Notes - Apps Development Framework - Version 1.7.
- \[[ADF-819](https://issues.alfresco.com/jira/browse/ADF-819)] - Snackbar does not appear when uploading files via DnD
- \[[ADF-923](https://issues.alfresco.com/jira/browse/ADF-923)] - Involved user should not be able to see 'Complete' button as active in a task.
- \[[ADF-939](https://issues.alfresco.com/jira/browse/ADF-939)] - [Login] Sign in button does not stay at the bottom
- \[[ADF-943](https://issues.alfresco.com/jira/browse/ADF-943)] - APS [ContentApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/content.api.ts) is not present on index.d.ts and [SitesApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/sites.api.ts) is not complete
- \[[ADF-943](https://issues.alfresco.com/jira/browse/ADF-943)] - APS [`ContentApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/content.api.ts) is not present on index.d.ts and [`SitesApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/sites.api.ts) is not complete
- \[[ADF-945](https://issues.alfresco.com/jira/browse/ADF-945)] - 'Undefined' is displayed in 'attach file' widget after restore.
- \[[ADF-950](https://issues.alfresco.com/jira/browse/ADF-950)] - when the [`Form`](../../lib/process-services/task-list/models/form.model.ts) in readonly mode you can edit the date
- \[[ADF-957](https://issues.alfresco.com/jira/browse/ADF-957)] - Duplicate Rest calls are made for fields where Rest end points are given

View File

@ -701,7 +701,7 @@ Release Notes - Apps Development Framework - Version 2.0.
- \[[ADF-1710](https://issues.alfresco.com/jira/browse/ADF-1710)] - An error is logged into the console when using data widget
- \[[ADF-1711](https://issues.alfresco.com/jira/browse/ADF-1711)] - The adf-task-attachment-list component displays drag-and-drop area that is not working
- \[[ADF-1712](https://issues.alfresco.com/jira/browse/ADF-1712)] - The adf-task-header component displays a Requeue button for none pooled tasks
- \[[ADF-1716](https://issues.alfresco.com/jira/browse/ADF-1716)] - Process List - processDefinitionKey is not part of the [ProcessInstanceQueryRepresentation](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/activiti-rest-api/docs/ProcessInstanceQueryRepresentation.md)
- \[[ADF-1716](https://issues.alfresco.com/jira/browse/ADF-1716)] - Process List - processDefinitionKey is not part of the [`ProcessInstanceQueryRepresentation`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/activiti-rest-api/docs/ProcessInstanceQueryRepresentation.md)
- \[[ADF-1718](https://issues.alfresco.com/jira/browse/ADF-1718)] - [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) should not be displayed on Search Results page when there are no results
- \[[ADF-1720](https://issues.alfresco.com/jira/browse/ADF-1720)] - Date-time picker is not working properly with other Date Display Format than default
- \[[ADF-1722](https://issues.alfresco.com/jira/browse/ADF-1722)] - [object Object] appears in People control when selecting the same name
@ -738,7 +738,7 @@ Release Notes - Apps Development Framework - Version 2.0.
- \[[ADF-1824](https://issues.alfresco.com/jira/browse/ADF-1824)] - Moment js security issue
- \[[ADF-1825](https://issues.alfresco.com/jira/browse/ADF-1825)] - [`Form`](../../lib/process-services/task-list/models/form.model.ts) field in start task no aligned
- \[[ADF-1827](https://issues.alfresco.com/jira/browse/ADF-1827)] - 'Object Object' displayed on search results page
- \[[ADF-1829](https://issues.alfresco.com/jira/browse/ADF-1829)] - [PeopleApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/people.api.ts) - getSiteMembership wrong returned type
- \[[ADF-1829](https://issues.alfresco.com/jira/browse/ADF-1829)] - [`PeopleApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/people.api.ts) - getSiteMembership wrong returned type
- \[[ADF-1830](https://issues.alfresco.com/jira/browse/ADF-1830)] - Cannot access processes or reports
- \[[ADF-1832](https://issues.alfresco.com/jira/browse/ADF-1832)] - [Document List] IE 11 erro on click
- \[[ADF-1835](https://issues.alfresco.com/jira/browse/ADF-1835)] - The pagination on search results page is not working properly
@ -746,7 +746,7 @@ Release Notes - Apps Development Framework - Version 2.0.
- \[[ADF-1839](https://issues.alfresco.com/jira/browse/ADF-1839)] - Login does not switch user preferences
- \[[ADF-1856](https://issues.alfresco.com/jira/browse/ADF-1856)] - Document List - location fails for a user that has granular permissions
- \[[ADF-1859](https://issues.alfresco.com/jira/browse/ADF-1859)] - The [document list component](../content-services/components/document-list.component.md) no longer exports [`ShareDataRow`](../../lib/content-services/document-list/data/share-data-row.model.ts)
- \[[ADF-1860](https://issues.alfresco.com/jira/browse/ADF-1860)] - [NodesApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/nodes.api.ts).getNodeChildren has wrong return type
- \[[ADF-1860](https://issues.alfresco.com/jira/browse/ADF-1860)] - [`NodesApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/nodes.api.ts).getNodeChildren has wrong return type
- \[[ADF-1861](https://issues.alfresco.com/jira/browse/ADF-1861)] - Line breaks not displayed in "Display Text" widget in forms
- \[[ADF-1862](https://issues.alfresco.com/jira/browse/ADF-1862)] - Adf toolbar should get the background color from the theme
- \[[ADF-1865](https://issues.alfresco.com/jira/browse/ADF-1865)] - [Document List] "Empty View" does not wrap long text
@ -782,7 +782,7 @@ Release Notes - Apps Development Framework - Version 2.0.
- \[[ADF-1951](https://issues.alfresco.com/jira/browse/ADF-1951)] - Date widget doesn't display the correct date.
- \[[ADF-1956](https://issues.alfresco.com/jira/browse/ADF-1956)] - Date widget with advanced properties does not display value.
- \[[ADF-1962](https://issues.alfresco.com/jira/browse/ADF-1962)] - getContentThumbnailUrl returns file data instead or URL
- \[[ADF-1963](https://issues.alfresco.com/jira/browse/ADF-1963)] - [ContentApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/content.api.ts) is missing the preview rendition API
- \[[ADF-1963](https://issues.alfresco.com/jira/browse/ADF-1963)] - [`ContentApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/content.api.ts) is missing the preview rendition API
- \[[ADF-1964](https://issues.alfresco.com/jira/browse/ADF-1964)] - [Demo Shell] Max size filter is not switched off.
- \[[ADF-1965](https://issues.alfresco.com/jira/browse/ADF-1965)] - 'Upload file' button is enabled if user does not have permission to upload a file/folder
- \[[ADF-1966](https://issues.alfresco.com/jira/browse/ADF-1966)] - Wrong sort on Document List

View File

@ -324,7 +324,7 @@ Release Notes - Apps Development Framework - Version 2.3.0
- \[[ADF-2442](https://issues.alfresco.com/jira/browse/ADF-2442)] - [Search Service](../../lib/core/services/search.service.ts) has wrong types for the 'search' API
- \[[ADF-2443](https://issues.alfresco.com/jira/browse/ADF-2443)] - Typo in the UserPreferences service
- \[[ADF-2444](https://issues.alfresco.com/jira/browse/ADF-2444)] - CLONE - Incorrect Items per page values on all lists after upgrade to ADF 2.2.0
- \[[ADF-2448](https://issues.alfresco.com/jira/browse/ADF-2448)] - Wrong type definition for [RequestPagination](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/search-rest-api/docs/RequestPagination.md)
- \[[ADF-2448](https://issues.alfresco.com/jira/browse/ADF-2448)] - Wrong type definition for [`RequestPagination`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/search-rest-api/docs/RequestPagination.md)
- \[[ADF-2450](https://issues.alfresco.com/jira/browse/ADF-2450)] - Search api type definition is not defined
- \[[ADF-2454](https://issues.alfresco.com/jira/browse/ADF-2454)] - Login dialog icon and header text not centered correctly
- \[[ADF-2455](https://issues.alfresco.com/jira/browse/ADF-2455)] - Document List does not render thumbnails

View File

@ -338,7 +338,7 @@ Release Notes - Apps Development Framework - Version 2.5.0
] - CLONE - Thumbs.db files are uploading with a folder upload
- \[
[ADF-3289](https://issues.alfresco.com/jira/browse/ADF-3289)
] - [AppsDefinitionApi](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api-legacy/activiti-rest-api/src/api/AppsDefinitionApi.ts) contains two methods with same name and different firms
] - [`AppsDefinitionApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api-legacy/activiti-rest-api/src/api/AppsDefinitionApi.ts) contains two methods with same name and different firms
- \[
[ADF-3292](https://issues.alfresco.com/jira/browse/ADF-3292)
] - CLONE - Filter category should be deselected when user makes a new search query
@ -374,7 +374,7 @@ Release Notes - Apps Development Framework - Version 2.5.0
] - Refresh button is not displayed on the form
- \[
[ADF-3383](https://issues.alfresco.com/jira/browse/ADF-3383)
] - Incorrect datatype for password in [PersonBodyCreate](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/model/personBodyCreate.ts) in index.d.ts
] - Incorrect datatype for password in [`PersonBodyCreate`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/model/personBodyCreate.ts) in index.d.ts
- \[
[ADF-3386](https://issues.alfresco.com/jira/browse/ADF-3386)
] - Task Filters accordion is not expanding / collapsing

View File

@ -382,13 +382,13 @@ Below is the list of JIRA issues that were closed for this release.
- [ADF-3497](https://issues.alfresco.com/jira/browse/ADF-3497) - Facet intervals on search filter
- [ADF-3677](https://issues.alfresco.com/jira/browse/ADF-3677) - [SearchQueryBuilderService](../content-services/services/search-query-builder.service.md) to support highlight
- [ADF-3677](https://issues.alfresco.com/jira/browse/ADF-3677) - [`SearchQueryBuilderService`](../content-services/services/search-query-builder.service.md) to support highlight
- [ADF-3735](https://issues.alfresco.com/jira/browse/ADF-3735) - SSO Login Error for [login component](../core/components/login.component.md)
- [ADF-3798](https://issues.alfresco.com/jira/browse/ADF-3798) - [Demo Shell][aps2] Show Task list related to a Process
- [ADF-4003](https://issues.alfresco.com/jira/browse/ADF-4003) - Add roles filtering to [PeopleCloudComponent](../process-services-cloud/components/people-cloud.component.md)
- [ADF-4003](https://issues.alfresco.com/jira/browse/ADF-4003) - Add roles filtering to [`PeopleCloudComponent`](../process-services-cloud/components/people-cloud.component.md)
- [ADF-4078](https://issues.alfresco.com/jira/browse/ADF-4078) - Fixed headers in the document list
@ -469,7 +469,7 @@ Below is the list of JIRA issues that were closed for this release.
- [ADF-3934](https://issues.alfresco.com/jira/browse/ADF-3934) - [People Cloud Component](../process-services-cloud/components/people-cloud.component.md) - Remove the concept of assignee
- [ADF-3979](https://issues.alfresco.com/jira/browse/ADF-3979) - [GroupCloudComponent](../process-services-cloud/components/group-cloud.component.md) should be able to detect "preSelectGroups" input changes
- [ADF-3979](https://issues.alfresco.com/jira/browse/ADF-3979) - [`GroupCloudComponent`](../process-services-cloud/components/group-cloud.component.md) should be able to detect "preSelectGroups" input changes
- [ADF-3989](https://issues.alfresco.com/jira/browse/ADF-3989) - The list of apps in 'appName' filter is duplicated after switching between saved filters
@ -495,7 +495,7 @@ Below is the list of JIRA issues that were closed for this release.
- [ADF-4154](https://issues.alfresco.com/jira/browse/ADF-4154) - Unit tests failing after upgrade to ADF 3.1.0-beta3
- [ADF-4156](https://issues.alfresco.com/jira/browse/ADF-4156) - Regression in [TaskListComponent](../process-services/components/task-list.component.md) Caused by in-place Date Formatting
- [ADF-4156](https://issues.alfresco.com/jira/browse/ADF-4156) - Regression in [`TaskListComponent`](../process-services/components/task-list.component.md) Caused by in-place Date Formatting
- [ADF-4165](https://issues.alfresco.com/jira/browse/ADF-4165) - ADF 3.0 Not able to login with implicitFlow false
@ -529,7 +529,7 @@ Below is the list of JIRA issues that were closed for this release.
- [ADF-4305](https://issues.alfresco.com/jira/browse/ADF-4305) - DocumentList - CardViewMode - Field values missing in the display.
- [ADF-4313](https://issues.alfresco.com/jira/browse/ADF-4313) - [Demo shell] [Form](../../lib/process-services/task-list/models/form.model.ts) field looks like an editable field in task header after task was completed
- [ADF-4313](https://issues.alfresco.com/jira/browse/ADF-4313) - [Demo shell][form](../../lib/process-services/task-list/models/form.model.ts) field looks like an editable field in task header after task was completed
- [ADF-4316](https://issues.alfresco.com/jira/browse/ADF-4316) - [People component](../process-services/components/people.component.md) table is not well aligned
@ -657,7 +657,7 @@ Below is the list of JIRA issues that were closed for this release.
- [ADF-4120](https://issues.alfresco.com/jira/browse/ADF-4120) - automate ADF-3989 - The list of apps in 'appName' filter is duplicated after switching between saved filters
- [ADF-4126](https://issues.alfresco.com/jira/browse/ADF-4126) - Automate ADF-4003 - Add roles filtering to [PeopleCloudComponent](../process-services-cloud/components/people-cloud.component.md)
- [ADF-4126](https://issues.alfresco.com/jira/browse/ADF-4126) - Automate ADF-4003 - Add roles filtering to [`PeopleCloudComponent`](../process-services-cloud/components/people-cloud.component.md)
- [ADF-4129](https://issues.alfresco.com/jira/browse/ADF-4129) - Automate ADF-4066 - Task doesn't have an assignee when the assignee is empty from Start Task form

View File

@ -73,7 +73,7 @@ This component is responsible to show the form renderer in case the task has a f
For more details refer to the:
- [TaskFormCloudComponent](../process-services-cloud/components/task-form-cloud.component).
- [`TaskFormCloudComponent`](../process-services-cloud/components/task-form-cloud.component.md).
#### Form Cloud
@ -86,9 +86,9 @@ This component is responsible to render the form cloud definition attached to th
</adf-cloud-form>
```
In case the form has an upload widget and the alfresco content has been configured*, the attached file will be stored into the alfresco repositoty.
In case the form has an upload widget and the alfresco content has been configured\*, the attached file will be stored into the alfresco repository.
Note*:
Note\*:
Don't forget to set the `providers` property to `ALL` and `ecmHost` value in the `app.config.json`.
e.g.
@ -100,7 +100,7 @@ e.g.
For more details refer to the:
- [FormCloudComponent](../process-services-cloud/components/form-cloud.component.md).
- [`FormCloudComponent`](../process-services-cloud/components/form-cloud.component.md).
#### New permission template to app list
@ -119,13 +119,12 @@ Cloud form definition selector component is a dropdown that shows all the form p
For more details refer to the:
- [FormDefinitionSelectorCloudComponent](../process-services-cloud/components/form-definition-selector-cloud.component.md).
- [`FormDefinitionSelectorCloudComponent`](../process-services-cloud/components/form-definition-selector-cloud.component.md).
#### Start a standalone task with a form
The start task cloud is now using the `cloud-form-definition-selector` that allows the user to attach a form to a task
### Five more languages available
Starting from ADF 3.2, five more languages are now available, together with the other ten already in the list. The new languages supported are: Danish, Finnish, Swedish, Czech, Polish.

View File

@ -13,14 +13,6 @@ The release can be found on GitHub at [this location](https://github.com/Alfresc
See the [ADF roadmap](../roadmap.md) for details of features planned for future
versions of ADF.
## Contents
- [New package versions](#new-package-versions)
- [Goals for this release](#goals-for-this-release)
- [Fix deployment service](#fix-deployment-service)
- [Localisation](#localisation)
- [References](#references)
## New package versions
"@alfresco/adf-content-services" : "3.2.1"
@ -33,7 +25,6 @@ versions of ADF.
This patch version contain a fix for a changed endpoint in Activiti 7 [Rename alfresco-deployment-service in deployment-service](https://github.com/Alfresco/alfresco-ng2-components/pull/4711/files)
## Localisation
This release includes: French, German, Italian, Spanish, Arabic, Japanese, Dutch, Norwegian (Bokmål), Russian, Danish, Finnish, Swedish, Czech, Polish, Brazilian Portuguese and Simplified Chinese versions.

View File

@ -13,7 +13,7 @@ Github only: true
| [**Adding a new component**](new-component.md) | Basic | In this tutorial, you will learn how to create a component using [Angular CLI](https://cli.angular.io/) within an existing application. |
| [**Adding a new view**](new-view.md) | Beginner | In this tutorial you will learn how to create a new view in your application and how to access it using a defined endpoint. |
| [**Using ADF Components**](using-components.md) | Basic | In this tutorial you will learn how to extend, use and configure ADF Components. |
| [**Basic theming**](basic-theming.md) | Beginner | In this tutorial you will see how to theme an ADF app by modifying the CSS. |
| [**Basic theming**](basic-theming.md) | Beginner | In this tutorial you will see how to theme an ADF app by modifying the CSS. |
| [**Customizing the Login component**](customising-login.md) | Intermediate | In this tutorial you will learn how to customize the [Login component](../core/components/login.component.md) following the technical documentation. |
| [**Working with a Data Table**](working-with-data-table.md) | Intermediate | In this tutorial you will learn how to populate a DataTable component. |
| [**Working with the Nodes API Service**](working-with-nodes-api-service.md) | Intermediate | In this tutorial you will learn how to use the [`NodesApiService`](../core/services/nodes-api.service.md). |

View File

@ -111,7 +111,7 @@ backend services have been tested with each released version of ADF.
### Components retired
| Name | Reason | Alternative |
| -- | -- | -- |
| --- | --- | --- |
| Accordion component | Superseded by Angular `<mat-accordion>` | See the [Angular Expansion Panel](https://material.angular.io/components/expansion/overview#accordion) component for details. |
| Accordion group component | Superseded by Angular `<mat-expansion-panel>` | See the [Angular Expansion Panel](https://material.angular.io/components/expansion/overview#accordion) component for details. |

View File

@ -15,12 +15,10 @@
* limitations under the License.
*/
import { LoginPage } from '@alfresco/adf-testing';
import { LoginPage, NotificationHistoryPage } from '@alfresco/adf-testing';
import { ContentServicesPage } from '../../pages/adf/contentServicesPage';
import { CreateFolderDialog } from '../../pages/adf/dialog/createFolderDialog';
import { NotificationPage } from '../../pages/adf/notificationPage';
import { MetadataViewPage } from '../../pages/adf/metadataViewPage';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
import { browser, Key } from 'protractor';
@ -30,7 +28,7 @@ describe('Create folder directive', function () {
const loginPage = new LoginPage();
const contentServicesPage = new ContentServicesPage();
const createFolderDialog = new CreateFolderDialog();
const notificationPage = new NotificationPage();
const notificationHistoryPage = new NotificationHistoryPage();
const metadataViewPage = new MetadataViewPage();
const acsUser = new AcsUserModel();
@ -91,7 +89,7 @@ describe('Create folder directive', function () {
contentServicesPage.createNewFolder(folderName);
notificationPage.checkNotifyContains('There\'s already a folder with this name. Try a different name.');
notificationHistoryPage.checkNotifyContains('There\'s already a folder with this name. Try a different name.');
});
it('[C260157] Should be possible create a folder under a folder with the same name', () => {

View File

@ -24,7 +24,7 @@ import { browser } from 'protractor';
describe('Notifications Component', () => {
const loginPage = new LoginPage();
const notificationPage = new NotificationPage();
const notificationHistoryPage = new NotificationPage();
const acsUser = new AcsUserModel();
@ -43,74 +43,74 @@ describe('Notifications Component', () => {
await loginPage.loginToContentServicesUsingUserModel(acsUser);
notificationPage.goToNotificationsPage();
notificationHistoryPage.goToNotificationsPage();
notificationPage.enterDurationField(3000);
notificationHistoryPage.enterDurationField(3000);
done();
});
afterEach( () => {
browser.executeScript(`document.querySelector('button[data-automation-id="notification-custom-dismiss-button"]').click();`);
notificationPage.enterDurationField(3000);
notificationHistoryPage.enterDurationField(3000);
});
it('[C279977] Should show notification when the message is not empty and button is clicked', () => {
notificationPage.enterMessageField('Notification test');
notificationPage.clickNotificationButton();
notificationPage.checkNotificationSnackBarIsDisplayedWithMessage('Notification test');
notificationHistoryPage.enterMessageField('Notification test');
notificationHistoryPage.clickNotificationButton();
notificationHistoryPage.checkNotificationSnackBarIsDisplayedWithMessage('Notification test');
});
it('[C279979] Should not show notification when the message is empty and button is clicked', () => {
notificationPage.clearMessage();
notificationPage.clickNotificationButton();
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.clearMessage();
notificationHistoryPage.clickNotificationButton();
notificationHistoryPage.checkNotificationSnackBarIsNotDisplayed();
});
it('[C279978] Should show notification with action when the message is not empty and button is clicked', () => {
notificationPage.enterMessageField('Notification test');
notificationPage.clickActionToggle();
notificationPage.clickNotificationButton();
notificationPage.checkNotificationSnackBarIsDisplayedWithMessage('Notification test');
notificationPage.clickActionButton();
notificationPage.checkActionEvent();
notificationPage.clickActionToggle();
notificationHistoryPage.enterMessageField('Notification test');
notificationHistoryPage.clickActionToggle();
notificationHistoryPage.clickNotificationButton();
notificationHistoryPage.checkNotificationSnackBarIsDisplayedWithMessage('Notification test');
notificationHistoryPage.clickActionButton();
notificationHistoryPage.checkActionEvent();
notificationHistoryPage.clickActionToggle();
});
it('[C279981] Should show notification with action when the message is not empty and custom configuration button is clicked', () => {
notificationPage.enterMessageField('Notification test');
notificationPage.clickNotificationButton();
notificationPage.checkNotificationSnackBarIsDisplayed();
notificationHistoryPage.enterMessageField('Notification test');
notificationHistoryPage.clickNotificationButton();
notificationHistoryPage.checkNotificationSnackBarIsDisplayed();
});
it('[C279987] Should show custom notification during a limited time when a duration is added', () => {
notificationPage.enterMessageField('Notification test');
notificationPage.enterDurationField(1000);
notificationPage.clickNotificationButton();
notificationPage.checkNotificationSnackBarIsDisplayed();
notificationHistoryPage.enterMessageField('Notification test');
notificationHistoryPage.enterDurationField(1000);
notificationHistoryPage.clickNotificationButton();
notificationHistoryPage.checkNotificationSnackBarIsDisplayed();
browser.sleep(1500);
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.checkNotificationSnackBarIsNotDisplayed();
});
it('[C280000] Should show notification with action when the message is not empty and custom button is clicked', () => {
notificationPage.enterMessageField('Notification test');
notificationPage.clickActionToggle();
notificationPage.clickNotificationButton();
notificationPage.checkNotificationSnackBarIsDisplayedWithMessage('Notification test');
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationPage.clickNotificationButton();
notificationPage.clickActionButton();
notificationPage.checkActionEvent();
notificationPage.clickActionToggle();
notificationHistoryPage.enterMessageField('Notification test');
notificationHistoryPage.clickActionToggle();
notificationHistoryPage.clickNotificationButton();
notificationHistoryPage.checkNotificationSnackBarIsDisplayedWithMessage('Notification test');
notificationHistoryPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.clickNotificationButton();
notificationHistoryPage.clickActionButton();
notificationHistoryPage.checkActionEvent();
notificationHistoryPage.clickActionToggle();
});
it('[C280001] Should meet configuration when a custom notification is set', () => {
notificationPage.enterMessageField('Notification test');
notificationPage.enterDurationField(1000);
notificationPage.selectHorizontalPosition('Right');
notificationPage.selectVerticalPosition('Top');
notificationPage.selectDirection('Left to right');
notificationPage.clickNotificationButton();
expect(notificationPage.getConfigObject()).toBe('{"direction": "ltr", "duration": "1000", "horizontalPosition": "right", "verticalPosition": "top"}');
notificationHistoryPage.enterMessageField('Notification test');
notificationHistoryPage.enterDurationField(1000);
notificationHistoryPage.selectHorizontalPosition('Right');
notificationHistoryPage.selectVerticalPosition('Top');
notificationHistoryPage.selectDirection('Left to right');
notificationHistoryPage.clickNotificationButton();
expect(notificationHistoryPage.getConfigObject()).toBe('{"direction": "ltr", "duration": "1000", "horizontalPosition": "right", "verticalPosition": "top"}');
});
});

View File

@ -16,18 +16,16 @@
*/
import { PermissionsPage } from '../../pages/adf/permissionsPage';
import { LoginPage } from '@alfresco/adf-testing';
import { ContentServicesPage } from '../../pages/adf/contentServicesPage';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
import resources = require('../../util/resources');
import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
import { FileModel } from '../../models/ACS/fileModel';
import { UploadActions } from '../../actions/ACS/upload.actions';
import { StringUtil, BrowserActions } from '@alfresco/adf-testing';
import { StringUtil, BrowserActions, LoginPage, NotificationHistoryPage } from '@alfresco/adf-testing';
import { browser } from 'protractor';
import { FolderModel } from '../../models/ACS/folderModel';
import { ViewerPage } from '../../pages/adf/viewerPage';
import { NotificationPage } from '../../pages/adf/notificationPage';
import { MetadataViewPage } from '../../pages/adf/metadataViewPage';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { UploadDialog } from '../../pages/adf/dialog/uploadDialog';
@ -44,7 +42,7 @@ describe('Permissions Component', function () {
const viewerPage = new ViewerPage();
const metadataViewPage = new MetadataViewPage();
const notificationPage = new NotificationPage();
const notificationPage = new NotificationHistoryPage();
const uploadDialog = new UploadDialog();
let fileOwnerUser, filePermissionUser, file;
const fileModel = new FileModel({
@ -300,8 +298,12 @@ describe('Permissions Component', function () {
afterEach(async (done) => {
await uploadActions.deleteFilesOrFolder(alfrescoJsApi, file.entry.id);
try {
await uploadActions.deleteFilesOrFolder(alfrescoJsApi, file.entry.id);
} catch (error) {
}
done();
});
@ -587,7 +589,6 @@ describe('Permissions Component', function () {
permissionsPage.clickPermissionInheritedButton();
notificationPage.checkNotifyContains('You are not allowed to change permissions');
notificationPage.checkNotificationSnackBarIsNotDisplayed();
permissionsPage.clickAddPermissionButton();

View File

@ -23,10 +23,9 @@ import resources = require('../../util/resources');
import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
import { FileModel } from '../../models/ACS/fileModel';
import { UploadActions } from '../../actions/ACS/upload.actions';
import { StringUtil } from '@alfresco/adf-testing';
import { StringUtil, NotificationHistoryPage } from '@alfresco/adf-testing';
import { browser } from 'protractor';
import { ViewerPage } from '../../pages/adf/viewerPage';
import { NotificationPage } from '../../pages/adf/notificationPage';
import CONSTANTS = require('../../util/constants');
import { MetadataViewPage } from '../../pages/adf/metadataViewPage';
import { UploadDialog } from '../../pages/adf/dialog/uploadDialog';
@ -44,7 +43,7 @@ describe('Permissions Component', function () {
const viewerPage = new ViewerPage();
const navigationBarPage = new NavigationBarPage();
const metadataViewPage = new MetadataViewPage();
const notificationPage = new NotificationPage();
const notificationHistoryPage = new NotificationHistoryPage();
const uploadDialog = new UploadDialog();
let folderOwnerUser, consumerUser, siteConsumerUser, contributorUser, managerUser, collaboratorUser;
@ -224,11 +223,11 @@ describe('Permissions Component', function () {
contentServicesPage.metadataContent('Site' + fileModel.name);
notificationPage.checkNotifyContains('You don\'t have access to do this.');
notificationHistoryPage.checkNotifyContains('You don\'t have access to do this.');
contentServicesPage.uploadFile(fileModel.location);
notificationPage.checkNotifyContains('You don\'t have the create permission to upload the content');
notificationHistoryPage.checkNotifyContains('You don\'t have the create permission to upload the content');
});
@ -254,7 +253,7 @@ describe('Permissions Component', function () {
contentServicesPage.metadataContent('Site' + fileModel.name);
notificationPage.checkNotifyContains('You don\'t have access to do this.');
notificationHistoryPage.checkNotifyContains('You don\'t have access to do this.');
contentServicesPage.uploadFile(testFileModel.location).checkContentIsDisplayed(testFileModel.name);

View File

@ -15,7 +15,7 @@
* limitations under the License.
*/
import { LoginPage, BrowserActions, LocalStorageUtil } from '@alfresco/adf-testing';
import { LoginPage, BrowserActions, LocalStorageUtil, NotificationHistoryPage } from '@alfresco/adf-testing';
import { ContentServicesPage } from '../../pages/adf/contentServicesPage';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { ViewerPage } from '../../pages/adf/viewerPage';
@ -38,6 +38,7 @@ describe('Share file', () => {
const shareDialog = new ShareDialog();
const navigationBarPage = new NavigationBarPage();
const viewerPage = new ViewerPage();
const notificationHistoryPage = new NotificationHistoryPage();
const acsUser = new AcsUserModel();
const uploadActions = new UploadActions();
@ -101,7 +102,7 @@ describe('Share file', () => {
contentServicesPage.clickShareButton();
shareDialog.checkDialogIsDisplayed();
shareDialog.clickShareLinkButton();
shareDialog.checkNotificationWithMessage('Link copied to the clipboard');
notificationHistoryPage.checkNotifyContains('Link copied to the clipboard');
});
it('[C286543] Should be possible to close Share dialog', () => {
@ -179,7 +180,7 @@ describe('Share file', () => {
contentServicesPage.clickShareButton();
shareDialog.checkDialogIsDisplayed();
shareDialog.clickShareLinkButton();
shareDialog.checkNotificationWithMessage('Link copied to the clipboard');
notificationHistoryPage.checkNotifyContains('Link copied to the clipboard');
const sharedLink = await shareDialog.getShareLink();
BrowserActions.getUrl(sharedLink);
viewerPage.checkFileNameIsDisplayed(pngFileModel.name);
@ -190,13 +191,13 @@ describe('Share file', () => {
contentServicesPage.clickShareButton();
shareDialog.checkDialogIsDisplayed();
shareDialog.clickShareLinkButton();
shareDialog.checkNotificationWithMessage('Link copied to the clipboard');
notificationHistoryPage.checkNotifyContains('Link copied to the clipboard');
const sharedLink = await shareDialog.getShareLink();
shareDialog.clickCloseButton();
contentServicesPage.clickShareButton();
shareDialog.checkDialogIsDisplayed();
shareDialog.clickShareLinkButton();
shareDialog.checkNotificationWithMessage('Link copied to the clipboard');
notificationHistoryPage.checkNotifyContains('Link copied to the clipboard');
const secondSharedLink = await shareDialog.getShareLink();
expect(sharedLink).toEqual(secondSharedLink);
BrowserActions.getUrl(sharedLink);

View File

@ -17,14 +17,11 @@
import { browser } from 'protractor';
import { StringUtil } from '@alfresco/adf-testing';
import { LoginPage } from '@alfresco/adf-testing';
import { StringUtil, LoginPage, NotificationHistoryPage } from '@alfresco/adf-testing';
import { ContentServicesPage } from '../../pages/adf/contentServicesPage';
import { UploadDialog } from '../../pages/adf/dialog/uploadDialog';
import { UploadToggles } from '../../pages/adf/dialog/uploadToggles';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { NotificationPage } from '../../pages/adf/notificationPage';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
import { FileModel } from '../../models/ACS/fileModel';
@ -45,7 +42,7 @@ describe('Upload - User permission', () => {
let acsUser;
let acsUserTwo;
const navigationBarPage = new NavigationBarPage();
const notificationPage = new NotificationPage();
const notificationHistoryPage = new NotificationHistoryPage();
const emptyFile = new FileModel({
'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name,
@ -169,7 +166,7 @@ describe('Upload - User permission', () => {
contentServicesPage.uploadFile(emptyFile.location);
notificationPage.checkNotifyContains('You don\'t have the create permission to upload the content');
notificationHistoryPage.checkNotifyContains('You don\'t have the create permission to upload the content');
});
xit('[C279916] Should not be allowed to upload a folder in folder with consumer permissions', () => {
@ -194,7 +191,7 @@ describe('Upload - User permission', () => {
contentServicesPage.uploadFolder(folder.location);
notificationPage.checkNotifyContains('You don\'t have the create permission to upload the content');
notificationHistoryPage.checkNotifyContains('You don\'t have the create permission to upload the content');
});
});

View File

@ -21,7 +21,6 @@ import { LoginPage, BrowserActions } from '@alfresco/adf-testing';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { VersionManagePage } from '../../pages/adf/versionManagerPage';
import { UploadDialog } from '../../pages/adf/dialog/uploadDialog';
import { NotificationPage } from '../../pages/adf/notificationPage';
import { ContentServicesPage } from '../../pages/adf/contentServicesPage';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
@ -34,7 +33,7 @@ import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
import { UploadActions } from '../../actions/ACS/upload.actions';
import { NodeActions } from '../../actions/ACS/node.actions';
import { StringUtil } from '@alfresco/adf-testing';
import { StringUtil, NotificationHistoryPage } from '@alfresco/adf-testing';
import CONSTANTS = require('../../util/constants');
describe('Version component permissions', () => {
@ -43,7 +42,7 @@ describe('Version component permissions', () => {
const versionManagePage = new VersionManagePage();
const navigationBarPage = new NavigationBarPage();
const uploadDialog = new UploadDialog();
const notificationPage = new NotificationPage();
const notificationHistoryPage = new NotificationHistoryPage();
const contentServices = new ContentServicesPage();
let site;
@ -198,7 +197,7 @@ describe('Version component permissions', () => {
it('[C277197] Should a user with Consumer permission not be able to upload a new version for a file with different creator', () => {
contentServices.versionManagerContent(differentCreatorFile.name);
notificationPage.checkNotifyContains(`You don't have access to do this`);
notificationHistoryPage.checkNotifyContains(`You don't have access to do this`);
});
it('[C277201] Should a user with Consumer permission not be able to upload a new version for a locked file', () => {
@ -259,7 +258,7 @@ describe('Version component permissions', () => {
it('[C277198] Should a user with Contributor permission not be able to upload a new version for a file with different creator', () => {
contentServices.versionManagerContent(differentCreatorFile.name);
notificationPage.checkNotifyContains(`You don't have access to do this`);
notificationHistoryPage.checkNotifyContains(`You don't have access to do this`);
});
it('[C277202] Should be disabled the option for a locked file', () => {

View File

@ -15,7 +15,7 @@
* limitations under the License.
*/
import { LoginPage } from '@alfresco/adf-testing';
import { LoginPage, NotificationHistoryPage } from '@alfresco/adf-testing';
import { DataTablePage } from '../../pages/adf/demo-shell/dataTablePage';
import { DataTableComponentPage } from '@alfresco/adf-testing';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
@ -23,7 +23,6 @@ import { browser } from 'protractor';
import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { NotificationPage } from '../../pages/adf/notificationPage';
import { DropActions } from '../../actions/drop.actions';
import resources = require('../../util/resources');
import { FileModel } from '../../models/ACS/fileModel';
@ -37,7 +36,7 @@ describe('Datatable component', () => {
const acsUser = new AcsUserModel();
const navigationBarPage = new NavigationBarPage();
const dataTableComponent = new DataTableComponentPage();
const notificationPage = new NotificationPage();
const notificationHistoryPage = new NotificationHistoryPage();
const dragAndDrop = new DropActions();
const pngFile = new FileModel({
'name': resources.Files.ADF_DOCUMENTS.PNG.file_name,
@ -118,23 +117,23 @@ describe('Datatable component', () => {
dataTablePage.mouseOverNameColumn('Name 2');
dataTablePage.dataTable.copyContentTooltipIsNotDisplayed();
dataTablePage.clickOnNameColumn('Name 2');
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.checkNotifyNotContains('Name 2');
});
it('[C307046] No tooltip is displayed when hover over a column that has default value for copyContent property', () => {
dataTablePage.mouseOverCreatedByColumn('Created One');
dataTablePage.dataTable.copyContentTooltipIsNotDisplayed();
dataTablePage.clickOnCreatedByColumn('Created One');
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.checkNotifyNotContains('Created One');
});
it('[C307040] A column value with copyContent set to true is copied when clicking on it', () => {
dataTablePage.mouseOverIdColumn('1');
expect(dataTablePage.getCopyContentTooltip()).toEqual('Click to copy');
dataTablePage.clickOnIdColumn('1');
notificationPage.checkNotifyContains('Text copied to clipboard');
notificationHistoryPage.checkNotifyContains('Text copied to clipboard');
dataTablePage.clickOnIdColumn('2');
notificationPage.checkNotifyContains('Text copied to clipboard');
notificationHistoryPage.checkNotifyContains('Text copied to clipboard');
dataTablePage.pasteClipboard();
expect(dataTablePage.getClipboardInputText()).toEqual('2');
});
@ -150,23 +149,23 @@ describe('Datatable component', () => {
copyContentDataTablePage.mouseOverNameColumn('Second');
copyContentDataTablePage.dataTable.copyContentTooltipIsNotDisplayed();
copyContentDataTablePage.clickOnNameColumn('Second');
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.checkNotifyNotContains('Second');
});
it('[C307075] No tooltip is displayed when hover over a column that has default value for copyContent property', () => {
copyContentDataTablePage.mouseOverCreatedByColumn('Created one');
copyContentDataTablePage.dataTable.copyContentTooltipIsNotDisplayed();
copyContentDataTablePage.clickOnCreatedByColumn('Created one');
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.checkNotifyNotContains('Created One');
});
it('[C307073] A column value with copyContent set to true is copied when clicking on it', () => {
copyContentDataTablePage.mouseOverIdColumn('1');
expect(copyContentDataTablePage.getCopyContentTooltip()).toEqual('Click to copy');
copyContentDataTablePage.clickOnIdColumn('1');
notificationPage.checkNotifyContains('Text copied to clipboard');
notificationHistoryPage.checkNotifyContains('Text copied to clipboard');
copyContentDataTablePage.clickOnIdColumn('2');
notificationPage.checkNotifyContains('Text copied to clipboard');
notificationHistoryPage.checkNotifyContains('Text copied to clipboard');
copyContentDataTablePage.pasteClipboard();
expect(copyContentDataTablePage.getClipboardInputText()).toEqual('2');
});
@ -175,7 +174,7 @@ describe('Datatable component', () => {
dataTablePage.mouseOverIdColumn('1');
expect(dataTablePage.getCopyContentTooltip()).toEqual('Click to copy');
dataTablePage.clickOnIdColumn('1');
notificationPage.checkNotifyContains('Text copied to clipboard');
notificationHistoryPage.checkNotifyContains('Text copied to clipboard');
dataTablePage.pasteClipboard();
expect(dataTablePage.getClipboardInputText()).toEqual('1');
});
@ -185,7 +184,7 @@ describe('Datatable component', () => {
copyContentDataTablePage.mouseOverJsonColumn(2);
expect(copyContentDataTablePage.getCopyContentTooltip()).toEqual('Click to copy');
copyContentDataTablePage.clickOnJsonColumn(2);
notificationPage.checkNotifyContains('Text copied to clipboard');
notificationHistoryPage.checkNotifyContains('Text copied to clipboard');
copyContentDataTablePage.pasteClipboard();
expect(copyContentDataTablePage.getClipboardInputText()).toContain(jsonValue);
});
@ -201,12 +200,11 @@ describe('Datatable component', () => {
it('[C307984] Should trigger the event handling header-drop and cell-drop', () => {
const dragAndDropHeader = dragAndDropDataTablePage.getDropTargetIdColumnHeader();
dragAndDrop.dropFile(dragAndDropHeader, pngFile.location);
notificationPage.checkNotifyContains('Dropped data on [ id ] header');
notificationPage.checkNotificationSnackBarIsNotDisplayed();
notificationHistoryPage.checkNotifyContains('Dropped data on [ id ] header');
const dragAndDropCell = dragAndDropDataTablePage.getDropTargetIdColumnCell(1);
dragAndDrop.dropFile(dragAndDropCell, pngFile.location);
notificationPage.checkNotifyContains('Dropped data on [ id ] cell');
notificationHistoryPage.checkNotifyContains('Dropped data on [ id ] cell');
});
});
});

View File

@ -55,12 +55,17 @@ describe('Login component - SSO', () => {
describe('SSO Login Error for login component', () => {
it('[C299205] Should display the login error message when the SSO identity service is wrongly configured', async () => {
await settingsPage.setProviderEcmSso(browser.params.testConfig.adf.url,
afterEach(() => {
browser.executeScript('window.sessionStorage.clear();');
browser.executeScript('window.localStorage.clear();');
});
it('[C299205] Should display the login error message when the SSO identity service is wrongly configured', () => {
settingsPage.setProviderEcmSso(browser.params.testConfig.adf.url,
'http://aps22/auth/realms/alfresco',
browser.params.testConfig.adf.hostIdentity, false, true, 'alfresco');
await loginSSOPage.clickOnSSOButton();
await loginSSOPage.checkLoginErrorIsDisplayed();
loginSSOPage.clickOnSSOButton();
loginSSOPage.checkLoginErrorIsDisplayed();
expect(loginSSOPage.getLoginErrorMessage()).toContain('SSO Authentication server unreachable');
});
});

View File

@ -7,19 +7,20 @@ let targetProxy = (PROXY_HOST_ADF || HOST);
let fallback = require('connect-history-api-fallback');
module.exports = {
ghostMode : false,
'port': 4200,
open: false,
server: {
middleware: {
1: proxy('/alfresco', {
target: targetProxy,
"target": targetProxy,
changeOrigin: true,
pathRewrite: {
"^/alfresco/alfresco": ""
}
}),
2: proxy('/activiti-app', {
target: targetProxy,
"target": targetProxy,
changeOrigin: true,
"pathRewrite": {
"^/activiti-app/activiti-app": ""

View File

@ -172,7 +172,7 @@ export class DataTablePage {
}
clickOnJsonColumn(rowNumber) {
return this.dataTable.clickElement(this.dataTable.getCellByRowNumberAndColumnName(rowNumber - 1, this.columns.json));
return BrowserActions.click(this.dataTable.getCellByRowNumberAndColumnName(rowNumber - 1, this.columns.json));
}
clickOnNameColumn(name) {

View File

@ -164,6 +164,7 @@ export class TaskListDemoPage {
}
clickResetButton() {
BrowserActions.closeMenuAndDialogs();
BrowserActions.click(this.resetButton);
}

View File

@ -83,12 +83,6 @@ export class ShareDialog {
BrowserVisibility.waitUntilElementIsPresent(this.shareToggleDisabled);
}
checkNotificationWithMessage(message) {
BrowserVisibility.waitUntilElementIsPresent(
element(by.cssContainingText('simple-snack-bar', message))
);
}
dialogIsClosed() {
BrowserVisibility.waitUntilElementIsStale(this.shareDialog);
}

View File

@ -30,8 +30,7 @@ export class FiltersPage {
goToFilter(filterName) {
BrowserActions.closeMenuAndDialogs();
const filter = element(by.css(`span[data-automation-id="${filterName}_filter"]`));
BrowserActions.click(filter);
BrowserActions.clickExecuteScript(`span[data-automation-id="${filterName}_filter"]`);
return this;
}

View File

@ -139,6 +139,7 @@ export class TaskDetailsPage {
}
clickForm() {
BrowserActions.closeMenuAndDialogs();
BrowserActions.click(this.formNameField);
}

View File

@ -115,7 +115,7 @@ describe('Attachment list action menu for processes', () => {
viewerPage.checkFileNameIsDisplayed(pngFile.name);
viewerPage.clickCloseButton();
browser.sleep(10000);
processFiltersPage.clickRunningFilterButton();
processFiltersPage.selectFromProcessList(processName.active);
@ -140,7 +140,6 @@ describe('Attachment list action menu for processes', () => {
attachmentListPage.clickAttachFileButton(pngFile.location);
processDetailsPage.clickCancelProcessButton();
browser.sleep(10000);
processFiltersPage.clickCompletedFilterButton();
processDetailsPage.checkProcessTitleIsDisplayed();

View File

@ -0,0 +1 @@
{"id":"process-c5040521-f596-4748-b3c5-15c8b9868906","extensions":{"properties":{"7cf99919-ca35-41a5-a7b0-289e05d44604":{"id":"7cf99919-ca35-41a5-a7b0-289e05d44604","name":"nameString","type":"string","required":true,"value":"string"},"059e303d-07d6-4fbc-9121-557419db3ca8":{"id":"059e303d-07d6-4fbc-9121-557419db3ca8","name":"name","type":"date","required":true,"value":"date"}},"mappings":{}}}

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://bpmn.io/schema/bpmn" id="sample-diagram" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<process id="process-c5040521-f596-4748-b3c5-15c8b9868906" name="processwithvariables" isExecutable="true">
<startEvent id="StartEvent_1"></startEvent>
<sequenceFlow id="SequenceFlow_0yx7uuw" sourceRef="StartEvent_1" targetRef="Task_13kpt3a"></sequenceFlow>
<userTask id="Task_13kpt3a" name="taskVariable"></userTask>
<endEvent id="EndEvent_1whqpi5"></endEvent>
<sequenceFlow id="SequenceFlow_1a3uiw2" sourceRef="Task_13kpt3a" targetRef="EndEvent_1whqpi5"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_process-c5040521-f596-4748-b3c5-15c8b9868906">
<bpmndi:BPMNPlane bpmnElement="process-c5040521-f596-4748-b3c5-15c8b9868906" id="BPMNPlane_process-c5040521-f596-4748-b3c5-15c8b9868906">
<bpmndi:BPMNShape bpmnElement="StartEvent_1" id="BPMNShape_StartEvent_1">
<omgdc:Bounds height="36.0" width="36.0" x="412.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_13kpt3a" id="BPMNShape_Task_13kpt3a">
<omgdc:Bounds height="80.0" width="100.0" x="498.0" y="218.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="EndEvent_1whqpi5" id="BPMNShape_EndEvent_1whqpi5">
<omgdc:Bounds height="36.0" width="36.0" x="648.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_0yx7uuw" id="BPMNEdge_SequenceFlow_0yx7uuw">
<omgdi:waypoint x="448.0" y="258.0"></omgdi:waypoint>
<omgdi:waypoint x="498.0" y="258.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1a3uiw2" id="BPMNEdge_SequenceFlow_1a3uiw2">
<omgdi:waypoint x="598.0" y="258.0"></omgdi:waypoint>
<omgdi:waypoint x="648.0" y="258.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@ -0,0 +1 @@
{"id":"process-75651812-d60b-4a4c-892f-55eb095705c8","extensions":{"properties":{},"mappings":{}}}

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://bpmn.io/schema/bpmn" id="sample-diagram" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<process id="process-75651812-d60b-4a4c-892f-55eb095705c8" name="simpleProcess" isExecutable="true">
<startEvent id="StartEvent_1"></startEvent>
<sequenceFlow id="SequenceFlow_0jdd7i3" sourceRef="StartEvent_1" targetRef="Task_1gp4t4s"></sequenceFlow>
<userTask id="Task_1gp4t4s" name="taskSimple"></userTask>
<endEvent id="EndEvent_05442a5"></endEvent>
<sequenceFlow id="SequenceFlow_00wy043" sourceRef="Task_1gp4t4s" targetRef="EndEvent_05442a5"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_process-75651812-d60b-4a4c-892f-55eb095705c8">
<bpmndi:BPMNPlane bpmnElement="process-75651812-d60b-4a4c-892f-55eb095705c8" id="BPMNPlane_process-75651812-d60b-4a4c-892f-55eb095705c8">
<bpmndi:BPMNShape bpmnElement="StartEvent_1" id="BPMNShape_StartEvent_1">
<omgdc:Bounds height="36.0" width="36.0" x="412.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_1gp4t4s" id="BPMNShape_Task_1gp4t4s">
<omgdc:Bounds height="80.0" width="100.0" x="498.0" y="218.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="EndEvent_05442a5" id="BPMNShape_EndEvent_05442a5">
<omgdc:Bounds height="36.0" width="36.0" x="648.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_0jdd7i3" id="BPMNEdge_SequenceFlow_0jdd7i3">
<omgdi:waypoint x="448.0" y="258.0"></omgdi:waypoint>
<omgdi:waypoint x="498.0" y="258.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_00wy043" id="BPMNEdge_SequenceFlow_00wy043">
<omgdi:waypoint x="598.0" y="258.0"></omgdi:waypoint>
<omgdi:waypoint x="648.0" y="258.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

View File

@ -0,0 +1 @@
{"name":"simpleapp","version":"1","description":""}

View File

@ -19,7 +19,7 @@ const HOST_SSO = process.env.URL_HOST_SSO_ADF;
const HOST_IDENTITY = process.env.URL_HOST_IDENTITY;
const TIMEOUT = parseInt(process.env.TIMEOUT, 10);
const PROXY = process.env.PROXY_HOST_ADF;
const DEBUG = process.env.DEBUG;
const LOG = process.env.LOG;
const BPM_HOST = process.env.URL_HOST_BPM_ADF || "bpm";
const OAUTH_HOST = process.env.URL_HOST_SSO_ADF || "keycloak";
const OAUTH_CLIENDID = process.env.OAUTH_CLIENDID || "activiti";
@ -49,7 +49,7 @@ const appConfig = {
}
};
if (DEBUG) {
if (LOG) {
console.log('======= test.config.js hostBPM ====== ');
console.log('hostBPM : ' + (HOST_BPM || PROXY || HOST));
console.log('EMAIL : ' + (EMAIL));
@ -125,7 +125,7 @@ module.exports = {
baseUrl = HOST;
}
if (DEBUG) {
if (LOG) {
console.log('hostSso baseUrl : ' + baseUrl);
}
@ -145,7 +145,7 @@ module.exports = {
baseUrl = HOST;
}
if (DEBUG) {
if (LOG) {
console.log('hostIdentity baseUrl : ' + baseUrl);
}

24
lib/cli/README.md Normal file
View File

@ -0,0 +1,24 @@
# Alfresco ADF Cli
## The Goal of ADF CLI
The ADF CLI manages, builds , doc and test your ADF Application projects.
## Installation
To get started follow these instructions:
``sh
npm install aadf-cli -g
``
### License Check
Move in the folder where you have your pacakge.json and run the command:
```bash
adf-license
```

View File

@ -1,20 +1,20 @@
#!/usr/bin/env node
var path = require('path');
var fs = require('fs');
var checker = require('license-checker');
var spdxCodes = require('spdx-license-list');
var ejs = require('ejs');
var program = require('commander');
var spdxCodes = require('spdx-license-list');
var startPath = path.resolve('.');
var templatePath = path.resolve(__dirname, 'templates', 'licensePage.ejs');
const nonStandardLicenses = {
"public domain": "PDDL-1.0",
"apache": "Apache-2.0",
"bsd": "BSD-2-Clause"
}
};
const missingRepos = {
"@alfresco/adf-testing": "https://github.com/Alfresco/alfresco-ng2-components",
@ -26,37 +26,42 @@ const missingRepos = {
"adf-monaco-extension": "https://github.com/eromano/aca-monaco-extension",
"indexof": "https://github.com/component/indexof",
"rxjs-compat": "https://github.com/ReactiveX/rxjs/tree/master/compat",
}
};
program
.usage('<versionNumber>')
.parse(process.argv);
.usage('<versionNumber>')
.parse(process.argv);
console.log(`Checking ${startPath}`);
var packageJson = JSON.parse(fs.readFileSync(path.resolve('./','package.json')), 'utf8');
if (!packageJson) {
console.error('Move in the path where you have the package.json');
return;
}
console.log(path.resolve('./','package.json'));
checker.init({
start: startPath,
start: './',
production: true,
failOn: "GPL"
}, function(err, packages) {
failOn: 'GPL'
}, function (err, packages) {
if (err) {
console.log(err);
} else {
//console.log(JSON.stringify(packages));
for (var packageName in packages) {
var pack = packages[packageName];
pack['licenseExp'] = pack['licenses']
.replace(/\*/, '')
.replace(/[a-zA-Z0-9\-\.]+/g, match => {
var lowerMatch = match.toLowerCase();
.replace(/\*/, '')
.replace(/[a-zA-Z0-9\-\.]+/g, match => {
var lowerMatch = match.toLowerCase();
if ((lowerMatch !== 'and') && (lowerMatch !== 'or') && (lowerMatch !== 'with')) {
return licenseWithMDLinks(match);
} else {
return match;
}
});
if ((lowerMatch !== 'and') && (lowerMatch !== 'or') && (lowerMatch !== 'with')) {
return licenseWithMDLinks(match);
} else {
return match;
}
});
if (!pack['repository']) {
var lastAtSignPos = packageName.lastIndexOf('@');
@ -68,14 +73,16 @@ checker.init({
}
}
ejs.renderFile(templatePath, {packages: packages, projVersion: program.args[0]}, {}, (err, mdText) => {
ejs.renderFile(templatePath, {
packages: packages,
projVersion: packageJson.version,
projName: packageJson.description
}, {}, (err, mdText) => {
if (err) {
console.log(err);
} else {
//console.log(mdText);
var licenseFilePath = path.resolve('.', 'docs', 'license-info', `license-info-${program.args[0]}.md`)
fs.writeFileSync(licenseFilePath, mdText);
console.log(`Wrote license list at ${licenseFilePath}`);
fs.writeFileSync(`license-info-${packageJson.version}.md`, mdText);
console.log(`Wrote license`);
}
});
}

View File

@ -0,0 +1,28 @@
---
Title: License info, <%= projName %> <%= projVersion %>
---
# License information for <%= projName %> <%= projVersion %>
This page lists all third party libraries that ADF <%= projVersion %> depends on.
## Libraries
| Name | Version | License |
| --- | --- | --- |
<% for (var packageName in packages) {
var lastAtSignPos = packageName.lastIndexOf('@');
var name = packageName.substring(0, lastAtSignPos);
var version = packageName.substring(lastAtSignPos + 1);
var pack = packages[packageName];
var licenses = pack['licenseExp'] || 'N/A';
var repo = pack['repository'];
var linkedName = name;
if (repo) {
linkedName = `[${name}](${repo})`
}
-%>
| <%= linkedName %> | <%= version %> | <%= licenses %> |
<% } %>

402
lib/cli/package-lock.json generated Normal file
View File

@ -0,0 +1,402 @@
{
"name": "@alfresco/adf-cli",
"version": "3.2.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
}
},
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
},
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"requires": {
"ms": "^2.1.1"
}
},
"debuglog": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
"integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI="
},
"dezalgo": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
"integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
"requires": {
"asap": "^2.0.0",
"wrappy": "1"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"glob": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
},
"license-checker": {
"version": "25.0.1",
"resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz",
"integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==",
"requires": {
"chalk": "^2.4.1",
"debug": "^3.1.0",
"mkdirp": "^0.5.1",
"nopt": "^4.0.1",
"read-installed": "~4.0.3",
"semver": "^5.5.0",
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0",
"spdx-satisfies": "^4.0.0",
"treeify": "^1.1.0"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": {
"minimist": "0.0.8"
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
},
"nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"requires": {
"abbrev": "1",
"osenv": "^0.1.4"
}
},
"normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"requires": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"requires": {
"wrappy": "1"
}
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"requires": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
},
"read-installed": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz",
"integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=",
"requires": {
"debuglog": "^1.0.1",
"graceful-fs": "^4.1.2",
"read-package-json": "^2.0.0",
"readdir-scoped-modules": "^1.0.0",
"semver": "2 || 3 || 4 || 5",
"slide": "~1.1.3",
"util-extend": "^1.0.1"
}
},
"read-package-json": {
"version": "2.0.13",
"resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz",
"integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==",
"requires": {
"glob": "^7.1.1",
"graceful-fs": "^4.1.2",
"json-parse-better-errors": "^1.0.1",
"normalize-package-data": "^2.0.0",
"slash": "^1.0.0"
}
},
"readdir-scoped-modules": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz",
"integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=",
"requires": {
"debuglog": "^1.0.1",
"dezalgo": "^1.0.0",
"graceful-fs": "^4.1.2",
"once": "^1.3.0"
}
},
"resolve": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
"integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
"requires": {
"path-parse": "^1.0.6"
}
},
"semver": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
},
"slash": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
"integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
},
"slide": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
"integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
},
"spdx-compare": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz",
"integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==",
"requires": {
"array-find-index": "^1.0.2",
"spdx-expression-parse": "^3.0.0",
"spdx-ranges": "^2.0.0"
}
},
"spdx-correct": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
"integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
"requires": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-exceptions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
"integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
},
"spdx-expression-parse": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
"integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
"requires": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-license-ids": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
"integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA=="
},
"spdx-license-list": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-5.0.0.tgz",
"integrity": "sha512-N5u9tEFRBUzQDjMKRRt8SHxC/UaqYApPmdF4MMFnICQg3z52onNbnneuro/sWw2rd+eGu9agQOzUbD671Xia7Q=="
},
"spdx-ranges": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.0.tgz",
"integrity": "sha512-OOWghvosfmECc9edy/A9j7GabERmn8bJWHc0J1knVytQtO5Rw7VfxK6CDqmivJhfMJqWhWWUfffNNMPYvyvyQA=="
},
"spdx-satisfies": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz",
"integrity": "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==",
"requires": {
"spdx-compare": "^1.0.0",
"spdx-expression-parse": "^3.0.0",
"spdx-ranges": "^2.0.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
},
"treeify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz",
"integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A=="
},
"util-extend": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz",
"integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8="
},
"validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"requires": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
}
}
}

25
lib/cli/package.json Normal file
View File

@ -0,0 +1,25 @@
{
"name": "@alfresco/adf-cli",
"description": "Alfresco ADF cli and utils",
"version": "3.2.1",
"author": "Alfresco Software, Ltd.",
"bin": {
"adf-license": "./bin/doc/licenseList.js"
},
"repository": {
"type": "git",
"url": "https://github.com/Alfresco/alfresco-ng2-components.git"
},
"bugs": {
"url": "https://github.com/Alfresco/alfresco-ng2-components/issues"
},
"dependencies": {
"spdx-license-list": "^5.0.0",
"license-checker": "^25.0.1",
"commander": "^2.15.1"
},
"keywords": [
"alfresco-component"
],
"license": "Apache-2.0"
}

View File

@ -41,6 +41,7 @@ import { CommentsModule } from './comments/comments.module';
import { ButtonsMenuModule } from './buttons-menu/buttons-menu.module';
import { TemplateModule } from './templates/template.module';
import { ClipboardModule } from './clipboard/clipboard.module';
import { NotificationHistoryModule } from './notification-history/notification-history.module';
import { DirectiveModule } from './directives/directive.module';
import { DialogModule } from './dialogs/dialog.module';
@ -87,7 +88,8 @@ import { DirectionalityConfigService } from './services/directionality-config.se
ButtonsMenuModule,
TemplateModule,
IconModule,
SortingPickerModule
SortingPickerModule,
NotificationHistoryModule
],
exports: [
AboutModule,
@ -119,7 +121,8 @@ import { DirectionalityConfigService } from './services/directionality-config.se
ButtonsMenuModule,
TemplateModule,
SortingPickerModule,
IconModule
IconModule,
NotificationHistoryModule
]
})
export class CoreModule {

View File

@ -5,6 +5,11 @@
"CLAIM": "CLAIM",
"UNCLAIM": "RELEASE",
"START PROCESS": "START PROCESS",
"NOTIFICATION_HISTORY":{
"NO_MESSAGE" : "No messages",
"NOTIFICATIONS": "Notifications",
"MARK_AS_READ": "Mark all as read"
},
"FORM": {
"START_FORM": {
"TITLE": "Start Form"

View File

@ -41,6 +41,7 @@ export * from './directives/index';
export * from './clipboard/index';
export * from './dialogs/index';
export * from './icon/index';
export * from './notification-history/index';
export * from './utils/index';
export * from './interface/index';

View File

@ -22,7 +22,7 @@ import { MatTabChangeEvent } from '@angular/material';
template: '<ng-template><ng-content></ng-content></ng-template>'
})
export class InfoDrawerTabComponent {
/** The title of the tab. */
/** The title of the tab (string or translation key). */
@Input()
label: string = '';
@ -42,7 +42,7 @@ export class InfoDrawerTabComponent {
host: { 'class': 'adf-info-drawer' }
})
export class InfoDrawerComponent {
/** The title of the info drawer. */
/** The title of the info drawer (string or translation key). */
@Input()
title: string|null = null;

View File

@ -0,0 +1,21 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export interface NotificationModel {
dateTime: Date;
message: string;
}

View File

@ -26,3 +26,4 @@ export * from './redirection.model';
export * from './pagination.model';
export * from './oauth-config.model';
export * from './request-pagination.model';
export * from './notification.model';

View File

@ -0,0 +1,18 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './public-api';

View File

@ -0,0 +1,33 @@
<div (keyup)="onKeyPress($event)">
<button mat-button [matMenuTriggerFor]="menu" class="adf-notification-history-menu_button"
id="adf-notification-history-open-button">
<mat-icon>mail_outline</mat-icon>
</button>
<mat-menu #menu="matMenu" [xPosition]="menuPositionX" [yPosition]="menuPositionY"
[overlapTrigger]="false" id="adf-notification-history-menu" class="adf-notification-history-menu">
<div id="adf-notification-history-list">
<mat-list>
<mat-list-item>
<h6 mat-line>{{ 'NOTIFICATION_HISTORY.NOTIFICATIONS' | translate }}</h6>
</mat-list-item>
</mat-list>
<mat-divider></mat-divider>
<mat-list>
<mat-list-item *ngFor="let notification of notifications">
<mat-icon mat-list-icon>{{notification.info? notification.info: 'info'}}</mat-icon>
<h4 mat-line>{{notification.message}}</h4>
<p mat-line> {{notification.dateTime | date}} </p>
</mat-list-item>
<mat-list-item *ngIf="isEmptyNotification()" id="adf-notification-history-component-no-message">
<h4 mat-line>{{ 'NOTIFICATION_HISTORY.NO_MESSAGE' | translate }}</h4>
</mat-list-item>
<mat-action-list *ngIf="!isEmptyNotification()" id="adf-notification-history-mark-as-read">
<button mat-list-item (click)="markAsRead()">{{ 'NOTIFICATION_HISTORY.MARK_AS_READ' | translate }}
</button>
</mat-action-list>
</mat-list>
</div>
</mat-menu>
</div>

View File

@ -0,0 +1,23 @@
.adf {
&-notification-history-menu_button.mat-button {
margin-right: 0;
border-radius: 90%;
padding: 0;
min-width: 40px;
height: 40px;
}
}
@media only screen and (min-device-width: 480px) {
.mat-menu-panel.adf-notification-history-menu {
max-height: 450px;
min-width: 450px;
overflow: auto;
padding: 0;
}
}
.mat-menu-panel.adf-notification-history-menu .mat-menu-content {
padding: 0;
}

View File

@ -0,0 +1,80 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { async, ComponentFixture, inject, TestBed } from '@angular/core/testing';
import { NotificationService } from '../services';
import { setupTestBed } from '../testing/setupTestBed';
import { CoreTestingModule } from '../testing/core.testing.module';
import { NotificationHistoryComponent } from './notification-history.component';
import { OverlayContainer } from '@angular/cdk/overlay';
describe('Notification History Component', () => {
let fixture: ComponentFixture<NotificationHistoryComponent>;
let element: HTMLElement;
let notificationService: NotificationService;
let overlayContainerElement: HTMLElement;
function openNotification() {
fixture.detectChanges();
const button: HTMLButtonElement = <HTMLButtonElement> element.querySelector('#adf-notification-history-open-button');
button.click();
fixture.detectChanges();
}
setupTestBed({
imports: [CoreTestingModule]
});
beforeEach(async(() => {
fixture = TestBed.createComponent(NotificationHistoryComponent);
element = fixture.nativeElement;
notificationService = TestBed.get(NotificationService);
}));
beforeEach(inject([OverlayContainer], (oc: OverlayContainer) => {
overlayContainerElement = oc.getContainerElement();
}));
afterEach(() => {
fixture.destroy();
});
describe('ui ', () => {
it('should empty message be present when there are no notifications in the history', (done) => {
openNotification();
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(overlayContainerElement.querySelector('#adf-notification-history-component-no-message')).toBeDefined();
done();
});
});
it('should message be present and empty message not be present when there are notifications in the history', (done) => {
notificationService.showInfo('Example Message');
openNotification();
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(overlayContainerElement.querySelector('#adf-notification-history-component-no-message')).toBeNull();
expect(overlayContainerElement.querySelector('#adf-notification-history-list').innerHTML).toContain('Example Message');
done();
});
});
});
});

View File

@ -0,0 +1,78 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, Input, ViewChild, OnDestroy } from '@angular/core';
import { NotificationService } from '../services/notification.service';
import { NotificationModel } from '../models/notification.model';
import { MatMenuTrigger } from '@angular/material';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
@Component({
selector: 'adf-notification-history',
styleUrls: ['notification-history.component.scss'],
templateUrl: 'notification-history.component.html'
})
export class NotificationHistoryComponent implements OnDestroy {
onDestroy$ = new Subject<boolean>();
notifications: NotificationModel[] = [];
@ViewChild(MatMenuTrigger)
trigger: MatMenuTrigger;
/** Custom choice for opening the menu at the bottom. Can be `before` or `after`. */
@Input()
menuPositionX: string = 'after';
/** Custom choice for opening the menu at the bottom. Can be `above` or `below`. */
@Input()
menuPositionY: string = 'below';
constructor(
private notificationService: NotificationService) {
this.notificationService.messages
.pipe(takeUntil(this.onDestroy$))
.subscribe((message) => {
this.notifications.push(message);
});
}
isEmptyNotification(): boolean {
return (!this.notifications || this.notifications.length === 0);
}
onKeyPress(event: KeyboardEvent) {
this.closeUserModal(event);
}
markAsRead() {
this.notifications = [];
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
private closeUserModal($event: KeyboardEvent) {
if ($event.keyCode === 27) {
this.trigger.closeMenu();
}
}
}

View File

@ -0,0 +1,38 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { MaterialModule } from '../material.module';
import { NotificationHistoryComponent } from './notification-history.component';
import { TranslateModule } from '@ngx-translate/core';
@NgModule({
imports: [
CommonModule,
MaterialModule,
TranslateModule.forChild()
],
declarations: [
NotificationHistoryComponent
],
exports: [
NotificationHistoryComponent
]
})
export class NotificationHistoryModule {}

View File

@ -0,0 +1,19 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './notification-history.component';
export * from './notification-history.module';

View File

@ -19,6 +19,8 @@ import { Injectable } from '@angular/core';
import { MatSnackBar, MatSnackBarRef, MatSnackBarConfig } from '@angular/material';
import { TranslationService } from './translation.service';
import { AppConfigService, AppConfigValues } from '../app-config/app-config.service';
import { Subject } from 'rxjs';
import { NotificationModel } from '../models/notification.model';
@Injectable({
providedIn: 'root'
@ -27,6 +29,8 @@ export class NotificationService {
DEFAULT_DURATION_MESSAGE: number = 5000;
messages: Subject<NotificationModel> = new Subject();
constructor(private snackBar: MatSnackBar,
private translationService: TranslationService,
private appConfigService: AppConfigService) {
@ -53,6 +57,8 @@ export class NotificationService {
};
}
this.messages.next({ message: translatedMessage, dateTime: new Date });
return this.snackBar.open(translatedMessage, null, config);
}
@ -76,6 +82,8 @@ export class NotificationService {
};
}
this.messages.next({ message: translatedMessage, dateTime: new Date });
return this.snackBar.open(translatedMessage, action, config);
}
@ -89,6 +97,8 @@ export class NotificationService {
protected showMessage(message: string, panelClass: string, action?: string): MatSnackBarRef<any> {
message = this.translationService.instant(message);
this.messages.next({ message: message, dateTime: new Date });
return this.snackBar.open(message, action, {
duration: this.DEFAULT_DURATION_MESSAGE,
panelClass

View File

@ -183,7 +183,6 @@
@media only screen and (min-device-width: 480px) {
.mat-menu-panel.adf-userinfo-menu {
max-height: 450px;
min-width: 4500px;
min-width: 450px;
overflow: auto;
padding: 0;

View File

@ -83,10 +83,12 @@ export class PeopleComponent implements OnInit, AfterViewInit {
}
involveUser(user: UserProcessModel) {
this.peopleProcessService.involveUserWithTask(this.taskId, user.id.toString())
.subscribe(() => {
this.people = [...this.people, user];
}, (error) => this.logService.error('Impossible to involve user with task'));
if (user && user.id) {
this.peopleProcessService.involveUserWithTask(this.taskId, user.id.toString())
.subscribe(() => {
this.people = [...this.people, user];
}, (error) => this.logService.error('Impossible to involve user with task'));
}
}
removeInvolvedUser(user: UserProcessModel) {

View File

@ -339,13 +339,7 @@ export class DataTableComponentPage {
}
clickColumn(columnName, columnValue) {
const column = this.getCellElementByValue(columnName, columnValue);
this.clickElement(column);
return this;
}
clickElement(elem) {
BrowserActions.click(elem);
BrowserActions.clickExecuteScript(`div[title="${columnName}"] div[data-automation-id="text_${columnValue}"] span`);
return this;
}
}

View File

@ -75,17 +75,15 @@ export class LoginPage {
)
);
async goToLoginPage() {
goToLoginPage() {
browser.waitForAngularEnabled(true);
browser.driver.get(this.loginURL);
this.waitForElements();
return this;
return this.waitForElements();
}
waitForElements() {
BrowserVisibility.waitUntilElementIsVisible(this.txtUsername);
BrowserVisibility.waitUntilElementIsVisible(this.txtPassword);
return this;
return BrowserVisibility.waitUntilElementIsVisible(this.txtPassword);
}
enterUsername(username) {
@ -165,7 +163,7 @@ export class LoginPage {
}
async loginToAllUsingUserModel(userModel) {
this.goToLoginPage();
await this.goToLoginPage();
await LocalStorageUtil.clearStorage();
await LocalStorageUtil.setStorageItem('providers', 'ALL');
await LocalStorageUtil.apiReset();
@ -173,7 +171,7 @@ export class LoginPage {
}
async loginToProcessServicesUsingUserModel(userModel) {
this.goToLoginPage();
await this.goToLoginPage();
await LocalStorageUtil.clearStorage();
await LocalStorageUtil.setStorageItem('providers', 'BPM');
await LocalStorageUtil.apiReset();

View File

@ -0,0 +1,52 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { by, element } from 'protractor';
import { BrowserActions } from '../utils/browser-actions';
export class NotificationHistoryPage {
notificationList = element(by.css('#adf-notification-history-list'));
clickNotificationButton() {
BrowserActions.clickExecuteScript('#adf-notification-history-open-button');
}
clickMarkAsRead() {
BrowserActions.click(element(by.css('#adf-notification-history-mark-as-read')));
}
checkNotificationIsPresent(text: string) {
expect(BrowserActions.getText(this.notificationList)).toContain(text);
}
checkNotificationIsNotPresent(text: string) {
expect(BrowserActions.getText(this.notificationList)).not.toContain(text);
}
checkNotifyContains(text: string) {
this.clickNotificationButton();
this.checkNotificationIsPresent(text);
this.clickMarkAsRead();
}
checkNotifyNotContains(text: string) {
this.clickNotificationButton();
this.checkNotificationIsNotPresent(text);
BrowserActions.closeMenuAndDialogs();
}
}

View File

@ -25,5 +25,5 @@ export * from './data-table-component.page';
export * from './pagination.page';
export * from './error.page';
export * from './login.page';
export * from './notification-history.page';
export * from './form/public-api';

59
lib/tsconfig.doc.json Normal file
View File

@ -0,0 +1,59 @@
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"skipLibCheck": false,
"noLib": false,
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"noImplicitAny": false,
"noImplicitReturns": false,
"noImplicitUseStrict": false,
"noFallthroughCasesInSwitch": true,
"removeComments": true,
"declaration": true,
"outDir": "./dist",
"baseUrl" : "./",
"types": ["jasmine"],
"allowSyntheticDefaultImports": true,
"paths": {
"@alfresco/adf-process-services-cloud": ["./process-services-cloud/"],
"@alfresco/adf-testing": ["./testing/"],
"@alfresco/adf-process-services": ["./process-services/"],
"@alfresco/adf-content-services": ["./content-services/"],
"@alfresco/adf-extensions": ["./extensions/"],
"@alfresco/adf-core": ["./core/"],
"@alfresco/adf-insights": ["./analytics"]
},
"lib": [
"es2016",
"dom"
],
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true
},
"exclude": [
"testing",
"*/node_modules",
"*/demo",
"config",
"*/coverage",
"node_modules",
"*/dist",
"dist"
],
"angularCompilerOptions": {
"strictMetadataEmit": false,
"skipTemplateCodegen": true,
"preserveWhitespaces": false
},
"typedocOptions": {
"json": "docs/docs.json",
"exclude": ["**/*.spec.ts", "node_modules"],
"ignoreCompilerErrors": true
}
}

2660
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@
"00": "echo -------------------------------------------- DOC -----------------------------------------------",
"00s": "",
"markdownlint": "markdownlint ./docs",
"docbuild": "node node_modules/typedoc/bin/typedoc --tsconfig lib/tsconfig.json && node tools/doc/buildYamlSourceInfo.js docs/docs.json && node ./tools/doc/docProcessor.js",
"docbuild": "node node_modules/typedoc/bin/typedoc --tsconfig lib/tsconfig.doc.json && node tools/doc/buildYamlSourceInfo.js docs/docs.json && node ./tools/doc/docProcessor.js",
"license-checker": "license-checker --production --failOn 'GPL' > licenses.txt",
"01": "echo -------------------------------------------- Build Lib -----------------------------------------------",
"01s": "",
@ -128,13 +128,13 @@
"@types/jasminewd2": "~2.0.2",
"@types/node": "6.0.90",
"ajv-cli": "^3.0.0",
"bundlesize": "^0.15.3",
"bundlesize": "^0.17.2",
"chalk": "^2.3.2",
"codelyzer": "5.0.0",
"dotenv": "6.2.0",
"commander": "^2.15.1",
"concurrently": "^3.5.1",
"cspell": "^3.1.3",
"dotenv": "6.2.0",
"ejs": "^2.6.1",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"fs-extra": "^4.0.2",
@ -147,8 +147,8 @@
"jasmine-reporters": "^2.3.2",
"jasmine-spec-reporter": "~4.2.1",
"jasmine2-protractor-utils": "1.1.3",
"js-yaml": "^3.12.0",
"karma": "~2.0.0",
"js-yaml": "^3.13.1",
"karma": "^4.1.0",
"karma-chrome-launcher": "~2.2.0",
"karma-cli": "~1.0.1",
"karma-coverage": "^1.1.2",
@ -160,9 +160,9 @@
"karma-remap-istanbul": "0.6.0",
"karma-systemjs": "0.16.0",
"license-checker": "^25.0.1",
"lite-server": "^2.4.0",
"lint-staged": "^8.1.7",
"markdownlint-cli": "^0.12.0",
"lite-server": "^2.4.0",
"markdownlint-cli": "^0.16.0",
"mdast-util-compact": "^1.0.1",
"mdast-util-heading-range": "^2.1.0",
"mdast-util-toc": "^2.0.1",
@ -172,6 +172,7 @@
"ng-packagr": "4.7.1",
"node-sass": "4.9.2",
"protractor": "^5.4.0",
"protractor-browser-logs": "^1.0.423",
"protractor-html-reporter-2": "^1.0.4",
"protractor-retry": "^1.2.0",
"raw-loader": "0.5.1",

View File

@ -33,9 +33,10 @@ let MAXINSTANCES = process.env.MAXINSTANCES || 1;
let TIMEOUT = parseInt(process.env.TIMEOUT, 10);
let SAVE_SCREENSHOT = (process.env.SAVE_SCREENSHOT == 'true');
let LIST_SPECS = process.env.LIST_SPECS || [];
let LOG = process.env.LOG ? true : false;
let arraySpecs = [];
if (process.env.DEBUG) {
if (LOG) {
console.log('======= PROTRACTOR CONFIGURATION ====== ');
console.log('SAVE_SCREENSHOT : ' + SAVE_SCREENSHOT);
console.log('BROWSER_RUN : ' + BROWSER_RUN);
@ -83,7 +84,7 @@ let buildNumber = () => {
return process.env.TRAVIS_BUILD_NUMBER;
};
let saveScreenshots = async function (alfrescoJsApi, retryCount) {
let uploadScreenshot = async function (alfrescoJsApi, retryCount) {
let files = fs.readdirSync(path.join(__dirname, './e2e-output/screenshots'));
if (files && files.length > 0) {
@ -132,7 +133,7 @@ let saveScreenshots = async function (alfrescoJsApi, retryCount) {
}
};
let saveReport = async function (filenameReport, alfrescoJsApi) {
let uploadReport = async function (alfrescoJsApi, filenameReport) {
let pathFile = path.join(__dirname, './e2e-output/junit-report/html', filenameReport + '.html');
let reportFile = fs.createReadStream(pathFile);
@ -176,6 +177,72 @@ let saveReport = async function (filenameReport, alfrescoJsApi) {
}
};
let browserLogErrorPrint = function () {
if (process.env.LOG) {
var browserLogs = require('protractor-browser-logs'),
logs = browserLogs(browser);
global.logs = logs;
beforeEach(function () {
logs.reset();
// You can put here all expected generic expectations.
logs.ignore('favicon.ico');
logs.ignore('favicon.ico');
logs.ignore('favicon-96x96.png');
logs.ignore(logs.or(logs.INFO, logs.DEBUG));
});
afterEach(async () => {
let url = await browser.getCurrentUrl();
return logs.verify();
});
}
};
let saveReport = async function (alfrescoJsApi, retryCount) {
let filenameReport = `ProtractorTestReport-${FOLDER}-${retryCount}`;
let output = '';
let savePath = `${projectRoot}/e2e-output/junit-report/`;
let temporaryHtmlPath = savePath + 'html/temporaryHtml/';
let lastFileName = '';
let files = fs.readdirSync(savePath);
if (files && files.length > 0) {
for (const fileName of files) {
const testConfigReport = {
reportTitle: 'Protractor Test Execution Report',
outputPath: temporaryHtmlPath,
outputFilename: Math.random().toString(36).substr(2, 5) + filenameReport,
};
let filePath = `${projectRoot}/e2e-output/junit-report/` + fileName;
new htmlReporter().from(filePath, testConfigReport);
lastFileName = testConfigReport.outputFilename;
}
}
let lastHtmlFile = temporaryHtmlPath + lastFileName + '.html';
if (!(fs.lstatSync(lastHtmlFile).isDirectory())) {
output = output + fs.readFileSync(lastHtmlFile);
}
let fileName = savePath + 'html/' + filenameReport + '.html';
fs.writeFileSync(fileName, output, 'utf8');
await uploadReport(alfrescoJsApi, filenameReport);
rimraf(`${projectRoot}/e2e-output/screenshots/`, function () {
console.log('done delete screenshot');
});
};
exports.config = {
allScriptsTimeout: TIMEOUT,
@ -184,6 +251,11 @@ exports.config = {
useAllAngular2AppRoots: true,
capabilities: {
loggingPrefs: {
browser: 'ALL' // "OFF", "SEVERE", "WARNING", "INFO", "CONFIG", "FINE", "FINER", "FINEST", "ALL".
},
browserName: 'chrome',
shardTestFiles: true,
@ -219,7 +291,7 @@ exports.config = {
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
defaultTimeoutInterval: 120000,
print: function () {
}
},
@ -241,11 +313,21 @@ exports.config = {
screenshotPath: `${projectRoot}/e2e-output/screenshots/`
}],
postTest(results) {
browser.manage().logs()
.get('browser').then(function (browserLog) {
console.log('log: ' +
require('util').inspect(browserLog));
});
retry.onCleanUp(results);
},
onCleanUp(results) {
retry.onCleanUp(results);
},
onPrepare() {
browserLogErrorPrint();
retry.onPrepare();
@ -281,6 +363,7 @@ exports.config = {
});
jasmine.getEnv().addReporter(junitReporter);
return browser.driver.executeScript(disableCSSAnimation);
function disableCSSAnimation() {
@ -301,78 +384,48 @@ exports.config = {
},
beforeLaunch: function () {
if (SAVE_SCREENSHOT) {
let reportsFolder = `${projectRoot}/e2e-output/junit-report/`;
let reportsFolder = `${projectRoot}/e2e-output/junit-report/`;
fs.exists(reportsFolder, function (exists, error) {
if (exists) {
rimraf(reportsFolder, function (err) {
});
}
if (error) {
console.error('[ERROR] fs', error);
}
});
fs.exists(reportsFolder, function (exists, error) {
if (exists) {
rimraf(reportsFolder, function (err) {
});
}
if (error) {
console.error('[ERROR] fs', error);
}
});
}
},
afterLaunch: async function () {
if (SAVE_SCREENSHOT) {
let retryCount = 1;
if (argv.retry) {
retryCount = ++argv.retry;
}
let filenameReport = `ProtractorTestReport-${FOLDER}-${retryCount}`;
let output = '';
let savePath = `${projectRoot}/e2e-output/junit-report/`;
let temporaryHtmlPath = savePath + 'html/temporaryHtml/';
let lastFileName = '';
let files = fs.readdirSync(savePath);
if (files && files.length > 0) {
for (const fileName of files) {
const testConfigReport = {
reportTitle: 'Protractor Test Execution Report',
outputPath: temporaryHtmlPath,
outputFilename: Math.random().toString(36).substr(2, 5) + filenameReport,
};
let filePath = `${projectRoot}/e2e-output/junit-report/` + fileName;
new htmlReporter().from(filePath, testConfigReport);
lastFileName = testConfigReport.outputFilename;
}
}
let lastHtmlFile = temporaryHtmlPath + lastFileName + '.html';
if (!(fs.lstatSync(lastHtmlFile).isDirectory())) {
output = output + fs.readFileSync(lastHtmlFile);
}
let fileName = savePath + 'html/' + filenameReport + '.html';
fs.writeFileSync(fileName, output, 'utf8');
let alfrescoJsApi = new AlfrescoApi({
provider: 'ECM',
hostEcm: TestConfig.adf.url
});
alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
await saveScreenshots(alfrescoJsApi, retryCount);
await saveReport(filenameReport, alfrescoJsApi);
rimraf(`${projectRoot}/e2e-output/screenshots/`, function () {
console.log('done delete screenshot');
});
try {
await uploadScreenshot(alfrescoJsApi, retryCount);
} catch (error) {
console.error('Error saving screenshot', error);
}
try {
await saveReport(alfrescoJsApi, retryCount);
} catch (error) {
console.error('Error saving Report', error);
}
}
return retry.afterLaunch(4);

View File

@ -2,7 +2,9 @@
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
eval projects=( "@alfresco/adf-core"
eval projects=(
"@alfresco/adf-cli"
"@alfresco/adf-core"
"@alfresco/adf-content-services"
"@alfresco/adf-insights"
"@alfresco/adf-process-services"

View File

@ -17,6 +17,7 @@ eval JSAPI_VERSION=""
eval EXEC_BUILD=true
eval projects=(
"cli"
"core"
"insights"
"testing"

View File

@ -30,16 +30,21 @@ show_help() {
echo "-host_bpm URL of the Back end to test"
echo "-host_identity URL of the identity service backend to test"
echo "-host_sso the entire path including the name of the realm"
echo "-save save the error screenshot in the remote env"
echo "-save save the error screenshot and report in the remote env"
echo "-timeout or --timeout override the timeout foe the wait utils"
echo "-l --lint enable lint"
echo "-m --maxInstances max instances parallel for tests"
echo "-log or --log print all the browser log"
echo "-disable-control-flow disable control flow"
echo "-db or --debug run the debugger"
echo "-vjsapi install different version from npm of JS-API defined in the package.json"
echo "-h or --help"
}
set_log(){
export LOG=true
}
set_username(){
USERNAME=$1
export USERNAME_ADF=$USERNAME
@ -101,6 +106,7 @@ set_timeout(){
}
set_save_screenshot(){
mkdir -p ./e2e-output/junit-report
export SAVE_SCREENSHOT=true
}
@ -174,6 +180,7 @@ while [[ $1 == -* ]]; do
-proxy|--proxy) set_proxy $2; shift 2;;
-s|--seleniumServer) set_selenium $2; shift 2;;
-host|--host) set_host $2; shift 2;;
-log|--log) set_log; shift ;;
-host_bpm|--host_bpm) set_host_bpm $2; shift 2;;
-host_sso|--host_sso) set_host_sso $2; shift 2;;
-host_identity|--host_identity) set_host_identity $2; shift 2;;

View File

@ -11,9 +11,9 @@ CONTEXT_ENV="content-services"
AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)";
AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/$CONTEXT_ENV")";
RUN_CHECK=$(echo node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1)
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -b || exit 1)
if [[ $AFFECTED_LIBS =~ "$CONTEXT_ENV$" || $TRAVIS_PULL_REQUEST == "false" ]];
node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -b -m 3 || exit 1)
if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || $TRAVIS_PULL_REQUEST == "false" ]];
then
$RUN_CHECK
$RUN_E2E --folder $CONTEXT_ENV

View File

@ -11,15 +11,12 @@ CONTEXT_ENV="core"
AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)";
AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/$CONTEXT_ENV")";
RUN_CHECK_PS=$(echo node ./scripts/check-env/check-ps-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 )
RUN_CHECK_CS=$(echo node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 )
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" -save --use-dist -b )
node ./scripts/check-env/check-ps-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1
node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -b -m 3 )
if [[ $AFFECTED_LIBS =~ "$CONTEXT_ENV$" || $TRAVIS_PULL_REQUEST == "false" ]];
if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || $TRAVIS_PULL_REQUEST == "false" ]];
then
$RUN_CHECK_PS
$RUN_CHECK_CS
$RUN_E2E --folder $CONTEXT_ENV
else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]];
then
@ -28,8 +25,6 @@ else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]];
if [[ $LIST_SPECS != "" ]];
then
echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS
$RUN_CHECK_PS
$RUN_CHECK_CS
$RUN_E2E --specs "$LIST_SPECS"
fi
fi

View File

@ -7,7 +7,7 @@ cd $DIR/../../../
./scripts/git-util/check-branch-updated.sh -b $TRAVIS_BRANCH || exit 1;
AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)";
if [[ $AFFECTED_LIBS =~ "process-services-cloud$" || $TRAVIS_PULL_REQUEST == "false" ]];
if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "insight" || $TRAVIS_PULL_REQUEST == "false" ]];
then
node ./scripts/check-env/check-ps-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1;
./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder insights --use-dist || exit 1;

View File

@ -11,21 +11,20 @@ CONTEXT_ENV="process-services-cloud"
AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)";
AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/$CONTEXT_ENV")";
RUN_CHECK=$(echo node ./scripts/check-env/check-activiti-env.js --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --client 'activiti' || exit 1 )
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" -host_sso "$E2E_HOST_SSO" -host_bpm "$E2E_HOST_BPM" -host_identity "$E2E_HOST_IDENTITY" -identity_admin_email "$E2E_ADMIN_EMAIL_IDENTITY" -identity_admin_password "$E2E_ADMIN_PASSWORD_IDENTITY" --use-dist )
if [[ $AFFECTED_LIBS =~ "$CONTEXT_ENV$" || $TRAVIS_PULL_REQUEST == "false" ]];
if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || $TRAVIS_PULL_REQUEST == "false" ]];
then
$RUN_CHECK
node ./scripts/check-env/check-activiti-env.js --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --client 'activiti' || exit 1
$RUN_E2E --folder $CONTEXT_ENV
else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]];
then
HEAD_SHA_BRANCH="$(git merge-base origin/$TRAVIS_BRANCH HEAD)"
LIST_SPECS="$(git diff --name-only $HEAD_SHA_BRANCH HEAD | grep "^e2e/$CONTEXT_ENV" | paste -sd , -)"
node ./scripts/check-env/check-activiti-env.js --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --client 'activiti' || exit 1
if [[ $LIST_SPECS != "" ]];
then
echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS
$RUN_CHECK
$RUN_E2E --specs "$LIST_SPECS"
fi
fi

View File

@ -11,12 +11,11 @@ CONTEXT_ENV="process-services"
AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)";
AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/$CONTEXT_ENV/")";
RUN_CHECK=$(echo node ./scripts/check-env/check-ps-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 )
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -b -m 2 )
node ./scripts/check-env/check-ps-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -b -m 3 )
if [[ $AFFECTED_LIBS =~ "$CONTEXT_ENV$" || $TRAVIS_PULL_REQUEST == "false" ]];
if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || $TRAVIS_PULL_REQUEST == "false" ]];
then
$RUN_CHECK
$RUN_E2E --folder $CONTEXT_ENV
else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]];
then
@ -25,7 +24,6 @@ else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]];
if [[ $LIST_SPECS != "" ]];
then
echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS
$RUN_CHECK
$RUN_E2E --specs "$LIST_SPECS"
fi
fi

View File

@ -11,12 +11,11 @@ CONTEXT_ENV="search"
AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)";
AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/$CONTEXT_ENV")";
RUN_CHECK=$(echo node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 )
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -save -b )
node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -b -m 3 )
if [[ $AFFECTED_LIBS =~ "content-services$" || $TRAVIS_PULL_REQUEST == "false" ]];
if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "content-services" || $TRAVIS_PULL_REQUEST == "false" ]];
then
$RUN_CHECK
$RUN_E2E --folder $CONTEXT_ENV
else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]];
then
@ -25,7 +24,6 @@ else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]];
if [[ $LIST_SPECS != "" ]];
then
echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS
$RUN_CHECK
$RUN_E2E --specs "$LIST_SPECS"
fi
fi

View File

@ -8,7 +8,8 @@ eval AUTO=false
eval TOTAL_BUILD=true;
eval SEMANTIC="minor";
eval projects=( "core"
eval projects=( "cli"
"core"
"content-services"
"process-services"
"process-services-cloud"

View File

@ -2,7 +2,6 @@ var fs = require("fs");
var path = require("path");
var ejs = require("ejs");
var templateFolder = path.resolve("tools", "doc", "yamlTemplates");
var outputFolder = path.resolve("docs", "sourceinfo");
@ -30,9 +29,9 @@ var template = ejs.compile(
searchItemsRecursively(docData);
function searchItemsRecursively(item) {
if (interestedIn(item.kind)) {
processItem(item);
} else if (item.children) {
item.children.forEach(child => {
@ -41,14 +40,17 @@ function searchItemsRecursively(item) {
}
}
function interestedIn(itemKind) {
return (itemKind === 128) || (itemKind === 256) || (itemKind === 4194304);
}
function processItem(item) {
//console.log(`Generating ${item.name}`);
var docText = template(item);
fs.writeFileSync(path.resolve(outputFolder, item.name + ".yml"), docText);
}
if( item.name === 'Widget'){
console.log('item ' + JSON.stringify(item.name ));
}
fs.writeFileSync(path.resolve(outputFolder, item.name + ".yml"), docText);
}

View File

@ -6,14 +6,9 @@ var lodash = require("lodash");
var jsyaml = require("js-yaml");
var remark = require("remark");
var parse = require("remark-parse");
var stringify = require("remark-stringify");
var frontMatter = require("remark-frontmatter");
var mdCompact = require("mdast-util-compact");
//var tdoc = require("typedoc");
var ngHelpers = require("./ngHelpers");
var si = require("./SourceInfoClasses");
// "Aggregate" data collected over the whole file set.
@ -24,15 +19,6 @@ var configFileName = "doctool.config.json";
var defaultFolder = path.resolve("docs");
var sourceInfoFolder = path.resolve("docs", "sourceinfo");
var libFolders = [
"core", "content-services", "process-services",
"insights", "process-services-cloud", "extensions"
];
var excludePatterns = [
"**/*.spec.ts"
];
function updatePhase(mdCache, aggData) {
var errorMessages;
@ -142,63 +128,6 @@ function initMdCache(filenames) {
return mdCache;
}
/*
function getSourceInfo(infoFolder) {
var sourceInfo = {};
var yamlFiles = fs.readdirSync(infoFolder);
yamlFiles.forEach(file => {
var yamlText = fs.readFileSync(path.resolve(infoFolder, file), "utf8");
var yaml = jsyaml.safeLoad(yamlText);
sou
});
}
/*
function initSourceInfo(aggData, mdCache) {
var app = new tdoc.Application({
exclude: excludePatterns,
ignoreCompilerErrors: true,
experimentalDecorators: true,
tsconfig: "tsconfig.json"
});
let sources = app.expandInputFiles(libFolders.map(folder => {
return path.resolve("lib", folder);
}));
aggData.projData = app.convert(sources);
aggData.classInfo = {};
var mdFiles = Object.keys(mdCache);
mdFiles.forEach(mdFile => {
var className = ngHelpers.ngNameToClassName(path.basename(mdFile, ".md"), aggData.config.typeNameExceptions);
var classRef = aggData.projData.findReflectionByName(className);
var className = ngHelpers.ngNameToClassName(path.basename(mdFile, ".md"), aggData.config.typeNameExceptions);
var yamlText = fs.readFileSync(path.resolve(sourceInfoFolder, className + ".yml"), "utf8");
var yaml = jsyaml.safeLoad(yamlText);
if (yaml) {
aggData.classInfo[className] = new si.ComponentInfo(yaml);
}
if (classRef) {
aggData.classInfo[className] = new si.ComponentInfo(classRef);
}
});
}
*/
function initClassInfo(aggData) {
var yamlFilenames = fs.readdirSync(path.resolve(sourceInfoFolder));
@ -278,21 +207,9 @@ files = files.filter(filename =>
var mdCache = initMdCache(files);
console.log("Loading source data...");
//initSourceInfo(aggData, mdCache);
initClassInfo(aggData);
/*
console.log("Initialising...");
initPhase(aggData);
console.log("Analysing Markdown files...");
readPhase(mdCache, aggData);
console.log("Computing aggregate data...");
aggPhase(aggData);
*/
console.log("Updating Markdown files...");
updatePhase(mdCache, aggData);

View File

@ -1,6 +1,6 @@
export class MDNav {
constructor(public root: any, public pos: number = 0) {}
find(test: (element: any) => boolean = () => true, index: number = 0): MDNav {
@ -25,7 +25,6 @@ export class MDNav {
return new MDNav(this.root, this.root.children.length);
}
findAll(test: (element: any) => boolean = () => true, index: number = 0): MDNav[] {
if (!this.root || !this.root.children) {
return [];
@ -89,7 +88,7 @@ export class MDNav {
return h.type === "link" && test(h);
}, index);
}
list(test: (element: any) => boolean = () => true, index: number = 0): MDNav {
return this.find((h) => {
return h.type === "list" && test(h);
@ -165,7 +164,7 @@ export class MDNav {
(this.pos >= this.root.children.length);
}
get childNav(): MDNav {
return new MDNav(this.item);
}
@ -181,7 +180,7 @@ export class MDNav {
get textValue() : string {
if (this.item) {
if (this.item) {
if (this.item["value"]) {
return this.item.value;
} else if (
@ -197,4 +196,4 @@ export class MDNav {
return "";
}
}
}
}

View File

@ -1,8 +1,11 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
}
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }

View File

@ -33,14 +33,6 @@ let libFolders = ["core", "content-services", "extensions", "insights", "process
libsearch(srcData, path.resolve(libFolder));
/*
let keys = Object.keys(srcData);
for (let i = 0; i < keys.length; i++) {
console.log(keys[i]);
}
*/
const authToken = process.env.graphAuthToken;
const client = new GraphQLClient('https://api.github.com/graphql', {
@ -147,20 +139,6 @@ function getDocFilePaths(folderPath) {
libFolders.forEach(element => {
let libPath = path.resolve(folderPath, element);
addItemsRecursively(libPath, result);
let items = fs.readdirSync(libPath);
/*
files = files.filter(filename =>
(path.extname(filename) === ".md") &&
(filename !== "README.md") &&
(filename.match(angFilePattern))
);
files.forEach(element => {
result.push(path.join(libPath, element));
});
*/
});

View File

@ -2,7 +2,7 @@
### Properties
| Name | Type | Default value | Description |
| -- | -- | -- | -- |
| --- | --- | --- | --- |
<% properties.forEach(function(prop) { -%>
<% if (prop.isInput) { -%>
| <%= prop.name %> | <% if (prop.type) { %>`<%- prop.type %>`<% } %> | <%- prop.defaultValue %> | <%- prop.docText %> |
@ -14,10 +14,10 @@
### Events
| Name | Type | Description |
| -- | -- | -- |
| --- | --- | --- |
<% properties.forEach(function(prop) { -%>
<% if (prop.isOutput) { -%>
| <%= prop.name %> | `<%- prop.type %>` | <%- prop.docText %> |
<% } -%>
<% }) -%>
<% } %>
<% } %>

View File

@ -2,7 +2,7 @@
### Properties
| Name | Type | Default value | Description |
| -- | -- | -- | -- |
| --- | --- | --- | --- |
<% properties.forEach(function(prop) { -%>
<% if (prop.isInput) { -%>
| <%= prop.name %> | `<%- prop.type %>` | <%- prop.defaultValue %> | <%- prop.docText %> |
@ -14,10 +14,10 @@
### Events
| Name | Type | Description |
| -- | -- | -- |
| --- | --- | --- |
<% properties.forEach(function(prop) { -%>
<% if (prop.isOutput) { -%>
| <%= prop.name %> | `<%- prop.type %>` | <%- prop.docText %> |
<% } -%>
<% }) -%>
<% } %>
<% } %>

View File

@ -3,8 +3,10 @@
return fullPath.substring(fullPath.indexOf('docs') + 5).replace('\\', '/')
}
function relSrcPath(fullPath) {
return '../' + fullPath.substring(fullPath.indexOf('lib')).replace('\\', '/')
function relSrcPath(document) {
if(document && document.heading && document.heading.link && document.heading.link.url){
return '../' + document.heading.link.url.substring(document.heading.link.url.indexOf('lib')).replace('\\', '/')
}
}
function renderSection(sectionName) {
@ -15,14 +17,14 @@
### <%= sectionName %>
| Name | Description | Source link |
| -- | -- | --|
| --- | --- | --|
<% }
sectionDocs.forEach(document => { -%>
| [<%= document['title'] %>](<%= relDocPath(document['id']) %>) -%>
<% if (document['status'] && document['status'] !== 'Active') { -%>
![<%= document['status'] %>](docassets/images/<%= document['status'] %>Icon.png) <% } -%>
| <%= document['paragraph']['plaintext'] %> | [Source](<%= relSrcPath(document['heading']['link']['url']) %>) |
| <%= document['paragraph']['plaintext'] %> | [Source](<%= relSrcPath(document) %>) |
<% });
}
-%>

Some files were not shown because too many files have changed in this diff Show More