[AAE-1152] Add People and Group component in the AAE Forms (#5314)

* firt version groupo component widget

* fix group

* fix compilation issue

* fix compilation issue

* fix compilation issue

* fix compilation issue

* fix problem update script

* multiple browser ps cloud

* add field assignment

* add field in form model

* no need subobject we need an issue to refactor the field model

* no need subobject we need an issue to refactor the field model

* fix unit test

* remove title modify

* revert

* fix lint

* exclude AAE-1179

* exclude tooltip e2e
This commit is contained in:
Eugenio Romano 2019-12-10 11:24:24 +00:00 committed by GitHub
parent a63e487637
commit 703b96c9b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
51 changed files with 319 additions and 82 deletions

View File

@ -168,7 +168,6 @@ export const appRoutes: Routes = [
path: 'cloud', path: 'cloud',
canActivate: [AuthGuardSsoRoleService], canActivate: [AuthGuardSsoRoleService],
data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403' }, data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403' },
children: [ children: [
{ {
path: '', path: '',

View File

@ -16,8 +16,8 @@
*/ */
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { FormFieldModel, NotificationService, FormRenderingService, CoreAutomationService, FormModel } from '@alfresco/adf-core'; import { FormFieldModel, NotificationService, CoreAutomationService, FormModel } from '@alfresco/adf-core';
import { FormCloudService, UploadCloudWidgetComponent } from '@alfresco/adf-process-services-cloud'; import { FormCloudService } from '@alfresco/adf-process-services-cloud';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
@Component({ @Component({
@ -43,10 +43,8 @@ export class FormCloudDemoComponent implements OnInit, OnDestroy {
constructor( constructor(
private notificationService: NotificationService, private notificationService: NotificationService,
private formRenderingService: FormRenderingService,
private formService: FormCloudService, private formService: FormCloudService,
private automationService: CoreAutomationService) { private automationService: CoreAutomationService) {
this.formRenderingService.setComponentTypeResolver('upload', () => UploadCloudWidgetComponent, true);
} }
logErrors(errorFields: FormFieldModel[]) { logErrors(errorFields: FormFieldModel[]) {

View File

@ -39,7 +39,6 @@
[validate]="peoplePreselectValidation" [validate]="peoplePreselectValidation"
[appName]="peopleAppName" [appName]="peopleAppName"
[roles]="peopleRoles" [roles]="peopleRoles"
[appName]="peopleAppName"
[title]="'ADF_TASK_LIST.START_TASK.FORM.LABEL.ASSIGNEE'" [title]="'ADF_TASK_LIST.START_TASK.FORM.LABEL.ASSIGNEE'"
[mode]="peopleMode"></adf-cloud-people> [mode]="peopleMode"></adf-cloud-people>
</div> </div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 MiB

After

Width:  |  Height:  |  Size: 0 B

View File

@ -145,6 +145,7 @@ async function checkIfAppIsReleased(args: ConfigArgs, apiService: any, absentApp
const projectList = await getAppProjects(args, apiService); const projectList = await getAppProjects(args, apiService);
let TIME = 5000; let TIME = 5000;
let noError = true; let noError = true;
for (let i = 0; i < absentApps.length; i++) { for (let i = 0; i < absentApps.length; i++) {
noError = true; noError = true;
const currentAbsentApp = absentApps[i]; const currentAbsentApp = absentApps[i];
@ -152,8 +153,11 @@ async function checkIfAppIsReleased(args: ConfigArgs, apiService: any, absentApp
return currentAbsentApp.name === currentApp.entry.name; return currentAbsentApp.name === currentApp.entry.name;
}); });
let projectRelease: any; let projectRelease: any;
if (app === undefined) { if (app === undefined) {
logger.warn('Missing project: Create the project for ' + currentAbsentApp.name); logger.warn('Missing project: Create the project for ' + currentAbsentApp.name);
try { try {
const uploadedApp = await importProjectApp(args, apiService, currentAbsentApp); const uploadedApp = await importProjectApp(args, apiService, currentAbsentApp);
logger.warn('Project imported ' + currentAbsentApp.name); logger.warn('Project imported ' + currentAbsentApp.name);
@ -161,16 +165,21 @@ async function checkIfAppIsReleased(args: ConfigArgs, apiService: any, absentApp
projectRelease = await releaseProject(args, apiService, uploadedApp); projectRelease = await releaseProject(args, apiService, uploadedApp);
} }
} catch (error) { } catch (error) {
logger.info(`error status ${error.status}`);
if (error.status !== 409) { if (error.status !== 409) {
logger.info(`Not possible to upload the project ${app.name} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.response.text)}`); logger.info(`Not possible to upload the project ${app.name} status : ${JSON.stringify(error.status)} ${JSON.stringify(error.response.text)}`);
process.exit(1); process.exit(1);
} else { } else {
logger.error(`Not possible to upload the project because inconsistency CS - Modelling try to delete manually the node`); logger.error(`Not possible to upload the project because inconsistency CS - Modelling try to delete manually the node`);
noError = false; process.exit(1);
} }
} }
} else { } else {
TIME += 5000; TIME += 5000;
logger.info('Project ' + app.entry.name + ' found'); logger.info('Project ' + app.entry.name + ' found');
const projectReleaseList = await getReleaseAppProjectId(args, apiService, app.entry.id); const projectReleaseList = await getReleaseAppProjectId(args, apiService, app.entry.id);
@ -192,6 +201,7 @@ async function checkIfAppIsReleased(args: ConfigArgs, apiService: any, absentApp
}); });
} }
} }
if (noError) { if (noError) {
await checkDescriptorExist(args, apiService, currentAbsentApp.name); await checkDescriptorExist(args, apiService, currentAbsentApp.name);
await sleep(TIME); await sleep(TIME);

View File

@ -79,6 +79,11 @@ export class FormFieldModel extends FormWidgetModel {
emptyOption: FormFieldOption; emptyOption: FormFieldOption;
validationSummary: ErrorMessageModel; validationSummary: ErrorMessageModel;
// People and Group Options
appName: string;
roles: string[];
mode: string;
get value(): any { get value(): any {
return this._value; return this._value;
} }
@ -168,6 +173,11 @@ export class FormFieldModel extends FormWidgetModel {
this._value = this.parseValue(json); this._value = this.parseValue(json);
this.validationSummary = new ErrorMessageModel(); this.validationSummary = new ErrorMessageModel();
// People and Group Options
this.appName = json.appName;
this.roles = json.roles;
this.mode = json.mode;
if (json.placeholder && json.placeholder !== '' && json.placeholder !== 'null') { if (json.placeholder && json.placeholder !== '' && json.placeholder !== 'null') {
this.placeholder = json.placeholder; this.placeholder = json.placeholder;
} }
@ -344,9 +354,9 @@ export class FormFieldModel extends FormWidgetModel {
This is needed due to Activiti issue related to reading radio button values as value string This is needed due to Activiti issue related to reading radio button values as value string
but saving back as object: { id: <id>, name: <name> } but saving back as object: { id: <id>, name: <name> }
*/ */
const rbEntry: FormFieldOption[] = this.options.filter((opt) => opt.id === this.value); const radioButton: FormFieldOption[] = this.options.filter((opt) => opt.id === this.value);
if (rbEntry.length > 0) { if (radioButton.length > 0) {
this.form.values[this.id] = rbEntry[0]; this.form.values[this.id] = radioButton[0];
} }
break; break;
case FormFieldTypes.UPLOAD: case FormFieldTypes.UPLOAD:
@ -358,9 +368,9 @@ export class FormFieldModel extends FormWidgetModel {
} }
break; break;
case FormFieldTypes.TYPEAHEAD: case FormFieldTypes.TYPEAHEAD:
const taEntry: FormFieldOption[] = this.options.filter((opt) => opt.id === this.value || opt.name === this.value); const typeAheadEntry: FormFieldOption[] = this.options.filter((opt) => opt.id === this.value || opt.name === this.value);
if (taEntry.length > 0) { if (typeAheadEntry.length > 0) {
this.form.values[this.id] = taEntry[0]; this.form.values[this.id] = typeAheadEntry[0];
} else if (this.options.length > 0) { } else if (this.options.length > 0) {
this.form.values[this.id] = null; this.form.values[this.id] = null;
} }

View File

@ -36,12 +36,13 @@ import { TemplateModule, CoreModule } from '@alfresco/adf-core';
AppListCloudComponent, AppListCloudComponent,
AppDetailsCloudComponent AppDetailsCloudComponent
], ],
providers: [ providers: [
AppsProcessCloudService AppsProcessCloudService
], ],
exports: [ exports: [
AppListCloudComponent, AppListCloudComponent,
AppDetailsCloudComponent AppDetailsCloudComponent
] ]
}) })
export class AppListCloudModule { } export class AppListCloudModule {
}

View File

@ -38,9 +38,11 @@ import {
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { FormCloudService } from '../services/form-cloud.service'; import { FormCloudService } from '../services/form-cloud.service';
import { TaskVariableCloud } from '../models/task-variable-cloud.model'; import { TaskVariableCloud } from '../models/task-variable-cloud.model';
import { DropdownCloudWidgetComponent } from './dropdown-cloud/dropdown-cloud.widget'; import { DropdownCloudWidgetComponent } from './widgets/dropdown/dropdown-cloud.widget';
import { AttachFileCloudWidgetComponent } from './attach-file-cloud-widget/attach-file-cloud-widget.component'; import { AttachFileCloudWidgetComponent } from './widgets/attach-file/attach-file-cloud-widget.component';
import { DateCloudWidgetComponent } from './date-cloud/date-cloud.widget'; import { DateCloudWidgetComponent } from './widgets/date/date-cloud.widget';
import { PeopleCloudWidgetComponent } from './widgets/people/people-cloud.widget';
import { GroupCloudWidgetComponent } from './widgets/group/group-cloud.widget';
import { TaskDetailsCloudModel } from '../../task/start-task/models/task-details-cloud.model'; import { TaskDetailsCloudModel } from '../../task/start-task/models/task-details-cloud.model';
@Component({ @Component({
@ -123,6 +125,8 @@ export class FormCloudComponent extends FormBaseComponent implements OnChanges,
this.formRenderingService.setComponentTypeResolver('upload', () => AttachFileCloudWidgetComponent, true); this.formRenderingService.setComponentTypeResolver('upload', () => AttachFileCloudWidgetComponent, true);
this.formRenderingService.setComponentTypeResolver('dropdown', () => DropdownCloudWidgetComponent, true); this.formRenderingService.setComponentTypeResolver('dropdown', () => DropdownCloudWidgetComponent, true);
this.formRenderingService.setComponentTypeResolver('date', () => DateCloudWidgetComponent, true); this.formRenderingService.setComponentTypeResolver('date', () => DateCloudWidgetComponent, true);
this.formRenderingService.setComponentTypeResolver('people', () => PeopleCloudWidgetComponent, true);
this.formRenderingService.setComponentTypeResolver('functional-group', () => GroupCloudWidgetComponent, true);
} }
ngOnChanges(changes: SimpleChanges) { ngOnChanges(changes: SimpleChanges) {

View File

@ -17,8 +17,8 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ContentCloudNodeSelectorService } from '../../services/content-cloud-node-selector.service'; import { ContentCloudNodeSelectorService } from '../../../services/content-cloud-node-selector.service';
import { ProcessCloudContentService } from '../../services/process-cloud-content.service'; import { ProcessCloudContentService } from '../../../services/process-cloud-content.service';
import { AttachFileCloudWidgetComponent } from './attach-file-cloud-widget.component'; import { AttachFileCloudWidgetComponent } from './attach-file-cloud-widget.component';
import { import {
setupTestBed, setupTestBed,
@ -29,13 +29,13 @@ import {
FormService, FormService,
DownloadService DownloadService
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { ProcessServiceCloudTestingModule } from '../../../testing/process-service-cloud.testing.module'; import { ProcessServiceCloudTestingModule } from '../../../../testing/process-service-cloud.testing.module';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ContentModule } from '@alfresco/adf-content-services'; import { ContentModule } from '@alfresco/adf-content-services';
import { By } from '@angular/platform-browser'; import { By } from '@angular/platform-browser';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { Node } from '@alfresco/js-api'; import { Node } from '@alfresco/js-api';
import { FormCloudModule } from '../../form-cloud.module'; import { FormCloudModule } from '../../../form-cloud.module';
describe('AttachFileCloudWidgetComponent', () => { describe('AttachFileCloudWidgetComponent', () => {
let widget: AttachFileCloudWidgetComponent; let widget: AttachFileCloudWidgetComponent;

View File

@ -27,9 +27,9 @@ import {
baseHost baseHost
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { Node, RelatedContentRepresentation } from '@alfresco/js-api'; import { Node, RelatedContentRepresentation } from '@alfresco/js-api';
import { ContentCloudNodeSelectorService } from '../../services/content-cloud-node-selector.service'; import { ContentCloudNodeSelectorService } from '../../../services/content-cloud-node-selector.service';
import { ProcessCloudContentService } from '../../services/process-cloud-content.service'; import { ProcessCloudContentService } from '../../../services/process-cloud-content.service';
import { UploadCloudWidgetComponent } from '../upload-cloud.widget'; import { UploadCloudWidgetComponent } from './upload-cloud.widget';
@Component({ @Component({
selector: 'adf-cloud-attach-file-cloud-widget', selector: 'adf-cloud-attach-file-cloud-widget',

View File

@ -22,7 +22,7 @@ import { Node } from '@alfresco/js-api';
import { Observable, from } from 'rxjs'; import { Observable, from } from 'rxjs';
import { mergeMap } from 'rxjs/operators'; import { mergeMap } from 'rxjs/operators';
import { WidgetComponent, baseHost, LogService, FormService, ThumbnailService, ContentLinkModel, NotificationService } from '@alfresco/adf-core'; import { WidgetComponent, baseHost, LogService, FormService, ThumbnailService, ContentLinkModel, NotificationService } from '@alfresco/adf-core';
import { ProcessCloudContentService } from '../services/process-cloud-content.service'; import { ProcessCloudContentService } from '../../../services/process-cloud-content.service';
@Component({ @Component({
selector: 'upload-cloud-widget', selector: 'upload-cloud-widget',

View File

@ -19,7 +19,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { DateCloudWidgetComponent } from './date-cloud.widget'; import { DateCloudWidgetComponent } from './date-cloud.widget';
import { setupTestBed, FormFieldModel, FormModel, CoreModule } from '@alfresco/adf-core'; import { setupTestBed, FormFieldModel, FormModel, CoreModule } from '@alfresco/adf-core';
import { FormCloudService } from '../../services/form-cloud.service'; import { FormCloudService } from '../../../services/form-cloud.service';
import moment from 'moment-es6'; import moment from 'moment-es6';
describe('DateWidgetComponent', () => { describe('DateWidgetComponent', () => {

View File

@ -21,7 +21,7 @@ import { of } from 'rxjs';
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { DropdownCloudWidgetComponent } from './dropdown-cloud.widget'; import { DropdownCloudWidgetComponent } from './dropdown-cloud.widget';
import { FormService, WidgetVisibilityService, FormFieldOption, setupTestBed, FormFieldModel, FormModel, CoreModule } from '@alfresco/adf-core'; import { FormService, WidgetVisibilityService, FormFieldOption, setupTestBed, FormFieldModel, FormModel, CoreModule } from '@alfresco/adf-core';
import { FormCloudService } from '../../services/form-cloud.service'; import { FormCloudService } from '../../../services/form-cloud.service';
describe('DropdownCloudWidgetComponent', () => { describe('DropdownCloudWidgetComponent', () => {

View File

@ -17,7 +17,7 @@
import { Component, OnInit, ViewEncapsulation, OnDestroy } from '@angular/core'; import { Component, OnInit, ViewEncapsulation, OnDestroy } from '@angular/core';
import { baseHost, WidgetComponent, FormService, LogService, FormFieldOption } from '@alfresco/adf-core'; import { baseHost, WidgetComponent, FormService, LogService, FormFieldOption } from '@alfresco/adf-core';
import { FormCloudService } from '../../services/form-cloud.service'; import { FormCloudService } from '../../../services/form-cloud.service';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';

View File

@ -0,0 +1,14 @@
<div class="adf-dropdown-widget {{field.className}}"
[class.adf-invalid]="!field.isValid" [class.adf-readonly]="field.readOnly">
<label class="adf-label" [attr.for]="field.id">{{field.name | translate }}<span
*ngIf="isRequired()">*</span></label>
<adf-cloud-group [mode]="mode"
[roles]="roles"
[appName]="appName"
[preSelectGroups]="preSelectGroup">
</adf-cloud-group>
<error-widget [error]="field.validationSummary"></error-widget>
<error-widget class="adf-dropdown-required-message" *ngIf="isInvalidFieldRequired()"
required="{{ 'FORM.FIELD.REQUIRED' | translate }}"></error-widget>
</div>

View File

@ -0,0 +1,44 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { baseHost, WidgetComponent, IdentityGroupCountModel } from '@alfresco/adf-core';
/* tslint:disable:component-selector */
@Component({
selector: 'group-cloud-widget',
templateUrl: './group-cloud.widget.html',
host: baseHost,
encapsulation: ViewEncapsulation.None
})
export class GroupCloudWidgetComponent extends WidgetComponent implements OnInit {
appName: string;
roles: string[];
mode: string;
preSelectGroup: IdentityGroupCountModel[];
ngOnInit() {
if (this.field) {
this.appName = this.field.appName;
this.roles = this.field.roles;
this.mode = this.field.mode;
this.preSelectGroup = this.field.value;
}
}
}

View File

@ -0,0 +1,15 @@
<div class="adf-dropdown-widget {{field.className}}"
[class.adf-invalid]="!field.isValid" [class.adf-readonly]="field.readOnly">
<label class="adf-label" [attr.for]="field.id">{{field.name | translate }}<span *ngIf="isRequired()">*</span></label>
<adf-cloud-people
[preSelectUsers]="preSelectUsers"
[validate]="true"
[appName]="appName"
[roles]="roles"
[mode]="mode">
</adf-cloud-people>
<error-widget [error]="field.validationSummary"></error-widget>
<error-widget class="adf-dropdown-required-message" *ngIf="isInvalidFieldRequired()"
required="{{ 'FORM.FIELD.REQUIRED' | translate }}"></error-widget>
</div>

View File

@ -0,0 +1,44 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { baseHost, WidgetComponent, IdentityUserModel } from '@alfresco/adf-core';
/* tslint:disable:component-selector */
@Component({
selector: 'people-cloud-widget',
templateUrl: './people-cloud.widget.html',
host: baseHost,
encapsulation: ViewEncapsulation.None
})
export class PeopleCloudWidgetComponent extends WidgetComponent implements OnInit {
appName: string;
roles: string[];
mode: string;
preSelectUsers: IdentityUserModel[];
ngOnInit() {
if (this.field) {
this.appName = this.field.appName;
this.roles = this.field.roles;
this.mode = this.field.mode;
this.preSelectUsers = this.field.value;
}
}
}

View File

@ -20,16 +20,22 @@ import { CommonModule } from '@angular/common';
import { FlexLayoutModule } from '@angular/flex-layout'; import { FlexLayoutModule } from '@angular/flex-layout';
import { TemplateModule, FormBaseModule, PipeModule, CoreModule, FormRenderingService } from '@alfresco/adf-core'; import { TemplateModule, FormBaseModule, PipeModule, CoreModule, FormRenderingService } from '@alfresco/adf-core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { UploadCloudWidgetComponent } from './components/upload-cloud.widget';
import { MaterialModule } from '../material.module'; import { MaterialModule } from '../material.module';
import { FormCloudComponent } from './components/form-cloud.component'; import { FormCloudComponent } from './components/form-cloud.component';
import { FormDefinitionSelectorCloudComponent } from './components/form-definition-selector-cloud.component'; import { FormDefinitionSelectorCloudComponent } from './components/form-definition-selector-cloud.component';
import { FormDefinitionSelectorCloudService } from './services/form-definition-selector-cloud.service'; import { FormDefinitionSelectorCloudService } from './services/form-definition-selector-cloud.service';
import { FormCustomOutcomesComponent } from './components/form-cloud-custom-outcomes.component'; import { FormCustomOutcomesComponent } from './components/form-cloud-custom-outcomes.component';
import { DropdownCloudWidgetComponent } from './components/dropdown-cloud/dropdown-cloud.widget';
import { AttachFileCloudWidgetComponent } from './components/attach-file-cloud-widget/attach-file-cloud-widget.component';
import { ContentNodeSelectorModule } from '@alfresco/adf-content-services'; import { ContentNodeSelectorModule } from '@alfresco/adf-content-services';
import { DateCloudWidgetComponent } from './components/date-cloud/date-cloud.widget';
import { DateCloudWidgetComponent } from './components/widgets/date/date-cloud.widget';
import { DropdownCloudWidgetComponent } from './components/widgets/dropdown/dropdown-cloud.widget';
import { GroupCloudWidgetComponent } from './components/widgets/group/group-cloud.widget';
import { PeopleCloudWidgetComponent } from './components/widgets/people/people-cloud.widget';
import { AttachFileCloudWidgetComponent } from './components/widgets/attach-file/attach-file-cloud-widget.component';
import { UploadCloudWidgetComponent } from './components/widgets/attach-file/upload-cloud.widget';
import { PeopleCloudModule } from '../people/people-cloud.module';
import { GroupCloudModule } from '../group/group-cloud.module';
@NgModule({ @NgModule({
imports: [ imports: [
@ -42,7 +48,9 @@ import { DateCloudWidgetComponent } from './components/date-cloud/date-cloud.wid
ReactiveFormsModule, ReactiveFormsModule,
FormBaseModule, FormBaseModule,
CoreModule, CoreModule,
ContentNodeSelectorModule ContentNodeSelectorModule,
PeopleCloudModule,
GroupCloudModule
], ],
declarations: [ declarations: [
FormCloudComponent, FormCloudComponent,
@ -51,7 +59,9 @@ import { DateCloudWidgetComponent } from './components/date-cloud/date-cloud.wid
FormCustomOutcomesComponent, FormCustomOutcomesComponent,
DropdownCloudWidgetComponent, DropdownCloudWidgetComponent,
AttachFileCloudWidgetComponent, AttachFileCloudWidgetComponent,
DateCloudWidgetComponent DateCloudWidgetComponent,
PeopleCloudWidgetComponent,
GroupCloudWidgetComponent
], ],
providers: [ providers: [
FormDefinitionSelectorCloudService, FormDefinitionSelectorCloudService,
@ -61,7 +71,9 @@ import { DateCloudWidgetComponent } from './components/date-cloud/date-cloud.wid
UploadCloudWidgetComponent, UploadCloudWidgetComponent,
DropdownCloudWidgetComponent, DropdownCloudWidgetComponent,
AttachFileCloudWidgetComponent, AttachFileCloudWidgetComponent,
DateCloudWidgetComponent DateCloudWidgetComponent,
PeopleCloudWidgetComponent,
GroupCloudWidgetComponent
], ],
exports: [ exports: [
FormCloudComponent, FormCloudComponent,

View File

@ -19,9 +19,7 @@ export * from './models/task-variable-cloud.model';
export * from './models/form-definition-selector-cloud.model'; export * from './models/form-definition-selector-cloud.model';
export * from './components/form-cloud.component'; export * from './components/form-cloud.component';
export * from './components/upload-cloud.widget';
export * from './components/form-definition-selector-cloud.component'; export * from './components/form-definition-selector-cloud.component';
export * from './components/attach-file-cloud-widget/attach-file-cloud-widget.component';
export * from './services/form-cloud.service'; export * from './services/form-cloud.service';
export * from './services/form-definition-selector-cloud.service'; export * from './services/form-definition-selector-cloud.service';

View File

@ -18,10 +18,10 @@
import { PeopleCloudComponent } from './people-cloud.component'; import { PeopleCloudComponent } from './people-cloud.component';
import { ComponentFixture, TestBed, async, tick, fakeAsync } from '@angular/core/testing'; import { ComponentFixture, TestBed, async, tick, fakeAsync } from '@angular/core/testing';
import { IdentityUserService, AlfrescoApiService, CoreModule, setupTestBed } from '@alfresco/adf-core'; import { IdentityUserService, AlfrescoApiService, CoreModule, setupTestBed } from '@alfresco/adf-core';
import { ProcessServiceCloudTestingModule } from '../../../../testing/process-service-cloud.testing.module'; import { ProcessServiceCloudTestingModule } from '../../testing/process-service-cloud.testing.module';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { mockUsers } from '../../mock/user-cloud.mock'; import { mockUsers } from '../mock/user-cloud.mock';
import { StartTaskCloudModule } from '../../start-task-cloud.module'; import { PeopleCloudModule } from '../people-cloud.module';
import { SimpleChange } from '@angular/core'; import { SimpleChange } from '@angular/core';
import { By } from '@angular/platform-browser'; import { By } from '@angular/platform-browser';
@ -49,7 +49,7 @@ describe('PeopleCloudComponent', () => {
imports: [ imports: [
CoreModule.forRoot(), CoreModule.forRoot(),
ProcessServiceCloudTestingModule, ProcessServiceCloudTestingModule,
StartTaskCloudModule PeopleCloudModule
], ],
providers: [ providers: [
IdentityUserService IdentityUserService

View File

@ -0,0 +1,34 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export const mockUsers = [
{ id: 'fake-id-1', username: 'first-name-1 last-name-1', firstName: 'first-name-1', lastName: 'last-name-1', email: 'abc@xyz.com' },
{ id: 'fake-id-2', username: 'first-name-2 last-name-2', firstName: 'first-name-2', lastName: 'last-name-2', email: 'abcd@xyz.com'},
{ id: 'fake-id-3', username: 'first-name-3 last-name-3', firstName: 'first-name-3', lastName: 'last-name-3', email: 'abcde@xyz.com' }
];
export const cloudMockUser = {
id: 'fake-id-1', username: 'AssignedTaskUser', firstName: 'first-name-1', lastName: 'last-name-1', email: 'abc@xyz.com'
};
export const mockRoles = [
{ id: 'id-1', name: 'MOCK-ADMIN-ROLE'},
{ id: 'id-2', name: 'MOCK-USER-ROLE'},
{ id: 'id-3', name: 'MOCK_MODELER-ROLE' },
{ id: 'id-4', name: 'MOCK-ROLE-1' },
{ id: 'id-5', name: 'MOCK-ROLE-2'}
];

View File

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

View File

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

View File

@ -29,6 +29,7 @@ import {
PROCESS_FILTERS_SERVICE_TOKEN, PROCESS_FILTERS_SERVICE_TOKEN,
TASK_FILTERS_SERVICE_TOKEN TASK_FILTERS_SERVICE_TOKEN
} from './services/public-api'; } from './services/public-api';
import { PeopleCloudModule } from './people/people-cloud.module';
@NgModule({ @NgModule({
imports: [ imports: [
@ -37,6 +38,7 @@ import {
ProcessCloudModule, ProcessCloudModule,
TaskCloudModule, TaskCloudModule,
GroupCloudModule, GroupCloudModule,
PeopleCloudModule,
FormCloudModule, FormCloudModule,
TaskFormModule TaskFormModule
], ],
@ -60,7 +62,8 @@ import {
TaskCloudModule, TaskCloudModule,
GroupCloudModule, GroupCloudModule,
FormCloudModule, FormCloudModule,
TaskFormModule TaskFormModule,
PeopleCloudModule
] ]
}) })
export class ProcessServicesCloudModule { } export class ProcessServicesCloudModule { }

View File

@ -1,10 +1,10 @@
@import './../app/components/app-details-cloud.component'; @import './../app/components/app-details-cloud.component';
@import './../app/components/app-list-cloud.component'; @import './../app/components/app-list-cloud.component';
@import './../group/components/group-cloud.component'; @import './../group/components/group-cloud.component';
@import './../people/components/people-cloud.component.scss';
@import './../process/process-list/components/process-list-cloud.component.scss'; @import './../process/process-list/components/process-list-cloud.component.scss';
@import './../process/process-filters/components/edit-process-filter-cloud.component.scss'; @import './../process/process-filters/components/edit-process-filter-cloud.component.scss';
@import './../task/task-form/components/task-form-cloud.component'; @import './../task/task-form/components/task-form-cloud.component';
@import './../task/start-task/components/people-cloud/people-cloud.component.scss';
@import './../task/start-task/components/start-task-cloud.component.scss'; @import './../task/start-task/components/start-task-cloud.component.scss';
@import './../task/task-filters/components/edit-task-filter-cloud.component.scss'; @import './../task/task-filters/components/edit-task-filter-cloud.component.scss';
@import './../task/task-filters/components/task-filters-cloud.component.scss'; @import './../task/task-filters/components/task-filters-cloud.component.scss';

View File

@ -28,8 +28,8 @@ import {
IdentityUserModel, IdentityUserModel,
UserPreferenceValues UserPreferenceValues
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { PeopleCloudComponent } from './people-cloud/people-cloud.component'; import { PeopleCloudComponent } from '../../../people/components/people-cloud.component';
import { GroupCloudComponent } from '../../../../lib/group/components/group-cloud.component'; import { GroupCloudComponent } from '../../../group/components/group-cloud.component';
import { TaskCloudService } from '../../services/task-cloud.service'; import { TaskCloudService } from '../../services/task-cloud.service';
import { StartTaskCloudRequestModel } from '../models/start-task-cloud-request.model'; import { StartTaskCloudRequestModel } from '../models/start-task-cloud-request.model';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';

View File

@ -15,20 +15,6 @@
* limitations under the License. * limitations under the License.
*/ */
export const mockUsers = [
{ id: 'fake-id-1', username: 'first-name-1 last-name-1', firstName: 'first-name-1', lastName: 'last-name-1', email: 'abc@xyz.com' },
{ id: 'fake-id-2', username: 'first-name-2 last-name-2', firstName: 'first-name-2', lastName: 'last-name-2', email: 'abcd@xyz.com'},
{ id: 'fake-id-3', username: 'first-name-3 last-name-3', firstName: 'first-name-3', lastName: 'last-name-3', email: 'abcde@xyz.com' }
];
export const cloudMockUser = { export const cloudMockUser = {
id: 'fake-id-1', username: 'AssignedTaskUser', firstName: 'first-name-1', lastName: 'last-name-1', email: 'abc@xyz.com' id: 'fake-id-1', username: 'AssignedTaskUser', firstName: 'first-name-1', lastName: 'last-name-1', email: 'abc@xyz.com'
}; };
export const mockRoles = [
{ id: 'id-1', name: 'MOCK-ADMIN-ROLE'},
{ id: 'id-2', name: 'MOCK-USER-ROLE'},
{ id: 'id-3', name: 'MOCK_MODELER-ROLE' },
{ id: 'id-4', name: 'MOCK-ROLE-1' },
{ id: 'id-5', name: 'MOCK-ROLE-2'}
];

View File

@ -17,5 +17,4 @@
export * from './models/task-details-cloud.model'; export * from './models/task-details-cloud.model';
export * from './components/start-task-cloud.component'; export * from './components/start-task-cloud.component';
export * from './components/people-cloud/people-cloud.component';
export * from './start-task-cloud.module'; export * from './start-task-cloud.module';

View File

@ -19,18 +19,17 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { FlexLayoutModule } from '@angular/flex-layout'; import { FlexLayoutModule } from '@angular/flex-layout';
import { MaterialModule } from '../../material.module'; import { MaterialModule } from '../../material.module';
import { TemplateModule, PipeModule, CoreModule } from '@alfresco/adf-core'; import { TemplateModule, CoreModule } from '@alfresco/adf-core';
import { StartTaskCloudComponent } from './components/start-task-cloud.component'; import { StartTaskCloudComponent } from './components/start-task-cloud.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { PeopleCloudComponent } from './components/people-cloud/people-cloud.component';
import { GroupCloudModule } from '../../group/group-cloud.module'; import { GroupCloudModule } from '../../group/group-cloud.module';
import { TaskCloudService } from '../services/task-cloud.service'; import { TaskCloudService } from '../services/task-cloud.service';
import { FormCloudModule } from '../../form/form-cloud.module'; import { FormCloudModule } from '../../form/form-cloud.module';
import { PeopleCloudModule } from '../../people/people-cloud.module';
@NgModule({ @NgModule({
imports: [ imports: [
CommonModule, CommonModule,
PipeModule,
TemplateModule, TemplateModule,
FlexLayoutModule, FlexLayoutModule,
MaterialModule, MaterialModule,
@ -38,15 +37,15 @@ import { FormCloudModule } from '../../form/form-cloud.module';
ReactiveFormsModule, ReactiveFormsModule,
GroupCloudModule, GroupCloudModule,
CoreModule, CoreModule,
FormCloudModule FormCloudModule,
PeopleCloudModule
], ],
declarations: [StartTaskCloudComponent, PeopleCloudComponent], declarations: [StartTaskCloudComponent],
providers: [ providers: [
TaskCloudService TaskCloudService
], ],
exports: [ exports: [
StartTaskCloudComponent, StartTaskCloudComponent
PeopleCloudComponent
] ]
}) })
export class StartTaskCloudModule { export class StartTaskCloudModule {

View File

@ -22,9 +22,9 @@ import {
import { TaskDetailsCloudModel } from '../../start-task/models/task-details-cloud.model'; import { TaskDetailsCloudModel } from '../../start-task/models/task-details-cloud.model';
import { TaskCloudService } from '../../services/task-cloud.service'; import { TaskCloudService } from '../../services/task-cloud.service';
import { FormRenderingService, FormModel, ContentLinkModel } from '@alfresco/adf-core'; import { FormRenderingService, FormModel, ContentLinkModel } from '@alfresco/adf-core';
import { AttachFileCloudWidgetComponent } from '../../../form/components/attach-file-cloud-widget/attach-file-cloud-widget.component'; import { AttachFileCloudWidgetComponent } from '../../../form/components/widgets/attach-file/attach-file-cloud-widget.component';
import { DropdownCloudWidgetComponent } from '../../../form/components/dropdown-cloud/dropdown-cloud.widget'; import { DropdownCloudWidgetComponent } from '../../../form/components/widgets/dropdown/dropdown-cloud.widget';
import { DateCloudWidgetComponent } from '../../../form/components/date-cloud/date-cloud.widget'; import { DateCloudWidgetComponent } from '../../../form/components/widgets/date/date-cloud.widget';
@Component({ @Component({
selector: 'adf-cloud-task-form', selector: 'adf-cloud-task-form',

View File

@ -20,5 +20,6 @@ export * from './lib/app/public-api';
export * from './lib/process/public-api'; export * from './lib/process/public-api';
export * from './lib/task/public-api'; export * from './lib/task/public-api';
export * from './lib/group/public-api'; export * from './lib/group/public-api';
export * from './lib/people/public-api';
export * from './lib/form/public-api'; export * from './lib/form/public-api';
export * from './lib/services/public-api'; export * from './lib/services/public-api';

View File

@ -22,7 +22,7 @@ import { MaterialModule } from '../material.module';
import { CoreModule } from '@alfresco/adf-core'; import { CoreModule } from '@alfresco/adf-core';
import { AppsListComponent } from './apps-list.component'; import { AppsListComponent } from './apps-list.component';
import { SelectAppsDialogComponent } from './select-apps-dialog-component'; import { SelectAppsDialogComponent } from './select-apps-dialog.component';
@NgModule({ @NgModule({
imports: [ imports: [

View File

@ -16,6 +16,6 @@
*/ */
export * from './apps-list.component'; export * from './apps-list.component';
export * from './select-apps-dialog-component'; export * from './select-apps-dialog.component';
export * from './apps-list.module'; export * from './apps-list.module';

View File

@ -1,7 +1,7 @@
<header mat-dialog-title id="adf-selet-app-dialog-title">{{'APP.DIALOG.TITLE' | translate}}</header> <header mat-dialog-title id="adf-select-app-dialog-title">{{'APP.DIALOG.TITLE' | translate}}</header>
<section mat-dialog-content> <section mat-dialog-content>
<mat-select id="adf-selet-app-dialog-dropdown" placeholder="{{'APP.DIALOG.LIST' | translate}}" [(value)]="selectedProcess" > <mat-select id="adf-select-app-dialog-dropdown" placeholder="{{'APP.DIALOG.LIST' | translate}}" [(value)]="selectedProcess" >
<mat-option *ngFor="let currentProcessApp of processApps" [value]="currentProcessApp"> <mat-option *ngFor="let currentProcessApp of processApps" [value]="currentProcessApp">
{{ currentProcessApp.name }} {{ currentProcessApp.name }}
</mat-option> </mat-option>

View File

@ -23,7 +23,7 @@ import { AppsProcessService, setupTestBed } from '@alfresco/adf-core';
import { deployedApps } from '../mock/apps-list.mock'; import { deployedApps } from '../mock/apps-list.mock';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { SelectAppsDialogComponent } from './select-apps-dialog-component'; import { SelectAppsDialogComponent } from './select-apps-dialog.component';
import { ProcessTestingModule } from '../testing/process.testing.module'; import { ProcessTestingModule } from '../testing/process.testing.module';
@Component({ @Component({
@ -102,12 +102,12 @@ describe('Select app dialog', () => {
expect( expect(
overlayContainerElement.querySelector( overlayContainerElement.querySelector(
'.adf-selet-app-dialog-title' '.adf-select-app-dialog-title'
) )
).toBeDefined(); ).toBeDefined();
expect( expect(
overlayContainerElement.querySelector( overlayContainerElement.querySelector(
'.adf-selet-app-dialog-dropdown' '.adf-select-app-dialog-dropdown'
) )
).toBeDefined(); ).toBeDefined();
}); });

View File

@ -21,7 +21,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
@Component({ @Component({
selector: 'adf-select-apps-dialog', selector: 'adf-select-apps-dialog',
templateUrl: 'select-apps-dialog-component.html' templateUrl: 'select-apps-dialog.component.html'
}) })
export class SelectAppsDialogComponent { export class SelectAppsDialogComponent {

View File

@ -1,3 +1,7 @@
{ {
"C260249" : "REPO-4772 ACS 6.2" "C260249" : "REPO-4772 ACS 6.2",
"C291954" : "AAE-1179 Group Task",
"C291955" : "AAE-1179 Group Task",
"C307046" : "AAE-1180 Tooltip fail",
"C307075" : "AAE-1180 Tooltip fail"
} }

View File

@ -13,7 +13,7 @@ export AUTH_TYPE="OAUTH"
AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)";
AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/$CONTEXT_ENV")"; AFFECTED_E2E="$(./scripts/git-util/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e/$CONTEXT_ENV")";
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" -host_sso "$E2E_HOST_SSO" -host_bpm "$E2E_HOST_BPM" -host_identity "$E2E_HOST_IDENTITY" -identity_admin_email "$E2E_ADMIN_EMAIL_IDENTITY" -identity_admin_password "$E2E_ADMIN_PASSWORD_IDENTITY" -prefix $TRAVIS_BUILD_NUMBER -b --use-dist ) RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" -host_sso "$E2E_HOST_SSO" -host_bpm "$E2E_HOST_BPM" -host_identity "$E2E_HOST_IDENTITY" -identity_admin_email "$E2E_ADMIN_EMAIL_IDENTITY" -identity_admin_password "$E2E_ADMIN_PASSWORD_IDENTITY" -prefix $TRAVIS_BUILD_NUMBER -b --use-dist -m 3 )
./node_modules/@alfresco/adf-cli/bin/adf-cli init-aae-env --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" --username "$E2E_USERNAME" --password "$E2E_PASSWORD" --clientId 'activiti' || exit 1 ./node_modules/@alfresco/adf-cli/bin/adf-cli init-aae-env --host "$E2E_HOST_BPM" --oauth "$E2E_HOST_SSO" --username "$E2E_USERNAME" --password "$E2E_PASSWORD" --clientId 'activiti' || exit 1
node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 node ./scripts/check-env/check-cs-env.js --host "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1