From 8c00919db0d22ed06b258dde0661ed8cdb41f0e0 Mon Sep 17 00:00:00 2001 From: siva kumar Date: Fri, 23 Aug 2019 19:21:40 +0530 Subject: [PATCH] [ADF-4828] [ProcessListCloudComponent] Add action and context menu. (#5009) * * Demo on list com * [ADF-4828] [ADF] [ProcessListCloudComponent] Add action and context menu. * Exposed action and context menu. * Provided a way to in the demo shell to test action menu. * Added required transaltion on demo shell. * * Added doc * * Fixed comments. --- demo-shell/resources/i18n/en.json | 16 ++- .../cloud/processes-cloud-demo.component.html | 32 ++++- .../cloud/processes-cloud-demo.component.ts | 49 +++++++- .../cloud/services/cloud-layout.service.ts | 19 ++- .../shared/cloud-settings.component.html | 47 +++++++ .../cloud/shared/cloud-settings.component.ts | 43 ++++++- .../cloud/shared/cloud.shared.module.ts | 4 +- .../images/action-menu-on-process-list.png | Bin 0 -> 30645 bytes .../images/context-menu-on-process-list.png | Bin 0 -> 27796 bytes .../process-list-cloud.component.md | 116 ++++++++++++++++++ .../process-list-cloud.component.html | 7 ++ .../process-list-cloud.component.ts | 43 ++++++- 12 files changed, 366 insertions(+), 10 deletions(-) create mode 100644 docs/docassets/images/action-menu-on-process-list.png create mode 100644 docs/docassets/images/context-menu-on-process-list.png diff --git a/demo-shell/resources/i18n/en.json b/demo-shell/resources/i18n/en.json index 9fb603b5f9..6f13ce31f6 100644 --- a/demo-shell/resources/i18n/en.json +++ b/demo-shell/resources/i18n/en.json @@ -320,7 +320,21 @@ "MULTISELECTION": "Multiselection", "TESTING_MODE": "Testing Mode", "SELECTION_MODE": "Selection Mode", + "SELECTED_ROWS": "Selected rows", "TASK_DETAILS_REDIRECTION": "Display task details on task click", - "PROCESS_DETAILS_REDIRECTION": "Display process details on process click" + "PROCESS_DETAILS_REDIRECTION": "Display process details on process click", + "ACTION": { + "ACTION_TITLE": "Add Action", + "ACTION_MENU": "Action Menu", + "CONTEX_MENU": "Context Menu", + "ACTION_VISIBLE": "Visible", + "ACTION_DISABLE": "Disable", + "ADD_BUTTON": "Add", + "KEY": "Key", + "TITLE": "Title", + "ICON": "Icon", + "PROCESS_ID": "ProcessInstanceId", + "ACTION_TYPE": "Action Type" + } } } diff --git a/demo-shell/src/app/components/cloud/processes-cloud-demo.component.html b/demo-shell/src/app/components/cloud/processes-cloud-demo.component.html index af3a0ec943..70dfb611ac 100644 --- a/demo-shell/src/app/components/cloud/processes-cloud-demo.component.html +++ b/demo-shell/src/app/components/cloud/processes-cloud-demo.component.html @@ -24,7 +24,13 @@ [lastModifiedTo]="editedFilter.lastModifiedTo" [sorting]="sortArray" [selectionMode]="selectionMode" + [stickyHeader]="true" + [showActions]="actionMenu" + [showContextMenu]="contextMenu" [multiselect]="multiselect" + (showRowActionsMenu)="onShowRowActionsMenu($event)" + (showRowContextMenu)="onShowRowContextMenu($event)" + (executeRowAction)="onExecuteRowAction($event)" (rowClick)="onRowClick($event)" (rowsSelected)="onRowsSelected($event)"> @@ -35,10 +41,28 @@ (prevPage)="resetSelectedRows()">
- Selected rows: - +
+ {{ 'SETTINGS_CLOUD.SELECTED_ROWS' | translate }}: +
    +
  • {{ row.id }}
  • +
+
+
+ {{ 'SETTINGS_CLOUD.ACTION.ACTION_MENU' | translate }}: +
+
+ {{ 'SETTINGS_CLOUD.ACTION.PROCESS_ID' | translate }}: {{ selectedAction.id }}
+ {{ 'SETTINGS_CLOUD.ACTION.ACTION_TYPE' | translate }}: {{ selectedAction.actionType }} +
+
+
+ {{ 'SETTINGS_CLOUD.ACTION.CONTEX_MENU' | translate }}: +
+
+ {{ 'SETTINGS_CLOUD.ACTION.PROCESS_ID' | translate }}: {{ selectedContextAction.id }}
+ {{ 'SETTINGS_CLOUD.ACTION.ACTION_TYPE' | translate }}: {{ selectedContextAction.actionType }} +
+
diff --git a/demo-shell/src/app/components/cloud/processes-cloud-demo.component.ts b/demo-shell/src/app/components/cloud/processes-cloud-demo.component.ts index 40455ff8c2..87f77c13bc 100644 --- a/demo-shell/src/app/components/cloud/processes-cloud-demo.component.ts +++ b/demo-shell/src/app/components/cloud/processes-cloud-demo.component.ts @@ -24,7 +24,7 @@ import { } from '@alfresco/adf-process-services-cloud'; import { ActivatedRoute, Router } from '@angular/router'; -import { UserPreferencesService, AppConfigService } from '@alfresco/adf-core'; +import { UserPreferencesService, AppConfigService, DataCellEvent } from '@alfresco/adf-core'; import { CloudLayoutService, CloudServiceSettings } from './services/cloud-layout.service'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -55,11 +55,17 @@ export class ProcessesCloudDemoComponent implements OnInit, OnDestroy { selectionMode: string; selectedRows: string[] = []; testingMode: boolean; + actionMenu: boolean; + contextMenu: boolean; + actions: any[] = []; + selectedAction: { id: number, name: string, actionType: string}; + selectedContextAction: { id: number, name: string, actionType: string}; processFilterProperties: any = { filterProperties: [], sortProperties: [], actions: [] }; processDetailsRedirection: boolean; editedFilter: ProcessFilterCloudModel; + private performAction$ = new Subject(); private onDestroy$ = new Subject(); constructor( @@ -89,6 +95,7 @@ export class ProcessesCloudDemoComponent implements OnInit, OnDestroy { this.cloudLayoutService.settings$ .pipe(takeUntil(this.onDestroy$)) .subscribe(settings => this.setCurrentSettings(settings)); + this.performContextActions(); } ngOnDestroy() { @@ -102,6 +109,9 @@ export class ProcessesCloudDemoComponent implements OnInit, OnDestroy { this.testingMode = settings.testingMode; this.selectionMode = settings.selectionMode; this.processDetailsRedirection = settings.processDetailsRedirection; + this.actionMenu = settings.actionMenu; + this.contextMenu = settings.contextMenu; + this.actions = settings.actions; } } @@ -140,4 +150,41 @@ export class ProcessesCloudDemoComponent implements OnInit, OnDestroy { this.resetSelectedRows(); this.selectedRows = nodes.map((node) => node.obj.entry); } + + onShowRowActionsMenu(event: DataCellEvent) { + event.value.actions = this.actions; + } + + onShowRowContextMenu(event: DataCellEvent) { + event.value.actions = this.actions.map((action) => { + return { + data: event.value.row['obj'], + model: action, + subject: this.performAction$ + + }; + }); + } + + onExecuteRowAction(row: any) { + const value = row.value.row['obj'].entry; + const action = row.value.action; + this.selectedAction = {id: value.id, name: value.name, actionType: action.title}; + } + + performContextActions() { + this.performAction$ + .pipe(takeUntil(this.onDestroy$)) + .subscribe((action: any) => { + if (action) { + this.onExecuteContextAction(action); + } + }); + } + + onExecuteContextAction(contextAction: any) { + const value = contextAction.data.entry; + const action = contextAction.model; + this.selectedContextAction = {id: value.id, name: value.name, actionType: action.title}; + } } diff --git a/demo-shell/src/app/components/cloud/services/cloud-layout.service.ts b/demo-shell/src/app/components/cloud/services/cloud-layout.service.ts index d3041063d3..4e86e2aa5a 100644 --- a/demo-shell/src/app/components/cloud/services/cloud-layout.service.ts +++ b/demo-shell/src/app/components/cloud/services/cloud-layout.service.ts @@ -20,10 +20,13 @@ import { BehaviorSubject } from 'rxjs'; export interface CloudServiceSettings { multiselect: boolean; + actionMenu: boolean; + contextMenu: boolean; testingMode: boolean; taskDetailsRedirection: boolean; processDetailsRedirection: boolean; selectionMode: string; + actions: any[]; } export interface FilterSettings { @@ -32,6 +35,17 @@ export interface FilterSettings { key?: string; } +export class ActionMenuModel { + constructor( + public key: string, + public icon: string, + public title: string, + public visible?: boolean, + public disable?: boolean + ) { } + +} + @Injectable({ providedIn: 'root' }) @@ -39,10 +53,13 @@ export class CloudLayoutService { private settings: CloudServiceSettings = { multiselect: false, + actionMenu: false, + contextMenu: false, testingMode: false, taskDetailsRedirection: true, processDetailsRedirection: true, - selectionMode: 'single' + selectionMode: 'single', + actions: [] }; taskFilter$ = new BehaviorSubject({index: 0}); diff --git a/demo-shell/src/app/components/cloud/shared/cloud-settings.component.html b/demo-shell/src/app/components/cloud/shared/cloud-settings.component.html index 62d8ded230..5c385dcbdd 100644 --- a/demo-shell/src/app/components/cloud/shared/cloud-settings.component.html +++ b/demo-shell/src/app/components/cloud/shared/cloud-settings.component.html @@ -2,6 +2,12 @@ {{ 'SETTINGS_CLOUD.MULTISELECTION' | translate }} + + {{ 'SETTINGS_CLOUD.ACTION.ACTION_MENU' | translate }} + + + {{ 'SETTINGS_CLOUD.ACTION.CONTEX_MENU' | translate }} + {{ 'SETTINGS_CLOUD.TESTING_MODE' | translate }} @@ -21,4 +27,45 @@ + + + {{ 'SETTINGS_CLOUD.ACTION.ACTION_TITLE' | translate }} + + +
+ + + + + + + + + + + + + {{ 'SETTINGS_CLOUD.ACTION.ACTION_VISIBLE' | translate }} + + + {{ 'SETTINGS_CLOUD.ACTION.ACTION_DISABLE' | translate }} + + +
+
+ + + {{action.title}} + + cancel + + + +
+
+
diff --git a/demo-shell/src/app/components/cloud/shared/cloud-settings.component.ts b/demo-shell/src/app/components/cloud/shared/cloud-settings.component.ts index d21e308386..b9ca5fec4e 100644 --- a/demo-shell/src/app/components/cloud/shared/cloud-settings.component.ts +++ b/demo-shell/src/app/components/cloud/shared/cloud-settings.component.ts @@ -16,9 +16,10 @@ */ import { Component, OnInit, OnDestroy } from '@angular/core'; -import { CloudLayoutService } from '../services/cloud-layout.service'; +import { CloudLayoutService, ActionMenuModel } from '../services/cloud-layout.service'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; +import { FormGroup, FormControl } from '@angular/forms'; @Component({ selector: 'app-cloud-settings', @@ -29,6 +30,9 @@ export class CloudSettingsComponent implements OnInit, OnDestroy { private onDestroy$ = new Subject(); multiselect: boolean; + actionMenu: boolean; + contextMenu: boolean; + actions: ActionMenuModel[] = []; selectionMode: string; testingMode: boolean; taskDetailsRedirection: boolean; @@ -40,6 +44,14 @@ export class CloudSettingsComponent implements OnInit, OnDestroy { { value: 'multiple', title: 'Multiple' } ]; + actionMenuForm = new FormGroup({ + key: new FormControl(''), + title: new FormControl(''), + icon: new FormControl(''), + visible: new FormControl(true), + disable: new FormControl(false) + }); + constructor(private cloudLayoutService: CloudLayoutService) { } ngOnInit() { @@ -57,6 +69,9 @@ export class CloudSettingsComponent implements OnInit, OnDestroy { setCurrentSettings(settings) { if (settings) { this.multiselect = settings.multiselect; + this.actionMenu = this.actionMenu; + this.contextMenu = this.contextMenu; + this.actions = this.actions; this.testingMode = settings.testingMode; this.selectionMode = settings.selectionMode; this.taskDetailsRedirection = settings.taskDetailsRedirection; @@ -88,9 +103,35 @@ export class CloudSettingsComponent implements OnInit, OnDestroy { this.setSetting(); } + toggleActionMenu() { + this.actionMenu = !this.actionMenu; + this.setSetting(); + } + + toggleContextMenu() { + this.contextMenu = !this.contextMenu; + this.setSetting(); + } + + addAction() { + this.actions.push( this.actionMenuForm.value); + this.actionMenuForm.get('key').reset(); + this.actionMenuForm.get('title').reset(); + this.actionMenuForm.get('icon').reset(); + this.setSetting(); + } + + removeAction(removedAction: ActionMenuModel) { + this.actions = this.actions.filter((action: ActionMenuModel) => action.key !== removedAction.key); + this.setSetting(); + } + setSetting() { this.cloudLayoutService.setCurrentSettings({ multiselect: this.multiselect, + actionMenu: this.actionMenu, + contextMenu: this.contextMenu, + actions: this.actions, testingMode: this.testingMode, selectionMode: this.selectionMode, taskDetailsRedirection: this.taskDetailsRedirection, diff --git a/demo-shell/src/app/components/cloud/shared/cloud.shared.module.ts b/demo-shell/src/app/components/cloud/shared/cloud.shared.module.ts index a67fc6e948..7a72006f9d 100644 --- a/demo-shell/src/app/components/cloud/shared/cloud.shared.module.ts +++ b/demo-shell/src/app/components/cloud/shared/cloud.shared.module.ts @@ -20,6 +20,7 @@ import { CommonModule } from '@angular/common'; import { CloudSettingsComponent } from './cloud-settings.component'; import { MatDialogModule, MatInputModule, MatSelectModule, MatSlideToggleModule } from '@angular/material'; import { CoreModule } from '@alfresco/adf-core'; +import { FlexLayoutModule } from '@angular/flex-layout'; @NgModule({ imports: [ @@ -28,7 +29,8 @@ import { CoreModule } from '@alfresco/adf-core'; MatDialogModule, MatInputModule, MatSelectModule, - MatSlideToggleModule + MatSlideToggleModule, + FlexLayoutModule ], declarations: [ CloudSettingsComponent ], exports: [ CommonModule, CloudSettingsComponent] diff --git a/docs/docassets/images/action-menu-on-process-list.png b/docs/docassets/images/action-menu-on-process-list.png new file mode 100644 index 0000000000000000000000000000000000000000..bf16ea6b6ae781a97447cabb38e7268f699fe01e GIT binary patch literal 30645 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 J3$|Vd{|iID(&PXD literal 0 HcmV?d00001 diff --git a/docs/process-services-cloud/components/process-list-cloud.component.md b/docs/process-services-cloud/components/process-list-cloud.component.md index 5b12220bed..1f7ad0b23c 100644 --- a/docs/process-services-cloud/components/process-list-cloud.component.md +++ b/docs/process-services-cloud/components/process-list-cloud.component.md @@ -51,6 +51,9 @@ when the process list is empty: | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | appName | `string` | | The name of the application. | +| actions | `boolean` | false | Toggles the data actions column. | +| actionsPosition | `string` | "right" | Position of the actions dropdown menu. Can be "left" or "right". | +| contextMenu | `boolean` | false | Toggles custom context menu for the component. | | businessKey | `string` | "" | Filter the processes to display only the ones with this businessKey value. | | id | `string` | "" | Filter the processes to display only the ones with this ID. | | initiator | `string` | "" | Name of the initiator of the process. | @@ -73,6 +76,9 @@ when the process list is empty: | rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a row in the process list is clicked. | | rowsSelected | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when rows are selected/unselected. | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the list of process instances has been loaded successfully from the server. | +| executeRowAction | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowActionEvent`](../../../lib/core/datatable/components/datatable/data-row-action.event.ts)`>` | Emitted when the user executes a row action. | +| showRowActionsMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the actions menu is displayed for a row. | +| showRowContextMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the context menu is displayed for a row. | ## Details @@ -192,6 +198,116 @@ The configuration related to the pagination can be changed from the `app.config. }, ``` +#### showRowContextMenu event + +Emitted before the context menu is displayed for a row. + +Note that the ProcessListCloud itself does not populate the context menu with items. +You can provide all necessary content via the handler. + +```html + + +``` + +Event properties: + +```ts +value: { + row: DataRow, + col: DataColumn, + actions: [] +} +``` + +Handler example: + +```ts +onShowRowContextMenu(event: DataCellEvent) { + event.value.actions = [ + { title: 'Hello Context Action' }, + { ... } + ] +} +``` +![](../../docassets/images/context-menu-on-process-list.png) + +This event is cancellable. You can use `event.preventDefault()` to prevent the default behavior. + +The ProcessListCloud will automatically render the supplied menu items. + +See the [ContextMenu](https://www.npmjs.com/package/ng2-alfresco-core) +documentation for more details on the format and behavior of context actions. + +#### showRowActionsMenu event + +Emitted before the actions menu is displayed for a row. +Requires the `actions` property to be set to `true`. + +Event properties: + +```ts +value: { + row: DataRow, + action: any +} +``` + +Note that the ProcessListCloud itself does not populate the action menu with items. +You can provide all necessary content via the handler. + +This event is cancellable. You can use `event.preventDefault()` to prevent the default behavior. + +#### executeRowAction event + +Emitted when the user executes a row action. + +This usually accompanies a `showRowActionsMenu` event. +The ProcessListCloud itself does not execute actions but provides support for external +integration. If actions are provided using the `showRowActionsMenu` event +then `executeRowAction` will be automatically executed when the user clicks a +corresponding menu item. + +```html + + +``` + +```ts +import { DataCellEvent, DataRowActionEvent } from '@alfresco/adf-core'; + +onShowRowActionsMenu(event: DataCellEvent) { + let myAction = { + title: 'Hello Action' + // your custom metadata needed for onExecuteRowAction + }; + event.value.actions = [ + myAction + ]; +} + +onExecuteRowAction(event: DataRowActionEvent) { + let args = event.value; + console.log(args.row); + console.log(args.action); + window.alert(`My custom action: ${args.action.title}`); +} +``` + +![](../../docassets/images/action-menu-on-process-list.png) + +You can use any payloads for row actions. The only requirement for the objects is that they +must have a `title` property. + +When an action is selected in the dropdown menu, the ProcessListCloud invokes the `executeRowAction` event. +Use this to handle the response, inspect the action payload (and all custom properties defined +earlier), and perform the corresponding actions. + ## See also - [Data column component](../../core/components/data-column.component.md) diff --git a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html index ab135609ab..70a8338452 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html +++ b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.html @@ -1,9 +1,16 @@ = new EventEmitter(); @@ -108,6 +125,18 @@ export class ProcessListCloudComponent extends DataTableSchema implements OnChan @Output() rowsSelected: EventEmitter = new EventEmitter(); + /** Emitted before the context menu is displayed for a row. */ + @Output() + showRowContextMenu = new EventEmitter(); + + /** Emitted before the actions menu is displayed for a row. */ + @Output() + showRowActionsMenu = new EventEmitter(); + + /** Emitted when the user executes a row action. */ + @Output() + executeRowAction = new EventEmitter(); + /** Emitted when an error occurs while loading the list of process instances from the server. */ @Output() error: EventEmitter = new EventEmitter(); @@ -223,6 +252,18 @@ export class ProcessListCloudComponent extends DataTableSchema implements OnChan } } + onShowRowActionsMenu(event: DataCellEvent) { + this.showRowActionsMenu.emit(event); + } + + onShowRowContextMenu(event: DataCellEvent) { + this.showRowContextMenu.emit(event); + } + + onExecuteRowAction(row: DataRowActionEvent) { + this.executeRowAction.emit(row); + } + private createRequestNode(): ProcessQueryCloudRequestModel { const requestNode = { appName: this.appName,