AAE-26215 Standalone process cloud components (#10553)

This commit is contained in:
Denys Vuika
2025-01-15 08:37:46 -05:00
committed by GitHub
parent 8b5dcf19b9
commit 0a17fb4f4c
39 changed files with 475 additions and 974 deletions

View File

@@ -1,92 +0,0 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* 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 { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatChipsModule } from '@angular/material/chips';
import { MatNativeDateModule, MatRippleModule, MatOptionModule } from '@angular/material/core';
import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogModule } from '@angular/material/dialog';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatListModule } from '@angular/material/list';
import { MatMenuModule } from '@angular/material/menu';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatRadioModule } from '@angular/material/radio';
import { MatSelectModule } from '@angular/material/select';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatTableModule } from '@angular/material/table';
import { MatTabsModule } from '@angular/material/tabs';
@NgModule({
providers: [{ provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { floatLabel: 'never' } }],
imports: [
MatAutocompleteModule,
MatButtonModule,
MatCardModule,
MatDialogModule,
MatCheckboxModule,
MatDatepickerModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatOptionModule,
MatRadioModule,
MatSelectModule,
MatSlideToggleModule,
MatTableModule,
MatTabsModule,
MatProgressSpinnerModule,
MatNativeDateModule,
MatRippleModule,
MatChipsModule,
MatMenuModule,
MatExpansionModule
],
exports: [
MatAutocompleteModule,
MatButtonModule,
MatCardModule,
MatDialogModule,
MatCheckboxModule,
MatDatepickerModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatOptionModule,
MatRadioModule,
MatSelectModule,
MatSlideToggleModule,
MatTableModule,
MatTabsModule,
MatProgressSpinnerModule,
MatNativeDateModule,
MatRippleModule,
MatChipsModule,
MatMenuModule,
MatExpansionModule
]
})
export class MaterialModule {}

View File

