Files
alfresco-ng2-components/lib/process-services-cloud/src/lib/form/components/form-cloud.component.ts
Vito Albano 68ab2c67fd [AAE-19177] - Migration to NG15 - this one for real 👯 (#9088)
* Fixed linting

* Fixed storybook with migration to WP5

* Fixed core unit test and excluded instable ones

* Rebased with the latest develop

* Fixed most of unit tests failing

* Fixed prod build

* Fixed linting and js-api tests

* Fixed unit tests

* Fixed last unit tests

* Fixed js-api build

* Attempt to fix the e2e run'

* Fixing e2e part 2

* Fixing styles not migrated by material

* Fixed unit test failing

* E2E - fixing

* Fixing unit after rebase

* Fixing e2e - part III

* Rebase went little bit wrong -II

* Rebase went little bit wrong -III

* Fixing e2e - changing toggles

* Fixed code flow switch setting

* wrong xdescribe

* fixig e2es

* fixig e2es - task and version

* readded missing dep

* Fixed slider search e2es

* rebased and fixed the wrong directive for matList'

* fixed unit test problem and some other e2e

* Fixed search e2es

* Rebased to latest

* Fixed the last e2es?

* reverted broken rebase

* Fixed unit tests after rebase

* Fixed unit tests after rebase

* Honestly i'm going on just for the challenge now'

* Readded method removed

* Fixed pointless e2e

* Fixed unit test

* [AAE-18267] change unit test setup for auth service (#9216)

* [AAE-18267] change unit test setup for auth service

* [AAE-18267] remove exclude

* [AAE-18267] removed CoreTestingModule from imports

* unit test fixes for migration (#9217)

* reenabled excluded test in TagNodeList

* fixed tests for UploadApi in js-api

* Fixed a dependency problem

* remaining unit test fixes for the Angular 15 update (#9218)

* removing excludes from working tests

* test fixes for CategoriesManagementComponent

* [ci:force] reenabling tests / fixes

* fixes in process-services-cloud

* change html element type

* fix selector in StartProcessComponent

* Revert "Fixed a dependency problem"

This reverts commit 319e1830fe.

* Rebased to latest

* Fixed PR after huge rebase -_-

* Fixed lint files and exclude some needing migration

* Fixed package.json

* Fixed dependency to allow greater versions

* Rebased to the latest

* [affected:*][ci:force] Fixing rebase

* [affected:*][ci:force] Fixing rebase

* [affected:*][ci:force] Fixing rebase

* [affected:*][ci:force] Wrong setting page

* [affected:*][ci:force] Upgrading material selector class

* [affected:*][ci:force] Fixed lint

* [affected:*][ci:force] Fixed lint

* [affected:*][ci:force] Fixed e2e with new notation

* [affected:*][ci:force] Fixed e2e with new notation

* [affected:*][ci:force] Fixed e2e with new notation

* [affected:*][ci:force] [AAE-21070] Fix e2e Content: Components - C587084 - fix class selectors

* [affected:*][ci:force] Fixed lint after error on important

* Improvement/AAE-19176-reapply-selector-changes (#9424)

* AAE-19510 remove selector variable

* AAE-19510 poc for card view using variable selectors

* AAE-19176 rename mat selectors file

* AAE-19176 add missing style imports

* AAE-19176 remove remaining mat selectors

* AAE-19176 replaced todo material selectors with variables

* AAE-19176 changes made in meantime

* AAE-19176 conflict fixes

* [AAE-21083] Fix e2e Content: Metadata - C245652 - fix tab active selector

* Fix selector after merging https://github.com/Alfresco/alfresco-ng2-components/pull/9424, .mat-content-actions was replaced by .adf-start-process-content-actions

* Fix lint issue

* [AAE-21083] Fix e2e Content: Metadata - C280560 - fix slide toggle click, in v15 toggle is handled with a button instead of input

* [affected:*][ci:force] Fixed check on expansion panel filter

* [affected:*][ci:force] Fixed check on expansion panel filter

* [affected:*][ci:force] Fixed other e2es

* [affected:*][ci:force] Fixing e2e - the long painful journey

* [affected:*][ci:force] Fixing e2e - the long painful journey - part II

* [AAE-21084] Fix e2e Content: Upload and Versioning - C279992 - fix enable togle selector

* [AAE-21085] Fix e2e Search - revert to previous version, text should be written without pressing eneter to show the autocomplete list items

* [AAE-21085] Fix e2e Search - add content selector that wrap text

* [affected:*][ci:force] Fixing e2e - the lord of E2E

* [AAE-21089] Fix e2e Search - fix checkbox selector

* [affected:*][ci:force] Fixing e2e - the lord of E2E

* [affected:*][ci:force] Fixing e2e - the return of the fail

* [affected:*][ci:force] Fixing e2e - the return of the fail

* [affected:*][ci:force] Fixing e2e - the eternal fail

* [affected:*][ci:force] Remove fit

* [affected:*][ci:force] Fixing e2e - fixing the last ones

* [affected:*][ci:force] attempt to fix mat-selectors importing

* [affected:*][ci:force] Fixing the styles - check

* [affected:*][ci:force] Added pretheme for core as it is mandatory when publishing and rebuilding

* [affected:*][ci:force] - REBASED

* [ACS-7359] - Angular 15 - Edit aspects modal [ACA] (#9488)

* [affected:*][ci:force] - REBASED

* [affected:*][ci:force] - REBASED

* [affected:*][ci:force] - Rebased and added an extra fix for after

* [affected:*][ci:force] - Funny imports

* [ACS-7373] ng15 permissions page fixes

* [ACS-7373] mat-icon-buttons

* [ACS-7452] - Small screen notification banner [ACS-7418] About page (#9507)

* [ACS-7413] Dialog height and spacing issues (#9515)

* [ACS-7446] - Upload progress box issues

* [ACS-7414] - Manage versions dialog

* [ACS-7375] - Share link dialog issues

* Fixed errors on unit and lint

* Re Enabling unit test removed

* Fixing unit test after last rebase + lint

* Fixing unit test after last rebase + lint

* Fixing unit test after last rebase + lint

* [ACS-7419] Fix broken styling of notifications

* [ACS-7419] Fix broken styling of notifications, apply pr remarks

* [ACS-7419] Fix broken styling of notifications, apply pr remarks

* [ACS-7419] Fix broken styling of notifications, apply pr remarks

* Extra parentesys lint

* [ACS-7528] - Notification and user icons are a bit different (#9540)

* [ACS-7532] - Click on chip in search gives redundant icon (#9544)

* [ACS-7530] - Notifications popup looks a bit differently (#9543)

* [ACS-7414] - manage versions dialog (#9545)

* [ACS-7535][ACS-7537][ACS-7536][ACA] Move/Copy dialogs, Share dialog, Aspects dialog (#9553)

* AAE-21697 Fix people form widget style (#9555)

* [affected:*][ci:force] - Rebased

* [affected:*][ci:force] - Fixed problem after rebase

* [ACS-7519] - Login page (#9565)

* [ACS-7331] - View details sidebar (#9455)

* [ACS-7542] - Upload new version dialog (#9572)

* [ACS-7542] - Upload new version dialog

* [ACS-7542] - Upload new version dialog

* [ACS-7575] create library dialog fixes (#9574)

* [ACS-7534] create/edit folder dialog fixes (#9575)

* Rebased ADF Migration PR

* Rebased ADF Migration PR

* Sync lock

* [ACS-7681] Bell icon not aligned [ACS-7571] Comments [ACS-7563] Add permission dialog (#9594)

* [ACS-7554] Fix tags in column display (#9597)

* Fixed unit test

* AAE-21256 Fix form widget styles (#9599)

* [ACS-7555] column filters (#9576)

* Changed ng version before material migration

* migration for material'

* Upgrading NX and start fixing styles

* Make all the part build

* Fixed core unit test and excluded instable ones

* Fixed most of unit tests failing

* Fixed unit tests

* Fixed last unit tests

* fixed unit test problem and some other e2e

* Fixed unit tests after rebase

* [AAE-18267] change unit test setup for auth service (#9216)

* [AAE-18267] change unit test setup for auth service

* [AAE-18267] remove exclude

* [AAE-18267] removed CoreTestingModule from imports

* remaining unit test fixes for the Angular 15 update (#9218)

* removing excludes from working tests

* test fixes for CategoriesManagementComponent

* [ci:force] reenabling tests / fixes

* fixes in process-services-cloud

* change html element type

* fix selector in StartProcessComponent

* Fixing unit test after last rebase + lint

* ACS-7555 Fixed styles for node type filters

* ACS-7555 Removed redundant padding

* ACS-7555 Outlined input for text filter

* ACS-7555 Resolved conflicts

---------

Co-authored-by: Vito Albano <vito.albano@hyland.com>
Co-authored-by: Wojciech Duda <69160975+wojd0@users.noreply.github.com>

* AAE-21393 Fix amount form widget style (#9601)

* AAE-21392 Fix dropdown form widget style (#9605)

* [ACS-7582] Upload dialog button display fix (#9603)

* [ACS-7531] - Search page (#9606)

* rebased to last develop

* Fixed SonarCloud complaints

* Fixed SonarCloud complaints

* Fixing some sonarcloud comments

* [ACS-7572] link rules dialog fixes (#9607)

* AAE-21703 Fix group widget style (#9612)

* AAE-21703 Fix group form widget style

* AAE-21703 Improve tests

* [ACS-7533] - Advanced search chips dropdowns (#9618)

* [ACS-7560] undo deletion notification (#9632)

* ACS-7560 Fixed margin around snackbar and size of x icon

* ACS-7560 Fixed styles for info snackbar

* Rebased to the latest develop

* Rebased to the latest

* Skipped failing unit tests

* Updated today date selector

* rebased

* Fixed process unit test fail

* fix folder-edit license headers

* fix FolderEditDirective unit tests

* AAE-21937 Fix context menu list component (#9658)

* Fixed broken unit test after rebase

* ACS-7561 - permissions page (#9675)

* Trying to fix the long failing e2ea

* Missed import

* Fixed changed unit test

* Fixed property e2e

* Updated calendar selector

* [ACS-7768] unify inputs and selects across the app (#9687)

* Changed ng version before material migration

* migration for material'

* Fixed most of unit tests failing

* [affected:*][ci:force] Fixing rebase

* [affected:*][ci:force] attempt to fix mat-selectors importing

* [affected:*][ci:force] Fixing the styles - check

* AAE-21392 Fix dropdown form widget style (#9605)

* ACS-7768 Applied new styles for inputs

* ACS-7768 Align icon

* ACS-7768 Input colors based on input state

* ACS-7768 Corrected spaces

* ACS-7768 Styles for selectboxes

* ACS-7768 Fixed label jumping on hovering

* ACS-7768 Style inputs for add permission panel, user role column and comments, styles for inputs without label

* ACS-7768 Style inputs in search filters

* ACS-7768 Set appearance for inputs globally to outline

* ACS-7768 Style inputs for share dialog and login page

* ACS-7768 Style inputs in properties panel

* ACS-7768 Fixed white background when disabled field

* ACS-7768 Moved setting outline appearance for inputs to ACA, fix issue for inputs in permission container

* Revert "[affected:*][ci:force] Fixing the styles - check"

This reverts commit 80d971f7ab.

* Revert "[affected:*][ci:force] attempt to fix mat-selectors importing"

This reverts commit 821d9e1864.

* Revert "[affected:*][ci:force] Fixing rebase"

This reverts commit 378c6c2000.

* Revert "Fixed most of unit tests failing"

This reverts commit 44948e0a28.

* ACS-7768 Reverted unwanted changes

---------

Co-authored-by: Vito Albano <vito.albano@hyland.com>
Co-authored-by: Diogo Bastos <50139916+DiogoABastos@users.noreply.github.com>

* [ACS-7768] unify inputs and selects across the app - revert (#9699)

* Revert "[ACS-7768] unify inputs and selects across the app (#9687)"

This reverts commit 7cfb5ea64a.

* ACS-7768 Little correction

* [ACS-7998] - Add permissions input (#9704)

* [ACS-8004] Fix inputs for move folder (#9707)

* [ACS-7999] Fix inputs for edit and create folder (#9713)

* ACS-7999 Fix inputs for edit and create folder

* ACS-7999 Fix jumping dialog when focus field

* [ACS-7982] ACC - fix categories tree (#9715)

* Fixed after rebase

* Fixed package-lock

* Fixed after rebase

* Fixed unit test for process

* AAE-22783 Fix form elements label style (#9725)

* [ACS-8021] Inputs for comments (#9722)

* [ACS-8008] - Inputs for properties panel "General info" (#9744)

* [ACS-8052] Inputs for general info for libraries (#9745)

* [ACS-7983] Fixed security controls dialog (#9747)

* [ACS-8026] Fixed task form rendering (#9742)

* [ACS-8026] Fixed Task form rendering

* [ACS-8026] Fixed task form rendering

* [ACS-8042] Fixed styles for inputs in library creation (#9751)

* Added missing import for uppercase pipe (#9748)

* Recreated package-lock

* Fixed package and e2e with tabs that now are capital letters?

* Fixed package json

* Removed wrong version on core package

* Ehi Js-Api should be 7.8 NOT 7.9

* These dependencies will kill me

* [ACS-7981] UI fixes for create categories dialog (#9754)

* [ACS-7981] Fixed UI for create categories dialog

* [ACS-7981] Adding mat selectors for create categories dialog

* [ACS-7981] Create category dialog no longer allows ability to add existing categories

* [ACS-7974] Adding material selectors for assign security marks dialog (#9755)

* [ACS-7974] Fixed UI for assign security controls to user dialog

* [ACS-7974] Removing unneeded mat selector

* [ACS-8069] Updated error-content.component.html to be aligned with the new mat typography classes in angular material v15 (#9762)

* Added missing mat selector for mat-list-item-disabled (#9763)

* Fixed process unit test after huge rebase

* [ACS-8066] Style inputs for link rule dialog (#9773)

* Insight material module has been removed

* [ACS-7973] [ACC] header layout (#9782)

* [ACS-8096] Print button in the viewer does not open the print window (#9776) (#9778)

* [ACS-8066] Fixed unit tests (#9783)

* [ACS-8092] [ACA] testing angular 15 notifications bell is much smaller and is further from the profile page 2 (#9786)

* AAE 22837 Move confirm to core (#9750)

* confirm dialog is used in many places and should be part of the core

* fix

* Update confirm.dialog.spec.ts

* Update public-api.ts

* Fixed imports for confirm dialog unit tests

* Fixed linting for packages

* Removed -mdc as it's wrong for mat calendar

* [ACS-8098] [ACA] Testing Angular 15 - Move Popup placeholder missing (#9796)

* [ACS-7944] [ADW] Start process page (#9802)

* [ACS-8157] Used mat chip set instead of mat chip listbox for dynamic chip list to hide tick icon for chips (#9803)

* Fixed issue on focus mat calendar

* [ACS-7980] fix style (#9798)

* [ACS-7979] Fixed UI for create tags dialog (#9793)

* [ACS-7979] Fixed UI for create tags dialog. Minor UI fixes of create categories dialog as well

* [ACS-7979] Fixed unit tests

* [ACS-7979] Replaced dependency of CoreModule from tag.module.ts with TranslateModule and DynamicChipListModule

* [ACS-8158] Fixed spacing of tags in ACA (#9808)

* [ACS-8158] Fixed spacing of tags in ACA

* [ACS-8158] Fixed unit tests

* AAE-22965 fix datepicker focused element selector (#9814)

* [ACS-8212] Fixed alignment issue of filters button in sidenav (#9828)

* [ACS-8191] Added missing mat selectors for ACA. Updated mat selector name (#9809)

* [ACS-8191] Updated mat selector names

* [ACS-8191] Added missing mat selectors for ACA. Updated mat-selector names

* [ACS-8196] fix style for pagination (#9810)

* Removing implicitFlow in favor of codeFlow

* [ACS-8230] Fixed UI for snackbars with long text content and action buttons (#9830)

* [ACS-8231] [ADW] Processes button styling on hover- edit summary (#9833)

[ADW] Processes button styling on hover

* Revert "Removing implicitFlow in favor of codeFlow"

This reverts commit 58951a77b8.

* Fixed unit test after rebase

* Fixing unit test

* Disabled failing unit from content

* AAE-23287 migrate to storybook 8 (#9867)

* Fixed core unit test and excluded instable ones

* AAE-23287 migrate to storybook 8

---------

Co-authored-by: Vito Albano <vito.albano@hyland.com>

* Fixed unit and lint

* Fixing unit test and lint issues after merging with storybook latest

* Storybook still not working though

* Fixed missing locator for content e2e

* fix storybook exceeding timeout

* Fixed wrong package version

* AAE-23478 replace nav-list with action-list (#9875)

* [ACS-8272] [ADW] Testing Angular 15 - Misplaced buttons Cancel and Start process (#9869)

* [ACS-8273] [ADW] Testing Angular 15 - Process' tab names are uppercased (#9870)

* [ACS-8274] angular 15 description field in info drawer is truncated and scrollable (#9878)

* [ACS-8275] - [ACA] Testing Angular 15 - Tags are not displayed correctly (#9872)

* Fixing e2e tab label

* AAE-22858 Fix date button style (#9892)

* AAE-23556 Fix search text input component styles (#9895)

* Fixing unit test an builds

* Fixing style

* [ACS-8260] add user dialog misplaced search icon and space issue (#9897)

* [ACS-8275] [ACA] Angular 15 tags are not displayed correctly (#9896)

* [ACS-8322] Testing Angular 15 - Info Drawer - General info - Missing … (#9901)

* [ACS-8322] Testing Angular 15 - Info Drawer - General info - Missing arrow in Content type selector

* [ACS-8322] Testing Angular 15 - Info Drawer - General info - Missing arrow in Content type selector

* [AAE-23622] fixed buttons and chips (#9913)

* Aae 23572 recreate js api lib into a proper nx workspace lib bis (#9917)

* back to mocha, working in future node versions

* update package-lock

* change bundle to build

* update node to 18.20.3 [ci:force]

* fix e2es [ci:force]

* bring bundle back to fix e2e [ci:force]

* patch in legacy builds

* Updated package-lock

* Updated executor to new @nx

* Revert "Updated executor to new @nx"

This reverts commit a520ba3595.

* Improved ts config reverted changes on @nrwl

---------

Co-authored-by: Wojciech Duda <69160975+wojd0@users.noreply.github.com>

* Fixing target name for publishing js-api as it's not happening anymore

* fixed js-api publish command

* JS-api wasn't building correctly on publish

* Fixed naming for tests tab

* Fixed tabs name missed

* AAE-23704 Fixed outcome buttons text alignment (#9933)

* Thanks tooltip change

* Removing FIT :O

* Fixing build broken

* [ACS-8275] Testing Angular 15 - Tags are not displayed correctly (#9940)

* [ACS-8253] viewer file name change position on navigation (#9900)

* AAE-23783 Fixed feature flags dialog styles (#9945)

* Added styles include path to feature flags lib

* Fixed js-api version

---------

Co-authored-by: Wojciech Duda <69160975+wojd0@users.noreply.github.com>
Co-authored-by: Amedeo Lepore <amedeo.lepore85@gmail.com>
Co-authored-by: Amedeo Lepore <amedeo.lepore@hyland.com>
Co-authored-by: jacekpluta <73617938+jacekpluta@users.noreply.github.com>
Co-authored-by: Mykyta Maliarchuk <maliarchuk99@gmail.com>
Co-authored-by: tomson <tomasz.nastaly@hyland.com>
Co-authored-by: DominikIwanek <dominik.iwanek@hyland.com>
Co-authored-by: Jacek Pluta <jacek.pluta@hyland.com>
Co-authored-by: dominikiwanekhyland <141320833+dominikiwanekhyland@users.noreply.github.com>
Co-authored-by: Diogo Bastos <50139916+DiogoABastos@users.noreply.github.com>
Co-authored-by: Mykyta Maliarchuk <84377976+nikita-web-ua@users.noreply.github.com>
Co-authored-by: AleksanderSklorz <115619721+AleksanderSklorz@users.noreply.github.com>
Co-authored-by: Ehsan Rezaei <ehsan.rezaei@hyland.com>
Co-authored-by: swapnil-verma-gl <92505353+swapnil-verma-gl@users.noreply.github.com>
Co-authored-by: Eugenio Romano <eromano@users.noreply.github.com>
Co-authored-by: tamaragruszka <156320606+tamaragruszka@users.noreply.github.com>
Co-authored-by: tomasz hanaj <12088991+tomaszhanaj@users.noreply.github.com>
2024-07-19 10:27:15 +02:00

473 lines
17 KiB
TypeScript

/*!
* @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 { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, OnDestroy, HostListener, OnInit } from '@angular/core';
import { Observable, of, forkJoin, Subject, Subscription } from 'rxjs';
import { switchMap, takeUntil, map, filter } from 'rxjs/operators';
import {
FormBaseComponent,
FormFieldModel,
FormOutcomeEvent,
FormOutcomeModel,
WidgetVisibilityService,
FormService,
FORM_FIELD_VALIDATORS,
FormFieldValidator,
FormValues,
FormModel,
ContentLinkModel,
UploadWidgetContentLinkModel,
FormEvent,
ConfirmDialogComponent
} from '@alfresco/adf-core';
import { FormCloudService } from '../services/form-cloud.service';
import { TaskVariableCloud } from '../models/task-variable-cloud.model';
import { TaskDetailsCloudModel } from '../../task/start-task/models/task-details-cloud.model';
import { MatDialog } from '@angular/material/dialog';
import { v4 as uuidGeneration } from 'uuid';
import { FormCloudDisplayMode, FormCloudDisplayModeConfiguration } from '../../services/form-fields.interfaces';
import { FormCloudSpinnerService } from '../services/spinner/form-cloud-spinner.service';
import { DisplayModeService } from '../services/display-mode.service';
@Component({
selector: 'adf-cloud-form',
templateUrl: './form-cloud.component.html',
styleUrls: ['./form-cloud.component.scss']
})
export class FormCloudComponent extends FormBaseComponent implements OnChanges, OnInit, OnDestroy {
/** App name to fetch corresponding form and values. */
@Input()
appName: string = '';
/** The application version to use when fetching data */
@Input()
appVersion?: number;
/** Task id to fetch corresponding form and values. */
@Input()
formId: string;
/** ProcessInstanceId id to fetch corresponding form and values. */
@Input()
processInstanceId: string;
/** Underlying form model instance. */
@Input()
form: FormModel;
/** Task id to fetch corresponding form and values. */
@Input()
taskId: string;
/** Custom form values map to be used with the rendered form. */
@Input()
data: TaskVariableCloud[];
/** FormFieldValidator allow to override the form field validators provided. */
@Input()
fieldValidators: FormFieldValidator[] = [...FORM_FIELD_VALIDATORS];
/**
* The available display configurations for the form
*/
@Input()
displayModeConfigurations: FormCloudDisplayModeConfiguration[];
/** Emitted when the form is submitted with the `Save` or custom outcomes. */
@Output()
formSaved = new EventEmitter<FormModel>();
/** Emitted when the form is submitted with the `Complete` outcome. */
@Output()
formCompleted = new EventEmitter<FormModel>();
/** Emitted when the form is loaded or reloaded. */
@Output()
formLoaded = new EventEmitter<FormModel>();
/** Emitted when form values are refreshed due to a data property change. */
@Output()
formDataRefreshed = new EventEmitter<FormModel>();
/** Emitted when form content is clicked. */
@Output()
formContentClicked = new EventEmitter<ContentLinkModel>();
/** Emitted when a display mode configuration is turned on. */
@Output()
displayModeOn = new EventEmitter<FormCloudDisplayModeConfiguration>();
/** Emitted when a display mode configuration is turned off. */
@Output()
displayModeOff = new EventEmitter<FormCloudDisplayModeConfiguration>();
protected subscriptions: Subscription[] = [];
nodeId: string;
formCloudRepresentationJSON: any;
protected onDestroy$ = new Subject<boolean>();
readonly id: string;
displayMode: FormCloudDisplayMode;
constructor(
protected formCloudService: FormCloudService,
protected formService: FormService,
private dialog: MatDialog,
protected visibilityService: WidgetVisibilityService,
private readonly displayModeService: DisplayModeService,
private spinnerService: FormCloudSpinnerService
) {
super();
this.spinnerService.initSpinnerHandling(this.onDestroy$);
this.id = uuidGeneration();
this.formService.formContentClicked.pipe(takeUntil(this.onDestroy$)).subscribe((content) => {
if (content instanceof UploadWidgetContentLinkModel) {
this.form.setNodeIdValueForViewersLinkedToUploadWidget(content);
this.onFormDataRefreshed(this.form);
this.formService.formDataRefreshed.next(new FormEvent(this.form));
} else {
this.formContentClicked.emit(content);
}
});
this.formService.updateFormValuesRequested.pipe(takeUntil(this.onDestroy$)).subscribe((valuesToSetIfNotPresent) => {
this.form.addValuesNotPresent(valuesToSetIfNotPresent);
this.onFormDataRefreshed(this.form);
});
this.formService.formFieldValueChanged.pipe(takeUntil(this.onDestroy$)).subscribe(() => {
if (this.disableSaveButton) {
this.disableSaveButton = false;
}
});
}
@HostListener('keydown', ['$event'])
onKeyDown(event: KeyboardEvent): void {
event.stopPropagation();
}
ngOnChanges(changes: SimpleChanges) {
const appName = changes['appName'];
if (appName?.currentValue) {
if (this.taskId) {
this.getFormByTaskId(appName.currentValue, this.taskId, this.appVersion);
} else if (this.formId) {
this.getFormById(appName.currentValue, this.formId, this.appVersion);
}
return;
}
const formId = changes['formId'];
if (formId?.currentValue && this.appName) {
this.getFormById(this.appName, formId.currentValue, this.appVersion);
return;
}
const taskId = changes['taskId'];
if (taskId?.currentValue && this.appName) {
this.getFormByTaskId(this.appName, taskId.currentValue, this.appVersion);
return;
}
const data = changes['data'];
if (data?.currentValue) {
this.refreshFormData();
return;
}
const formRepresentation = changes['form'];
if (formRepresentation?.currentValue) {
this.form = formRepresentation.currentValue;
this.onFormLoaded(this.form);
return;
}
}
ngOnInit(): void {
DisplayModeService.displayMode$
.pipe(
filter((change) => change.id === this.id),
takeUntil(this.onDestroy$)
)
.subscribe((displayModeChange) => {
const oldDisplayMode = this.displayMode;
this.displayMode = displayModeChange.displayMode;
const oldDisplayModeConfiguration = this.displayModeService.findConfiguration(oldDisplayMode, this.displayModeConfigurations);
const newDisplayModeConfiguration = this.displayModeService.findConfiguration(
displayModeChange.displayMode,
this.displayModeConfigurations
);
if (oldDisplayModeConfiguration?.displayMode !== newDisplayModeConfiguration?.displayMode) {
if (oldDisplayModeConfiguration) {
this.displayModeOff.emit(oldDisplayModeConfiguration);
}
if (newDisplayModeConfiguration) {
this.displayModeOn.emit(newDisplayModeConfiguration);
}
}
});
}
/**
* Invoked when user clicks form refresh button.
*/
onRefreshClicked() {
this.loadForm();
}
loadForm() {
if (this.appName && this.taskId) {
this.getFormByTaskId(this.appName, this.taskId, this.appVersion);
} else if (this.appName && this.formId) {
this.getFormById(this.appName, this.formId, this.appVersion);
}
}
findProcessVariablesByTaskId(appName: string, taskId: string): Observable<TaskVariableCloud[]> {
return this.formCloudService.getTask(appName, taskId).pipe(
switchMap((task) => {
if (this.isAProcessTask(task)) {
return this.formCloudService.getTaskVariables(appName, taskId);
} else {
return of([]);
}
})
);
}
isAProcessTask(taskRepresentation: TaskDetailsCloudModel): boolean {
return taskRepresentation.processDefinitionId && taskRepresentation.processDefinitionDeploymentId !== 'null';
}
getFormByTaskId(appName: string, taskId: string, version?: number): Promise<FormModel> {
return new Promise<FormModel>((resolve) => {
forkJoin(this.formCloudService.getTaskForm(appName, taskId, version), this.formCloudService.getTaskVariables(appName, taskId))
.pipe(takeUntil(this.onDestroy$))
.subscribe(
(data) => {
this.formCloudRepresentationJSON = data[0];
this.formCloudRepresentationJSON.processVariables = data[1];
this.data = data[1];
const parsedForm = this.parseForm(this.formCloudRepresentationJSON);
this.visibilityService.refreshVisibility(parsedForm, this.data);
parsedForm.validateForm();
this.form = parsedForm;
this.form.nodeId = '-my-';
this.onFormLoaded(this.form);
resolve(this.form);
},
(error) => {
this.handleError(error);
resolve(null);
}
);
});
}
getFormById(appName: string, formId: string, appVersion?: number) {
this.formCloudService
.getForm(appName, formId, appVersion)
.pipe(
map((form) => {
const flattenForm = { ...form.formRepresentation, ...form.formRepresentation.formDefinition };
delete flattenForm.formDefinition;
return flattenForm;
}),
takeUntil(this.onDestroy$)
)
.subscribe(
(form) => {
this.formCloudRepresentationJSON = form;
this.formCloudRepresentationJSON.processVariables = this.data || [];
const parsedForm = this.parseForm(form);
this.visibilityService.refreshVisibility(parsedForm);
parsedForm?.validateForm();
this.form = parsedForm;
this.form.nodeId = '-my-';
this.onFormLoaded(this.form);
},
(error) => {
this.handleError(error);
}
);
}
saveTaskForm() {
if (this.form && this.appName && this.taskId) {
this.formCloudService
.saveTaskForm(this.appName, this.taskId, this.processInstanceId, `${this.form.id}`, this.form.values)
.pipe(takeUntil(this.onDestroy$))
.subscribe(
() => {
this.onTaskSaved(this.form);
},
(error) => this.onTaskSavedError(error)
);
this.displayModeService.onSaveTask(this.id, this.displayMode, this.displayModeConfigurations);
}
}
completeTaskForm(outcome?: string) {
if (this.form?.confirmMessage?.show === true) {
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
data: {
message: this.form.confirmMessage.message
},
minWidth: '450px'
});
dialogRef.afterClosed().subscribe((result) => {
if (result === true) {
this.completeForm(outcome);
}
});
} else {
this.completeForm(outcome);
}
this.displayModeService.onCompleteTask(this.id, this.displayMode, this.displayModeConfigurations);
}
private completeForm(outcome?: string) {
if (this.form && this.appName && this.taskId) {
this.formCloudService
.completeTaskForm(this.appName, this.taskId, this.processInstanceId, `${this.form.id}`, this.form.values, outcome, this.appVersion)
.pipe(takeUntil(this.onDestroy$))
.subscribe(
() => {
this.onTaskCompleted(this.form);
},
(error) => this.onTaskCompletedError(error)
);
}
}
parseForm(formCloudRepresentationJSON?: any): FormModel | null {
if (formCloudRepresentationJSON) {
const formValues: FormValues = {};
(this.data || []).forEach((variable) => {
formValues[variable.name] = variable.value;
});
const form = new FormModel(formCloudRepresentationJSON, formValues, this.readOnly, this.formService);
if (!form) {
form.outcomes = this.getFormDefinitionOutcomes(form);
}
if (this.fieldValidators && this.fieldValidators.length > 0) {
form.fieldValidators = this.fieldValidators;
}
return form;
}
return null;
}
/**
* Get custom set of outcomes for a Form Definition.
*
* @param form Form definition model.
* @returns list of form outcomes
*/
getFormDefinitionOutcomes(form: FormModel): FormOutcomeModel[] {
return [new FormOutcomeModel(form, { id: '$save', name: FormOutcomeModel.SAVE_ACTION, isSystem: true })];
}
checkVisibility(field: FormFieldModel) {
if (field?.form) {
this.visibilityService.refreshVisibility(field.form);
}
}
private refreshFormData() {
this.form = this.parseForm(this.formCloudRepresentationJSON);
if (this.form) {
this.onFormLoaded(this.form);
this.onFormDataRefreshed(this.form);
}
}
protected onFormLoaded(form: FormModel) {
if (form) {
this.displayModeConfigurations = this.displayModeService.getDisplayModeConfigurations(this.displayModeConfigurations);
this.displayMode = this.displayModeService.switchToDisplayMode(
this.id,
this.form.json.displayMode,
this.displayMode,
this.displayModeConfigurations
);
this.displayModeOn.emit(this.displayModeService.findConfiguration(this.displayMode, this.displayModeConfigurations));
}
this.formLoaded.emit(form);
}
protected onFormDataRefreshed(form: FormModel) {
this.formDataRefreshed.emit(form);
}
protected onTaskSaved(form: FormModel) {
this.formSaved.emit(form);
}
protected onTaskSavedError(error: any) {
this.handleError(error);
}
protected onTaskCompleted(form: FormModel) {
this.formCompleted.emit(form);
}
protected onTaskCompletedError(error: any) {
this.handleError(error);
}
protected onExecuteOutcome(outcome: FormOutcomeModel): boolean {
const args = new FormOutcomeEvent(outcome);
if (args.defaultPrevented) {
return false;
}
this.executeOutcome.emit(args);
return !args.defaultPrevented;
}
protected storeFormAsMetadata() {}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
switchToDisplayMode(newDisplayMode?: string) {
this.displayModeService.switchToDisplayMode(this.id, FormCloudDisplayMode[newDisplayMode], this.displayMode, this.displayModeConfigurations);
}
findDisplayConfiguration(displayMode?: string): FormCloudDisplayModeConfiguration {
return this.displayModeService.findConfiguration(FormCloudDisplayMode[displayMode], this.displayModeConfigurations);
}
}