From b1fd6cb60c1fa16d081baedb22049bc61fd4c11a Mon Sep 17 00:00:00 2001 From: Eugenio Romano Date: Wed, 17 Jan 2018 17:06:00 +0000 Subject: [PATCH] [ADF-2055] Ability to pre-populate form with a file and values (#2834) * fix translations form * fix style webpack script * fix tslint error problem in viewer * fix naming problems in attach file widget * add start process form values data initialization option * fix translation problems * missing return type * start process name configuration * add CS cross PS configuration * start process from file example * fix minor issues * add documentation and move the dialog in a separate component * easy test select app * alfrescoRepositoryName right property * file conversion test * fix issue after CR * Remove forgotten semicolon. --- .../example_start_process_attach_file.zip | Bin 0 -> 7428 bytes demo-shell/package.json | 2 +- demo-shell/resources/i18n/en.json | 9 +- .../app/components/files/files.component.html | 16 +++ .../app/components/files/files.component.ts | 29 +++- ...sion-manager-dialog-adapter.component.html | 4 +- docs/README.md | 47 ++++--- docs/docassets/images/select-apps-dialog.png | Bin 0 -> 48484 bytes docs/docassets/images/start_process.png | Bin 0 -> 86013 bytes docs/select-apps-dialog-component.md | 26 ++++ docs/start-process.component.md | 70 ++++++++++ lib/content-services/i18n/de.json | 23 +-- lib/content-services/i18n/en.json | 22 --- lib/content-services/i18n/es.json | 23 +-- lib/content-services/i18n/fr.json | 23 +-- lib/content-services/i18n/it.json | 23 +-- lib/content-services/i18n/ja.json | 23 +-- lib/content-services/i18n/nb.json | 23 +-- lib/content-services/i18n/nl.json | 23 +-- lib/content-services/i18n/pt-BR.json | 23 +-- lib/content-services/i18n/ru.json | 23 +-- lib/content-services/i18n/zh-CN.json | 23 +-- lib/core/app-config/app-config.service.ts | 3 +- lib/core/i18n/de.json | 23 ++- lib/core/i18n/en.json | 23 +++ lib/core/i18n/es.json | 23 ++- lib/core/i18n/fr.json | 23 ++- lib/core/i18n/it.json | 23 ++- lib/core/i18n/ja.json | 23 ++- lib/core/i18n/nb.json | 23 ++- lib/core/i18n/nl.json | 23 ++- lib/core/i18n/pt-BR.json | 23 ++- lib/core/i18n/ru.json | 21 +++ lib/core/i18n/zh-CN.json | 23 ++- .../viewer/components/viewer.component.ts | 16 ++- .../app-list/apps-list.component.spec.ts | 2 +- .../app-list/apps-list.module.ts | 10 +- lib/process-services/app-list/public-api.ts | 1 + .../select-apps-dialog-component.html | 13 ++ .../select-apps-dialog-component.spec.ts | 131 ++++++++++++++++++ .../app-list/select-apps-dialog-component.ts | 56 ++++++++ .../attach-file-widget.component.html | 10 +- .../attach-file-widget.component.ts | 34 ++--- lib/process-services/i18n/en.json | 8 ++ .../components/start-process.component.html | 1 + .../start-process.component.spec.ts | 71 +++++++--- .../components/start-process.component.ts | 67 +++++++-- .../process-list/services/process.service.ts | 4 +- 48 files changed, 789 insertions(+), 344 deletions(-) create mode 100644 assets/ps-example-apps/example_start_process_attach_file.zip create mode 100644 docs/docassets/images/select-apps-dialog.png create mode 100644 docs/docassets/images/start_process.png create mode 100644 docs/select-apps-dialog-component.md create mode 100644 lib/process-services/app-list/select-apps-dialog-component.html create mode 100644 lib/process-services/app-list/select-apps-dialog-component.spec.ts create mode 100644 lib/process-services/app-list/select-apps-dialog-component.ts diff --git a/assets/ps-example-apps/example_start_process_attach_file.zip b/assets/ps-example-apps/example_start_process_attach_file.zip new file mode 100644 index 0000000000000000000000000000000000000000..c827929b0506c99a77ddb169e7eeeb446196b8aa GIT binary patch literal 7428 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 + @@ -268,6 +269,13 @@ (success)="onDeleteActionSuccess($event)" handler="delete"> + + +
@@ -318,6 +327,13 @@ +
+ + +
+

Current folder ID: {{ documentList.currentFolderId }}

diff --git a/demo-shell/src/app/components/files/files.component.ts b/demo-shell/src/app/components/files/files.component.ts index afebf5d579..d5544cff06 100644 --- a/demo-shell/src/app/components/files/files.component.ts +++ b/demo-shell/src/app/components/files/files.component.ts @@ -23,14 +23,16 @@ import { MatDialog } from '@angular/material'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { MinimalNodeEntity, NodePaging, Pagination, MinimalNodeEntryEntity, SiteEntry } from 'alfresco-js-api'; import { - AlfrescoApiService, ContentService, TranslationService, + AlfrescoApiService, AuthenticationService, ContentService, TranslationService, FileUploadEvent, FolderCreatedEvent, LogService, NotificationService, UploadService, DataColumn, DataRow, UserPreferencesService, - PaginationComponent + PaginationComponent, FormValues } from '@alfresco/adf-core'; import { DocumentListComponent, PermissionStyleModel, DownloadZipDialogComponent } from '@alfresco/adf-content-services'; +import { SelectAppsDialogComponent } from '@alfresco/adf-process-services'; + import { VersionManagerDialogAdapterComponent } from './version-manager-dialog-adapter.component'; import { Subscription } from 'rxjs/Rx'; @@ -60,6 +62,10 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { // The identifier of a node. You can also use one of these well-known aliases: -my- | -shared- | -root- currentFolderId: string = DEFAULT_FOLDER_TO_SHOW; + formValues: FormValues = {}; + + processId; + @Input() selectionMode = 'multiple'; @@ -143,7 +149,8 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { private router: Router, private logService: LogService, private preference: UserPreferencesService, - @Optional() private route: ActivatedRoute) { + @Optional() private route: ActivatedRoute, + public authenticationService: AuthenticationService) { } showFile(event) { @@ -208,7 +215,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { } giveDefaultPaginationWhenNotDefined() { - this.pagination = { + this.pagination = { maxItems: this.preference.paginationSize, skipCount: 0, totalItems: 0, @@ -446,6 +453,20 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { return false; } + startProcesAction($event) { + this.formValues['file'] = $event.value.entry; + + const dialogRef = this.dialog.open(SelectAppsDialogComponent, { + width: '630px', + panelClass: 'adf-version-manager-dialog' + }); + + dialogRef.afterClosed().subscribe(selectedProcess => { + this.processId = selectedProcess.id; + }); + + } + onChangePageSize(event: Pagination): void { this.preference.paginationSize = event.maxItems; this.changedPageSize.emit(event); diff --git a/demo-shell/src/app/components/files/version-manager-dialog-adapter.component.html b/demo-shell/src/app/components/files/version-manager-dialog-adapter.component.html index e1decb8bd4..062fbf32a4 100644 --- a/demo-shell/src/app/components/files/version-manager-dialog-adapter.component.html +++ b/demo-shell/src/app/components/files/version-manager-dialog-adapter.component.html @@ -1,7 +1,7 @@ -
Manage versions
+
{{'VERSION.DIALOG.TITLE' | translate}}
- +
diff --git a/docs/README.md b/docs/README.md index d0f86d49d3..09c4918a3c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -168,30 +168,30 @@ for more information about installing and using the source code. ## Components -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Breadcrumb component](breadcrumb.component.md) | Indicates the current position within a navigation hierarchy. | [Source](../lib/content-services/breadcrumb/breadcrumb.component.ts) | -| [Dropdown breadcrumb component](dropdown-breadcrumb.component.md) | Indicates the current position within a navigation hierarchy using a dropdown menu. | [Source](../lib/content-services/breadcrumb/dropdown-breadcrumb.component.ts) | +| Name | Description | Source link | +| --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| [Breadcrumb component](breadcrumb.component.md) | Indicates the current position within a navigation hierarchy. | [Source](../lib/content-services/breadcrumb/breadcrumb.component.ts) | +| [Dropdown breadcrumb component](dropdown-breadcrumb.component.md) | Indicates the current position within a navigation hierarchy using a dropdown menu. | [Source](../lib/content-services/breadcrumb/dropdown-breadcrumb.component.ts) | | [Content metadata component](content-metadata.component.md) | Allows a user to display and edit metadata related to a node. | [Source](../lib/content-services/content-metadata/components/content-metadata/content-metadata.component.ts) | -| [Content node selector component](content-node-selector.component.md) | Allows a user to select items from a Content Services repository. | [Source](../lib/content-services/content-node-selector/content-node-selector.component.ts) | -| [Content action component](content-action.component.md) | Adds options to a Document List actions menu for a particular content type. | [Source](../lib/content-services/document-list/components/content-action/content-action.component.ts) | -| [Document list component](document-list.component.md) | Displays the documents from a repository. | [Source](../lib/content-services/document-list/components/document-list.component.ts) | -| [Search control component](search-control.component.md) | Displays a input text which shows find-as-you-type suggestions. | [Source](../lib/content-services/search/components/search-control.component.ts) | -| [Search component](search.component.md) | Searches items for supplied search terms. | [Source](../lib/content-services/search/components/search.component.ts) | -| [Sites dropdown component](sites-dropdown.component.md) | Displays a dropdown menu to show and interact with the sites of the current user. | [Source](../lib/content-services/site-dropdown/sites-dropdown.component.ts) | -| [Like component](like.component.md) | Allows a user to add "likes" to an item. | [Source](../lib/content-services/social/like.component.ts) | -| [Rating component](rating.component.md) | Allows a user to add ratings to an item. | [Source](../lib/content-services/social/rating.component.ts) | -| [Tag actions component](tag-actions.component.md) | Shows available actions for tags. | [Source](../lib/content-services/tag/tag-actions.component.ts) | -| [Tag list component](tag-list.component.md) | Shows tags for an item. | [Source](../lib/content-services/tag/tag-list.component.ts) | -| [Tag node list component](tag-node-list.component.md) | Shows tags for a node. | [Source](../lib/content-services/tag/tag-node-list.component.ts) | -| [File uploading dialog component](file-uploading-dialog.component.md) | Shows a dialog listing all the files uploaded with the Upload Button or Drag Area components. | [Source](../lib/content-services/upload/components/file-uploading-dialog.component.ts) | -| [Upload button component](upload-button.component.md) | Activates a file upload. | [Source](../lib/content-services/upload/components/upload-button.component.ts) | -| [Upload drag area component](upload-drag-area.component.md) | Adds a drag and drop area to upload files to Alfresco. | [Source](../lib/content-services/upload/components/upload-drag-area.component.ts) | -| [Version list component](version-list.component.md) | Displays the version history of a node in a [Version Manager component](version-manager.component.md) | [Source](../lib/content-services/version-manager/version-list.component.ts) | -| [Version manager component](version-manager.component.md) | Displays the version history of a node with the ability to upload a new version. | [Source](../lib/content-services/version-manager/version-manager.component.ts) | -| [Webscript component](webscript.component.md) | Provides access to Webscript features. | [Source](../lib/content-services/webscript/webscript.component.ts) | -| _Content metadata card component_ | _Not currently documented_ | [Source](../lib/content-services/content-metadata/components/content-metadata-card/content-metadata-card.component.ts) | -| _Content node selector panel component_ | _Not currently documented_ | [Source](../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | +| [Content node selector component](content-node-selector.component.md) | Allows a user to select items from a Content Services repository. | [Source](../lib/content-services/content-node-selector/content-node-selector.component.ts) | +| [Content action component](content-action.component.md) | Adds options to a Document List actions menu for a particular content type. | [Source](../lib/content-services/document-list/components/content-action/content-action.component.ts) | +| [Document list component](document-list.component.md) | Displays the documents from a repository. | [Source](../lib/content-services/document-list/components/document-list.component.ts) | +| [Search control component](search-control.component.md) | Displays a input text which shows find-as-you-type suggestions. | [Source](../lib/content-services/search/components/search-control.component.ts) | +| [Search component](search.component.md) | Searches items for supplied search terms. | [Source](../lib/content-services/search/components/search.component.ts) | +| [Sites dropdown component](sites-dropdown.component.md) | Displays a dropdown menu to show and interact with the sites of the current user. | [Source](../lib/content-services/site-dropdown/sites-dropdown.component.ts) | +| [Like component](like.component.md) | Allows a user to add "likes" to an item. | [Source](../lib/content-services/social/like.component.ts) | +| [Rating component](rating.component.md) | Allows a user to add ratings to an item. | [Source](../lib/content-services/social/rating.component.ts) | +| [Tag actions component](tag-actions.component.md) | Shows available actions for tags. | [Source](../lib/content-services/tag/tag-actions.component.ts) | +| [Tag list component](tag-list.component.md) | Shows tags for an item. | [Source](../lib/content-services/tag/tag-list.component.ts) | +| [Tag node list component](tag-node-list.component.md) | Shows tags for a node. | [Source](../lib/content-services/tag/tag-node-list.component.ts) | +| [File uploading dialog component](file-uploading-dialog.component.md) | Shows a dialog listing all the files uploaded with the Upload Button or Drag Area components. | [Source](../lib/content-services/upload/components/file-uploading-dialog.component.ts) | +| [Upload button component](upload-button.component.md) | Activates a file upload. | [Source](../lib/content-services/upload/components/upload-button.component.ts) | +| [Upload drag area component](upload-drag-area.component.md) | Adds a drag and drop area to upload files to Alfresco. | [Source](../lib/content-services/upload/components/upload-drag-area.component.ts) | +| [Version list component](version-list.component.md) | Displays the version history of a node in a [Version Manager component](version-manager.component.md) | [Source](../lib/content-services/version-manager/version-list.component.ts) | +| [Version manager component](version-manager.component.md) | Displays the version history of a node with the ability to upload a new version. | [Source](../lib/content-services/version-manager/version-manager.component.ts) | +| [Webscript component](webscript.component.md) | Provides access to Webscript features. | [Source](../lib/content-services/webscript/webscript.component.ts) | +| _Content metadata component_ | _Not currently documented_ | [Source](../lib/content-services/content-metadata/content-metadata.component.ts) | +| _Content node selector panel component_ | _Not currently documented_ | [Source](../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | ## Directives @@ -242,6 +242,7 @@ for more information about installing and using the source code. | Name | Description | Source link | | ---- | ----------- | ----------- | | [Apps list component](apps-list.component.md) | Shows all available apps. | [Source](../lib/process-services/app-list/apps-list.component.ts) | +| [Select app dialog component](select-apps-dialog-component.md) | Shows a dialog listing all the PS apps with a slect box to slect it | [Source](../lib/process-services/app-list/select-apps-dialog-component.ts) | | [Create process attachment component](create-process-attachment.component.md) | Displays Upload Component (Drag and Click) to upload the attachment to a specified process instance | [Source](../lib/process-services/attachment/create-process-attachment.component.ts) | | [Create task attachment component](create-task-attachment.component.md) | Displays Upload Component (Drag and Click) to upload the attachment to a specified task | [Source](../lib/process-services/attachment/create-task-attachment.component.ts) | | [Process attachment list component](process-attachment-list.component.md) | Displays attached documents on a specified process instance | [Source](../lib/process-services/attachment/process-attachment-list.component.ts) | diff --git a/docs/docassets/images/select-apps-dialog.png b/docs/docassets/images/select-apps-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f9501a924d4abb1a864adbb6f232166e22bee4 GIT binary patch literal 48484 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 z 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 W-S#LRUP%A9ZJT#}$&cCl{eJ-odkRtj literal 0 HcmV?d00001 diff --git a/docs/docassets/images/start_process.png b/docs/docassets/images/start_process.png new file mode 100644 index 0000000000000000000000000000000000000000..ac808e5c63cf6789496676d88fb5c252cedb5f5a GIT binary patch literal 86013 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 literal 0 HcmV?d00001 diff --git a/docs/select-apps-dialog-component.md b/docs/select-apps-dialog-component.md new file mode 100644 index 0000000000..a4f97fb3de --- /dev/null +++ b/docs/select-apps-dialog-component.md @@ -0,0 +1,26 @@ +# Select app Component + +Shows all available apps and give you back the selected app. + +![select-apps-dialog](docassets/images/select-apps-dialog.png) + +## Basic Usage + + ```ts +import { SelectAppsDialogComponent } from '@alfresco/adf-process-services'; + +constructor(private dialog: MatDialog) { +} + +startSelectDialog(){ + const dialogRef = this.dialog.open(SelectAppsDialogComponent, { + width: '630px', + panelClass: 'adf-version-manager-dialog' + }); + + dialogRef.afterClosed().subscribe(selectedProcess => { + this.processId = selectedProcess.id; + }); +} + +``` diff --git a/docs/start-process.component.md b/docs/start-process.component.md index 45d0809914..e27c8d1c41 100644 --- a/docs/start-process.component.md +++ b/docs/start-process.component.md @@ -17,7 +17,9 @@ Starts a process. | Name | Description | | --- | --- | | appId | (required): Limit the list of processes which can be started to those contained in the specified app | +| name | (optional) name to assign to the current process | | variables | Variables in input to the process [RestVariable](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-activiti-rest-api/docs/RestVariable.md)| +| values | Parameter to pass form field values in the start form if is associated | ### Events @@ -27,6 +29,74 @@ Starts a process. | cancel | Raised when the process canceled | | error | Raised when the start process fail | + +### Custom data example + +Here is an example of how to pass in form field values, these correspond to the start form that has been defined for the process: + + +```ts +const formValues:FormValues = { + 'test_1': 'value_1', + 'test_2': 'value_2', + 'test_3': 'value_1', + 'test_4': 'dropdown_id', + 'test_5': 'dropdown_label', + 'dropdown': {'id': 'dropdown_id', 'name': 'dropdown_label'} +}; +``` + +```html + + +``` + +### Attach a File to the start-form of the process + +After the repository is created in APS, you can see your new repository in the Alfresco Repositories list. +If the ID is set to 1, then all default values are fine. +However, if it is set to something else, for example, ***1002*** and the name is ***alfresco***, you must set in your 'app.config.json' the property ***alfrescoRepositoryName*** alfresco-1002: + +```ts + { + name: 'Alfresco ADF Application' + }, + ecmHost: 'http://{hostname}{:port}/ecm', + bpmHost: 'http://{hostname}{:port}/bpm', + logLevel: 'silent', + alfrescoRepositoryName : 'alfresco-1002' +``` + +After you need to pass the node in the input values object with the other properties: + +```ts + +let node: MinimalNodeEntryEntity = this.odesApiService.getNode(NODE_ID); + +const formValues: FormValues = { + 'file' : node + 'field_one': 'example text' +}; +``` + +Note In the object above the key 'file' is the name of the attach file field in the start form of the process. +The value of the file property has to be a ***MinimalNodeEntryEntity**: + +```html + + +``` + +The result will be the start form prefilled with the file: + + +![Start process load file](docassets/images/start_process.png) + + ## Details Displays Start Process, allowing the user to specify some details like process name and process definition, which are the most basic requirement to start a new process instance. The user have to select the process definition from a dropdown if there are more than one process definition available. If there is just one process definition available for the app, then it is auto-selected. There is a error message shown if no process definition is available. \ No newline at end of file diff --git a/lib/content-services/i18n/de.json b/lib/content-services/i18n/de.json index 40e2339672..260b490909 100644 --- a/lib/content-services/i18n/de.json +++ b/lib/content-services/i18n/de.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Startformular" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Vorschau nicht verfügbar" - }, - "FIELD": { - "UPLOAD": "Hochladen", - "REQUIRED": "*Erforderlich", - "VALIDATOR": { - "INVALID_NUMBER": "Verwenden Sie ein anderes Zahlenformat", - "INVALID_DATE": "Verwenden Sie ein anderes Datumsformat", - "INVALID_VALUE": "Geben Sie einen anderen Wert ein", - "NOT_GREATER_THAN": "Darf nicht größer als {{ maxValue }} sein", - "NOT_LESS_THAN": "Darf nicht kleiner als {{ minValue }} sein", - "AT_LEAST_LONG": "Geben Sie mindestens {{ minLength }} Zeichen ein", - "NO_LONGER_THAN": "Geben Sie höchstens {{ maxLength }} Zeichen ein" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Dieser Ordner ist leer" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "Sie verfügen nicht über die nötige Berechtigung ('{{permission}}'), um {{type}} zu {{action}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/en.json b/lib/content-services/i18n/en.json index ecc798dd9a..77b90fcd5a 100644 --- a/lib/content-services/i18n/en.json +++ b/lib/content-services/i18n/en.json @@ -1,26 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Start Form" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Preview not available" - }, - "FIELD": { - "SOURCE": "Select source from ", - "UPLOAD": "UPLOAD", - "REQUIRED": "*Required", - "VALIDATOR": { - "INVALID_NUMBER": "Use a different number format", - "INVALID_DATE": "Use a different date format", - "INVALID_VALUE": "Enter a different value", - "NOT_GREATER_THAN": "Can't be greater than {{ maxValue }}", - "NOT_LESS_THAN": "Can't be less than {{ minValue }}", - "AT_LEAST_LONG": "Enter at least {{ minLength }} characters", - "NO_LONGER_THAN": "Enter no more than {{ maxLength }} characters" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "This folder is empty" diff --git a/lib/content-services/i18n/es.json b/lib/content-services/i18n/es.json index fc1c4cbc42..702f383456 100644 --- a/lib/content-services/i18n/es.json +++ b/lib/content-services/i18n/es.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Iniciar formulario" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Vista previa no disponible" - }, - "FIELD": { - "UPLOAD": "Cargar", - "REQUIRED": "*Requerido", - "VALIDATOR": { - "INVALID_NUMBER": "Utilizar un formato de número diferente", - "INVALID_DATE": "Utilizar un formato de fecha diferente", - "INVALID_VALUE": "Introducir un valor diferente", - "NOT_GREATER_THAN": "No puede ser mayor que {{ maxValue }}", - "NOT_LESS_THAN": "No puede ser menor que {{ minValue }}", - "AT_LEAST_LONG": "Introducir al menos {{ minLength }} caracteres", - "NO_LONGER_THAN": "No introducir más de {{ maxLength }} caracteres" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Esta carpeta está vacía" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "No tiene permiso {{permission}} para {{action}} el {{type}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/fr.json b/lib/content-services/i18n/fr.json index ee5b4847c0..700185c379 100644 --- a/lib/content-services/i18n/fr.json +++ b/lib/content-services/i18n/fr.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Démarrer le formulaire" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Aperçu non disponible" - }, - "FIELD": { - "UPLOAD": "Importer", - "REQUIRED": "*Obligatoire", - "VALIDATOR": { - "INVALID_NUMBER": "Utiliser un format de numéro différent", - "INVALID_DATE": "Utiliser un format de date différent", - "INVALID_VALUE": "Entrer une valeur différente", - "NOT_GREATER_THAN": "Ne peut pas être supérieur à {{ maxValue }}", - "NOT_LESS_THAN": "Ne peut pas être inférieur à {{ minValue }}", - "AT_LEAST_LONG": "Entrez {{ minLength }} caractères minimum", - "NO_LONGER_THAN": "Entrez {{ maxLength }} caractères maximum" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Ce dossier est vide" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "Vous n'avez pas les droits d'accès {{permission}} pour {{action}} le {{type}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/it.json b/lib/content-services/i18n/it.json index ee66c94228..2acd8854f4 100644 --- a/lib/content-services/i18n/it.json +++ b/lib/content-services/i18n/it.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Modulo di inizio" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Anteprima non disponibile" - }, - "FIELD": { - "UPLOAD": "Carica", - "REQUIRED": "*Obbligatorio", - "VALIDATOR": { - "INVALID_NUMBER": "Usa un formato numerico diverso", - "INVALID_DATE": "Usa un formato di data diverso", - "INVALID_VALUE": "Immetti un valore diverso", - "NOT_GREATER_THAN": "Non può essere maggiore di {{ maxValue }}", - "NOT_LESS_THAN": "Non può essere inferiore di {{ minValue }}", - "AT_LEAST_LONG": "Immetti almeno {{ minLength }} caratteri", - "NO_LONGER_THAN": "Immetti non più di {{ maxLength }} caratteri" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Questa cartella è vuota" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "Non hai l'autorizzazione {{permission}} per {{action}} {{type}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/ja.json b/lib/content-services/i18n/ja.json index e5d050f084..6744334c78 100644 --- a/lib/content-services/i18n/ja.json +++ b/lib/content-services/i18n/ja.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "開始フォーム" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "プレビューは使用できません" - }, - "FIELD": { - "UPLOAD": "アップロード", - "REQUIRED": "*必須", - "VALIDATOR": { - "INVALID_NUMBER": "別の番号形式を使用してください", - "INVALID_DATE": "別の日付形式を使用してください", - "INVALID_VALUE": "別の値を入力してください", - "NOT_GREATER_THAN": "{{ maxValue }} より大きい値にすることはできません", - "NOT_LESS_THAN": "{{ minValue }} より小さい値にすることはできません", - "AT_LEAST_LONG": "{{ minLength }} 文字以上で入力してください", - "NO_LONGER_THAN": "{{ maxLength }} 文字以内で入力してください" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "このフォルダは空です" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "{{type}} を {{action}} するための {{permission}} 権限がありません" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/nb.json b/lib/content-services/i18n/nb.json index 040fad2225..c89e75b543 100644 --- a/lib/content-services/i18n/nb.json +++ b/lib/content-services/i18n/nb.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Start skjema" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Forhåndsvisning ikke tilgjengelig" - }, - "FIELD": { - "UPLOAD": "Laster opp", - "REQUIRED": "*Påkrevd", - "VALIDATOR": { - "INVALID_NUMBER": "Bruk et annet nummerformat", - "INVALID_DATE": "Bruk et annet datoformat", - "INVALID_VALUE": "Angi en annen verdi", - "NOT_GREATER_THAN": "Kan ikke være større enn {{ maxValue }}", - "NOT_LESS_THAN": "Kan ikke være mindre enn {{ minValue }}", - "AT_LEAST_LONG": "Angi minst {{ minLength }} tegn", - "NO_LONGER_THAN": "Ikke angi flere enn {{ maxLength }} tegn" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Denne mappen er tom" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "Du har ikke {{permission}} tillatelsen til å {{action}} {{type}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/nl.json b/lib/content-services/i18n/nl.json index ab84be4e38..a84b38cee9 100644 --- a/lib/content-services/i18n/nl.json +++ b/lib/content-services/i18n/nl.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Beginformulier" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Preview niet beschikbaar" - }, - "FIELD": { - "UPLOAD": "Uploaden", - "REQUIRED": "*Verplicht", - "VALIDATOR": { - "INVALID_NUMBER": "Gebruik een andere getalnotatie", - "INVALID_DATE": "Gebruik een andere datumnotatie", - "INVALID_VALUE": "Voer een andere waarde in", - "NOT_GREATER_THAN": "Mag niet groter zijn dan {{ maxValue }}", - "NOT_LESS_THAN": "Mag niet kleiner zijn dan {{ minValue }}", - "AT_LEAST_LONG": "Voer minimaal {{ minLength }} tekens in", - "NO_LONGER_THAN": "Voer maximaal {{ maxLength }} tekens in" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Deze map is leeg" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "U hebt geen {{permission}} rechten voor het {{action}} van {{type}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/pt-BR.json b/lib/content-services/i18n/pt-BR.json index 7f0a53083c..615f9fdd7c 100644 --- a/lib/content-services/i18n/pt-BR.json +++ b/lib/content-services/i18n/pt-BR.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Iniciar formulário" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Pré-visualização não disponível" - }, - "FIELD": { - "UPLOAD": "Carregar", - "REQUIRED": "*Obrigatório", - "VALIDATOR": { - "INVALID_NUMBER": "Use um formato de número diferente", - "INVALID_DATE": "Use um formato de data diferente", - "INVALID_VALUE": "Insira um valor diferente", - "NOT_GREATER_THAN": "Não pode ser maior do que {{ maxValue }}", - "NOT_LESS_THAN": "Não pode ser menor do que {{ minValue }}", - "AT_LEAST_LONG": "Insira no mínimo {{ minLength }} caracteres", - "NO_LONGER_THAN": "Insira no máximo {{ maxLength }} caracteres" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Esta pasta está vazia" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "Você não tem a permissão {{permission}} para {{action}} o {{type}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/ru.json b/lib/content-services/i18n/ru.json index a78ca9cba3..b61078b70a 100644 --- a/lib/content-services/i18n/ru.json +++ b/lib/content-services/i18n/ru.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "Запустить форму" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "Предварительный просмотр недоступен" - }, - "FIELD": { - "UPLOAD": "Загрузить", - "REQUIRED": "*Обязательно для заполнения", - "VALIDATOR": { - "INVALID_NUMBER": "Используйте другой формат числа", - "INVALID_DATE": "Используйте другой формат даты", - "INVALID_VALUE": "Введите другое значение", - "NOT_GREATER_THAN": "Не может быть более {{ maxValue }}", - "NOT_LESS_THAN": "Не может быть менее {{ minValue }}", - "AT_LEAST_LONG": "Введите не менее {{ minLength }} символ", - "NO_LONGER_THAN": "Введите не более {{ maxLength }} символ" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "Эта папка пуста" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "У вас нет разрешения {{permission}}, чтобы {{action}} {{type}}" } -} \ No newline at end of file +} diff --git a/lib/content-services/i18n/zh-CN.json b/lib/content-services/i18n/zh-CN.json index af51418d22..aa952310b1 100644 --- a/lib/content-services/i18n/zh-CN.json +++ b/lib/content-services/i18n/zh-CN.json @@ -1,25 +1,4 @@ { - "FORM": { - "START_FORM": { - "TITLE": "启动表单" - }, - "PREVIEW": { - "IMAGE_NOT_AVAILABLE": "预览不可用" - }, - "FIELD": { - "UPLOAD": "上传", - "REQUIRED": "*必填项", - "VALIDATOR": { - "INVALID_NUMBER": "使用其他数字格式", - "INVALID_DATE": "使用其他日期格式", - "INVALID_VALUE": "输入其他值", - "NOT_GREATER_THAN": "不得大于 {{ maxValue }}", - "NOT_LESS_THAN": "不得小于 {{ minValue }}", - "AT_LEAST_LONG": "输入至少 {{ minLength }} 个字符", - "NO_LONGER_THAN": "不得输入超过 {{ maxLength }} 个字符" - } - } - }, "ADF-DOCUMENT-LIST": { "EMPTY": { "HEADER": "此文件夹为空" @@ -185,4 +164,4 @@ "PERMISSON": { "LACKOF": "您没有 {{action}} {{type}} 的 {{permission}} 权限" } -} \ No newline at end of file +} diff --git a/lib/core/app-config/app-config.service.ts b/lib/core/app-config/app-config.service.ts index b6f3054b63..d250a25379 100644 --- a/lib/core/app-config/app-config.service.ts +++ b/lib/core/app-config/app-config.service.ts @@ -30,7 +30,8 @@ export class AppConfigService { }, ecmHost: 'http://{hostname}{:port}/ecm', bpmHost: 'http://{hostname}{:port}/bpm', - logLevel: 'silent' + logLevel: 'silent', + alfrescoRepositoryName : 'alfresco-1' }; constructor(private http: HttpClient) { diff --git a/lib/core/i18n/de.json b/lib/core/i18n/de.json index bca5c09460..1a70b32976 100644 --- a/lib/core/i18n/de.json +++ b/lib/core/i18n/de.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Startformular" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Vorschau nicht verfügbar" + }, + "FIELD": { + "UPLOAD": "Hochladen", + "REQUIRED": "*Erforderlich", + "VALIDATOR": { + "INVALID_NUMBER": "Verwenden Sie ein anderes Zahlenformat", + "INVALID_DATE": "Verwenden Sie ein anderes Datumsformat", + "INVALID_VALUE": "Geben Sie einen anderen Wert ein", + "NOT_GREATER_THAN": "Darf nicht größer als {{ maxValue }} sein", + "NOT_LESS_THAN": "Darf nicht kleiner als {{ minValue }} sein", + "AT_LEAST_LONG": "Geben Sie mindestens {{ minLength }} Zeichen ein", + "NO_LONGER_THAN": "Geben Sie höchstens {{ maxLength }} Zeichen ein" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "Angezeigt werden {{ range }} von {{ total }}", @@ -148,4 +169,4 @@ "LOADING": "Laden", "UNKNOWN_FORMAT": "Vorschau konnte nicht geladen werden" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/en.json b/lib/core/i18n/en.json index 3dac2d853c..9d816b4fd2 100644 --- a/lib/core/i18n/en.json +++ b/lib/core/i18n/en.json @@ -1,4 +1,27 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Start Form" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Preview not available" + }, + "FIELD": { + "LOCALSTORAGE" : "Local storage", + "SOURCE": "Select source from ", + "UPLOAD": "UPLOAD", + "REQUIRED": "*Required", + "VALIDATOR": { + "INVALID_NUMBER": "Use a different number format", + "INVALID_DATE": "Use a different date format", + "INVALID_VALUE": "Enter a different value", + "NOT_GREATER_THAN": "Can't be greater than {{ maxValue }}", + "NOT_LESS_THAN": "Can't be less than {{ minValue }}", + "AT_LEAST_LONG": "Enter at least {{ minLength }} characters", + "NO_LONGER_THAN": "Enter no more than {{ maxLength }} characters" + } + } + }, "CORE": { "FILE_SIZE": { "BYTES": "Bytes", diff --git a/lib/core/i18n/es.json b/lib/core/i18n/es.json index 56b348ef19..f822db36e2 100644 --- a/lib/core/i18n/es.json +++ b/lib/core/i18n/es.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Iniciar formulario" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Vista previa no disponible" + }, + "FIELD": { + "UPLOAD": "Cargar", + "REQUIRED": "*Requerido", + "VALIDATOR": { + "INVALID_NUMBER": "Utilizar un formato de número diferente", + "INVALID_DATE": "Utilizar un formato de fecha diferente", + "INVALID_VALUE": "Introducir un valor diferente", + "NOT_GREATER_THAN": "No puede ser mayor que {{ maxValue }}", + "NOT_LESS_THAN": "No puede ser menor que {{ minValue }}", + "AT_LEAST_LONG": "Introducir al menos {{ minLength }} caracteres", + "NO_LONGER_THAN": "No introducir más de {{ maxLength }} caracteres" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "Mostrando {{ range }} de {{ total }}", @@ -148,4 +169,4 @@ "LOADING": "Cargando", "UNKNOWN_FORMAT": "No se ha podido cargar la vista previa" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/fr.json b/lib/core/i18n/fr.json index 4bcfd68a24..4f5821d343 100644 --- a/lib/core/i18n/fr.json +++ b/lib/core/i18n/fr.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Démarrer le formulaire" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Aperçu non disponible" + }, + "FIELD": { + "UPLOAD": "Importer", + "REQUIRED": "*Obligatoire", + "VALIDATOR": { + "INVALID_NUMBER": "Utiliser un format de numéro différent", + "INVALID_DATE": "Utiliser un format de date différent", + "INVALID_VALUE": "Entrer une valeur différente", + "NOT_GREATER_THAN": "Ne peut pas être supérieur à {{ maxValue }}", + "NOT_LESS_THAN": "Ne peut pas être inférieur à {{ minValue }}", + "AT_LEAST_LONG": "Entrez {{ minLength }} caractères minimum", + "NO_LONGER_THAN": "Entrez {{ maxLength }} caractères maximum" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "Affichage de {{ range }} sur {{ total }}", @@ -148,4 +169,4 @@ "LOADING": "Chargement en cours", "UNKNOWN_FORMAT": "Impossible de charger l'aperçu" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/it.json b/lib/core/i18n/it.json index b4ca34cb72..c2bcd267ef 100644 --- a/lib/core/i18n/it.json +++ b/lib/core/i18n/it.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Modulo di inizio" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Anteprima non disponibile" + }, + "FIELD": { + "UPLOAD": "Carica", + "REQUIRED": "*Obbligatorio", + "VALIDATOR": { + "INVALID_NUMBER": "Usa un formato numerico diverso", + "INVALID_DATE": "Usa un formato di data diverso", + "INVALID_VALUE": "Immetti un valore diverso", + "NOT_GREATER_THAN": "Non può essere maggiore di {{ maxValue }}", + "NOT_LESS_THAN": "Non può essere inferiore di {{ minValue }}", + "AT_LEAST_LONG": "Immetti almeno {{ minLength }} caratteri", + "NO_LONGER_THAN": "Immetti non più di {{ maxLength }} caratteri" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "Visualizzazione di {{ range }} su {{ total }}", @@ -148,4 +169,4 @@ "LOADING": "Caricamento in corso", "UNKNOWN_FORMAT": "Impossibile caricare l'anteprima" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/ja.json b/lib/core/i18n/ja.json index 480b9abd8d..5e6e3a821e 100644 --- a/lib/core/i18n/ja.json +++ b/lib/core/i18n/ja.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "開始フォーム" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "プレビューは使用できません" + }, + "FIELD": { + "UPLOAD": "アップロード", + "REQUIRED": "*必須", + "VALIDATOR": { + "INVALID_NUMBER": "別の番号形式を使用してください", + "INVALID_DATE": "別の日付形式を使用してください", + "INVALID_VALUE": "別の値を入力してください", + "NOT_GREATER_THAN": "{{ maxValue }} より大きい値にすることはできません", + "NOT_LESS_THAN": "{{ minValue }} より小さい値にすることはできません", + "AT_LEAST_LONG": "{{ minLength }} 文字以上で入力してください", + "NO_LONGER_THAN": "{{ maxLength }} 文字以内で入力してください" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "表示中: {{ range }} / {{ total }} 件", @@ -148,4 +169,4 @@ "LOADING": "読み込み中", "UNKNOWN_FORMAT": "プレビューを読み込めませんでした" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/nb.json b/lib/core/i18n/nb.json index d5d1e31d63..2804165e23 100644 --- a/lib/core/i18n/nb.json +++ b/lib/core/i18n/nb.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Start skjema" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Forhåndsvisning ikke tilgjengelig" + }, + "FIELD": { + "UPLOAD": "Laster opp", + "REQUIRED": "*Påkrevd", + "VALIDATOR": { + "INVALID_NUMBER": "Bruk et annet nummerformat", + "INVALID_DATE": "Bruk et annet datoformat", + "INVALID_VALUE": "Angi en annen verdi", + "NOT_GREATER_THAN": "Kan ikke være større enn {{ maxValue }}", + "NOT_LESS_THAN": "Kan ikke være mindre enn {{ minValue }}", + "AT_LEAST_LONG": "Angi minst {{ minLength }} tegn", + "NO_LONGER_THAN": "Ikke angi flere enn {{ maxLength }} tegn" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "Vis {{ range }} av {{ total }}", @@ -148,4 +169,4 @@ "LOADING": "Laster", "UNKNOWN_FORMAT": "Kan ikke laste forhåndsvisning" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/nl.json b/lib/core/i18n/nl.json index c7dd3185ae..2f9aa1ca45 100644 --- a/lib/core/i18n/nl.json +++ b/lib/core/i18n/nl.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Beginformulier" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Preview niet beschikbaar" + }, + "FIELD": { + "UPLOAD": "Uploaden", + "REQUIRED": "*Verplicht", + "VALIDATOR": { + "INVALID_NUMBER": "Gebruik een andere getalnotatie", + "INVALID_DATE": "Gebruik een andere datumnotatie", + "INVALID_VALUE": "Voer een andere waarde in", + "NOT_GREATER_THAN": "Mag niet groter zijn dan {{ maxValue }}", + "NOT_LESS_THAN": "Mag niet kleiner zijn dan {{ minValue }}", + "AT_LEAST_LONG": "Voer minimaal {{ minLength }} tekens in", + "NO_LONGER_THAN": "Voer maximaal {{ maxLength }} tekens in" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "{{ range }} van {{ total }} wordt weergegeven", @@ -148,4 +169,4 @@ "LOADING": "Wordt geladen", "UNKNOWN_FORMAT": "Kan voorbeeld niet laden" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/pt-BR.json b/lib/core/i18n/pt-BR.json index 1ca23ecef3..41d185a245 100644 --- a/lib/core/i18n/pt-BR.json +++ b/lib/core/i18n/pt-BR.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Iniciar formulário" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Pré-visualização não disponível" + }, + "FIELD": { + "UPLOAD": "Carregar", + "REQUIRED": "*Obrigatório", + "VALIDATOR": { + "INVALID_NUMBER": "Use um formato de número diferente", + "INVALID_DATE": "Use um formato de data diferente", + "INVALID_VALUE": "Insira um valor diferente", + "NOT_GREATER_THAN": "Não pode ser maior do que {{ maxValue }}", + "NOT_LESS_THAN": "Não pode ser menor do que {{ minValue }}", + "AT_LEAST_LONG": "Insira no mínimo {{ minLength }} caracteres", + "NO_LONGER_THAN": "Insira no máximo {{ maxLength }} caracteres" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "Mostrando {{ range }} de {{ total }}", @@ -148,4 +169,4 @@ "LOADING": "Carregando", "UNKNOWN_FORMAT": "Não foi possível carregar pré-visualização" } -} \ No newline at end of file +} diff --git a/lib/core/i18n/ru.json b/lib/core/i18n/ru.json index b2ff415533..e845d3867e 100644 --- a/lib/core/i18n/ru.json +++ b/lib/core/i18n/ru.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "Запустить форму" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "Предварительный просмотр недоступен" + }, + "FIELD": { + "UPLOAD": "Загрузить", + "REQUIRED": "*Обязательно для заполнения", + "VALIDATOR": { + "INVALID_NUMBER": "Используйте другой формат числа", + "INVALID_DATE": "Используйте другой формат даты", + "INVALID_VALUE": "Введите другое значение", + "NOT_GREATER_THAN": "Не может быть более {{ maxValue }}", + "NOT_LESS_THAN": "Не может быть менее {{ minValue }}", + "AT_LEAST_LONG": "Введите не менее {{ minLength }} символ", + "NO_LONGER_THAN": "Введите не более {{ maxLength }} символ" + } + } + }, "CORE": { "FILE_SIZE": { "BYTES": "Б", diff --git a/lib/core/i18n/zh-CN.json b/lib/core/i18n/zh-CN.json index 21b1e449a4..295405c99e 100644 --- a/lib/core/i18n/zh-CN.json +++ b/lib/core/i18n/zh-CN.json @@ -1,4 +1,25 @@ { + "FORM": { + "START_FORM": { + "TITLE": "启动表单" + }, + "PREVIEW": { + "IMAGE_NOT_AVAILABLE": "预览不可用" + }, + "FIELD": { + "UPLOAD": "上传", + "REQUIRED": "*必填项", + "VALIDATOR": { + "INVALID_NUMBER": "使用其他数字格式", + "INVALID_DATE": "使用其他日期格式", + "INVALID_VALUE": "输入其他值", + "NOT_GREATER_THAN": "不得大于 {{ maxValue }}", + "NOT_LESS_THAN": "不得小于 {{ minValue }}", + "AT_LEAST_LONG": "输入至少 {{ minLength }} 个字符", + "NO_LONGER_THAN": "不得输入超过 {{ maxLength }} 个字符" + } + } + }, "CORE": { "PAGINATION": { "ITEMS_RANGE": "显示 {{range}}/{{total}}", @@ -148,4 +169,4 @@ "LOADING": "正在加载", "UNKNOWN_FORMAT": "无法加载预览" } -} \ No newline at end of file +} diff --git a/lib/core/viewer/components/viewer.component.ts b/lib/core/viewer/components/viewer.component.ts index 8e1a6a1dec..efd58208e7 100644 --- a/lib/core/viewer/components/viewer.component.ts +++ b/lib/core/viewer/components/viewer.component.ts @@ -458,17 +458,21 @@ export class ViewerComponent implements OnChanges { await this.renditionService.convert(nodeId, 'pdf').toPromise(); this.viewerType = 'pdf'; this.urlFileContent = this.apiService.contentApi.getRenditionUrl(nodeId, 'pdf'); - } catch { + } catch (error) { + this.logService.error(error); } } - } catch { + } catch (error) { + this.logService.error(error); + try { const imagePreview = await this.apiService.renditionsApi.getRendition(nodeId, 'imgpreview'); if (imagePreview.entry.status.toString() === 'CREATED') { this.viewerType = 'image'; this.urlFileContent = this.apiService.contentApi.getRenditionUrl(nodeId, 'imgpreview'); } - } catch { + } catch (error) { + this.logService.error(error); } } @@ -484,14 +488,16 @@ export class ViewerComponent implements OnChanges { this.viewerType = 'pdf'; this.urlFileContent = this.apiService.contentApi.getSharedLinkRenditionUrl(sharedId, 'pdf'); } - } catch { + } catch (error) { + this.logService.error(error); try { const rendition = await this.apiService.renditionsApi.getSharedLinkRendition(sharedId, 'imgpreview'); if (rendition.entry.status.toString() === 'CREATED') { this.viewerType = 'image'; this.urlFileContent = this.apiService.contentApi.getSharedLinkRenditionUrl(sharedId, 'imgpreview'); } - } catch { + } catch (error) { + this.logService.error(error); } } diff --git a/lib/process-services/app-list/apps-list.component.spec.ts b/lib/process-services/app-list/apps-list.component.spec.ts index f3ec7ca70b..63f7296dd4 100644 --- a/lib/process-services/app-list/apps-list.component.spec.ts +++ b/lib/process-services/app-list/apps-list.component.spec.ts @@ -55,7 +55,7 @@ describe('AppsListComponent', () => { component = fixture.componentInstance; debugElement = fixture.debugElement; - service = fixture.debugElement.injector.get(AppsProcessService); + service = TestBed.get(AppsProcessService); getAppsSpy = spyOn(service, 'getDeployedApplications').and.returnValue(Observable.of(deployedApps)); }); diff --git a/lib/process-services/app-list/apps-list.module.ts b/lib/process-services/app-list/apps-list.module.ts index 26a8dfdc28..d6423d50d6 100644 --- a/lib/process-services/app-list/apps-list.module.ts +++ b/lib/process-services/app-list/apps-list.module.ts @@ -22,6 +22,7 @@ import { MaterialModule } from '../material.module'; import { TranslateModule } from '@ngx-translate/core'; import { AppsListComponent } from './apps-list.component'; +import { SelectAppsDialogComponent } from './select-apps-dialog-component'; @NgModule({ imports: [ @@ -31,11 +32,16 @@ import { AppsListComponent } from './apps-list.component'; TranslateModule ], declarations: [ - AppsListComponent + AppsListComponent, + SelectAppsDialogComponent ], providers: [], exports: [ - AppsListComponent + AppsListComponent, + SelectAppsDialogComponent + ], + entryComponents: [ + SelectAppsDialogComponent ] }) export class AppsListModule { diff --git a/lib/process-services/app-list/public-api.ts b/lib/process-services/app-list/public-api.ts index fb2c71a74d..48eb0254f0 100644 --- a/lib/process-services/app-list/public-api.ts +++ b/lib/process-services/app-list/public-api.ts @@ -16,3 +16,4 @@ */ export * from './apps-list.component'; +export * from './select-apps-dialog-component'; diff --git a/lib/process-services/app-list/select-apps-dialog-component.html b/lib/process-services/app-list/select-apps-dialog-component.html new file mode 100644 index 0000000000..e49a1c08f6 --- /dev/null +++ b/lib/process-services/app-list/select-apps-dialog-component.html @@ -0,0 +1,13 @@ +
{{'APP.DIALOG.TITLE' | translate}}
+
+ + + + {{ currentProcessApp.name }} + + + +
+
+ +
diff --git a/lib/process-services/app-list/select-apps-dialog-component.spec.ts b/lib/process-services/app-list/select-apps-dialog-component.spec.ts new file mode 100644 index 0000000000..3e236b10dc --- /dev/null +++ b/lib/process-services/app-list/select-apps-dialog-component.spec.ts @@ -0,0 +1,131 @@ +/*! + * @license + * Copyright 2016 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 } from '@angular/core'; +import { async, TestBed } from '@angular/core/testing'; +import { ComponentFixture } from '@angular/core/testing'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { MaterialModule } from '../material.module'; +import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; +import { MatDialog } from '@angular/material'; +import { OverlayContainer } from '@angular/cdk/overlay'; +import { AppsProcessService } from '@alfresco/adf-core'; +import { deployedApps } from '../mock/apps-list.mock'; +import { Observable } from 'rxjs/Observable'; + +import { SelectAppsDialogComponent } from './select-apps-dialog-component'; + +@Component({ + selector: 'adf-dialog-test', + template: '' +}) +export class DialogSelectAppTestComponent { + + processId: any; + + dialogRef: any; + + constructor(private dialog: MatDialog) { + } + + startProcesAction() { + this.dialogRef = this.dialog.open(SelectAppsDialogComponent, { + width: '630px' + }); + + this.dialogRef.afterClosed().subscribe(selectedProcess => { + this.processId = selectedProcess.id; + }); + } + +} + +describe('Select app dialog', () => { + + let fixture: ComponentFixture; + let component: DialogSelectAppTestComponent; + let dialogRef; + let overlayContainerElement: HTMLElement; + let service: AppsProcessService; + + beforeEach(async(() => { + dialogRef = { + close: jasmine.createSpy('close') + }; + + TestBed.configureTestingModule({ + imports: [ + MaterialModule, + FormsModule, + ReactiveFormsModule, + BrowserDynamicTestingModule + ], + declarations: [ + SelectAppsDialogComponent, + DialogSelectAppTestComponent + ], + providers: [ + AppsProcessService, + { + provide: OverlayContainer, + useFactory: () => { + overlayContainerElement = document.createElement('div'); + return { getContainerElement: () => overlayContainerElement }; + } + } + { + provide: MatDialogRef, useValue: dialogRef + }, + { + provide: MAT_DIALOG_DATA, + useValue: {} + } + ] + }); + + TestBed.overrideModule(BrowserDynamicTestingModule, { + set: { entryComponents: [SelectAppsDialogComponent] } + }); + + TestBed.compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DialogSelectAppTestComponent); + component = fixture.componentInstance; + + service = TestBed.get(AppsProcessService); + + spyOn(service, 'getDeployedApplications').and.returnValue(Observable.of(deployedApps)); + }); + + describe('Dialog', () => { + + beforeEach(() => { + fixture.detectChanges(); + }; + + it('should init title and dropdown', () => { + component.startProcesAction(); + + expect(overlayContainerElement.querySelector('.adf-selet-app-dialog-title')).toBeDefined(); + expect(overlayContainerElement.querySelector('.adf-selet-app-dialog-dropdown')).toBeDefined(); + }); + }); + +}); diff --git a/lib/process-services/app-list/select-apps-dialog-component.ts b/lib/process-services/app-list/select-apps-dialog-component.ts new file mode 100644 index 0000000000..953de62b17 --- /dev/null +++ b/lib/process-services/app-list/select-apps-dialog-component.ts @@ -0,0 +1,56 @@ +/*! + * @license + * Copyright 2016 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 { AppsProcessService, NotificationService, TranslationService } from '@alfresco/adf-core'; +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +@Component({ + selector: 'adf-select-apps-dialog', + templateUrl: 'select-apps-dialog-component.html' +}) +export class SelectAppsDialogComponent { + + processApps: any; + + selectedProcess: any; + + constructor(private appsProcessService: AppsProcessService, + private translateService: TranslationService, + private notificationService: NotificationService, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.appsProcessService.getDeployedApplications().subscribe( + (apps: any[]) => { + this.processApps = apps.filter((currentApp) => { + return currentApp.id; + }); + }, + (err) => { + this.translateService.get('TAG.MESSAGES.EXIST').subscribe((error) => { + this.notificationService.openSnackMessage(error, 4000); + }); + } + ); + + } + + onStart(): void { + this.dialogRef.close(this.selectedProcess); + } +} diff --git a/lib/process-services/content-widget/attach-file-widget.component.html b/lib/process-services/content-widget/attach-file-widget.component.html index e15123e9a1..561efd3ac3 100644 --- a/lib/process-services/content-widget/attach-file-widget.component.html +++ b/lib/process-services/content-widget/attach-file-widget.component.html @@ -25,7 +25,7 @@
diff --git a/lib/process-services/content-widget/attach-file-widget.component.ts b/lib/process-services/content-widget/attach-file-widget.component.ts index f355ebbbf8..9eab0f881f 100644 --- a/lib/process-services/content-widget/attach-file-widget.component.ts +++ b/lib/process-services/content-widget/attach-file-widget.component.ts @@ -40,11 +40,9 @@ import { Observable } from 'rxjs/Observable'; }) export class AttachFileWidgetComponent extends UploadWidgetComponent implements OnInit { - alfrescoLogoUrl: string = '../assets/images/alfresco-flower.svg'; repositoryList = []; - constructor( - public formService: FormService, + constructor(public formService: FormService, private logger: LogService, public thumbnails: ThumbnailService, public processContentService: ProcessContentService, @@ -69,36 +67,36 @@ export class AttachFileWidgetComponent extends UploadWidgetComponent implements return !!this.field.params && !!this.field.params.fileSource; } - isMultipleSourceUpload() { + isMultipleSourceUpload(): boolean { return !this.field.readOnly && this.isFileSourceConfigured() && !this.isOnlyLocalSourceSelected(); } - isAllFileSourceSelected() { + isAllFileSourceSelected(): boolean { return this.field.params && this.field.params.fileSource && this.field.params.fileSource.serviceId === 'all-file-sources'; } - isOnlyLocalSourceSelected() { + isOnlyLocalSourceSelected(): boolean { return this.field.params && this.field.params.fileSource && this.field.params.fileSource.serviceId === 'local-file'; } - isSimpleUploadButton() { + isSimpleUploadButton(): boolean { return this.isUploadButtonVisible() && - !this.isFileSourceConfigured() || - this.isOnlyLocalSourceSelected(); + !this.isFileSourceConfigured() || + this.isOnlyLocalSourceSelected(); } - isUploadButtonVisible() { + isUploadButtonVisible(): boolean { return (!this.hasFile || this.multipleOption) && !this.field.readOnly; } - isDefinedSourceFolder() { + isDefinedSourceFolder(): boolean { return !!this.field.params && - !!this.field.params.fileSource && - !!this.field.params.fileSource.selectedFolder; + !!this.field.params.fileSource && + !!this.field.params.fileSource.selectedFolder; } openSelectDialogFromFileSource() { @@ -106,7 +104,7 @@ export class AttachFileWidgetComponent extends UploadWidgetComponent implements if (this.isDefinedSourceFolder()) { this.contentDialog.openFileBrowseDialogByFolderId(params.fileSource.selectedFolder.pathId).subscribe( (selections: MinimalNodeEntryEntity[]) => { - this.uploadFileFromShare(selections, + this.uploadFileFromCS(selections, this.field.params.fileSource.selectedFolder.accountId, this.field.params.fileSource.selectedFolder.siteId); }); @@ -117,11 +115,11 @@ export class AttachFileWidgetComponent extends UploadWidgetComponent implements const accountIdentifier = 'alfresco-' + repoId + repoName; this.contentDialog.openFileBrowseDialogBySite().subscribe( (selections: MinimalNodeEntryEntity[]) => { - this.uploadFileFromShare(selections, accountIdentifier); + this.uploadFileFromCS(selections, accountIdentifier); }); } - private uploadFileFromShare(fileNodeList: MinimalNodeEntryEntity[], accountId: string, siteId?: string) { + private uploadFileFromCS(fileNodeList: MinimalNodeEntryEntity[], accountId: string, siteId?: string) { let filesSaved = []; Observable.from(fileNodeList) .mergeMap(node => @@ -131,7 +129,9 @@ export class AttachFileWidgetComponent extends UploadWidgetComponent implements ).subscribe((res) => { filesSaved.push(res); }, - (error) => { this.logger.error(error); }, + (error) => { + this.logger.error(error); + }, () => { this.field.value = filesSaved; this.field.json.value = filesSaved; diff --git a/lib/process-services/i18n/en.json b/lib/process-services/i18n/en.json index 1a4266b833..e1e063157f 100644 --- a/lib/process-services/i18n/en.json +++ b/lib/process-services/i18n/en.json @@ -302,5 +302,13 @@ "NEW_TASK": "New Task", "NEW_PROCESS": "New Process" } + }, + "APP":{ + "DIALOG" :{ + "START" : "Start", + "TITLE" : "Select a process", + "LIST": "Proces list", + "ERROR" : "Possible connection with process service not present" + } } } diff --git a/lib/process-services/process-list/components/start-process.component.html b/lib/process-services/process-list/components/start-process.component.html index e5003b9e7f..bba11f209e 100644 --- a/lib/process-services/process-list/components/start-process.component.html +++ b/lib/process-services/process-list/components/start-process.component.html @@ -17,6 +17,7 @@ { + let appConfig: AppConfigService; + let activitiContentService: ActivitiContentService; let component: StartProcessInstanceComponent; let fixture: ComponentFixture; let processService: ProcessService; @@ -54,6 +56,7 @@ describe('StartProcessInstanceComponent', () => { StartProcessInstanceComponent ], providers: [ + ActivitiContentService, ProcessService, FormService ] @@ -61,7 +64,8 @@ describe('StartProcessInstanceComponent', () => { })); beforeEach(() => { - + appConfig = TestBed.get(AppConfigService); + activitiContentService = TestBed.get(ActivitiContentService); fixture = TestBed.createComponent(StartProcessInstanceComponent); component = fixture.componentInstance; processService = fixture.debugElement.injector.get(ProcessService); @@ -70,7 +74,7 @@ describe('StartProcessInstanceComponent', () => { getDefinitionsSpy = spyOn(processService, 'getProcessDefinitions').and.returnValue(Observable.of(testProcessDefs)); startProcessSpy = spyOn(processService, 'startProcess').and.returnValue(Observable.of(newProcess)); getStartFormDefinitionSpy = spyOn(formService, 'getStartFormDefinition').and.returnValue(Observable.of(taskFormMock)); - + spyOn(activitiContentService, 'applyAlfrescoNode').and.returnValue(Observable.of({ id: 1234 })); }); it('should create instance of StartProcessInstanceComponent', () => { @@ -81,7 +85,7 @@ describe('StartProcessInstanceComponent', () => { it('should call service to fetch process definitions with appId', () => { let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); fixture.detectChanges(); expect(getDefinitionsSpy).toHaveBeenCalledWith('123'); @@ -89,7 +93,7 @@ describe('StartProcessInstanceComponent', () => { it('should call service to fetch process definitions without appId', () => { let change = new SimpleChange(null, null, true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); fixture.detectChanges(); expect(getDefinitionsSpy).toHaveBeenCalledWith(null); @@ -97,7 +101,7 @@ describe('StartProcessInstanceComponent', () => { it('should call service to fetch process definitions with appId when provided', () => { let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); fixture.detectChanges(); expect(getDefinitionsSpy).toHaveBeenCalledWith('123'); @@ -105,7 +109,7 @@ describe('StartProcessInstanceComponent', () => { it('should display the correct number of processes in the select list', () => { let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); fixture.detectChanges(); let selectElement = fixture.nativeElement.querySelector('mat-select'); @@ -114,7 +118,7 @@ describe('StartProcessInstanceComponent', () => { it('should display the option def details', () => { let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); component.processDefinitions = testProcessDefs; fixture.detectChanges(); fixture.whenStable().then(() => { @@ -131,7 +135,7 @@ describe('StartProcessInstanceComponent', () => { it('should indicate an error to the user if process defs cannot be loaded', async(() => { getDefinitionsSpy = getDefinitionsSpy.and.returnValue(Observable.throw({})); let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); fixture.detectChanges(); fixture.whenStable().then(() => { @@ -144,7 +148,7 @@ describe('StartProcessInstanceComponent', () => { it('should show no process available message when no process definition is loaded', async(() => { getDefinitionsSpy = getDefinitionsSpy.and.returnValue(Observable.of([])); let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); fixture.detectChanges(); fixture.whenStable().then(() => { @@ -156,7 +160,7 @@ describe('StartProcessInstanceComponent', () => { it('should auto-select process def from dropdown if there is just one process def', () => { let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); component.processDefinitions[0] = testProcessDefRepr; fixture.detectChanges(); fixture.whenStable().then(() => { @@ -183,17 +187,17 @@ describe('StartProcessInstanceComponent', () => { })); it('should reload processes when appId input changed', () => { - component.ngOnChanges({appId: change}); + component.ngOnChanges({ appId: change }); expect(getDefinitionsSpy).toHaveBeenCalledWith(456); }); it('should reload processes when appId input changed to null', () => { - component.ngOnChanges({appId: nullChange}); + component.ngOnChanges({ appId: nullChange }); expect(getDefinitionsSpy).toHaveBeenCalledWith(null); }); it('should get current processDeff', () => { - component.ngOnChanges({appId: change}); + component.ngOnChanges({ appId: change }); component.onProcessDefChange('my:Process'); fixture.detectChanges(); expect(getDefinitionsSpy).toHaveBeenCalled(); @@ -206,7 +210,7 @@ describe('StartProcessInstanceComponent', () => { beforeEach(() => { component.name = 'My new process'; let change = new SimpleChange(null, 123, true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); }); it('should call service to start process if required fields provided', async(() => { @@ -261,7 +265,7 @@ describe('StartProcessInstanceComponent', () => { it('should throw error event when process cannot be started', async(() => { let errorSpy = spyOn(component.error, 'error'); - let error = {message: 'My error'}; + let error = { message: 'My error' }; startProcessSpy = startProcessSpy.and.returnValue(Observable.throw(error)); component.onProcessDefChange('my:process1'); component.startProcess(); @@ -331,7 +335,7 @@ describe('StartProcessInstanceComponent', () => { beforeEach(async(() => { component.name = 'My new process'; let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); fixture.detectChanges(); })); @@ -374,7 +378,7 @@ describe('StartProcessInstanceComponent', () => { beforeEach(() => { getDefinitionsSpy.and.returnValue(Observable.of(testProcessDefWithForm)); let change = new SimpleChange(null, '123', true); - component.ngOnChanges({'appId': change}); + component.ngOnChanges({ 'appId': change }); component.onProcessDefChange('my:process1'); fixture.detectChanges(); fixture.whenStable(); @@ -397,7 +401,7 @@ describe('StartProcessInstanceComponent', () => { })); it('should emit cancel event on cancel Button', () => { - let cancelButton = fixture.nativeElement.querySelector('#cancle_process'); + let cancelButton = fixture.nativeElement.querySelector('#cancle_process'); let cancelSpy: jasmine.Spy = spyOn(component.cancel, 'emit'); cancelButton.click(); fixture.detectChanges(); @@ -405,6 +409,35 @@ describe('StartProcessInstanceComponent', () => { }); }); + describe('CS content connection', () => { + + fit('alfrescoRepositoryName default configuration property', () => { + expect(component.getAlfrescoRepositoryName()).toBe('alfresco-1Alfresco'); + }); + + fit('alfrescoRepositoryName configuration property should be fetched', () => { + appConfig.config = Object.assign(appConfig.config, { + 'alfrescoRepositoryName': 'alfresco-123' + }; + + expect(component.getAlfrescoRepositoryName()).toBe('alfresco-123Alfresco'); + }); + + fit('if values in input is a node should be linked in the process service', () => { + + component.values = {}; + component.values['file'] = { + isFile: true, + name= 'example-file' + }; + + component.moveNodeFromCStoPS(); + + fixture.whenStable().then(() => { + expect(component.values.file[0].id).toBe(1234); + }); + }); + }); }); }); diff --git a/lib/process-services/process-list/components/start-process.component.ts b/lib/process-services/process-list/components/start-process.component.ts index c0af3d8cf0..3dde162421 100644 --- a/lib/process-services/process-list/components/start-process.component.ts +++ b/lib/process-services/process-list/components/start-process.component.ts @@ -15,8 +15,23 @@ * limitations under the License. */ -import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core'; -import { StartFormComponent, FormRenderingService } from '@alfresco/adf-core'; +import { + Component, + EventEmitter, + Input, + OnChanges, + Output, + SimpleChanges, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { + ActivitiContentService, + AppConfigService, + StartFormComponent, + FormRenderingService, + FormValues +} from '@alfresco/adf-core'; import { ProcessInstanceVariable } from '../models/process-instance-variable.model'; import { ProcessDefinitionRepresentation } from './../models/process-definition.model'; import { ProcessInstance } from './../models/process-instance.model'; @@ -37,6 +52,12 @@ export class StartProcessInstanceComponent implements OnChanges { @Input() variables: ProcessInstanceVariable[]; + @Input() + values: FormValues; + + @Input() + name: string; + @Output() start: EventEmitter = new EventEmitter(); @@ -51,19 +72,23 @@ export class StartProcessInstanceComponent implements OnChanges { processDefinitions: ProcessDefinitionRepresentation[] = []; - name: string; - currentProcessDef: ProcessDefinitionRepresentation = new ProcessDefinitionRepresentation(); errorMessageId: string = ''; constructor(private activitiProcess: ProcessService, - private formRenderingService: FormRenderingService) { + private formRenderingService: FormRenderingService, + private activitiContentService: ActivitiContentService, + private appConfig: AppConfigService) { this.formRenderingService.setComponentTypeResolver('upload', () => AttachFileWidgetComponent, true); this.formRenderingService.setComponentTypeResolver('select-folder', () => AttachFolderWidgetComponent, true); } ngOnChanges(changes: SimpleChanges) { + if (changes['values'] && changes['values'].currentValue) { + this.moveNodeFromCStoPS(); + } + let appIdChange = changes['appId']; let appId = appIdChange ? appIdChange.currentValue : null; this.load(appId); @@ -82,6 +107,30 @@ export class StartProcessInstanceComponent implements OnChanges { ); } + getAlfrescoRepositoryName(): string { + let alfrescoRepositoryName = this.appConfig.get('alfrescoRepositoryName'); + if (!alfrescoRepositoryName) { + alfrescoRepositoryName = 'alfresco-1'; + } + return alfrescoRepositoryName + 'Alfresco'; + } + + moveNodeFromCStoPS() { + let accountIdentifier = this.getAlfrescoRepositoryName(); + + for (let key in this.values) { + if (this.values.hasOwnProperty(key)) { + let currentValue = this.values[key]; + + if (currentValue.isFile) { + this.activitiContentService.applyAlfrescoNode(currentValue, null, accountIdentifier).subscribe((res) => { + this.values[key] = [res]; + }); + } + } + } + } + public startProcess(outcome?: string) { if (this.currentProcessDef.id && this.name) { this.resetErrorMessage(); @@ -121,7 +170,7 @@ export class StartProcessInstanceComponent implements OnChanges { this.cancel.emit(); } - hasStartForm() { + hasStartForm(): boolean { return this.currentProcessDef && this.currentProcessDef.hasStartForm; } @@ -129,7 +178,7 @@ export class StartProcessInstanceComponent implements OnChanges { return this.processDefinitions ? (this.processDefinitions.length > 0 || this.errorMessageId) : this.errorMessageId; } - isStartFormMissingOrValid() { + isStartFormMissingOrValid(): boolean { if (this.startForm) { return this.startForm.form && this.startForm.form.isValid; } else { @@ -137,7 +186,7 @@ export class StartProcessInstanceComponent implements OnChanges { } } - validateForm() { + validateForm(): boolean { return this.currentProcessDef.id && this.name && this.isStartFormMissingOrValid(); } @@ -149,7 +198,7 @@ export class StartProcessInstanceComponent implements OnChanges { this.errorMessageId = ''; } - hasErrorMessage() { + hasErrorMessage(): boolean { return this.processDefinitions.length === 0 && !this.errorMessageId; } diff --git a/lib/process-services/process-list/services/process.service.ts b/lib/process-services/process-list/services/process.service.ts index 3239cb1249..b087c37587 100644 --- a/lib/process-services/process-list/services/process.service.ts +++ b/lib/process-services/process-list/services/process.service.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { AlfrescoApiService } from '@alfresco/adf-core'; +import { AlfrescoApiService, FormValues } from '@alfresco/adf-core'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { TaskDetailsModel } from '../../task-list'; @@ -98,7 +98,7 @@ export class ProcessService { .catch(err => this.handleProcessError(err)); } - startProcess(processDefinitionId: string, name: string, outcome?: string, startFormValues?: any, variables?: ProcessInstanceVariable[]): Observable { + startProcess(processDefinitionId: string, name: string, outcome?: string, startFormValues?: FormValues, variables?: ProcessInstanceVariable[]): Observable { let startRequest: any = { name: name, processDefinitionId: processDefinitionId