mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-12 17:04:57 +00:00
[AAE-7666] Add error message when REST API fails for radio buttons (#7926)
* [AAE-7666] Add error message when REST API fails for radio buttons * [AAE-7666] remove not needed checks from unit test * Remove redundant code * move logic from html to component
This commit is contained in:
parent
b572e16b67
commit
0b0174ced4
@ -18,5 +18,5 @@
|
|||||||
</mat-radio-button>
|
</mat-radio-button>
|
||||||
</mat-radio-group>
|
</mat-radio-group>
|
||||||
</div>
|
</div>
|
||||||
<error-widget [error]="field.validationSummary" ></error-widget>
|
<error-widget class="adf-radio-group-error-message" [error]="hasError()"></error-widget>
|
||||||
</div>
|
</div>
|
||||||
|
@ -28,4 +28,8 @@
|
|||||||
&-radio-button {
|
&-radio-button {
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&-radio-group-error-message .adf-error-container {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ import { FormFieldModel, FormFieldOption, FormFieldTypes, FormModel, setupTestBe
|
|||||||
import { FormCloudService } from '../../../services/form-cloud.service';
|
import { FormCloudService } from '../../../services/form-cloud.service';
|
||||||
import { RadioButtonsCloudWidgetComponent } from './radio-buttons-cloud.widget';
|
import { RadioButtonsCloudWidgetComponent } from './radio-buttons-cloud.widget';
|
||||||
import { ProcessServiceCloudTestingModule } from '../../../../testing/process-service-cloud.testing.module';
|
import { ProcessServiceCloudTestingModule } from '../../../../testing/process-service-cloud.testing.module';
|
||||||
import { of } from 'rxjs';
|
import { of, throwError } from 'rxjs';
|
||||||
|
|
||||||
describe('RadioButtonsCloudWidgetComponent', () => {
|
describe('RadioButtonsCloudWidgetComponent', () => {
|
||||||
let fixture: ComponentFixture<RadioButtonsCloudWidgetComponent>;
|
let fixture: ComponentFixture<RadioButtonsCloudWidgetComponent>;
|
||||||
@ -48,7 +48,6 @@ describe('RadioButtonsCloudWidgetComponent', () => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
formCloudService = TestBed.inject(FormCloudService);
|
formCloudService = TestBed.inject(FormCloudService);
|
||||||
spyOn(formCloudService, 'getRestWidgetData').and.returnValue(of(restOption));
|
|
||||||
fixture = TestBed.createComponent(RadioButtonsCloudWidgetComponent);
|
fixture = TestBed.createComponent(RadioButtonsCloudWidgetComponent);
|
||||||
widget = fixture.componentInstance;
|
widget = fixture.componentInstance;
|
||||||
element = fixture.nativeElement;
|
element = fixture.nativeElement;
|
||||||
@ -56,6 +55,7 @@ describe('RadioButtonsCloudWidgetComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should update form on values fetched', () => {
|
it('should update form on values fetched', () => {
|
||||||
|
spyOn(formCloudService, 'getRestWidgetData').and.returnValue(of(restOption));
|
||||||
const taskId = '<form-id>';
|
const taskId = '<form-id>';
|
||||||
const fieldId = '<field-id>';
|
const fieldId = '<field-id>';
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ describe('RadioButtonsCloudWidgetComponent', () => {
|
|||||||
const field = widget.field;
|
const field = widget.field;
|
||||||
spyOn(field, 'updateForm').and.stub();
|
spyOn(field, 'updateForm').and.stub();
|
||||||
|
|
||||||
widget.ngOnInit();
|
fixture.detectChanges();
|
||||||
expect(field.updateForm).toHaveBeenCalled();
|
expect(field.updateForm).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -155,6 +155,7 @@ describe('RadioButtonsCloudWidgetComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to set a Radio Button widget when rest option enabled', () => {
|
it('should be able to set a Radio Button widget when rest option enabled', () => {
|
||||||
|
spyOn(formCloudService, 'getRestWidgetData').and.returnValue(of(restOption));
|
||||||
widget.field = new FormFieldModel(new FormModel({}), {
|
widget.field = new FormFieldModel(new FormModel({}), {
|
||||||
id: 'radio-id',
|
id: 'radio-id',
|
||||||
name: 'radio-name-label',
|
name: 'radio-name-label',
|
||||||
@ -172,4 +173,22 @@ describe('RadioButtonsCloudWidgetComponent', () => {
|
|||||||
expect(selectedOption.innerText).toBe('opt-name-1');
|
expect(selectedOption.innerText).toBe('opt-name-1');
|
||||||
expect(widget.field.isValid).toBe(true);
|
expect(widget.field.isValid).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should show error message if the restUrl failed to fetch options', () => {
|
||||||
|
spyOn(formCloudService, 'getRestWidgetData').and.returnValue(throwError('Failed to fetch options'));
|
||||||
|
widget.field.restUrl = 'https://fake-rest-url';
|
||||||
|
widget.field.optionType = 'rest';
|
||||||
|
widget.field.restIdProperty = 'name';
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
const radioButtons = element.querySelector<HTMLInputElement>('mat-radio-group');
|
||||||
|
radioButtons.click();
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
const errorMessage = element.querySelector('.adf-radio-group-error-message .adf-error-text');
|
||||||
|
const errorIcon = element.querySelector('.adf-radio-group-error-message .adf-error-icon');
|
||||||
|
|
||||||
|
expect(errorIcon.textContent).toBe('error_outline');
|
||||||
|
expect(errorMessage.textContent).toBe('FORM.FIELD.REST_API_FAILED');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -18,10 +18,11 @@
|
|||||||
/* eslint-disable @angular-eslint/component-selector */
|
/* eslint-disable @angular-eslint/component-selector */
|
||||||
|
|
||||||
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
|
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
|
||||||
import { WidgetComponent, FormService, LogService, FormFieldOption } from '@alfresco/adf-core';
|
import { WidgetComponent, FormService, LogService, FormFieldOption, ErrorMessageModel } from '@alfresco/adf-core';
|
||||||
import { FormCloudService } from '../../../services/form-cloud.service';
|
import { FormCloudService } from '../../../services/form-cloud.service';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'radio-buttons-cloud-widget',
|
selector: 'radio-buttons-cloud-widget',
|
||||||
@ -43,11 +44,14 @@ import { takeUntil } from 'rxjs/operators';
|
|||||||
export class RadioButtonsCloudWidgetComponent extends WidgetComponent implements OnInit {
|
export class RadioButtonsCloudWidgetComponent extends WidgetComponent implements OnInit {
|
||||||
|
|
||||||
typeId = 'RadioButtonsCloudWidgetComponent';
|
typeId = 'RadioButtonsCloudWidgetComponent';
|
||||||
|
restApiError: ErrorMessageModel;
|
||||||
|
|
||||||
protected onDestroy$ = new Subject<boolean>();
|
protected onDestroy$ = new Subject<boolean>();
|
||||||
|
|
||||||
constructor(public formService: FormService,
|
constructor(public formService: FormService,
|
||||||
private formCloudService: FormCloudService,
|
private formCloudService: FormCloudService,
|
||||||
private logService: LogService) {
|
private logService: LogService,
|
||||||
|
private translateService: TranslateService) {
|
||||||
super(formService);
|
super(formService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +67,10 @@ export class RadioButtonsCloudWidgetComponent extends WidgetComponent implements
|
|||||||
.subscribe((result: FormFieldOption[]) => {
|
.subscribe((result: FormFieldOption[]) => {
|
||||||
this.field.options = result;
|
this.field.options = result;
|
||||||
this.field.updateForm();
|
this.field.updateForm();
|
||||||
}, (err) => this.handleError(err));
|
}, (err) => {
|
||||||
|
this.resetRestApiOptions();
|
||||||
|
this.handleError(err);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onOptionClick(optionSelected: any) {
|
onOptionClick(optionSelected: any) {
|
||||||
@ -72,6 +79,7 @@ export class RadioButtonsCloudWidgetComponent extends WidgetComponent implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleError(error: any) {
|
handleError(error: any) {
|
||||||
|
this.restApiError = new ErrorMessageModel({ message: this.translateService.instant('FORM.FIELD.REST_API_FAILED', { hostname: this.getRestUrlHostName() }) });
|
||||||
this.logService.error(error);
|
this.logService.error(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,4 +95,16 @@ export class RadioButtonsCloudWidgetComponent extends WidgetComponent implements
|
|||||||
}
|
}
|
||||||
return this.field.value === option.id;
|
return this.field.value === option.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resetRestApiOptions() {
|
||||||
|
this.field.options = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
getRestUrlHostName(): string {
|
||||||
|
return new URL(this.field?.restUrl).hostname ?? this.field?.restUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasError(): ErrorMessageModel {
|
||||||
|
return this.restApiError || this.field.validationSummary;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user