@@ -16,7 +16,7 @@
*/
import { NgModule, ModuleWithProviders } from '@angular/core';
import { CoreModule, FormRenderingService, provideTranslations } from '@alfresco/adf-core';
import { FormRenderingService, provideTranslations } from '@alfresco/adf-core';
import { APP_LIST_CLOUD_DIRECTIVES } from './app/app-list-cloud.module';
import { TaskCloudModule } from './task/task-cloud.module';
import { ProcessCloudModule } from './process/process-cloud.module';
@@ -31,35 +31,22 @@ import {
TASK_LIST_PREFERENCES_SERVICE_TOKEN
} from './services/public-api';
import { CloudFormRenderingService } from './form/components/cloud-form-rendering.service';
import { ApolloModule } from 'apollo-angular';
import { RichTextEditorComponent } from './rich-text-editor';
import { GroupCloudComponent } from './group/components/group-cloud.component';
import { PeopleCloudComponent } from './people/components/people-cloud.component';
export const PROCESS_SERVICES_CLOUD_DIRECTIVES = [
...APP_LIST_CLOUD_DIRECTIVES,
...FORM_CLOUD_DIRECTIVES,
...TASK_FORM_CLOUD_DIRECTIVES,
PeopleCloudComponent,
RichTextEditorComponent
] as const;
@NgModule({
imports: [
CoreModule,
...APP_LIST_CLOUD_DIRECTIVES,
ProcessCloudModule,
TaskCloudModule,
GroupCloudComponent,
PeopleCloudComponent,
...FORM_CLOUD_DIRECTIVES,
...TASK_FORM_CLOUD_DIRECTIVES,
ApolloModule,
RichTextEditorComponent
],
imports: [ProcessCloudModule, TaskCloudModule, GroupCloudComponent, ...PROCESS_SERVICES_CLOUD_DIRECTIVES],
providers: [provideTranslations('adf-process-services-cloud', 'assets/adf-process-services-cloud')],
exports: [
...APP_LIST_CLOUD_DIRECTIVES,
ProcessCloudModule,
TaskCloudModule,
GroupCloudComponent,
...FORM_CLOUD_DIRECTIVES,
...TASK_FORM_CLOUD_DIRECTIVES,
PeopleCloudComponent,
RichTextEditorComponent
]
exports: [ProcessCloudModule, TaskCloudModule, GroupCloudComponent, ...PROCESS_SERVICES_CLOUD_DIRECTIVES]
})
export class ProcessServicesCloudModule {
static forRoot(

View File

@@ -16,14 +16,16 @@
*/
import { NgModule } from '@angular/core';
import { ProcessFiltersCloudModule } from './process-filters/process-filters-cloud.module';
import { PROCESS_FILTERS_CLOUD_DIRECTIVES } from './process-filters/process-filters-cloud.module';
import { ProcessListCloudModule } from './process-list/process-list-cloud.module';
import { CoreModule } from '@alfresco/adf-core';
import { StartProcessCloudComponent } from './start-process/components/start-process-cloud.component';
import { ProcessHeaderCloudComponent } from './process-header/components/process-header-cloud.component';
export const PROCESS_CLOUD_DIRECTIVES = [StartProcessCloudComponent, ProcessHeaderCloudComponent] as const;
/** @deprecated use standalone components or PROCESS_CLOUD_DIRECTIVES instead */
@NgModule({
imports: [CoreModule, ProcessFiltersCloudModule, ProcessListCloudModule, StartProcessCloudComponent, ProcessHeaderCloudComponent],
exports: [ProcessFiltersCloudModule, ProcessListCloudModule, StartProcessCloudComponent, ProcessHeaderCloudComponent]
imports: [...PROCESS_FILTERS_CLOUD_DIRECTIVES, ProcessListCloudModule, ...PROCESS_CLOUD_DIRECTIVES],
exports: [...PROCESS_FILTERS_CLOUD_DIRECTIVES, ProcessListCloudModule, ...PROCESS_CLOUD_DIRECTIVES]
})
export class ProcessCloudModule {}

View File

@@ -8,7 +8,12 @@
<span *ngIf="showTitle"> {{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.TITLE' | translate}}</span>
<div *ngIf="showFilterActions" class="adf-cloud-edit-process-filter-actions">
<ng-container *ngIf="toggleFilterActions">
<button *ngFor="let filterAction of processFilterActions" mat-icon-button [title]="filterAction.tooltip | translate" [attr.data-automation-id]="'adf-filter-action-' + filterAction.actionType" [disabled]="isDisabledAction(filterAction)" (click)="executeFilterActions($event, filterAction)">
<button *ngFor="let filterAction of processFilterActions"
mat-icon-button
[title]="filterAction.tooltip | translate"
[attr.data-automation-id]="'adf-filter-action-' + filterAction.actionType"
[disabled]="isDisabledAction(filterAction)"
(click)="executeFilterActions($event, filterAction)">
<adf-icon [value]="filterAction.icon" />
</button>
</ng-container>
@@ -72,14 +77,16 @@
[matDatepicker]="dateController"
placeholder="{{processFilterProperty.label | translate}}"
[attr.data-automation-id]="'adf-cloud-edit-process-property-' + processFilterProperty.key">
<mat-datepicker-toggle matSuffix [for]="dateController" [attr.data-automation-id]="'adf-cloud-edit-process-property-date-toggle-' + processFilterProperty.key" />
<mat-datepicker #dateController [attr.data-automation-id]="'adf-cloud-edit-process-property-date-picker-' + processFilterProperty.key" />
<div class="adf-edit-process-filter-date-error-container">
<div *ngIf="hasError(processFilterProperty)">
<div class="adf-error-text">{{'ADF_CLOUD_EDIT_PROCESS_FILTER.ERROR.DATE' | translate}}</div>
<mat-icon class="adf-error-icon">warning</mat-icon>
<mat-datepicker-toggle
matSuffix [for]="dateController"
[attr.data-automation-id]="'adf-cloud-edit-process-property-date-toggle-' + processFilterProperty.key" />
<mat-datepicker #dateController [attr.data-automation-id]="'adf-cloud-edit-process-property-date-picker-' + processFilterProperty.key" />
<div class="adf-edit-process-filter-date-error-container">
<div *ngIf="hasError(processFilterProperty)">
<div class="adf-error-text">{{'ADF_CLOUD_EDIT_PROCESS_FILTER.ERROR.DATE' | translate}}</div>
<mat-icon class="adf-error-icon">warning</mat-icon>
</div>
</div>
</div>
</mat-form-field>
<adf-cloud-date-range-filter *ngIf="processFilterProperty.type === 'date-range'"

View File

@@ -16,51 +16,41 @@
*/
import { AlfrescoApiService } from '@alfresco/adf-content-services';
import { ADF_DATE_FORMATS, FullNamePipe, NoopAuthModule, NoopTranslateModule, UserPreferencesService } from '@alfresco/adf-core';
import { ADF_DATE_FORMATS, NoopAuthModule, NoopTranslateModule, UserPreferencesService } from '@alfresco/adf-core';
import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { SimpleChange } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
import { DateFnsAdapter } from '@angular/material-date-fns-adapter';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatChipsModule } from '@angular/material/chips';
import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialog, MatDialogModule } from '@angular/material/dialog';
import { MatExpansionPanelHarness } from '@angular/material/expansion/testing';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconTestingModule } from '@angular/material/icon/testing';
import { MatInputModule } from '@angular/material/input';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatProgressSpinnerHarness } from '@angular/material/progress-spinner/testing';
import { MatSelectModule } from '@angular/material/select';
import { MatSelectHarness } from '@angular/material/select/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { endOfDay, format, isValid, startOfDay, subYears } from 'date-fns';
import { enUS } from 'date-fns/locale';
import { of } from 'rxjs';
import { AppsProcessCloudService } from '../../../app/services/apps-process-cloud.service';
import { DateRangeFilterComponent } from '../../../common/date-range-filter/date-range-filter.component';
import { fakeEnvironmentList } from '../../../common/mock/environment.mock';
import { DateCloudFilterType } from '../../../models/date-cloud-filter.model';
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
import { PeopleCloudComponent } from '../../../people/components/people-cloud.component';
import { IdentityUserServiceMock } from '../../../people/mock/people-cloud.mock';
import { PROCESS_FILTERS_SERVICE_TOKEN } from '../../../services/cloud-token.service';
import { LocalPreferenceCloudService } from '../../../services/local-preference-cloud.service';
import { NotificationCloudService } from '../../../services/notification-cloud.service';
import { ProcessCloudService } from '../../services/process-cloud.service';
import { mockAppVersions } from '../mock/process-filters-cloud.mock';
import { ProcessFilterCloudModel } from '../models/process-filter-cloud.model';
import { ProcessFilterCloudService } from '../services/process-filter-cloud.service';
import { fakeApplicationInstance, fakeApplicationInstanceWithEnvironment } from './../../../app/mock/app-model.mock';
import { AppsProcessCloudService } from '../../../../app/services/apps-process-cloud.service';
import { fakeEnvironmentList } from '../../../../common/mock/environment.mock';
import { DateCloudFilterType } from '../../../../models/date-cloud-filter.model';
import { ProcessDefinitionCloud } from '../../../../models/process-definition-cloud.model';
import { IdentityUserServiceMock } from '../../../../people/mock/people-cloud.mock';
import { PROCESS_FILTERS_SERVICE_TOKEN } from '../../../../services/cloud-token.service';
import { LocalPreferenceCloudService } from '../../../../services/local-preference-cloud.service';
import { NotificationCloudService } from '../../../../services/notification-cloud.service';
import { ProcessCloudService } from '../../../services/process-cloud.service';
import { mockAppVersions } from '../../mock/process-filters-cloud.mock';
import { ProcessFilterCloudModel } from '../../models/process-filter-cloud.model';
import { ProcessFilterCloudService } from '../../services/process-filter-cloud.service';
import { fakeApplicationInstance, fakeApplicationInstanceWithEnvironment } from '../../../../app/mock/app-model.mock';
import {
EditProcessFilterCloudComponent,
PROCESS_FILTER_ACTION_RESTORE,
PROCESS_FILTER_ACTION_SAVE_DEFAULT
} from './edit-process-filter-cloud.component';
import { ProcessFilterDialogCloudComponent } from './process-filter-dialog-cloud.component';
import { ProcessFilterDialogCloudComponent } from '../process-filter-dialog/process-filter-dialog-cloud.component';
import { IdentityUserService } from '@alfresco/adf-process-services-cloud';
describe('EditProcessFilterCloudComponent', () => {
@@ -106,17 +96,7 @@ describe('EditProcessFilterCloudComponent', () => {
MatDialogModule,
NoopTranslateModule,
NoopAnimationsModule,
MatSelectModule,
MatDatepickerModule,
MatAutocompleteModule,
FullNamePipe,
MatFormFieldModule,
MatInputModule,
ReactiveFormsModule,
MatChipsModule,
MatProgressBarModule,
PeopleCloudComponent,
DateRangeFilterComponent
EditProcessFilterCloudComponent
],
providers: [
{ provide: PROCESS_FILTERS_SERVICE_TOKEN, useClass: LocalPreferenceCloudService },

View File

@@ -16,28 +16,40 @@
*/
import { Component, DestroyRef, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges, ViewEncapsulation } from '@angular/core';
import { AbstractControl, FormBuilder, FormControl, FormGroup } from '@angular/forms';
import { AbstractControl, FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { DateAdapter } from '@angular/material/core';
import { MatDialog } from '@angular/material/dialog';
import { debounceTime, filter, finalize, switchMap, tap } from 'rxjs/operators';
import { Observable, Subscription } from 'rxjs';
import { AppsProcessCloudService } from '../../../app/services/apps-process-cloud.service';
import { AppsProcessCloudService } from '../../../../app/services/apps-process-cloud.service';
import {
ProcessFilterAction,
ProcessFilterCloudModel,
ProcessFilterOptions,
ProcessFilterProperties,
ProcessSortFilterProperty
} from '../models/process-filter-cloud.model';
import { DateFnsUtils, TranslationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
import { ProcessFilterCloudService } from '../services/process-filter-cloud.service';
import { ProcessFilterDialogCloudComponent } from './process-filter-dialog-cloud.component';
import { ProcessCloudService } from '../../services/process-cloud.service';
import { DateCloudFilterType, DateRangeFilter } from '../../../models/date-cloud-filter.model';
import { IdentityUserModel } from '../../../people/models/identity-user.model';
import { Environment } from '../../../common/interface/environment.interface';
} from '../../models/process-filter-cloud.model';
import { DateFnsUtils, IconComponent, TranslationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
import { ProcessFilterCloudService } from '../../services/process-filter-cloud.service';
import { ProcessFilterDialogCloudComponent } from '../process-filter-dialog/process-filter-dialog-cloud.component';
import { ProcessCloudService } from '../../../services/process-cloud.service';
import { DateCloudFilterType, DateRangeFilter } from '../../../../models/date-cloud-filter.model';
import { IdentityUserModel } from '../../../../people/models/identity-user.model';
import { Environment } from '../../../../common/interface/environment.interface';
import { endOfDay, isValid, startOfDay } from 'date-fns';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { TranslateModule } from '@ngx-translate/core';
import { MatButtonModule } from '@angular/material/button';
import { NgForOf, NgIf } from '@angular/common';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
import { MatInputModule } from '@angular/material/input';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIconModule } from '@angular/material/icon';
import { DateRangeFilterComponent } from '../../../../common/date-range-filter/date-range-filter.component';
import { PeopleCloudComponent } from '../../../../people/components/people-cloud.component';
export const PROCESS_FILTER_ACTION_SAVE = 'save';
export const PROCESS_FILTER_ACTION_SAVE_AS = 'saveAs';
@@ -68,6 +80,24 @@ interface ProcessFilterFormProps {
@Component({
selector: 'adf-cloud-edit-process-filter',
standalone: true,
imports: [
IconComponent,
MatProgressSpinnerModule,
TranslateModule,
MatButtonModule,
NgForOf,
NgIf,
MatExpansionModule,
MatFormFieldModule,
MatSelectModule,
ReactiveFormsModule,
MatInputModule,
MatDatepickerModule,
MatIconModule,
DateRangeFilterComponent,
PeopleCloudComponent
],
templateUrl: './edit-process-filter-cloud.component.html',
styleUrls: ['./edit-process-filter-cloud.component.scss'],
encapsulation: ViewEncapsulation.None

View File

@@ -4,11 +4,14 @@
</span>
<mat-card appearance="outlined" class="adf-process-filter-dialog-card">
<mat-card-content class="adf-process-filter-dialog-card-content">
<form [formGroup]="filterForm">
<mat-form-field class="adf-process-filter-name" [floatLabel]="'auto'">
<input matInput placeholder="{{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.FILTER_NAME' | translate }}" [formControl]="filterForm.controls.name" id="adf-filter-name-id">
</mat-form-field>
</form>
<form [formGroup]="filterForm">
<mat-form-field class="adf-process-filter-name" [floatLabel]="'auto'">
<input
matInput
placeholder="{{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.FILTER_NAME' | translate }}"
[formControl]="filterForm.controls.name" id="adf-filter-name-id">
</mat-form-field>
</form>
</mat-card-content>
<mat-card-actions class='adf-process-filter-dialog-actions'>
<button mat-button (click)="onSaveClick()" id="adf-save-button-id" [disabled]="!filterForm.valid">

View File

@@ -18,8 +18,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { ProcessFilterDialogCloudComponent } from './process-filter-dialog-cloud.component';
import { ProcessServiceCloudTestingModule } from '../../../testing/process-service-cloud.testing.module';
import { ProcessFiltersCloudModule } from '../process-filters-cloud.module';
import { ProcessServiceCloudTestingModule } from '../../../../testing/process-service-cloud.testing.module';
describe('ProcessFilterDialogCloudComponent', () => {
let component: ProcessFilterDialogCloudComponent;
@@ -36,7 +35,7 @@ describe('ProcessFilterDialogCloudComponent', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ProcessServiceCloudTestingModule, ProcessFiltersCloudModule],
imports: [ProcessServiceCloudTestingModule, ProcessFilterDialogCloudComponent],
providers: [
{ provide: MatDialogRef, useValue: mockDialogRef },
{ provide: MAT_DIALOG_DATA, useValue: mockDialogData }

View File

@@ -16,11 +16,17 @@
*/
import { ChangeDetectionStrategy, Component, inject, ViewEncapsulation } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatInputModule } from '@angular/material/input';
@Component({
selector: 'adf-cloud-process-filter-dialog-cloud',
standalone: true,
imports: [TranslateModule, MatButtonModule, MatCardModule, MatInputModule, ReactiveFormsModule, MatDialogModule],
templateUrl: './process-filter-dialog-cloud.component.html',
styleUrls: ['./process-filter-dialog-cloud.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,

View File

@@ -18,18 +18,16 @@
import { SimpleChange } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { of, throwError } from 'rxjs';
import { ProcessFilterCloudService } from '../services/process-filter-cloud.service';
import { ProcessFilterCloudService } from '../../services/process-filter-cloud.service';
import { ProcessFiltersCloudComponent } from './process-filters-cloud.component';
import { By } from '@angular/platform-browser';
import { PROCESS_FILTERS_SERVICE_TOKEN } from '../../../services/cloud-token.service';
import { LocalPreferenceCloudService } from '../../../services/local-preference-cloud.service';
import { mockProcessFilters } from '../mock/process-filters-cloud.mock';
import { PROCESS_FILTERS_SERVICE_TOKEN } from '../../../../services/cloud-token.service';
import { LocalPreferenceCloudService } from '../../../../services/local-preference-cloud.service';
import { mockProcessFilters } from '../../mock/process-filters-cloud.mock';
import { AppConfigService, AppConfigServiceMock, NoopTranslateModule } from '@alfresco/adf-core';
import { ProcessListCloudService } from '../../../process/process-list/services/process-list-cloud.service';
import { NotificationCloudService } from '../../../services/notification-cloud.service';
import { ProcessListCloudService } from '../../../process-list/services/process-list-cloud.service';
import { ApolloModule } from 'apollo-angular';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { MatListModule } from '@angular/material/list';
const ProcessFilterCloudServiceMock = {
getProcessFilters: () => of(mockProcessFilters),
@@ -46,16 +44,18 @@ describe('ProcessFiltersCloudComponent', () => {
const configureTestingModule = (searchApiMethod: 'GET' | 'POST') => {
TestBed.configureTestingModule({
imports: [NoopTranslateModule, NoopAnimationsModule, MatListModule],
imports: [NoopTranslateModule, NoopAnimationsModule, ProcessFiltersCloudComponent],
providers: [
{ provide: PROCESS_FILTERS_SERVICE_TOKEN, useClass: LocalPreferenceCloudService },
{ provide: AppConfigService, useClass: AppConfigServiceMock },
{ provide: ProcessListCloudService, useValue: {
getProcessCounter: () => of(10),
getProcessListCounter: () => of(10)
}},
{
provide: ProcessListCloudService,
useValue: {
getProcessCounter: () => of(10),
getProcessListCounter: () => of(10)
}
},
{ provide: ProcessFilterCloudService, useValue: ProcessFilterCloudServiceMock },
NotificationCloudService,
ApolloModule
]
});

View File

@@ -15,30 +15,25 @@
* limitations under the License.
*/
import {
Component,
DestroyRef,
EventEmitter,
inject,
Input,
OnChanges,
OnInit,
Output,
SimpleChanges,
ViewEncapsulation
} from '@angular/core';
import { Component, DestroyRef, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges, ViewEncapsulation } from '@angular/core';
import { Observable } from 'rxjs';
import { ProcessFilterCloudService } from '../services/process-filter-cloud.service';
import { ProcessFilterCloudModel } from '../models/process-filter-cloud.model';
import { AppConfigService, TranslationService } from '@alfresco/adf-core';
import { FilterParamsModel } from '../../../task/task-filters/models/filter-cloud.model';
import { ProcessFilterCloudService } from '../../services/process-filter-cloud.service';
import { ProcessFilterCloudModel } from '../../models/process-filter-cloud.model';
import { AppConfigService, IconComponent, TranslationService } from '@alfresco/adf-core';
import { FilterParamsModel } from '../../../../task/task-filters/models/filter-cloud.model';
import { debounceTime, tap } from 'rxjs/operators';
import { ProcessListCloudService } from '../../../process/process-list/services/process-list-cloud.service';
import { ProcessFilterCloudAdapter } from '../../process-list/models/process-cloud-query-request.model';
import { ProcessListCloudService } from '../../../process-list/services/process-list-cloud.service';
import { ProcessFilterCloudAdapter } from '../../../process-list/models/process-cloud-query-request.model';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { TranslateModule } from '@ngx-translate/core';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatListModule } from '@angular/material/list';
@Component({
selector: 'adf-cloud-process-filters',
standalone: true,
imports: [TranslateModule, IconComponent, NgIf, MatProgressSpinnerModule, NgForOf, MatListModule, AsyncPipe],
templateUrl: './process-filters-cloud.component.html',
styleUrls: ['./process-filters-cloud.component.scss'],
encapsulation: ViewEncapsulation.None
@@ -326,6 +321,6 @@ export class ProcessFiltersCloudComponent implements OnInit, OnChanges {
private fetchProcessFilterCounter(filter: ProcessFilterCloudModel): Observable<number> {
return this.searchApiMethod === 'POST'
? this.processListCloudService.getProcessListCounter(new ProcessFilterCloudAdapter(filter))
: this.processListCloudService.getProcessCounter(filter.appName, filter.status)
: this.processListCloudService.getProcessCounter(filter.appName, filter.status);
}
}

View File

@@ -16,31 +16,19 @@
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { ProcessFiltersCloudComponent } from './components/process-filters-cloud.component';
import { MaterialModule } from '../../material.module';
import { CoreModule } from '@alfresco/adf-core';
import { HttpClientModule } from '@angular/common/http';
import { EditProcessFilterCloudComponent } from './components/edit-process-filter-cloud.component';
import { ProcessFilterDialogCloudComponent } from './components/process-filter-dialog-cloud.component';
import { APP_LIST_CLOUD_DIRECTIVES } from './../../app/app-list-cloud.module';
import { PeopleCloudComponent } from '../../people/components/people-cloud.component';
import { DateRangeFilterComponent } from '../../common/date-range-filter/date-range-filter.component';
import { ProcessFiltersCloudComponent } from './components/process-filters/process-filters-cloud.component';
import { EditProcessFilterCloudComponent } from './components/edit-process-filter/edit-process-filter-cloud.component';
import { ProcessFilterDialogCloudComponent } from './components/process-filter-dialog/process-filter-dialog-cloud.component';
export const PROCESS_FILTERS_CLOUD_DIRECTIVES = [
ProcessFiltersCloudComponent,
EditProcessFilterCloudComponent,
ProcessFilterDialogCloudComponent
] as const;
/** @deprecated use standalone components or PROCESS_FILTERS_CLOUD_DIRECTIVES instead */
@NgModule({
imports: [
FormsModule,
ReactiveFormsModule,
HttpClientModule,
CommonModule,
MaterialModule,
...APP_LIST_CLOUD_DIRECTIVES,
CoreModule,
DateRangeFilterComponent,
PeopleCloudComponent
],
declarations: [ProcessFiltersCloudComponent, EditProcessFilterCloudComponent, ProcessFilterDialogCloudComponent],
exports: [ProcessFiltersCloudComponent, EditProcessFilterCloudComponent, ProcessFilterDialogCloudComponent]
imports: [...PROCESS_FILTERS_CLOUD_DIRECTIVES],
exports: [...PROCESS_FILTERS_CLOUD_DIRECTIVES]
})
export class ProcessFiltersCloudModule {}

View File

@@ -15,9 +15,9 @@
* limitations under the License.
*/
export * from './components/process-filters-cloud.component';
export * from './components/edit-process-filter-cloud.component';
export * from './components/process-filter-dialog-cloud.component';
export * from './components/process-filters/process-filters-cloud.component';
export * from './components/edit-process-filter/edit-process-filter-cloud.component';
export * from './components/process-filter-dialog/process-filter-dialog-cloud.component';
export * from './models/process-filter-cloud.model';
export * from './services/process-filter-cloud.service';
export * from './process-filters-cloud.module';

View File

@@ -1,4 +1,4 @@
<adf-datatable #dataTable
<adf-datatable
[rows]="rows"
[columns]="columns"
[data]="dataAdapter"

View File

@@ -23,28 +23,113 @@ import {
ColumnsSelectorComponent,
CustomEmptyContentTemplateDirective,
DataColumn,
DataColumnComponent,
DataColumnListComponent,
DataRowEvent,
getDataColumnMock,
ObjectDataColumn,
ObjectDataRow,
User
} from '@alfresco/adf-core';
import { ProcessListCloudService } from '../services/process-list-cloud.service';
import { ProcessListCloudComponent } from './process-list-cloud.component';
import { fakeCustomSchema, fakeProcessCloudList, processListSchemaMock } from '../mock/process-list-service.mock';
import { of } from 'rxjs';
import { shareReplay, skip } from 'rxjs/operators';
import { ProcessServiceCloudTestingModule } from '../../../testing/process-service-cloud.testing.module';
import { ProcessListCloudSortingModel } from '../models/process-list-sorting.model';
import { PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN } from '../../../services/cloud-token.service';
import { ProcessListCloudPreferences } from '../models/process-cloud-preferences';
import { PROCESS_LIST_CUSTOM_VARIABLE_COLUMN } from '../../../models/data-column-custom-data';
import { PROCESS_LIST_CUSTOM_VARIABLE_COLUMN, ProcessListDataColumnCustomData } from '../../../models/data-column-custom-data';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { PreferenceCloudServiceInterface } from '../../../services/preference-cloud.interface';
import { HarnessLoader } from '@angular/cdk/testing';
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatProgressSpinnerHarness } from '@angular/material/progress-spinner/testing';
const fakeCustomSchema = [
new ObjectDataColumn<ProcessListDataColumnCustomData>({
key: 'fakeName',
type: 'text',
title: 'ADF_CLOUD_TASK_LIST.PROPERTIES.FAKE',
sortable: true
}),
new ObjectDataColumn<ProcessListDataColumnCustomData>({
key: 'fakeTaskName',
type: 'text',
title: 'ADF_CLOUD_TASK_LIST.PROPERTIES.TASK_FAKE',
sortable: true
})
];
const fakeProcessCloudList = {
list: {
entries: [
{
entry: {
appName: 'easy-peasy-japanesey',
appVersion: 1,
id: '69eddfa7-d781-11e8-ae24-0a58646001fa',
name: 'starring',
processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa',
processDefinitionKey: 'BasicProcess',
initiator: 'devopsuser',
startDate: 1540381146275,
businessKey: 'MyBusinessKey',
status: 'RUNNING',
lastModified: 1540381146276,
lastModifiedTo: null,
lastModifiedFrom: null,
variables: [{ id: 'variableId', value: 'variableValue' }]
}
},
{
entry: {
appName: 'easy-peasy-japanesey',
appVersion: 1,
id: '8b3f625f-d781-11e8-ae24-0a58646001fa',
name: null,
processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa',
processDefinitionKey: 'BasicProcess',
initiator: 'devopsuser',
startDate: 1540381202174,
businessKey: 'MyBusinessKey',
status: 'RUNNING',
lastModified: 1540381202174,
lastModifiedTo: null,
lastModifiedFrom: null
}
},
{
entry: {
appName: 'easy-peasy-japanesey',
appVersion: 2,
id: '87c12637-d783-11e8-ae24-0a58646001fa',
name: null,
processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa',
processDefinitionKey: 'BasicProcess',
initiator: 'superadminuser',
startDate: 1540382055307,
businessKey: 'MyBusinessKey',
status: 'RUNNING',
lastModified: 1540382055308,
lastModifiedTo: null,
lastModifiedFrom: null
}
}
],
pagination: {
skipCount: 0,
maxItems: 100,
count: 3,
hasMoreItems: false,
totalItems: 3
}
}
};
@Component({
standalone: true,
imports: [DataColumnComponent, DataColumnListComponent, ProcessListCloudComponent],
template: ` <adf-cloud-process-list #processListCloud>
<data-columns>
<data-column key="name" title="ADF_CLOUD_TASK_LIST.PROPERTIES.NAME" class="adf-full-width adf-name-column" [order]="3" />
@@ -66,6 +151,62 @@ class CustomTaskListComponent {
}
}
const processListSchemaMock = {
presets: {
default: [
{
key: 'id',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.ID'
},
{
key: 'name',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.NAME'
},
{
key: 'status',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.STATUS'
},
{
key: 'startDate',
type: 'date',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.START_DATE',
format: 'timeAgo'
},
{
key: 'appName',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.APP_NAME'
},
{
key: 'businessKey',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.BUSINESS_KEY'
},
{
key: 'initiator',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.INITIATOR'
},
{
key: 'lastModified',
type: 'date',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.LAST_MODIFIED'
},
{
key: 'processDefinitionId',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_DEF_ID'
},
{
key: 'processDefinitionKey',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_DEF_KEY'
}
].map((column: { key: string; type: string; title: string; sortable: boolean; format: string }) => {
column.sortable = true;
if (!column.type) {
column.type = 'text';
}
return column;
})
}
};
describe('ProcessListCloudComponent', () => {
let loader: HarnessLoader;
let component: ProcessListCloudComponent;
@@ -78,7 +219,7 @@ describe('ProcessListCloudComponent', () => {
const configureTestingModule = (searchApiMethod: 'GET' | 'POST') => {
TestBed.configureTestingModule({
imports: [ProcessServiceCloudTestingModule]
imports: [ProcessServiceCloudTestingModule, ProcessListCloudComponent]
});
appConfig = TestBed.inject(AppConfigService);
processListCloudService = TestBed.inject(ProcessListCloudService);
@@ -904,8 +1045,7 @@ describe('ProcessListCloudComponent: Injecting custom columns for task list - Cu
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ProcessServiceCloudTestingModule],
declarations: [CustomTaskListComponent]
imports: [ProcessServiceCloudTestingModule, CustomTaskListComponent]
});
fixtureCustom = TestBed.createComponent(CustomTaskListComponent);
fixtureCustom.detectChanges();
@@ -928,6 +1068,8 @@ describe('ProcessListCloudComponent: Injecting custom columns for task list - Cu
describe('ProcessListCloudComponent: Creating an empty custom template - EmptyTemplateComponent', () => {
@Component({
standalone: true,
imports: [CustomEmptyContentTemplateDirective, ProcessListCloudComponent],
template: `
<adf-cloud-process-list #processListCloud>
<adf-custom-empty-content-template>
@@ -949,9 +1091,14 @@ describe('ProcessListCloudComponent: Creating an empty custom template - EmptyTe
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ProcessServiceCloudTestingModule, MatProgressSpinnerModule, CustomEmptyContentTemplateDirective],
providers: [{ provide: PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN, useValue: preferencesService }],
declarations: [EmptyTemplateComponent, ProcessListCloudComponent]
imports: [
ProcessServiceCloudTestingModule,
MatProgressSpinnerModule,
CustomEmptyContentTemplateDirective,
ProcessListCloudComponent,
EmptyTemplateComponent
],
providers: [{ provide: PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN, useValue: preferencesService }]
});
fixtureEmpty = TestBed.createComponent(EmptyTemplateComponent);
fixtureEmpty.detectChanges();

View File

@@ -30,6 +30,7 @@ import {
} from '@angular/core';
import {
AppConfigService,
ColumnsSelectorComponent,
CustomEmptyContentTemplateDirective,
CustomLoadingContentTemplateDirective,
DataCellEvent,
@@ -38,6 +39,10 @@ import {
DataRowEvent,
DataTableComponent,
DataTableSchema,
EmptyContentComponent,
LoadingContentTemplateDirective,
MainMenuDataTableTemplateDirective,
NoContentTemplateDirective,
PaginatedComponent,
PaginationModel,
UserPreferencesService,
@@ -53,26 +58,40 @@ import { PreferenceCloudServiceInterface } from '../../../services/preference-cl
import { PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN } from '../../../services/cloud-token.service';
import { ProcessListCloudPreferences } from '../models/process-cloud-preferences';
import { ProcessListDatatableAdapter } from '../datatable/process-list-datatable-adapter';
import {
PROCESS_LIST_CUSTOM_VARIABLE_COLUMN,
ProcessListDataColumnCustomData
} from '../../../models/data-column-custom-data';
import { PROCESS_LIST_CUSTOM_VARIABLE_COLUMN, ProcessListDataColumnCustomData } from '../../../models/data-column-custom-data';
import { VariableMapperService } from '../../../services/variable-mapper.sevice';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { ProcessVariableFilterModel } from '../../../models/process-variable-filter.model';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { TranslateModule } from '@ngx-translate/core';
import { NgIf } from '@angular/common';
const PRESET_KEY = 'adf-cloud-process-list.presets';
/* eslint-disable @typescript-eslint/brace-style */
@Component({
selector: 'adf-cloud-process-list',
standalone: true,
imports: [
DataTableComponent,
MatProgressSpinnerModule,
TranslateModule,
ColumnsSelectorComponent,
MainMenuDataTableTemplateDirective,
EmptyContentComponent,
NoContentTemplateDirective,
LoadingContentTemplateDirective,
NgIf
],
templateUrl: './process-list-cloud.component.html',
styleUrls: ['./process-list-cloud.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class ProcessListCloudComponent
extends DataTableSchema<ProcessListDataColumnCustomData>
implements OnChanges, AfterContentInit, PaginatedComponent {
implements OnChanges, AfterContentInit, PaginatedComponent
{
@ViewChild(DataTableComponent) dataTable: DataTableComponent;
@ContentChild(CustomEmptyContentTemplateDirective)
@@ -244,24 +263,24 @@ export class ProcessListCloudComponent
@Input()
processDefinitionNames: string[] = [];
/**
* Filter the processes. Display only processes started by any of the users whose usernames are present in the array.
* This input will be used only if searchApiMethod input is provided with 'POST' value.
*/
/**
* Filter the processes. Display only processes started by any of the users whose usernames are present in the array.
* This input will be used only if searchApiMethod input is provided with 'POST' value.
*/
@Input()
initiators: string[] = [];
/**
* Filter the processes. Display only processes present in any of the specified app versions.
* This input will be used only if searchApiMethod input is provided with 'POST' value.
*/
/**
* Filter the processes. Display only processes present in any of the specified app versions.
* This input will be used only if searchApiMethod input is provided with 'POST' value.
*/
@Input()
appVersions: string[] = [];
/**
* Filter the processes. Display only processes with provided statuses.
* This input will be used only if searchApiMethod input is provided with 'POST' value.
*/
/**
* Filter the processes. Display only processes with provided statuses.
* This input will be used only if searchApiMethod input is provided with 'POST' value.
*/
@Input()
statuses: string[] = [];
@@ -278,7 +297,7 @@ export class ProcessListCloudComponent
/** Emitted when rows are selected/unselected. */
@Output()
rowsSelected: EventEmitter<any[]> = new EventEmitter<any[]>();
rowsSelected = new EventEmitter<any[]>();
/** Emitted before the context menu is displayed for a row. */
@Output()
@@ -294,11 +313,11 @@ export class ProcessListCloudComponent
/** Emitted when an error occurs while loading the list of process instances from the server. */
@Output()
error: EventEmitter<any> = new EventEmitter<any>();
error = new EventEmitter<any>();
/** Emitted when the list of process instances has been loaded successfully from the server. */
@Output()
success: EventEmitter<any> = new EventEmitter<any>();
success = new EventEmitter<any>();
pagination: BehaviorSubject<PaginationModel>;
size: number;
@@ -335,40 +354,39 @@ export class ProcessListCloudComponent
totalItems: 0
});
combineLatest([
this.isColumnSchemaCreated$,
this.fetchProcessesTrigger$
]).pipe(
tap(() => this.isLoading = true),
filter(([isColumnSchemaCreated]) => isColumnSchemaCreated),
switchMap(() => {
if (this.searchApiMethod === 'POST') {
const requestNode = this.createProcessListRequestNode();
this.processListRequestNode = requestNode;
return this.processListCloudService.fetchProcessList(requestNode).pipe(take(1));
} else {
const requestNode = this.createRequestNode();
this.requestNode = requestNode;
return this.processListCloudService.getProcessByRequest(requestNode).pipe(take(1));
combineLatest([this.isColumnSchemaCreated$, this.fetchProcessesTrigger$])
.pipe(
tap(() => (this.isLoading = true)),
filter(([isColumnSchemaCreated]) => isColumnSchemaCreated),
switchMap(() => {
if (this.searchApiMethod === 'POST') {
const requestNode = this.createProcessListRequestNode();
this.processListRequestNode = requestNode;
return this.processListCloudService.fetchProcessList(requestNode).pipe(take(1));
} else {
const requestNode = this.createRequestNode();
this.requestNode = requestNode;
return this.processListCloudService.getProcessByRequest(requestNode).pipe(take(1));
}
}),
takeUntilDestroyed()
)
.subscribe({
next: (processes) => {
this.rows = this.variableMapperService.mapVariablesByColumnTitle(processes.list.entries, this.columns);
this.dataAdapter = new ProcessListDatatableAdapter(this.rows, this.columns);
this.success.emit(processes);
this.isLoading = false;
this.pagination.next(processes.list.pagination);
},
error: (error) => {
console.error(error);
this.error.emit(error);
this.isLoading = false;
}
}),
takeUntilDestroyed()
).subscribe({
next: (processes) => {
this.rows = this.variableMapperService.mapVariablesByColumnTitle(processes.list.entries, this.columns);
this.dataAdapter = new ProcessListDatatableAdapter(this.rows, this.columns);
this.success.emit(processes);
this.isLoading = false;
this.pagination.next(processes.list.pagination);
},
error: (error) => {
console.error(error);
this.error.emit(error);
this.isLoading = false;
}
});
});
}
ngAfterContentInit() {
@@ -429,7 +447,6 @@ export class ProcessListCloudComponent
}
}
private isAnyPropertyChanged(changes: SimpleChanges): boolean {
for (const property in changes) {
if (this.isPropertyChanged(changes, property)) {
@@ -613,7 +630,7 @@ export class ProcessListCloudComponent
}
});
} else {
return new ProcessListRequestSortingModel({orderBy, direction, isFieldProcessVariable: false});
return new ProcessListRequestSortingModel({ orderBy, direction, isFieldProcessVariable: false });
}
}

View File

@@ -1,163 +0,0 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* 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 { ObjectDataColumn } from '@alfresco/adf-core';
import { ProcessListDataColumnCustomData } from '../../../models/data-column-custom-data';
export const fakeProcessCloudList = {
list: {
entries: [
{
entry: {
appName: 'easy-peasy-japanesey',
appVersion: 1,
id: '69eddfa7-d781-11e8-ae24-0a58646001fa',
name: 'starring',
processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa',
processDefinitionKey: 'BasicProcess',
initiator: 'devopsuser',
startDate: 1540381146275,
businessKey: 'MyBusinessKey',
status: 'RUNNING',
lastModified: 1540381146276,
lastModifiedTo: null,
lastModifiedFrom: null,
variables: [{ id: 'variableId', value: 'variableValue'}]
}
},
{
entry: {
appName: 'easy-peasy-japanesey',
appVersion: 1,
id: '8b3f625f-d781-11e8-ae24-0a58646001fa',
name: null,
processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa',
processDefinitionKey: 'BasicProcess',
initiator: 'devopsuser',
startDate: 1540381202174,
businessKey: 'MyBusinessKey',
status: 'RUNNING',
lastModified: 1540381202174,
lastModifiedTo: null,
lastModifiedFrom: null
}
},
{
entry: {
appName: 'easy-peasy-japanesey',
appVersion: 2,
id: '87c12637-d783-11e8-ae24-0a58646001fa',
name: null,
processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa',
processDefinitionKey: 'BasicProcess',
initiator: 'superadminuser',
startDate: 1540382055307,
businessKey: 'MyBusinessKey',
status: 'RUNNING',
lastModified: 1540382055308,
lastModifiedTo: null,
lastModifiedFrom: null
}
}
],
pagination: {
skipCount: 0,
maxItems: 100,
count: 3,
hasMoreItems: false,
totalItems: 3
}
}
};
export const fakeCustomSchema =
[
new ObjectDataColumn<ProcessListDataColumnCustomData>({
key: 'fakeName',
type: 'text',
title: 'ADF_CLOUD_TASK_LIST.PROPERTIES.FAKE',
sortable: true
}),
new ObjectDataColumn<ProcessListDataColumnCustomData>({
key: 'fakeTaskName',
type: 'text',
title: 'ADF_CLOUD_TASK_LIST.PROPERTIES.TASK_FAKE',
sortable: true
})
];
export const processListSchemaMock = {
presets: {
default: [
{
key: 'id',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.ID'
},
{
key: 'name',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.NAME'
},
{
key: 'status',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.STATUS'
},
{
key: 'startDate',
type: 'date',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.START_DATE',
format: 'timeAgo'
},
{
key: 'appName',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.APP_NAME'
},
{
key: 'businessKey',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.BUSINESS_KEY'
},
{
key: 'initiator',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.INITIATOR'
},
{
key: 'lastModified',
type: 'date',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.LAST_MODIFIED'
},
{
key: 'processDefinitionId',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_DEF_ID'
},
{
key: 'processDefinitionKey',
title: 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_DEF_KEY'
}
].map((column: {
key: string;
type: string;
title: string;
sortable: boolean;
format: string;
}) => {
column.sortable = true;
if (!column.type) {
column.type = 'text';
}
return column;
})
}
};

View File

@@ -16,22 +16,18 @@
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ProcessListCloudComponent } from './components/process-list-cloud.component';
import { MaterialModule } from '../../material.module';
import { CoreModule } from '@alfresco/adf-core';
import { LocalPreferenceCloudService } from '../../services/local-preference-cloud.service';
import { PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN } from '../../services/cloud-token.service';
@NgModule({
imports: [CommonModule, MaterialModule, CoreModule],
imports: [ProcessListCloudComponent],
providers: [
{
provide: PROCESS_LISTS_PREFERENCES_SERVICE_TOKEN,
useClass: LocalPreferenceCloudService
}
],
declarations: [ProcessListCloudComponent],
exports: [ProcessListCloudComponent]
})
export class ProcessListCloudModule {}

View File

@@ -59,17 +59,6 @@ export const fakeProcessWithFormInstance: ProcessInstanceCloud = {
processDefinitionName: 'my-process'
};
export const fakeCreatedProcessInstance: ProcessInstanceCloud = {
appName: 'simple-app',
id: 'd0b30377-dc5a-11e8-ae24-0a58646001fa',
name: 'My Process Name',
startDate: null,
initiator: 'usermock',
status: 'CREATED',
processDefinitionId: 'BasicProcess:1:d05062f1-c6fb-11e8-ae24-0a58646001fa',
processDefinitionKey: 'BasicProcess'
};
export const fakeProcessDefinitions: ProcessDefinitionCloud[] = [
new ProcessDefinitionCloud({
appName: 'myApp',

View File

@@ -21,6 +21,7 @@ import { TASK_FILTERS_CLOUD_DIRECTIVES } from './task-filters/task-filters-cloud
import { TASK_FORM_CLOUD_DIRECTIVES } from './task-form/task-form.module';
import { TaskHeaderCloudComponent } from './task-header/components/task-header-cloud.component';
/** @deprecated use standalone component imports instead */
@NgModule({
imports: [TaskListCloudModule, ...TASK_FILTERS_CLOUD_DIRECTIVES, TaskHeaderCloudComponent, ...TASK_FORM_CLOUD_DIRECTIVES],
exports: [TaskListCloudModule, ...TASK_FILTERS_CLOUD_DIRECTIVES, TaskHeaderCloudComponent, ...TASK_FORM_CLOUD_DIRECTIVES]

View File

@@ -40,6 +40,7 @@ import { MatCheckboxModule } from '@angular/material/checkbox';
import { DateRangeFilterComponent } from '../../../../../common/date-range-filter/date-range-filter.component';
import { PeopleCloudComponent } from '../../../../../people/components/people-cloud.component';
import { TaskAssignmentFilterCloudComponent } from '../../task-assignment-filter/task-assignment-filter.component';
import { ApolloModule } from 'apollo-angular';
@Component({
selector: 'adf-cloud-edit-task-filter',
@@ -60,7 +61,8 @@ import { TaskAssignmentFilterCloudComponent } from '../../task-assignment-filter
MatCheckboxModule,
DateRangeFilterComponent,
PeopleCloudComponent,
TaskAssignmentFilterCloudComponent
TaskAssignmentFilterCloudComponent,
ApolloModule
],
templateUrl: './edit-task-filter-cloud.component.html',
styleUrls: ['./edit-task-filter-cloud.component.scss'],

View File

@@ -18,7 +18,17 @@
import { Component, SimpleChange, ViewChild } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { AppConfigService, DataRowEvent, ObjectDataRow, User, DataColumn, ColumnsSelectorComponent } from '@alfresco/adf-core';
import {
AppConfigService,
DataRowEvent,
ObjectDataRow,
User,
DataColumn,
ColumnsSelectorComponent,
DataColumnListComponent,
DataColumnComponent,
CustomEmptyContentTemplateDirective
} from '@alfresco/adf-core';
import { TaskListCloudService } from '../../services/task-list-cloud.service';
import { TaskListCloudComponent } from './task-list-cloud.component';
import { fakeGlobalTasks, fakeCustomSchema, fakeGlobalTask } from '../../mock/fake-task-response.mock';
@@ -35,6 +45,8 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
import { MatProgressSpinnerHarness } from '@angular/material/progress-spinner/testing';
@Component({
standalone: true,
imports: [TaskListCloudComponent, DataColumnListComponent, DataColumnComponent],
template: ` <adf-cloud-task-list #taskListCloud>
<data-columns>
<data-column id="name" key="name" title="ADF_CLOUD_TASK_LIST.PROPERTIES.NAME" class="adf-full-width adf-name-column" [order]="3" />
@@ -60,7 +72,10 @@ class CustomTaskListComponent {
return `${person.firstName} ${person.lastName}`;
}
}
@Component({
standalone: true,
imports: [CustomEmptyContentTemplateDirective, TaskListCloudComponent],
template: `
<adf-cloud-task-list>
<adf-custom-empty-content-template>
@@ -70,7 +85,10 @@ class CustomTaskListComponent {
`
})
class EmptyTemplateComponent {}
@Component({
standalone: true,
imports: [TaskListCloudComponent, DataColumnListComponent, DataColumnComponent],
template: ` <adf-cloud-task-list>
<data-columns>
<data-column [copyContent]="true" key="id" title="ADF_CLOUD_TASK_LIST.PROPERTIES.ID" />
@@ -655,8 +673,7 @@ describe('TaskListCloudComponent: Injecting custom colums for tasklist - CustomT
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ProcessServiceCloudTestingModule],
declarations: [CustomTaskListComponent, CustomCopyContentTaskListComponent]
imports: [ProcessServiceCloudTestingModule, CustomTaskListComponent, CustomCopyContentTaskListComponent]
});
taskListCloudService = TestBed.inject(TASK_LIST_CLOUD_TOKEN);
spyOn(taskListCloudService, 'getTaskByRequest').and.returnValue(of(fakeGlobalTasks));

View File

@@ -17,12 +17,14 @@
import { Component, Inject, Input, ViewEncapsulation } from '@angular/core';
import {
AdfDateFnsAdapter,
AppConfigService,
ColumnsSelectorComponent,
DataTableComponent,
EmptyContentComponent,
LoadingContentTemplateDirective,
MainMenuDataTableTemplateDirective,
MOMENT_DATE_FORMATS,
NoContentTemplateDirective,
UserPreferencesService
} from '@alfresco/adf-core';
@@ -46,6 +48,7 @@ import { ProcessVariableFilterModel } from '../../../../models/process-variable-
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
const PRESET_KEY = 'adf-cloud-task-list.presets';
@@ -63,6 +66,10 @@ const PRESET_KEY = 'adf-cloud-task-list.presets';
LoadingContentTemplateDirective,
DataTableComponent
],
providers: [
{ provide: DateAdapter, useClass: AdfDateFnsAdapter },
{ provide: MAT_DATE_FORMATS, useValue: MOMENT_DATE_FORMATS }
],
templateUrl: './task-list-cloud.component.html',
styleUrls: ['./task-list-cloud.component.scss'],
encapsulation: ViewEncapsulation.None

View File

@@ -24,6 +24,7 @@ import { LocalPreferenceCloudService } from '../../services/local-preference-clo
export const TASK_LIST_CLOUD_DIRECTIVES = [TaskListCloudComponent, ServiceTaskListCloudComponent] as const;
/** @deprecated use standalone components or TASK_LIST_CLOUD_DIRECTIVES instead */
@NgModule({
imports: [...TASK_LIST_CLOUD_DIRECTIVES],
exports: [...TASK_LIST_CLOUD_DIRECTIVES],