mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
[ACA-3348] Add default process name pipe (#5745)
* [ACA-3348] Add default process name pipe * [ACA-3348] Add documentation * [ACA-3348] Change transform function to recieve a process def parameter, Update documentation * Change parameter type to fix build * Fix lint errors * Move unit test to the correct describe * Fix lint errors * Move from one core pipe to different for APS1 and Cloud * Add Pipe to process cloud providers * Update documentation * Revert demo-shell default process name * Fix pipe version in documentation * e2e - select process definition and then type name * Fix process services e2e * Align process filters e2e * Align start-task-form cloud e2e * Use processInstance model instead of processDefinition as a parameter for transform function
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2019 Alfresco Software, Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { async, TestBed } from '@angular/core/testing';
|
||||
import { setupTestBed } from 'core';
|
||||
import { CoreTestingModule } from 'core/testing/core.testing.module';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import moment from 'moment-es6';
|
||||
import { ProcessNameCloudPipe } from './process-name-cloud.pipe';
|
||||
import { LocalizedDatePipe } from '@alfresco/adf-core';
|
||||
import { ProcessInstanceCloud } from '../process/start-process/models/process-instance-cloud.model';
|
||||
|
||||
describe('ProcessNameCloudPipe', () => {
|
||||
|
||||
let processNamePipe: ProcessNameCloudPipe;
|
||||
const defaultName = 'default-name';
|
||||
const datetimeIdentifier = '%{datetime}';
|
||||
const processDefinitionIdentifier = '%{processDefinition}';
|
||||
const mockCurrentDate = 'Wed Oct 23 2019';
|
||||
const mockLocalizedCurrentDate = 'Oct 23, 2019, 12:00:00 AM';
|
||||
const nameWithProcessDefinitionIdentifier = `${defaultName} - ${processDefinitionIdentifier}`;
|
||||
const nameWithDatetimeIdentifier = `${defaultName} - ${datetimeIdentifier}`;
|
||||
const nameWithAllIdentifiers = `${defaultName} ${processDefinitionIdentifier} - ${datetimeIdentifier}`;
|
||||
const fakeProcessInstanceDetails = new ProcessInstanceCloud({ processDefinitionName: 'my-process-definition' });
|
||||
|
||||
setupTestBed({
|
||||
imports: [
|
||||
TranslateModule.forRoot(),
|
||||
CoreTestingModule
|
||||
]
|
||||
});
|
||||
|
||||
beforeEach(async(() => {
|
||||
const localizedDatePipe = TestBed.get(LocalizedDatePipe);
|
||||
processNamePipe = new ProcessNameCloudPipe(localizedDatePipe);
|
||||
}));
|
||||
|
||||
it('should not modify the name when there is no identifier', () => {
|
||||
const transformResult = processNamePipe.transform(defaultName);
|
||||
expect(transformResult).toEqual(defaultName);
|
||||
});
|
||||
|
||||
it('should add the selected process definition name to the process name', () => {
|
||||
const transformResult = processNamePipe.transform(nameWithProcessDefinitionIdentifier, fakeProcessInstanceDetails);
|
||||
expect(transformResult).toEqual(`${defaultName} - ${fakeProcessInstanceDetails.processDefinitionName}`);
|
||||
});
|
||||
|
||||
it('should add the current datetime to the process name', () => {
|
||||
spyOn(moment, 'now').and.returnValue(mockCurrentDate);
|
||||
const transformResult = processNamePipe.transform(nameWithDatetimeIdentifier);
|
||||
expect(transformResult).toEqual(`${defaultName} - ${mockLocalizedCurrentDate}`);
|
||||
});
|
||||
|
||||
it('should add the current datetime and the selected process definition name when both identifiers are present', () => {
|
||||
spyOn(moment, 'now').and.returnValue(mockCurrentDate);
|
||||
const transformResult = processNamePipe.transform(nameWithAllIdentifiers, fakeProcessInstanceDetails);
|
||||
expect(transformResult).toEqual(`${defaultName} ${fakeProcessInstanceDetails.processDefinitionName} - ${mockLocalizedCurrentDate}`);
|
||||
});
|
||||
|
||||
it('should not modify the process name when processDefinition identifier is present but no process definition is selected', () => {
|
||||
const transformResult = processNamePipe.transform(nameWithProcessDefinitionIdentifier);
|
||||
expect(transformResult).toEqual(`${defaultName} - `);
|
||||
});
|
||||
|
||||
});
|
@@ -0,0 +1,50 @@
|
||||
/*!
|
||||
* @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 { Pipe, PipeTransform } from '@angular/core';
|
||||
import moment from 'moment-es6';
|
||||
import { LocalizedDatePipe } from '@alfresco/adf-core';
|
||||
import { ProcessInstanceCloud } from '../process/start-process/models/process-instance-cloud.model';
|
||||
|
||||
@Pipe({ name: 'processNameCloud' })
|
||||
export class ProcessNameCloudPipe implements PipeTransform {
|
||||
static DATE_TIME_IDENTIFIER_REG_EXP = new RegExp('%{datetime}', 'i');
|
||||
static PROCESS_DEFINITION_IDENTIFIER_REG_EXP = new RegExp('%{processdefinition}', 'i');
|
||||
|
||||
constructor(private localizedDatePipe: LocalizedDatePipe) {
|
||||
}
|
||||
|
||||
transform(processNameFormat: string, processInstance?: ProcessInstanceCloud): string {
|
||||
let processName = processNameFormat;
|
||||
if (processName.match(ProcessNameCloudPipe.DATE_TIME_IDENTIFIER_REG_EXP)) {
|
||||
const presentDateTime = moment.now();
|
||||
processName = processName.replace(
|
||||
ProcessNameCloudPipe.DATE_TIME_IDENTIFIER_REG_EXP,
|
||||
this.localizedDatePipe.transform(presentDateTime, 'medium')
|
||||
);
|
||||
}
|
||||
|
||||
if (processName.match(ProcessNameCloudPipe.PROCESS_DEFINITION_IDENTIFIER_REG_EXP)) {
|
||||
const selectedProcessDefinitionName = processInstance ? processInstance.processDefinitionName : '';
|
||||
processName = processName.replace(
|
||||
ProcessNameCloudPipe.PROCESS_DEFINITION_IDENTIFIER_REG_EXP,
|
||||
selectedProcessDefinitionName
|
||||
);
|
||||
}
|
||||
return processName;
|
||||
}
|
||||
}
|
@@ -0,0 +1,30 @@
|
||||
/*!
|
||||
* @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 { ProcessNameCloudPipe } from './process-name-cloud.pipe';
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
ProcessNameCloudPipe
|
||||
],
|
||||
exports: [
|
||||
ProcessNameCloudPipe
|
||||
]
|
||||
})
|
||||
export class ProcessServicesCloudPipeModule {
|
||||
}
|
@@ -30,6 +30,7 @@ import {
|
||||
} from './services/public-api';
|
||||
import { PeopleCloudModule } from './people/people-cloud.module';
|
||||
import { CloudFormRenderingService } from './form/components/cloud-form-rendering.service';
|
||||
import { ProcessServicesCloudPipeModule } from './pipes/process-services-cloud-pipe.module';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
@@ -40,7 +41,8 @@ import { CloudFormRenderingService } from './form/components/cloud-form-renderin
|
||||
GroupCloudModule,
|
||||
PeopleCloudModule,
|
||||
FormCloudModule,
|
||||
TaskFormModule
|
||||
TaskFormModule,
|
||||
ProcessServicesCloudPipeModule
|
||||
],
|
||||
providers: [
|
||||
{
|
||||
@@ -63,7 +65,8 @@ import { CloudFormRenderingService } from './form/components/cloud-form-renderin
|
||||
GroupCloudModule,
|
||||
FormCloudModule,
|
||||
TaskFormModule,
|
||||
PeopleCloudModule
|
||||
PeopleCloudModule,
|
||||
ProcessServicesCloudPipeModule
|
||||
]
|
||||
})
|
||||
export class ProcessServicesCloudModule { }
|
||||
|
@@ -22,6 +22,7 @@ import { StartProcessCloudModule } from './start-process/start-process-cloud.mod
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { ProcessHeaderCloudModule } from './process-header/process-header-cloud.module';
|
||||
import { ProcessDirectiveModule } from './directives/process-directive.module';
|
||||
import { ProcessNameCloudPipe } from '../pipes/process-name-cloud.pipe';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
@@ -38,6 +39,7 @@ import { ProcessDirectiveModule } from './directives/process-directive.module';
|
||||
StartProcessCloudModule,
|
||||
ProcessHeaderCloudModule,
|
||||
ProcessDirectiveModule
|
||||
]
|
||||
],
|
||||
providers: [ProcessNameCloudPipe]
|
||||
})
|
||||
export class ProcessCloudModule { }
|
||||
|
@@ -30,6 +30,7 @@ import { debounceTime, takeUntil, switchMap, filter, distinctUntilChanged, tap }
|
||||
import { ProcessDefinitionCloud } from '../models/process-definition-cloud.model';
|
||||
import { Subject, Observable } from 'rxjs';
|
||||
import { TaskVariableCloud } from '../../../form/models/task-variable-cloud.model';
|
||||
import { ProcessNameCloudPipe } from '../../../pipes/process-name-cloud.pipe';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-cloud-start-process',
|
||||
@@ -107,12 +108,13 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy
|
||||
processDefinitionLoaded = false;
|
||||
|
||||
constructor(private startProcessCloudService: StartProcessCloudService,
|
||||
private formBuilder: FormBuilder) {
|
||||
private formBuilder: FormBuilder,
|
||||
private processNameCloudPipe: ProcessNameCloudPipe) {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.processForm = this.formBuilder.group({
|
||||
processInstanceName: new FormControl(this.name, [Validators.required, Validators.maxLength(this.getMaxNameLength()), Validators.pattern('^[^\\s]+(\\s+[^\\s]+)*$')]),
|
||||
processInstanceName: new FormControl('', [Validators.required, Validators.maxLength(this.getMaxNameLength()), Validators.pattern('^[^\\s]+(\\s+[^\\s]+)*$')]),
|
||||
processDefinition: new FormControl(this.processDefinitionName, [Validators.required, this.processDefinitionNameValidator()])
|
||||
});
|
||||
|
||||
@@ -372,8 +374,15 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy
|
||||
this.formContentClicked.emit(content);
|
||||
}
|
||||
|
||||
processDefinitionSelectionChanged(processDefinition) {
|
||||
this.processDefinitionSelection.emit(processDefinition);
|
||||
processDefinitionSelectionChanged(processDefinition: ProcessDefinitionCloud) {
|
||||
if (processDefinition) {
|
||||
const processInstanceDetails = new ProcessInstanceCloud({ processDefinitionName: processDefinition.name });
|
||||
const defaultProcessName = this.processNameCloudPipe.transform(this.name, processInstanceDetails);
|
||||
this.processInstanceName.setValue(defaultProcessName);
|
||||
this.processInstanceName.markAsDirty();
|
||||
this.processInstanceName.markAsTouched();
|
||||
this.processDefinitionSelection.emit(processDefinition);
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
|
@@ -27,6 +27,7 @@ export class ProcessInstanceCloud {
|
||||
parentId: string;
|
||||
processDefinitionId: string;
|
||||
processDefinitionKey: string;
|
||||
processDefinitionName: string;
|
||||
|
||||
constructor(obj?: any) {
|
||||
this.appName = obj && obj.appName || null;
|
||||
@@ -40,5 +41,6 @@ export class ProcessInstanceCloud {
|
||||
this.parentId = obj && obj.parentId || null;
|
||||
this.processDefinitionId = obj && obj.processDefinitionId || null;
|
||||
this.processDefinitionKey = obj && obj.processDefinitionKey || null;
|
||||
this.processDefinitionName = obj && obj.processDefinitionName || null;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user