UI: Refactoring
This commit is contained in:
parent
40179f0010
commit
fb8c349904
@ -41,12 +41,12 @@
|
||||
[name]="name"
|
||||
[(ngModel)]="value"
|
||||
(ngModelChange)="valueChange.emit(value)">
|
||||
<mat-button-toggle *ngFor="let option of options; trackBy: trackByHeaderOption" [value]="option.value" [disabled]="disabled" [class.tb-toggle-button-error]="option.error && value !== option.value">
|
||||
<mat-button-toggle *ngFor="let option of options; trackBy: trackByHeaderOption" [value]="option.value" [disabled]="disabled" [class.tb-toggle-button-error]="(option.error$ | async) && value !== option.value">
|
||||
{{ option.name }}
|
||||
<mat-icon matTooltipPosition="above"
|
||||
matTooltipClass="tb-error-tooltip"
|
||||
[matTooltip]="option.error"
|
||||
*ngIf="option.error && value !== option.value"
|
||||
[matTooltip]="(option.error$ | async)"
|
||||
*ngIf="(option.error$ | async) && value !== option.value"
|
||||
class="tb-error tb-error-icon">
|
||||
warning
|
||||
</mat-icon>
|
||||
|
||||
@ -39,19 +39,18 @@ import {
|
||||
import { PageComponent } from '@shared/components/page.component';
|
||||
import { Store } from '@ngrx/store';
|
||||
import { AppState } from '@core/core.state';
|
||||
import { BehaviorSubject, Subject, Subscription } from 'rxjs';
|
||||
import { BehaviorSubject, Observable, ReplaySubject, Subject, Subscription } from 'rxjs';
|
||||
import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout';
|
||||
import { MediaBreakpoints } from '@shared/models/constants';
|
||||
import { coerceBoolean } from '@shared/decorators/coercion';
|
||||
import { startWith, takeUntil } from 'rxjs/operators';
|
||||
import { Platform } from '@angular/cdk/platform';
|
||||
import { MatButtonToggle, MatButtonToggleGroup } from '@angular/material/button-toggle';
|
||||
import { isDefined } from '@core/utils';
|
||||
|
||||
export interface ToggleHeaderOption {
|
||||
name: string;
|
||||
value: any;
|
||||
error?: string;
|
||||
error$?: Observable<string>;
|
||||
}
|
||||
|
||||
export type ToggleHeaderAppearance = 'fill' | 'fill-invert' | 'stroked';
|
||||
@ -65,13 +64,13 @@ export type ScrollDirection = 'after' | 'before';
|
||||
}
|
||||
)
|
||||
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
||||
export class ToggleOption implements OnChanges {
|
||||
export class ToggleOption implements OnChanges, OnDestroy {
|
||||
|
||||
@Input() value: any;
|
||||
|
||||
@Input() error: string;
|
||||
|
||||
@Output() errorChange = new EventEmitter<string>();
|
||||
currentError = new ReplaySubject<string>(1);
|
||||
|
||||
get viewValue(): string {
|
||||
return (this._element?.nativeElement.textContent || '').trim();
|
||||
@ -83,11 +82,15 @@ export class ToggleOption implements OnChanges {
|
||||
|
||||
ngOnChanges(changes: SimpleChanges) {
|
||||
if (changes?.error) {
|
||||
if (!changes.error.firstChange && changes.error.currentValue !== changes.error.previousValue) {
|
||||
this.errorChange.emit(this.error);
|
||||
if (changes.error.currentValue !== changes.error.previousValue) {
|
||||
this.currentError.next(this.error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.currentError.complete();
|
||||
}
|
||||
}
|
||||
|
||||
@Directive()
|
||||
@ -106,7 +109,6 @@ export abstract class _ToggleBase extends PageComponent implements AfterContentI
|
||||
|
||||
ngAfterContentInit(): void {
|
||||
this.toggleOptions.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {
|
||||
this.subscribeToToggleOptions();
|
||||
this.syncToggleHeaderOptions();
|
||||
});
|
||||
}
|
||||
@ -116,16 +118,6 @@ export abstract class _ToggleBase extends PageComponent implements AfterContentI
|
||||
this._destroyed.complete();
|
||||
}
|
||||
|
||||
private subscribeToToggleOptions() {
|
||||
this.toggleOptions.forEach(option => {
|
||||
if (isDefined(option.error)) {
|
||||
option.errorChange.pipe(takeUntil(this._destroyed)).subscribe(() => {
|
||||
this.syncToggleHeaderOptions();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private syncToggleHeaderOptions() {
|
||||
if (this.toggleOptions?.length) {
|
||||
this.options.length = 0;
|
||||
@ -134,7 +126,7 @@ export abstract class _ToggleBase extends PageComponent implements AfterContentI
|
||||
{
|
||||
name: option.viewValue,
|
||||
value: option.value,
|
||||
error: option.error
|
||||
error$: option.currentError.asObservable()
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user