diff --git a/lib/core/src/lib/form/components/form-renderer.component.scss b/lib/core/src/lib/form/components/form-renderer.component.scss index 46f0eaad46..956c09af4d 100644 --- a/lib/core/src/lib/form/components/form-renderer.component.scss +++ b/lib/core/src/lib/form/components/form-renderer.component.scss @@ -20,6 +20,12 @@ .mat-mdc-form-field-infix { width: auto; } + + .adf-form-field-input:not(.adf-inplace-input-mat-form-field, .adf-people-cloud, .adf-cloud-group) { + #{ms.$mat-form-field-subscript-wrapper} { + height: 40px; + } + } } .alfresco-tabs-widget { @@ -40,7 +46,7 @@ .adf-container-widget { .adf-form-field-input:not(.adf-inplace-input-mat-form-field, .adf-people-cloud, .adf-cloud-group) { - margin-bottom: 35px; + margin-bottom: 0; } .adf-grid-list { @@ -265,7 +271,7 @@ } &-error-messages-container { - min-height: 35px; + height: 40px; } &-error-messages-container-visible { diff --git a/lib/core/src/lib/form/components/form-section/form-section.component.scss b/lib/core/src/lib/form/components/form-section/form-section.component.scss index 6092f1882e..ffe36b363a 100644 --- a/lib/core/src/lib/form/components/form-section/form-section.component.scss +++ b/lib/core/src/lib/form/components/form-section/form-section.component.scss @@ -5,7 +5,7 @@ &-single-column { display: flex; flex-wrap: inherit; - align-items: center; + align-items: flex-start; gap: 1%; @include flex.layout-bp(lt-md) { diff --git a/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.html b/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.html index b9c020a0c8..5eee1f9435 100644 --- a/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.html +++ b/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.html @@ -16,10 +16,9 @@ *
-
diff --git a/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.ts b/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.ts index 5c9eda7791..d1a340e48c 100644 --- a/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.ts +++ b/lib/core/src/lib/form/components/widgets/checkbox/checkbox.widget.ts @@ -17,7 +17,7 @@ /* eslint-disable @angular-eslint/component-selector */ -import { NgClass, NgIf } from '@angular/common'; +import { NgClass } from '@angular/common'; import { Component, ViewEncapsulation } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -47,7 +47,7 @@ import { WidgetComponent } from '../widget.component'; '(invalid)': 'event($event)', '(select)': 'event($event)' }, - imports: [NgClass, MatCheckboxModule, FormsModule, TranslatePipe, ErrorWidgetComponent, NgIf], + imports: [NgClass, MatCheckboxModule, FormsModule, TranslatePipe, ErrorWidgetComponent], encapsulation: ViewEncapsulation.None }) export class CheckboxWidgetComponent extends WidgetComponent {} diff --git a/lib/core/src/lib/form/components/widgets/error/error.component.scss b/lib/core/src/lib/form/components/widgets/error/error.component.scss index 026768b39d..2b57daf87a 100644 --- a/lib/core/src/lib/form/components/widgets/error/error.component.scss +++ b/lib/core/src/lib/form/components/widgets/error/error.component.scss @@ -10,12 +10,16 @@ } } +error-widget { + display: block; +} + .adf-error { display: flex; align-items: center; &-widget-container { - height: auto; + height: 40px; } &-animate { diff --git a/lib/core/src/lib/form/components/widgets/hyperlink/hyperlink.widget.scss b/lib/core/src/lib/form/components/widgets/hyperlink/hyperlink.widget.scss index a5f2b96287..91025303f0 100644 --- a/lib/core/src/lib/form/components/widgets/hyperlink/hyperlink.widget.scss +++ b/lib/core/src/lib/form/components/widgets/hyperlink/hyperlink.widget.scss @@ -1,6 +1,7 @@ .adf-hyperlink-widget { padding: 0.4375em 0; border-top: 0.8438em solid transparent; + margin-bottom: 20px; a { color: var(--mat-sys-primary); diff --git a/lib/core/src/lib/form/components/widgets/multiline-text/multiline-text.widget.scss b/lib/core/src/lib/form/components/widgets/multiline-text/multiline-text.widget.scss index 435d152e6e..242d172457 100644 --- a/lib/core/src/lib/form/components/widgets/multiline-text/multiline-text.widget.scss +++ b/lib/core/src/lib/form/components/widgets/multiline-text/multiline-text.widget.scss @@ -43,6 +43,6 @@ @include mixins.adf-error-icon; } -.adf-container-widget .adf-multiline-text-widget .adf-form-field-input.adf-has-counter { - margin-bottom: 44px; +.adf-container-widget .adf-multiline-text-widget mat-form-field.adf-form-field-input.adf-has-counter { + margin-bottom: 20px; } diff --git a/lib/core/src/lib/form/components/widgets/repeat/repeat.widget.scss b/lib/core/src/lib/form/components/widgets/repeat/repeat.widget.scss index 33e09becd6..843afbe1cd 100644 --- a/lib/core/src/lib/form/components/widgets/repeat/repeat.widget.scss +++ b/lib/core/src/lib/form/components/widgets/repeat/repeat.widget.scss @@ -9,7 +9,8 @@ } &-row-action { - margin-left: 10px; + margin-inline-start: 10px; + margin-block-end: 35px; } &-row-limit { diff --git a/lib/core/src/lib/styles/_mat-selectors.scss b/lib/core/src/lib/styles/_mat-selectors.scss index 31fa2b1208..dba941cafa 100644 --- a/lib/core/src/lib/styles/_mat-selectors.scss +++ b/lib/core/src/lib/styles/_mat-selectors.scss @@ -17,6 +17,7 @@ $mat-button: '.mat-mdc-button'; $mat-button-label: '.mdc-button__label'; $mat-form-field: '.mat-mdc-form-field'; $mat-form-field-wrapper: '.mat-mdc-text-field-wrapper'; +$mat-form-field-subscript-wrapper: '.mat-mdc-form-field-subscript-wrapper'; $mat-line-ripple: '.mdc-line-ripple'; $mat-form-field-prefix: '.mat-mdc-form-field-text-prefix'; $mat-form-field-suffix: '.mat-mdc-form-field-text-suffix'; diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.html b/lib/process-services-cloud/src/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.html index 0fea08b342..cb90cebccc 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.html +++ b/lib/process-services-cloud/src/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.html @@ -1,21 +1,26 @@
-
-
@@ -34,12 +39,15 @@ (contentModelFileHandler)="contentModelFormFileHandler($event)" (removeAttachFile)="onRemoveAttachFile($event)" /> -
- {{ 'FORM.FIELD.NO_FILE_ATTACHED' | translate }} -
- + @if (!hasFile && field.readOnly) { +
+ {{ 'FORM.FIELD.NO_FILE_ATTACHED' | translate }} +
+ }
- - + diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.html b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.html index 4bc5484ca1..a973a54176 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.html +++ b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.html @@ -1,31 +1,23 @@
- +
- + @if (!previewState) { - + - - - - + [required]="dataTableLoadFailed ? ('FORM.FIELD.DATA_TABLE_LOAD_FAILED' | translate) : ''" + /> + } @else {
-
+ }
diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.scss b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.scss index 532599f8e3..ed9398c207 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.scss +++ b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.scss @@ -1,4 +1,5 @@ .adf-data-table-widget-failed-message { + display: block; margin: 10px; } diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.spec.ts b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.spec.ts index 2ec50a2d85..f770440650 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.spec.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.spec.ts @@ -283,7 +283,8 @@ describe('DataTableWidgetComponent', () => { const failedErrorMsgElement = fixture.debugElement.query(By.css('.adf-data-table-widget-failed-message')); assertData(mockCountryColumns, []); - expect(failedErrorMsgElement).toBeNull(); + expect(failedErrorMsgElement).toBeTruthy(); + expect(failedErrorMsgElement.nativeElement.textContent.trim()).toBe(''); }); it('path points to single object with appropriate schema definition', () => { @@ -294,7 +295,8 @@ describe('DataTableWidgetComponent', () => { const failedErrorMsgElement = fixture.debugElement.query(By.css('.adf-data-table-widget-failed-message')); assertData(mockCountryColumns, [mockEuropeCountriesRows[1]]); - expect(failedErrorMsgElement).toBeNull(); + expect(failedErrorMsgElement).toBeTruthy(); + expect(failedErrorMsgElement.nativeElement.textContent.trim()).toBe(''); }); }); diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.ts b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.ts index 15034eed76..a49c9ade68 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/data-table/data-table.widget.ts @@ -27,7 +27,6 @@ import { NoContentTemplateDirective, EmptyContentComponent } from '@alfresco/adf-core'; -import { NgIf } from '@angular/common'; import { TranslatePipe } from '@ngx-translate/core'; import { FormCloudService } from '../../../services/form-cloud.service'; import { TaskVariableCloud } from '../../../models/task-variable-cloud.model'; @@ -36,7 +35,7 @@ import { DataTablePathParserHelper } from './helpers/data-table-path-parser.help @Component({ standalone: true, - imports: [NgIf, TranslatePipe, FormBaseModule, DataTableComponent, NoContentTemplateDirective, EmptyContentComponent], + imports: [TranslatePipe, FormBaseModule, DataTableComponent, NoContentTemplateDirective, EmptyContentComponent], selector: 'data-table', templateUrl: './data-table.widget.html', styleUrls: ['./data-table.widget.scss'], diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.html b/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.html index 83b2abe75f..e3ed0116de 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.html +++ b/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.html @@ -4,11 +4,13 @@ [class.adf-readonly]="field.readOnly" [class.adf-left-label-input-container]="field.leftLabels" > -
- -
+ @if (field.leftLabels) { +
+ +
+ }
- -
diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.spec.ts b/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.spec.ts index 15ef00254b..6d6afa7d45 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.spec.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.spec.ts @@ -141,8 +141,9 @@ describe('GroupCloudWidgetComponent', () => { fixture.detectChanges(); await fixture.whenStable(); - expect(element.querySelector('.adf-error-text')).toBeTruthy(); - expect(element.querySelector('.adf-error-text').textContent).toContain('ADF_CLOUD_GROUPS.ERROR.NOT_FOUND'); + const errorMessages = element.querySelectorAll('.adf-error-text'); + expect(errorMessages.length).toBe(1); + expect(errorMessages[0].textContent).toContain('ADF_CLOUD_GROUPS.ERROR.NOT_FOUND'); }); }); diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.ts b/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.ts index f6555a01a7..c4c6a58a85 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/group/group-cloud.widget.ts @@ -16,7 +16,7 @@ */ import { Component, DestroyRef, inject, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; -import { ErrorWidgetComponent, WidgetComponent } from '@alfresco/adf-core'; +import { WidgetComponent } from '@alfresco/adf-core'; import { UntypedFormControl } from '@angular/forms'; import { filter } from 'rxjs/operators'; import { ComponentSelectionMode } from '../../../../types'; @@ -31,7 +31,7 @@ import { GroupCloudComponent } from '../../../../group/components/group-cloud.co @Component({ selector: 'group-cloud-widget', - imports: [CommonModule, TranslatePipe, ErrorWidgetComponent, GroupCloudComponent], + imports: [CommonModule, TranslatePipe, GroupCloudComponent], templateUrl: './group-cloud.widget.html', host: { '(click)': 'event($event)', diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.html b/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.html index 399f01aca0..457aad503a 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.html +++ b/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.html @@ -1,10 +1,16 @@ -
-
- -
+
+ @if (field.leftLabels) { +
+ +
+ }
- -
- diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.spec.ts b/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.spec.ts index 981033fdea..eb0d49d3bf 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.spec.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.spec.ts @@ -171,8 +171,9 @@ describe('PeopleCloudWidgetComponent', () => { fixture.detectChanges(); await fixture.whenStable(); - expect(element.querySelector('.adf-error-text')).toBeTruthy(); - expect(element.querySelector('.adf-error-text').textContent).toContain('ADF_CLOUD_USERS.ERROR.NOT_FOUND'); + const errorMessages = element.querySelectorAll('.adf-error-text'); + expect(errorMessages.length).toBe(1); + expect(errorMessages[0].textContent).toContain('ADF_CLOUD_USERS.ERROR.NOT_FOUND'); }); }); diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.ts b/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.ts index 976e4f3c0b..e849ff395e 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/people/people-cloud.widget.ts @@ -16,7 +16,7 @@ */ import { Component, DestroyRef, inject, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; -import { ErrorWidgetComponent, WidgetComponent } from '@alfresco/adf-core'; +import { WidgetComponent } from '@alfresco/adf-core'; import { UntypedFormControl } from '@angular/forms'; import { filter } from 'rxjs/operators'; import { ComponentSelectionMode } from '../../../../types'; @@ -27,13 +27,12 @@ import { ReactivePreselectionService } from '../reactive-preselection.service'; import { CommonModule } from '@angular/common'; import { TranslatePipe } from '@ngx-translate/core'; import { PeopleCloudComponent } from '../../../../people/components/people-cloud.component'; -import { MatFormFieldModule } from '@angular/material/form-field'; /* eslint-disable @angular-eslint/component-selector */ @Component({ selector: 'people-cloud-widget', - imports: [CommonModule, TranslatePipe, ErrorWidgetComponent, PeopleCloudComponent, MatFormFieldModule], + imports: [CommonModule, TranslatePipe, PeopleCloudComponent], templateUrl: './people-cloud.widget.html', host: { '(click)': 'event($event)', diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.scss b/lib/process-services-cloud/src/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.scss index 3e2ae3f677..ae2d2c54f7 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.scss +++ b/lib/process-services-cloud/src/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.scss @@ -11,7 +11,6 @@ } &-radio-button-container-horizontal { - margin-bottom: 15px; display: flex; flex-flow: column wrap; align-items: flex-start; diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.html b/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.html index 6b8cb1a67d..ed73ace101 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.html +++ b/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.html @@ -4,51 +4,50 @@ >
- - - - {{file.name}} - - - + @if (hasFile) { + + + + {{file.name}} + @if (!field.readOnly) { + + } + + + }
-
- -
- -
{{ 'FORM.FIELD.NO_FILE_ATTACHED' | translate }}
+ @if ((!hasFile || multipleOption) && !field.readOnly) { +
+ +
+ } @if (!hasFile && field.readOnly) { +
{{ 'FORM.FIELD.NO_FILE_ATTACHED' | translate }}
+ }
- - +
diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.spec.ts b/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.spec.ts index 61e4537d8d..39f922fcfd 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.spec.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/upload/upload-cloud.widget.spec.ts @@ -55,4 +55,12 @@ describe('UploadCloudWidgetComponent', () => { expect(eventSpy).toHaveBeenCalledWith(clickEvent); }); }); + + it('should render one reserved form field status area', () => { + widget.field = new FormFieldModel(new FormModel(), {}); + fixture.detectChanges(); + + const statusAreas = fixture.nativeElement.querySelectorAll('error-widget'); + expect(statusAreas.length).toBe(1); + }); }); diff --git a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.html b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.html index 759941de30..d903177dbb 100644 --- a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.html +++ b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.html @@ -1,27 +1,37 @@
- - @if (label || required) { {{label}} } + + @if (label || required) { + {{ label }} + } - {{group.name}} - + title="{{ (group.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}" + > + {{ group.name }} + @if (!(group.readonly || readOnly)) { + + } - + - - -
- - {{group.name}} + data-automation-id="adf-cloud-group-autocomplete" + > + @if ((searchGroups$ | async)?.length) { + +
+ + {{ group.name }}
- + } @else { + + } - - {{ 'ADF_CLOUD_GROUPS.ERROR.NOT_FOUND' | translate }} - + @if (searchGroupsControl.hasError('searchTypingError') && !searchLoading) { + + {{ 'ADF_CLOUD_GROUPS.ERROR.NOT_FOUND' | translate }} + + } - -
- - -
{{ 'ADF_CLOUD_GROUPS.ERROR.NOT_FOUND' | translate }}
-
- - -
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate: { pattern: getValidationPattern() } }}
+ @if (validationLoading) { + + } + @if (hasPreselectError() && !isValidationLoading()) { + + +
{{ 'ADF_CLOUD_GROUPS.ERROR.NOT_FOUND' | translate }}
- - -
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate: { requiredLength: getValidationMaxLength() } }}
-
- - -
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate: { requiredLength: getValidationMinLength() } }}
-
- - -
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}
-
- - -
{{ 'ADF_CLOUD_GROUPS.ERROR.NOT_FOUND' | translate }}
-
+ } + @if (searchGroupsControl.hasError('pattern')) { + + +
+ {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate: { pattern: getValidationPattern() } }} +
+
+ } + @if (searchGroupsControl.hasError('maxlength')) { + + +
+ {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate: { requiredLength: getValidationMaxLength() } }} +
+
+ } + @if (searchGroupsControl.hasError('minlength')) { + + +
+ {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate: { requiredLength: getValidationMinLength() } }} +
+
+ } + @if ((searchGroupsControl.hasError('required') || groupChipsCtrl.hasError('required')) && isDirty()) { + + +
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}
+
+ } + @if (searchGroupsControl.hasError('searchTypingError') && !this.isFocused) { + + +
{{ 'ADF_CLOUD_GROUPS.ERROR.NOT_FOUND' | translate }}
+
+ }
diff --git a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.scss b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.scss index a9cdd5daad..7cca3876c9 100644 --- a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.scss +++ b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.scss @@ -57,10 +57,12 @@ } } -.adf-error-messages-container .adf-error-icon { - @include mixins.adf-error-icon; -} +.adf-error-messages-container { + .adf-error-icon { + @include mixins.adf-error-icon; + } -.adf-error-messages-container .adf-error { - animation: slide-down-fade-in 300ms cubic-bezier(0.55, 0, 0.55, 0.2); + .adf-error { + animation: slide-down-fade-in 300ms cubic-bezier(0.55, 0, 0.55, 0.2); + } } diff --git a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.spec.ts index 09d88fe3f2..2c37fff1ca 100644 --- a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.spec.ts @@ -27,6 +27,8 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { MatChipHarness } from '@angular/material/chips/testing'; import { MatIconHarness } from '@angular/material/icon/testing'; import { MatInputHarness } from '@angular/material/input/testing'; +import { MatFormField } from '@angular/material/form-field'; +import { MatProgressBar } from '@angular/material/progress-bar'; describe('GroupCloudComponent', () => { let loader: HarnessLoader; @@ -98,6 +100,22 @@ describe('GroupCloudComponent', () => { expect(await inputElement.getPlaceholder()).toEqual(''); }); + it('should use dynamic form field subscript sizing', () => { + fixture.detectChanges(); + + const formField = fixture.debugElement.query(By.directive(MatFormField)).componentInstance as MatFormField; + expect(formField.subscriptSizing).toBe('dynamic'); + }); + + it('should render validation progress inside the reserved status area', () => { + component.validationLoading = true; + fixture.detectChanges(); + + const progressBar = fixture.debugElement.query(By.directive(MatProgressBar)); + + expect(progressBar.parent.classes['adf-error-messages-container']).toBeTrue(); + }); + describe('Search group', () => { beforeEach(() => { fixture.detectChanges(); diff --git a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.html b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.html index e71ef489b3..c2b2633fe4 100644 --- a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.html +++ b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.html @@ -4,10 +4,14 @@ class="adf-people-cloud adf-form-field-input" [class.adf-invalid]="hasError() && isDirty()" > - - {{label}} - - {{ title | translate }} + @if (!title) { + + {{ label }} + + } + @if (title) { + {{ title | translate }} + } {{ user | fullName }} - + @if (!(user.readonly || readOnly)) { + + } - + @if ((searchUsers$ | async)?.length) {
-
- {{ user | fullName : true }} +
+ {{ user | fullName: true }}
-
+ } @else { + + } - - {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }} - + @if (searchUserCtrl.hasError('searchTypingError') && !searchLoading) { + + {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate: { userName: searchedValue } }} + + } - - -
- - -
{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: validateUsersMessage } }}
-
- - -
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate : { pattern: getValidationPattern() } }}
-
- - -
- {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate : { requiredLength: getValidationMaxLength() } }} -
-
- - -
- {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate : { requiredLength: getValidationMinLength() } }} -
-
- - -
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}
-
- - -
{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}
-
+
+ @if (validationLoading) { + + } + @if (showErrors) { + @if (hasPreselectError() && !isValidationLoading()) { + + +
{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate: { userName: validateUsersMessage } }}
+
+ } + @if (searchUserCtrl.hasError('pattern')) { + + +
+ {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate: { pattern: getValidationPattern() } }} +
+
+ } + @if (searchUserCtrl.hasError('maxlength')) { + + +
+ {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate: { requiredLength: getValidationMaxLength() } }} +
+
+ } + @if (searchUserCtrl.hasError('minlength')) { + + +
+ {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate: { requiredLength: getValidationMinLength() } }} +
+
+ } + @if ((searchUserCtrl.hasError('required') || userChipsCtrl.hasError('required')) && isDirty()) { + + +
{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}
+
+ } + @if (searchUserCtrl.hasError('searchTypingError') && !this.isFocused) { + + +
{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate: { userName: searchedValue } }}
+
+ } + }
diff --git a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts index 3b99609dd0..98381d0c34 100644 --- a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts @@ -27,6 +27,7 @@ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { MatChipHarness } from '@angular/material/chips/testing'; import { MatInputHarness } from '@angular/material/input/testing'; import { MatFormFieldHarness } from '@angular/material/form-field/testing'; +import { MatProgressBar } from '@angular/material/progress-bar'; import { IdentityUserService } from '../services/identity-user.service'; describe('PeopleCloudComponent', () => { @@ -99,6 +100,19 @@ describe('PeopleCloudComponent', () => { expect(await inputField.getLabel()).toEqual('TITLE_KEY'); }); + it('should use dynamic form field subscript sizing by default', () => { + expect(component.formFieldSubscriptSizing).toBe('dynamic'); + }); + + it('should render validation progress inside the reserved status area', () => { + component.validationLoading = true; + fixture.detectChanges(); + + const progressBar = fixture.debugElement.query(By.directive(MatProgressBar)); + + expect(progressBar.parent.classes['adf-error-messages-container']).toBeTrue(); + }); + describe('Search user', () => { beforeEach(() => { fixture.detectChanges(); diff --git a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts index 5a11dd42e7..62a47a8af9 100644 --- a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts @@ -169,7 +169,7 @@ export class PeopleCloudComponent implements OnInit, OnChanges, AfterViewInit { * Material form field subscript sizing (fixed / dynamic) */ @Input() - formFieldSubscriptSizing: SubscriptSizing = 'fixed'; + formFieldSubscriptSizing: SubscriptSizing = 'dynamic'; /** * Show errors under the form field