[ACS-6071] documentation fixes for process lib (#8943)

* doc and api fixes

* doc fixes

* fix docs

* code fixes

* typo fixes
This commit is contained in:
Denys Vuika
2023-09-28 14:35:59 +01:00
committed by GitHub
parent 016e5ec089
commit b03011c3d2
30 changed files with 215 additions and 142 deletions

View File

@@ -25,6 +25,7 @@ import { defaultApp, deployedApps, nonDeployedApps } from '../mock/apps-list.moc
import { AppsListComponent, APP_LIST_LAYOUT_GRID, APP_LIST_LAYOUT_LIST } from './apps-list.component'; import { AppsListComponent, APP_LIST_LAYOUT_GRID, APP_LIST_LAYOUT_LIST } from './apps-list.component';
import { ProcessTestingModule } from '../testing/process.testing.module'; import { ProcessTestingModule } from '../testing/process.testing.module';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { AppDefinitionRepresentationModel } from '../task-list';
describe('AppsListComponent', () => { describe('AppsListComponent', () => {
@@ -153,7 +154,7 @@ describe('AppsListComponent', () => {
const appDataMock = { const appDataMock = {
defaultAppId: 'tasks', defaultAppId: 'tasks',
name: null name: null
}; } as AppDefinitionRepresentationModel;
component.getAppName(appDataMock).subscribe((name) => { component.getAppName(appDataMock).subscribe((name) => {
expect(name).toBe('ADF_TASK_LIST.APPS.TASK_APP_NAME'); expect(name).toBe('ADF_TASK_LIST.APPS.TASK_APP_NAME');
}); });
@@ -163,7 +164,7 @@ describe('AppsListComponent', () => {
const appDataMock = { const appDataMock = {
defaultAppId: 'uiu', defaultAppId: 'uiu',
name: 'the-name' name: 'the-name'
}; } as AppDefinitionRepresentationModel;
component.getAppName(appDataMock).subscribe((name) => { component.getAppName(appDataMock).subscribe((name) => {
expect(name).toBe(appDataMock.name); expect(name).toBe(appDataMock.name);

View File

@@ -43,7 +43,8 @@ export class AppsListComponent implements OnInit, AfterContentInit, OnDestroy {
@ContentChild(CustomEmptyContentTemplateDirective) @ContentChild(CustomEmptyContentTemplateDirective)
emptyCustomContent: CustomEmptyContentTemplateDirective; emptyCustomContent: CustomEmptyContentTemplateDirective;
/** (**required**) Defines the layout of the apps. There are two possible /**
* Defines the layout of the apps. There are two possible
* values, "GRID" and "LIST". * values, "GRID" and "LIST".
*/ */
@Input() @Input()
@@ -102,11 +103,11 @@ export class AppsListComponent implements OnInit, AfterContentInit, OnDestroy {
} }
} }
isDefaultApp(app) { isDefaultApp(app: AppDefinitionRepresentationModel) {
return app.defaultAppId === DEFAULT_TASKS_APP; return app.defaultAppId === DEFAULT_TASKS_APP;
} }
getAppName(app) { getAppName(app: AppDefinitionRepresentationModel) {
return this.isDefaultApp(app) return this.isDefaultApp(app)
? this.translationService.get(DEFAULT_TASKS_APP_NAME) ? this.translationService.get(DEFAULT_TASKS_APP_NAME)
: of(app.name); : of(app.name);
@@ -115,7 +116,7 @@ export class AppsListComponent implements OnInit, AfterContentInit, OnDestroy {
/** /**
* Pass the selected app as next * Pass the selected app as next
* *
* @param app * @param app application model
*/ */
selectApp(app: AppDefinitionRepresentationModel) { selectApp(app: AppDefinitionRepresentationModel) {
this.currentApp = app; this.currentApp = app;
@@ -125,7 +126,8 @@ export class AppsListComponent implements OnInit, AfterContentInit, OnDestroy {
/** /**
* Return true if the appId is the current app * Return true if the appId is the current app
* *
* @param appId * @param appId application id
* @returns `true` if application is selected, otherwise `false`
*/ */
isSelected(appId: number): boolean { isSelected(appId: number): boolean {
return (this.currentApp !== undefined && appId === this.currentApp.id); return (this.currentApp !== undefined && appId === this.currentApp.id);
@@ -133,6 +135,8 @@ export class AppsListComponent implements OnInit, AfterContentInit, OnDestroy {
/** /**
* Check if the value of the layoutType property is an allowed value * Check if the value of the layoutType property is an allowed value
*
* @returns `true` if layout type is valid, otherwise `false`
*/ */
isValidType(): boolean { isValidType(): boolean {
return this.layoutType && (this.layoutType === APP_LIST_LAYOUT_LIST || this.layoutType === APP_LIST_LAYOUT_GRID); return this.layoutType && (this.layoutType === APP_LIST_LAYOUT_LIST || this.layoutType === APP_LIST_LAYOUT_GRID);
@@ -146,14 +150,18 @@ export class AppsListComponent implements OnInit, AfterContentInit, OnDestroy {
} }
/** /**
* Return true if the layout type is LIST * Check if the layout type is LIST
*
* @returns `true` if current layout is in the list mode, otherwise `false`
*/ */
isList(): boolean { isList(): boolean {
return this.layoutType === APP_LIST_LAYOUT_LIST; return this.layoutType === APP_LIST_LAYOUT_LIST;
} }
/** /**
* Return true if the layout type is GRID * Check if the layout type is GRID
*
* @returns `true` if current layout is in the grid mode, otherwise `false`
*/ */
isGrid(): boolean { isGrid(): boolean {
return this.layoutType === APP_LIST_LAYOUT_GRID; return this.layoutType === APP_LIST_LAYOUT_GRID;

View File

@@ -28,13 +28,15 @@ export class CreateProcessAttachmentComponent implements OnChanges {
@Input() @Input()
processInstanceId: string; processInstanceId: string;
/** Emitted when an error occurs while creating or uploading an attachment /**
* Emitted when an error occurs while creating or uploading an attachment
* from the user within the component. * from the user within the component.
*/ */
@Output() @Output()
error: EventEmitter<any> = new EventEmitter<any>(); error: EventEmitter<any> = new EventEmitter<any>();
/** Emitted when an attachment is successfully created or uploaded /**
* Emitted when an attachment is successfully created or uploaded
* from within the component. * from within the component.
*/ */
@Output() @Output()

View File

@@ -28,13 +28,15 @@ export class AttachmentComponent implements OnChanges {
@Input() @Input()
taskId: string; taskId: string;
/** Emitted when an error occurs while creating or uploading an /**
* Emitted when an error occurs while creating or uploading an
* attachment from the user within the component. * attachment from the user within the component.
*/ */
@Output() @Output()
error: EventEmitter<any> = new EventEmitter<any>(); error: EventEmitter<any> = new EventEmitter<any>();
/** Emitted when an attachment is created or uploaded successfully /**
* Emitted when an attachment is created or uploaded successfully
* from within the component. * from within the component.
*/ */
@Output() @Output()

View File

@@ -48,7 +48,8 @@ export class ProcessAttachmentListComponent implements OnChanges, AfterContentIn
@Input() @Input()
disabled: boolean = false; disabled: boolean = false;
/** Emitted when the attachment is double-clicked or the /**
* Emitted when the attachment is double-clicked or the
* view option is selected from the context menu by the user from * view option is selected from the context menu by the user from
* within the component. Returns a Blob representing the object * within the component. Returns a Blob representing the object
* that was clicked. * that was clicked.
@@ -56,13 +57,15 @@ export class ProcessAttachmentListComponent implements OnChanges, AfterContentIn
@Output() @Output()
attachmentClick = new EventEmitter(); attachmentClick = new EventEmitter();
/** Emitted when the attachment list has fetched all the attachments. /**
* Emitted when the attachment list has fetched all the attachments.
* Returns a list of attachments. * Returns a list of attachments.
*/ */
@Output() @Output()
success = new EventEmitter(); success = new EventEmitter();
/** Emitted when the attachment list is not able to fetch the attachments /**
* Emitted when the attachment list is not able to fetch the attachments
* (eg, following a network error). * (eg, following a network error).
*/ */
@Output() @Output()

View File

@@ -48,14 +48,16 @@ export class TaskAttachmentListComponent implements OnChanges, AfterContentInit
@Input() @Input()
disabled: boolean = false; disabled: boolean = false;
/** Emitted when the attachment is double-clicked or a view /**
* Emitted when the attachment is double-clicked or a view
* option is selected from the context menu by the user from within the component. * option is selected from the context menu by the user from within the component.
* Returns a Blob representing the clicked object. * Returns a Blob representing the clicked object.
*/ */
@Output() @Output()
attachmentClick = new EventEmitter(); attachmentClick = new EventEmitter();
/** Emitted when the attachment list has fetched all the attachments. /**
* Emitted when the attachment list has fetched all the attachments.
* Returns a list of attachments. * Returns a list of attachments.
*/ */
@Output() @Output()

View File

@@ -106,6 +106,7 @@ export class PeopleProcessService {
* *
* @param taskId ID of the task * @param taskId ID of the task
* @param searchWord Filter text to search for * @param searchWord Filter text to search for
* @param groupId group id
* @returns Array of user information objects * @returns Array of user information objects
*/ */
getWorkflowUsers(taskId?: string, searchWord?: string, groupId?: string): Observable<UserProcessModel[]> { getWorkflowUsers(taskId?: string, searchWord?: string, groupId?: string): Observable<UserProcessModel[]> {

View File

@@ -305,6 +305,7 @@ export class FormComponent extends FormBaseComponent implements OnInit, OnDestro
* Get custom set of outcomes for a Form Definition. * Get custom set of outcomes for a Form Definition.
* *
* @param form Form definition model. * @param form Form definition model.
* @returns list of form outcomes
*/ */
getFormDefinitionOutcomes(form: FormModel): FormOutcomeModel[] { getFormDefinitionOutcomes(form: FormModel): FormOutcomeModel[] {
return [new FormOutcomeModel(form, { id: '$save', name: FormOutcomeModel.SAVE_ACTION, isSystem: true })]; return [new FormOutcomeModel(form, { id: '$save', name: FormOutcomeModel.SAVE_ACTION, isSystem: true })];

View File

@@ -15,10 +15,10 @@
* limitations under the License. * limitations under the License.
*/ */
import { AlfrescoApiService, LogService, ExternalContent, ExternalContentLink } from '@alfresco/adf-core'; import { AlfrescoApiService, LogService, ExternalContent } from '@alfresco/adf-core';
import { SitesService } from '@alfresco/adf-content-services'; import { SitesService } from '@alfresco/adf-content-services';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { IntegrationAlfrescoOnPremiseApi, Node, RelatedContentRepresentation, ActivitiContentApi } from '@alfresco/js-api'; import { IntegrationAlfrescoOnPremiseApi, Node, RelatedContentRepresentation, ActivitiContentApi, AlfrescoEndpointRepresentation, AlfrescoContentRepresentation } from '@alfresco/js-api';
import { Observable, from, throwError } from 'rxjs'; import { Observable, from, throwError } from 'rxjs';
import { map, catchError } from 'rxjs/operators'; import { map, catchError } from 'rxjs/operators';
@@ -47,13 +47,14 @@ export class ActivitiContentService {
/** /**
* Returns a list of child nodes below the specified folder * Returns a list of child nodes below the specified folder
* *
* @param accountId * @param accountId account id
* @param folderId * @param folderId folder id
* @returns list of external content instances
*/ */
getAlfrescoNodes(accountId: string, folderId: string): Observable<[ExternalContent]> { getAlfrescoNodes(accountId: string, folderId: string): Observable<AlfrescoContentRepresentation[]> {
const accountShortId = accountId.replace('alfresco-', ''); const accountShortId = accountId.replace('alfresco-', '');
return from(this.integrationAlfrescoOnPremiseApi.getContentInFolder(accountShortId, folderId)).pipe( return from(this.integrationAlfrescoOnPremiseApi.getContentInFolder(accountShortId, folderId)).pipe(
map(this.toJsonArray), map(res => res?.data || []),
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }
@@ -61,16 +62,17 @@ export class ActivitiContentService {
/** /**
* Returns a list of all the repositories configured * Returns a list of all the repositories configured
* *
* @param tenantId * @param tenantId tenant id
* @param includeAccount * @param includeAccount include accounts
* @returns list of endpoints
*/ */
getAlfrescoRepositories(tenantId?: string, includeAccount?: boolean): Observable<any> { getAlfrescoRepositories(tenantId?: string, includeAccount?: boolean): Observable<AlfrescoEndpointRepresentation[]> {
const opts = { const opts = {
tenantId, tenantId,
includeAccounts: includeAccount ? includeAccount : true includeAccounts: includeAccount ? includeAccount : true
}; };
return from(this.integrationAlfrescoOnPremiseApi.getRepositories(opts)).pipe( return from(this.integrationAlfrescoOnPremiseApi.getRepositories(opts)).pipe(
map(this.toJsonArray), map(res => res?.data || []),
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }
@@ -78,11 +80,12 @@ export class ActivitiContentService {
/** /**
* Returns a list of child nodes below the specified folder * Returns a list of child nodes below the specified folder
* *
* @param accountId * @param accountId account id
* @param node * @param node node details
* @param siteId * @param siteId site id
* @returns link to external content
*/ */
linkAlfrescoNode(accountId: string, node: ExternalContent, siteId: string): Observable<ExternalContentLink> { linkAlfrescoNode(accountId: string, node: ExternalContent, siteId: string): Observable<RelatedContentRepresentation> {
return from( return from(
this.contentApi.createTemporaryRelatedContent({ this.contentApi.createTemporaryRelatedContent({
link: true, link: true,
@@ -92,12 +95,12 @@ export class ActivitiContentService {
sourceId: node.id + '@' + siteId sourceId: node.id + '@' + siteId
}) })
).pipe( ).pipe(
map(this.toJson), map(res => res || {}),
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }
applyAlfrescoNode(node: Node, siteId: string, accountId: string) { applyAlfrescoNode(node: Node, siteId: string, accountId: string): Observable<RelatedContentRepresentation> {
const currentSideId = siteId ? siteId : this.sitesService.getSiteNameFromNodePath(node); const currentSideId = siteId ? siteId : this.sitesService.getSiteNameFromNodePath(node);
const params: RelatedContentRepresentation = { const params: RelatedContentRepresentation = {
source: accountId, source: accountId,
@@ -107,26 +110,12 @@ export class ActivitiContentService {
link: node.isLink link: node.isLink
}; };
return from(this.contentApi.createTemporaryRelatedContent(params)).pipe( return from(this.contentApi.createTemporaryRelatedContent(params)).pipe(
map(this.toJson), map(res => res || {}),
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }
toJson(res: any) { private handleError(error: any): Observable<never> {
if (res) {
return res || {};
}
return {};
}
toJsonArray(res: any) {
if (res) {
return res.data || [];
}
return [];
}
handleError(error: any): Observable<any> {
let errMsg = ActivitiContentService.UNKNOWN_ERROR_MESSAGE; let errMsg = ActivitiContentService.UNKNOWN_ERROR_MESSAGE;
if (error) { if (error) {
errMsg = error.message errMsg = error.message

View File

@@ -190,7 +190,7 @@ export class ProcessContentService {
* @param source - source of the document that workflow or task has been started with * @param source - source of the document that workflow or task has been started with
* @param size - size of the entries to get * @param size - size of the entries to get
* @param page - page number * @param page - page number
* @return Promise<ResultListDataRepresentationRelatedProcessTask> * @returns Promise<ResultListDataRepresentationRelatedProcessTask>
*/ */
getProcessesAndTasksOnContent(sourceId: string, source: string, size?: number, page?: number): Observable<ResultListDataRepresentationRelatedProcessTask> { getProcessesAndTasksOnContent(sourceId: string, source: string, size?: number, page?: number): Observable<ResultListDataRepresentationRelatedProcessTask> {
return from(this.contentApi.getProcessesAndTasksOnContent(sourceId, source, size, page)).pipe(catchError((err) => this.handleError(err))); return from(this.contentApi.getProcessesAndTasksOnContent(sourceId, source, size, page)).pipe(catchError((err) => this.handleError(err)));

View File

@@ -44,6 +44,7 @@ export class AttachFileWidgetDialogService {
* *
* @param repository Alfresco endpoint that represents the content service * @param repository Alfresco endpoint that represents the content service
* @param currentFolderId Upload file from specific folder * @param currentFolderId Upload file from specific folder
* @param accountIdentifier account identifier
* @returns Information about the chosen file(s) * @returns Information about the chosen file(s)
*/ */
openLogin(repository: AlfrescoEndpointRepresentation, currentFolderId = '-my-', accountIdentifier?: string): Observable<Node[]> { openLogin(repository: AlfrescoEndpointRepresentation, currentFolderId = '-my-', accountIdentifier?: string): Observable<Node[]> {

View File

@@ -222,14 +222,14 @@ export class AttachFileWidgetComponent extends UploadWidgetComponent implements
private uploadFileFromExternalCS(repository: AlfrescoEndpointRepresentation, currentFolderId?: string) { private uploadFileFromExternalCS(repository: AlfrescoEndpointRepresentation, currentFolderId?: string) {
const accountIdentifier = `alfresco-${repository.id}-${repository.name}`; const accountIdentifier = `alfresco-${repository.id}-${repository.name}`;
this.attachDialogService.openLogin(repository, currentFolderId, accountIdentifier).subscribe((selections: any[]) => { this.attachDialogService.openLogin(repository, currentFolderId, accountIdentifier).subscribe((selections) => {
selections.forEach((node) => (node.isExternal = true)); selections.forEach((node) => (node['isExternal'] = true));
this.tempFilesList.push(...selections); this.tempFilesList.push(...selections);
this.uploadFileFromCS(selections, accountIdentifier); this.uploadFileFromCS(selections, accountIdentifier);
}); });
} }
private uploadFileFromCS(fileNodeList: any[], accountId: string, siteId?: string) { private uploadFileFromCS(fileNodeList: Node[], accountId: string, siteId?: string) {
const filesSaved = []; const filesSaved = [];
fileNodeList.forEach((node) => { fileNodeList.forEach((node) => {
@@ -239,13 +239,13 @@ export class AttachFileWidgetComponent extends UploadWidgetComponent implements
from(fileNodeList) from(fileNodeList)
.pipe( .pipe(
mergeMap((node) => mergeMap((node) =>
zip(of(node?.content?.mimeType), this.activitiContentService.applyAlfrescoNode(node, siteId, accountId), of(node.isExternal)) zip(of(node?.content?.mimeType), this.activitiContentService.applyAlfrescoNode(node, siteId, accountId), of(node['isExternal']))
) )
) )
.subscribe( .subscribe(
([mimeType, res, isExternal]) => { ([mimeType, res, isExternal]) => {
res.mimeType = mimeType; res.mimeType = mimeType;
res.isExternal = isExternal; res['isExternal'] = isExternal;
filesSaved.push(res); filesSaved.push(res);
}, },
(error) => { (error) => {

View File

@@ -123,6 +123,8 @@ export class ContentWidgetComponent implements OnChanges {
/** /**
* Invoke content download. * Invoke content download.
*
* @param content content link model
*/ */
download(content: ContentLinkModel): void { download(content: ContentLinkModel): void {
this.processContentService.getFileRawContent(content.id).subscribe( this.processContentService.getFileRawContent(content.id).subscribe(

View File

@@ -58,6 +58,9 @@ describe('PeopleSearchComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
}); });
/**
* trigger search
*/
function triggerSearch() { function triggerSearch() {
searchInput = element.querySelector('#userSearchText'); searchInput = element.querySelector('#userSearchText');
searchInput.value = 'fake-search'; searchInput.value = 'fake-search';

View File

@@ -43,7 +43,7 @@ export class CommentProcessService implements CommentsService {
/** /**
* Gets all comments that have been added to a process instance. * Gets all comments that have been added to a process instance.
* *
* @param processInstanceId ID of the target process instance * @param id ID of the target process instance
* @returns Details for each comment * @returns Details for each comment
*/ */
get(id: string): Observable<CommentModel[]> { get(id: string): Observable<CommentModel[]> {
@@ -69,7 +69,7 @@ export class CommentProcessService implements CommentsService {
/** /**
* Adds a comment to a process instance. * Adds a comment to a process instance.
* *
* @param processInstanceId ID of the target process instance * @param id ID of the target process instance
* @param message Text for the comment * @param message Text for the comment
* @returns Details of the comment added * @returns Details of the comment added
*/ */

View File

@@ -58,10 +58,6 @@ export class ProcessAuditDirective implements OnChanges {
@Output() @Output()
error: EventEmitter<any> = new EventEmitter<any>(); error: EventEmitter<any> = new EventEmitter<any>();
/**
* @param downloadService
* @param processListService
*/
constructor(private downloadService: DownloadService, constructor(private downloadService: DownloadService,
private processListService: ProcessService) { private processListService: ProcessService) {
} }

View File

@@ -33,7 +33,8 @@ import { Location } from '@angular/common';
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class ProcessFiltersComponent implements OnInit, OnChanges, OnDestroy { export class ProcessFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** The parameters to filter the task filter. If there is no match then the default one /**
* The parameters to filter the task filter. If there is no match then the default one
* (ie, the first filter in the list) is selected. * (ie, the first filter in the list) is selected.
*/ */
@Input() @Input()
@@ -155,9 +156,9 @@ export class ProcessFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Return the filter list filtered by appName * Return the filter list filtered by appName
* *
* @param appName * @param appName application name
*/ */
getFiltersByAppName(appName: string) { getFiltersByAppName(appName: string): void {
this.appsProcessService.getDeployedApplicationsByName(appName).subscribe( this.appsProcessService.getDeployedApplicationsByName(appName).subscribe(
(application) => { (application) => {
this.getFiltersByAppId(application.id); this.getFiltersByAppId(application.id);
@@ -172,7 +173,7 @@ export class ProcessFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Pass the selected filter as next * Pass the selected filter as next
* *
* @param filterModel * @param filterModel filter model
*/ */
selectFilter(filterModel: ProcessInstanceFilterRepresentation) { selectFilter(filterModel: ProcessInstanceFilterRepresentation) {
this.currentFilter = filterModel; this.currentFilter = filterModel;
@@ -182,8 +183,10 @@ export class ProcessFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Select the first filter of a list if present * Select the first filter of a list if present
*
* @param filterParam filter parameter
*/ */
selectProcessFilter(filterParam: FilterProcessRepresentationModel) { selectProcessFilter(filterParam: FilterProcessRepresentationModel): void {
if (filterParam) { if (filterParam) {
const newFilter = this.filters.find( const newFilter = this.filters.find(
(processFilter, index) => (processFilter, index) =>
@@ -219,7 +222,9 @@ export class ProcessFiltersComponent implements OnInit, OnChanges, OnDestroy {
} }
/** /**
* Return the current task * Get the current task
*
* @returns process instance filter
*/ */
getCurrentFilter(): ProcessInstanceFilterRepresentation { getCurrentFilter(): ProcessInstanceFilterRepresentation {
return this.currentFilter; return this.currentFilter;
@@ -227,13 +232,18 @@ export class ProcessFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Check if the filter list is empty * Check if the filter list is empty
*
* @returns `true` if filter list is empty, otherwise `false`
*/ */
isFilterListEmpty(): boolean { isFilterListEmpty(): boolean {
return this.filters === undefined || (this.filters && this.filters.length === 0); return this.filters === undefined || (this.filters && this.filters.length === 0);
} }
/** /**
* Return current filter icon * Get the material icons equivalent of the glyphicon icon
*
* @param icon glyphicon name
* @returns material icons equivalent of the icon
*/ */
getFilterIcon(icon: string): string { getFilterIcon(icon: string): string {
return this.iconsMDL.mapGlyphiconToMaterialDesignIcons(icon); return this.iconsMDL.mapGlyphiconToMaterialDesignIcons(icon);

View File

@@ -67,12 +67,6 @@ export class ProcessInstanceDetailsComponent implements OnChanges {
processInstanceDetails: ProcessInstance; processInstanceDetails: ProcessInstance;
/**
* Constructor
*
* @param activitiProcess Process service
* @param logService
*/
constructor(private activitiProcess: ProcessService, private logService: LogService) {} constructor(private activitiProcess: ProcessService, private logService: LogService) {}
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {

View File

@@ -31,11 +31,12 @@ import { share, takeUntil } from 'rxjs/operators';
styleUrls: ['./process-instance-tasks.component.css'] styleUrls: ['./process-instance-tasks.component.css']
}) })
export class ProcessInstanceTasksComponent implements OnInit, OnChanges, OnDestroy { export class ProcessInstanceTasksComponent implements OnInit, OnChanges, OnDestroy {
/** (**required**) The ID of the process instance to display tasks for. */ /** The ID of the process instance to display tasks for. */
@Input() @Input()
processInstanceDetails: ProcessInstance; processInstanceDetails: ProcessInstance;
/** Toggles whether to show a refresh button next to the list of tasks to allow /**
* Toggles whether to show a refresh button next to the list of tasks to allow
* it to be updated from the server. * it to be updated from the server.
*/ */
@Input() @Input()

View File

@@ -68,7 +68,8 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC
@Input() @Input()
state: string; state: string;
/** Defines the sort ordering of the list. Possible values are `created-desc`, `created-asc`, /**
* Defines the sort ordering of the list. Possible values are `created-desc`, `created-asc`,
* `ended-desc`, `ended-asc`. * `ended-desc`, `ended-asc`.
*/ */
@Input() @Input()
@@ -90,7 +91,8 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC
@Input() @Input()
multiselect: boolean = false; multiselect: boolean = false;
/** Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode, /**
* Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode,
* you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for * you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for
* multiple rows. * multiple rows.
*/ */
@@ -199,7 +201,9 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC
} }
/** /**
* Return the current id * Get the id of the current instance
*
* @returns instance id
*/ */
getCurrentId(): string { getCurrentId(): string {
return this.currentInstanceId; return this.currentInstanceId;
@@ -207,6 +211,8 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC
/** /**
* Check if the list is empty * Check if the list is empty
*
* @returns `true` if list is empty, otherwise `false`
*/ */
isListEmpty(): boolean { isListEmpty(): boolean {
return !this.rows || this.rows.length === 0; return !this.rows || this.rows.length === 0;
@@ -215,7 +221,7 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC
/** /**
* Emit the event rowClick passing the current task id when the row is clicked * Emit the event rowClick passing the current task id when the row is clicked
* *
* @param event * @param event input event
*/ */
onRowClick(event: DataRowEvent) { onRowClick(event: DataRowEvent) {
const item = event; const item = event;
@@ -227,7 +233,7 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC
/** /**
* Emit the event rowClick passing the current task id when pressed the Enter key on the selected row * Emit the event rowClick passing the current task id when pressed the Enter key on the selected row
* *
* @param event * @param event keyboard event
*/ */
onRowKeyUp(event: CustomEvent<any>) { onRowKeyUp(event: CustomEvent<any>) {
if (event.detail.keyboardEvent.key === 'Enter') { if (event.detail.keyboardEvent.key === 'Enter') {

View File

@@ -64,6 +64,11 @@ describe('StartProcessComponent', () => {
} }
}; };
/**
* Change application id
*
* @param appId application id
*/
function changeAppId(appId: number) { function changeAppId(appId: number) {
const change = new SimpleChange(null, appId, true); const change = new SimpleChange(null, appId, true);
component.appId = appId; component.appId = appId;
@@ -82,7 +87,7 @@ describe('StartProcessComponent', () => {
startProcessSpy = spyOn(processService, 'startProcess').and.returnValue(of(newProcess)); startProcessSpy = spyOn(processService, 'startProcess').and.returnValue(of(newProcess));
getStartFormDefinitionSpy = spyOn(processService, 'getStartFormDefinition').and.returnValue(of(taskFormMock)); getStartFormDefinitionSpy = spyOn(processService, 'getStartFormDefinition').and.returnValue(of(taskFormMock));
applyAlfrescoNodeSpy = spyOn(activitiContentService, 'applyAlfrescoNode').and.returnValue(of({ id: 1234 })); applyAlfrescoNodeSpy = spyOn(activitiContentService, 'applyAlfrescoNode').and.returnValue(of({ id: 1234 }));
spyOn(activitiContentService, 'getAlfrescoRepositories').and.returnValue(of([{ id: '1', name: 'fake-repo-name' }])); spyOn(activitiContentService, 'getAlfrescoRepositories').and.returnValue(of([{ id: '1', name: 'fake-repo-name' } as any]));
}); });
afterEach(() => { afterEach(() => {

View File

@@ -41,21 +41,23 @@ const MAX_LENGTH = 255;
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class StartProcessInstanceComponent implements OnChanges, OnInit, OnDestroy { export class StartProcessInstanceComponent implements OnChanges, OnInit, OnDestroy {
/** (optional) Limit the list of processes that can be started to those /**
* Limit the list of processes that can be started to those
* contained in the specified app. * contained in the specified app.
*/ */
@Input() @Input()
appId: number; appId?: number;
/** (optional) Define the header of the component. */ /** Define the header of the component. */
@Input() @Input()
title: string; title?: string;
/** (optional) Definition name of the process to start. */ /** Definition name of the process to start. */
@Input() @Input()
processDefinitionName: string; processDefinitionName?: string;
/** Variables in the input to the process /**
* Variables in the input to the process
* [RestVariable](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-activiti-rest-api/docs/RestVariable.md). * [RestVariable](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-activiti-rest-api/docs/RestVariable.md).
*/ */
@Input() @Input()
@@ -65,21 +67,21 @@ export class StartProcessInstanceComponent implements OnChanges, OnInit, OnDestr
@Input() @Input()
values: FormValues; values: FormValues;
/** (optional) Name to assign to the current process. */ /** Name to assign to the current process. */
@Input() @Input()
name: string = ''; name?: string = '';
/** Hide or show the process selection dropdown. */ /** Hide or show the process selection dropdown. */
@Input() @Input()
showSelectProcessDropdown: boolean = true; showSelectProcessDropdown: boolean = true;
/** (optional) Hide or show application selection dropdown. */ /** Hide or show application selection dropdown. */
@Input() @Input()
showSelectApplicationDropdown: boolean = false; showSelectApplicationDropdown?: boolean = false;
/** (optional) Parameter to enable selection of process when filtering. */ /** Parameter to enable selection of process when filtering. */
@Input() @Input()
processFilterSelector: boolean = true; processFilterSelector?: boolean = true;
/** Emitted when the process starts. */ /** Emitted when the process starts. */
@Output() @Output()

View File

@@ -69,7 +69,8 @@ export class ProcessUserInfoComponent implements OnDestroy {
@Input() @Input()
showName: boolean = true; showName: boolean = true;
/** When the username is shown, this defines its position relative to the user info button. /**
* When the username is shown, this defines its position relative to the user info button.
* Can be `right` or `left`. * Can be `right` or `left`.
*/ */
@Input() @Input()

View File

@@ -26,14 +26,15 @@ import { TaskListService } from './../services/tasklist.service';
styleUrls: ['./checklist.component.scss'] styleUrls: ['./checklist.component.scss']
}) })
export class ChecklistComponent implements OnChanges { export class ChecklistComponent implements OnChanges {
/** (required) The id of the parent task to which subtasks are /**
* attached. * The id of the parent task to which subtasks are attached.
*/ */
@Input() @Input()
taskId: string; taskId: string;
/** Toggle readonly state of the form. All form widgets /**
* will render as readonly if enabled. * Toggle readonly state of the form.
* All form widgets will render as readonly if enabled.
*/ */
@Input() @Input()
readOnly: boolean = false; readOnly: boolean = false;

View File

@@ -112,7 +112,8 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy {
@Input() @Input()
showFormSaveButton: boolean = true; showFormSaveButton: boolean = true;
/** Toggles read-only state of the form. All form widgets render as read-only /**
* Toggles read-only state of the form. All form widgets render as read-only
* if enabled. * if enabled.
*/ */
@Input() @Input()
@@ -154,7 +155,8 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy {
@Output() @Output()
error = new EventEmitter<any>(); error = new EventEmitter<any>();
/** Emitted when any outcome is executed. Default behaviour can be prevented /**
* Emitted when any outcome is executed. Default behaviour can be prevented
* via `event.preventDefault()`. * via `event.preventDefault()`.
*/ */
@Output() @Output()

View File

@@ -32,7 +32,8 @@ import { filter, takeUntil } from 'rxjs/operators';
encapsulation: ViewEncapsulation.None encapsulation: ViewEncapsulation.None
}) })
export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy { export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** Parameters to use for the task filter. If there is no match then /**
* Parameters to use for the task filter. If there is no match then
* the default filter (the first one the list) is selected. * the default filter (the first one the list) is selected.
*/ */
@Input() @Input()
@@ -121,12 +122,12 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
} }
/** /**
* Return the task list filtered by appId or by appName * Load the task list filtered by appId or by appName
* *
* @param appId * @param appId application id
* @param appName * @param appName application name
*/ */
getFilters(appId?: number, appName?: string) { getFilters(appId?: number, appName?: string): void {
if (appName) { if (appName) {
this.getFiltersByAppName(appName); this.getFiltersByAppName(appName);
} else { } else {
@@ -160,9 +161,9 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Return the filter list filtered by appName * Return the filter list filtered by appName
* *
* @param appName * @param appName application name
*/ */
getFiltersByAppName(appName: string) { getFiltersByAppName(appName: string): void {
this.appsProcessService.getDeployedApplicationsByName(appName).subscribe( this.appsProcessService.getDeployedApplicationsByName(appName).subscribe(
(application) => { (application) => {
this.getFiltersByAppId(application.id); this.getFiltersByAppId(application.id);
@@ -176,9 +177,9 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Create default filters by appId * Create default filters by appId
* *
* @param appId * @param appId application id
*/ */
createFiltersByAppId(appId?: number) { createFiltersByAppId(appId?: number): void {
this.taskFilterService.createDefaultFilters(appId).subscribe( this.taskFilterService.createDefaultFilters(appId).subscribe(
(resDefault: FilterRepresentationModel[]) => { (resDefault: FilterRepresentationModel[]) => {
this.resetFilter(); this.resetFilter();
@@ -195,9 +196,9 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Pass the selected filter as next * Pass the selected filter as next
* *
* @param newFilter * @param newFilter new filter model
*/ */
public selectFilter(newFilter: FilterParamsModel) { public selectFilter(newFilter: FilterParamsModel): void {
if (newFilter) { if (newFilter) {
this.currentFilter = this.filters.find( this.currentFilter = this.filters.find(
(entry, index) => (entry, index) =>
@@ -215,6 +216,8 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Selects and emits the clicked filter. * Selects and emits the clicked filter.
*
* @param filterParams filter parameters model
*/ */
onFilterClick(filterParams: FilterParamsModel) { onFilterClick(filterParams: FilterParamsModel) {
this.selectFilter(filterParams); this.selectFilter(filterParams);
@@ -224,9 +227,9 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Select filter with task * Select filter with task
* *
* @param taskId * @param taskId task id
*/ */
public selectFilterWithTask(taskId: string) { selectFilterWithTask(taskId: string): void {
const filteredFilterList: FilterRepresentationModel[] = []; const filteredFilterList: FilterRepresentationModel[] = [];
this.taskListService.getFilterForTaskById(taskId, this.filters).subscribe( this.taskListService.getFilterForTaskById(taskId, this.filters).subscribe(
(filterModel: FilterRepresentationModel) => { (filterModel: FilterRepresentationModel) => {
@@ -247,14 +250,16 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Select as default task filter the first in the list * Select as default task filter the first in the list
*/ */
public selectDefaultTaskFilter() { public selectDefaultTaskFilter(): void {
if (!this.isFilterListEmpty()) { if (!this.isFilterListEmpty()) {
this.currentFilter = this.filters[0]; this.currentFilter = this.filters[0];
} }
} }
/** /**
* Return the current task * Get the current filter
*
* @returns filter model
*/ */
getCurrentFilter(): FilterRepresentationModel { getCurrentFilter(): FilterRepresentationModel {
return this.currentFilter; return this.currentFilter;
@@ -262,15 +267,20 @@ export class TaskFiltersComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Check if the filter list is empty * Check if the filter list is empty
*
* @returns `true` if filter list is empty, otherwise `false`
*/ */
isFilterListEmpty(): boolean { isFilterListEmpty(): boolean {
return this.filters === undefined || (this.filters && this.filters.length === 0); return this.filters === undefined || (this.filters && this.filters.length === 0);
} }
/** /**
* Return current filter icon * Get the material icons equivalent of the glyphicon icon
*
* @param icon glyphicon name
* @returns material icons equivalent of the icon
*/ */
getFilterIcon(icon): string { getFilterIcon(icon: string): string {
return this.iconsMDL.mapGlyphiconToMaterialDesignIcons(icon); return this.iconsMDL.mapGlyphiconToMaterialDesignIcons(icon);
} }

View File

@@ -50,8 +50,8 @@ export class TaskFormComponent implements OnInit, OnChanges {
@Input() @Input()
showCancelButton: boolean = true; showCancelButton: boolean = true;
/** Toggles read-only state of the form. All form widgets render as read-only /**
* if enabled. * Toggles read-only state of the form. All form widgets render as read-only if enabled.
*/ */
@Input() @Input()
readOnlyForm: boolean = false; readOnlyForm: boolean = false;
@@ -88,7 +88,8 @@ export class TaskFormComponent implements OnInit, OnChanges {
@Output() @Output()
showAttachForm = new EventEmitter<void>(); showAttachForm = new EventEmitter<void>();
/** Emitted when any outcome is executed. Default behaviour can be prevented /**
* Emitted when any outcome is executed. Default behaviour can be prevented
* via `event.preventDefault()`. * via `event.preventDefault()`.
*/ */
@Output() @Output()

View File

@@ -121,7 +121,9 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
} }
/** /**
* Return the process parent information * Get the process parent information
*
* @returns a map of process instance and definition
*/ */
getParentInfo(): Map<string, string> { getParentInfo(): Map<string, string> {
if (this.taskDetails.processInstanceId && this.taskDetails.processDefinitionName) { if (this.taskDetails.processInstanceId && this.taskDetails.processDefinitionName) {
@@ -131,35 +133,46 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
} }
/** /**
* Does the task have an assignee * Check if the task has an assignee
*
* @returns `true` if the task has an assignee, otherwise `false`
*/ */
hasAssignee(): boolean { hasAssignee(): boolean {
return !!this.taskDetails.assignee; return !!this.taskDetails.assignee;
} }
/** /**
* Returns true if the task is assigned to logged in user * Check if the task is assigned to a user
*
* @param userId the id of the user to check
* @returns `true` if the task assigned to a user, otherwise `false`
*/ */
isAssignedTo(userId: number): boolean { isAssignedTo(userId: number): boolean {
return this.hasAssignee() ? this.taskDetails.assignee.id === userId : false; return this.hasAssignee() ? this.taskDetails.assignee.id === userId : false;
} }
/** /**
* Return true if the task assigned * Check if the task is assigned to the current user
*
* @returns `true` if the task assigned to current user, otherwise `false`
*/ */
isAssignedToCurrentUser(): boolean { isAssignedToCurrentUser(): boolean {
return this.hasAssignee() && this.isAssignedTo(this.currentUserId); return this.hasAssignee() && this.isAssignedTo(this.currentUserId);
} }
/** /**
* Return true if the user is a candidate member * Check if the user is a candidate member
*
* @returns `true` if user is a candidate member, otherwise false
*/ */
isCandidateMember(): boolean { isCandidateMember(): boolean {
return this.taskDetails.managerOfCandidateGroup || this.taskDetails.memberOfCandidateGroup || this.taskDetails.memberOfCandidateUsers; return this.taskDetails.managerOfCandidateGroup || this.taskDetails.memberOfCandidateGroup || this.taskDetails.memberOfCandidateUsers;
} }
/** /**
* Return true if the task claimable * Check if the task is claimable
*
* @returns `true` if task can be claimed, otherwise `false`
*/ */
isTaskClaimable(): boolean { isTaskClaimable(): boolean {
return !this.hasAssignee() && this.isCandidateMember(); return !this.hasAssignee() && this.isCandidateMember();
@@ -167,15 +180,19 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
/** /**
* Return true if the task claimed by candidate member. * Return true if the task claimed by candidate member.
*
* @returns `true` if the task is claimed, otherwise `false`
*/ */
isTaskClaimedByCandidateMember(): boolean { isTaskClaimedByCandidateMember(): boolean {
return this.isCandidateMember() && this.isAssignedToCurrentUser() && !this.isCompleted(); return this.isCandidateMember() && this.isAssignedToCurrentUser() && !this.isCompleted();
} }
/** /**
* Returns task's status * Get the status of the task
*
* @returns `Completed` or `Running`
*/ */
getTaskStatus(): string { getTaskStatus(): 'Completed' | 'Running' {
return this.taskDetails?.isCompleted() ? 'Completed' : 'Running'; return this.taskDetails?.isCompleted() ? 'Completed' : 'Running';
} }
@@ -188,7 +205,9 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
} }
/** /**
* Returns true if the task is completed * Returns the task completion state
*
* @returns `true` if the task is completed, otherwise `false`
*/ */
isCompleted(): boolean { isCompleted(): boolean {
return !!this.taskDetails?.endDate; return !!this.taskDetails?.endDate;

View File

@@ -69,7 +69,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
@Input() @Input()
state: string; state: string;
/** The assignment of the process. Possible values are: "assignee" (the current user /**
* The assignment of the process. Possible values are: "assignee" (the current user
* is the assignee), "candidate" (the current user is a task candidate, "group_x" (the task * is the assignee), "candidate" (the current user is a task candidate, "group_x" (the task
* is assigned to a group where the current user is a member, * is assigned to a group where the current user is a member,
* no value (the current user is involved). * no value (the current user is involved).
@@ -77,7 +78,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
@Input() @Input()
assignment: string; assignment: string;
/** Define the sort order of the tasks. Possible values are : `created-desc`, /**
* Define the sort order of the tasks. Possible values are : `created-desc`,
* `created-asc`, `due-desc`, `due-asc` * `created-asc`, `due-desc`, `due-asc`
*/ */
@Input() @Input()
@@ -87,7 +89,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
@Input() @Input()
name: string; name: string;
/** Define which task id should be selected after reloading. If the task id doesn't /**
* Define which task id should be selected after reloading. If the task id doesn't
* exist or nothing is passed then the first task will be selected. * exist or nothing is passed then the first task will be selected.
*/ */
@Input() @Input()
@@ -100,7 +103,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
@Input() @Input()
data: DataTableAdapter; data: DataTableAdapter;
/** Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode, /**
* Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode,
* you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for * you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for
* multiple rows. * multiple rows.
*/ */
@@ -183,8 +187,6 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
* Toggles custom data source mode. * Toggles custom data source mode.
* When enabled the component reloads data from it's current source instead of the server side. * When enabled the component reloads data from it's current source instead of the server side.
* This allows generating and displaying custom data sets (i.e. filtered out content). * This allows generating and displaying custom data sets (i.e. filtered out content).
*
* @memberOf TaskListComponent
*/ */
hasCustomDataSource: boolean = false; hasCustomDataSource: boolean = false;
@@ -255,6 +257,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
/** /**
* Select the task given in input if present * Select the task given in input if present
*
* @param taskIdSelected selected task id
*/ */
selectTask(taskIdSelected: string): void { selectTask(taskIdSelected: string): void {
if (!this.isListEmpty()) { if (!this.isListEmpty()) {
@@ -278,7 +282,9 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
} }
/** /**
* Return the current id * Return the current instance id
*
* @returns the current instance id
*/ */
getCurrentId(): string { getCurrentId(): string {
return this.currentInstanceId; return this.currentInstanceId;
@@ -287,7 +293,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
/** /**
* Check if the taskId is the same of the selected task * Check if the taskId is the same of the selected task
* *
* @param taskId * @param taskId task id
* @returns `true` if current instance id is the same as task id, otherwise `false`
*/ */
isEqualToCurrentId(taskId: string): boolean { isEqualToCurrentId(taskId: string): boolean {
return this.currentInstanceId === taskId; return this.currentInstanceId === taskId;
@@ -295,6 +302,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
/** /**
* Check if the list is empty * Check if the list is empty
*
* @returns `true` if list is empty, otherwise `false`
*/ */
isListEmpty(): boolean { isListEmpty(): boolean {
return !this.rows || this.rows.length === 0; return !this.rows || this.rows.length === 0;
@@ -397,7 +406,8 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft
/** /**
* Optimize name field * Optimize name field
* *
* @param instances * @param instances task detail models
* @returns list of task detail models
*/ */
private optimizeTaskDetails(instances: TaskDetailsModel[]): TaskDetailsModel[] { private optimizeTaskDetails(instances: TaskDetailsModel[]): TaskDetailsModel[] {
instances = instances.map((task) => { instances = instances.map((task) => {

View File

@@ -417,7 +417,7 @@ export class TaskListService {
/** /**
* Gets the search query for a task based on the supplied filter. * Gets the search query for a task based on the supplied filter.
* *
* @param filter The filter to use * @param filterModel The filter to use
* @returns The search query * @returns The search query
*/ */
private generateTaskRequestNodeFromFilter(filterModel: FilterRepresentationModel): TaskQueryRequestRepresentationModel { private generateTaskRequestNodeFromFilter(filterModel: FilterRepresentationModel): TaskQueryRequestRepresentationModel {