Browse Source

Merge pull request #9034 from vvlladd28/improvement/alarm-filter-config

Fixed resize alarm filter config component
pull/9050/head
Igor Kulikov 3 years ago
committed by GitHub
parent
commit
f87f310438
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 26
      ui-ngx/src/app/core/services/utils.service.ts
  2. 22
      ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.html
  3. 29
      ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.scss
  4. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts
  5. 15
      ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts

26
ui-ngx/src/app/core/services/utils.service.ts

@ -17,7 +17,7 @@
// eslint-disable-next-line @typescript-eslint/triple-slash-reference // eslint-disable-next-line @typescript-eslint/triple-slash-reference
/// <reference path="../../../../src/typings/rawloader.typings.d.ts" /> /// <reference path="../../../../src/typings/rawloader.typings.d.ts" />
import { Inject, Injectable, NgZone } from '@angular/core'; import { ElementRef, Inject, Injectable, NgZone } from '@angular/core';
import { WINDOW } from '@core/services/window.service'; import { WINDOW } from '@core/services/window.service';
import { ExceptionData } from '@app/shared/models/error.models'; import { ExceptionData } from '@app/shared/models/error.models';
import { import {
@ -45,7 +45,7 @@ import { alarmFields, alarmSeverityTranslations, alarmStatusTranslations } from
import { materialColors } from '@app/shared/models/material.models'; import { materialColors } from '@app/shared/models/material.models';
import { WidgetInfo } from '@home/models/widget-component.models'; import { WidgetInfo } from '@home/models/widget-component.models';
import jsonSchemaDefaults from 'json-schema-defaults'; import jsonSchemaDefaults from 'json-schema-defaults';
import { Observable } from 'rxjs'; import { fromEvent, Observable, Subscription } from 'rxjs';
import { publishReplay, refCount } from 'rxjs/operators'; import { publishReplay, refCount } from 'rxjs/operators';
import { WidgetContext } from '@app/modules/home/models/widget-component.models'; import { WidgetContext } from '@app/modules/home/models/widget-component.models';
import { import {
@ -57,6 +57,8 @@ import {
import { EntityId } from '@shared/models/id/entity-id'; import { EntityId } from '@shared/models/id/entity-id';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { entityTypeTranslations } from '@shared/models/entity-type.models'; import { entityTypeTranslations } from '@shared/models/entity-type.models';
import { OverlayRef } from '@angular/cdk/overlay';
import { ResizeObserver } from '@juggle/resize-observer';
const i18nRegExp = new RegExp(`{${i18nPrefix}:[^{}]+}`, 'g'); const i18nRegExp = new RegExp(`{${i18nPrefix}:[^{}]+}`, 'g');
@ -528,4 +530,24 @@ export class UtilsService {
return base64toObj(b64Encoded); return base64toObj(b64Encoded);
} }
public updateOverlayMaxHeigth(overlay: OverlayRef, observeElementRef?: ElementRef): Subscription {
const observeElement = observeElementRef ? observeElementRef.nativeElement : overlay.overlayElement.children[0];
const setMaxHeigthOverlay = () => {
const top = observeElement.getBoundingClientRect().top;
const viewport = window.innerHeight;
overlay.updateSize({
maxHeight: viewport - top
});
};
const observer = new ResizeObserver(() => {
setMaxHeigthOverlay();
observer.unobserve(observeElement);
});
observer.observe(observeElement);
return fromEvent(window, 'resize').subscribe(() => setMaxHeigthOverlay());
}
} }

22
ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.html

@ -55,29 +55,28 @@
</form> </form>
</ng-template> </ng-template>
<ng-template #alarmFilter> <ng-template #alarmFilter>
<div class="tb-form-panel no-padding no-border" [formGroup]="alarmFilterConfigForm"> <div class="tb-form-panel tb-alarm-filter-config-component no-padding no-border" [formGroup]="alarmFilterConfigForm">
<div class="tb-form-row space-between" ngClass.xs="filters-row-mobile"> <div class="tb-form-row space-between column-xs">
<div class="fixed-title-width" ngClass.xs="filters-title-mobile" translate>alarm.alarm-status-list</div> <div class="fixed-title-width" translate>alarm.alarm-status-list</div>
<mat-chip-listbox multiple formControlName="statusList"> <mat-chip-listbox multiple formControlName="statusList">
<mat-chip-option *ngFor="let searchStatus of alarmSearchStatuses" [value]="searchStatus"> <mat-chip-option *ngFor="let searchStatus of alarmSearchStatuses" [value]="searchStatus">
{{ alarmSearchStatusTranslationMap.get(searchStatus) | translate }} {{ alarmSearchStatusTranslationMap.get(searchStatus) | translate }}
</mat-chip-option> </mat-chip-option>
</mat-chip-listbox> </mat-chip-listbox>
</div> </div>
<div class="tb-form-row space-between" ngClass.xs="filters-row-mobile"> <div class="tb-form-row space-between column-xs">
<div class="fixed-title-width" ngClass.xs="filters-title-mobile" translate>alarm.alarm-severity-list</div> <div class="fixed-title-width" translate>alarm.alarm-severity-list</div>
<mat-chip-listbox multiple formControlName="severityList"> <mat-chip-listbox multiple formControlName="severityList">
<mat-chip-option *ngFor="let alarmSeverity of alarmSeverities" [value]="alarmSeverity"> <mat-chip-option *ngFor="let alarmSeverity of alarmSeverities" [value]="alarmSeverity">
{{ alarmSeverityTranslationMap.get(alarmSeverityEnum[alarmSeverity]) | translate }} {{ alarmSeverityTranslationMap.get(alarmSeverityEnum[alarmSeverity]) | translate }}
</mat-chip-option> </mat-chip-option>
</mat-chip-listbox> </mat-chip-listbox>
</div> </div>
<div class="tb-form-row" ngClass.xs="filters-row-mobile"> <div class="tb-form-row column-xs">
<div class="fixed-title-width" ngClass.xs="filters-title-mobile" translate>alarm.alarm-type-list</div> <div class="fixed-title-width" translate>alarm.alarm-type-list</div>
<mat-form-field fxFlex appearance="outline" <mat-form-field fxFlex appearance="outline"
subscriptSizing="dynamic" subscriptSizing="dynamic"
class="tb-chips" class="tb-chips">
ngClass.xs="filters-fields-width-mobile">
<mat-chip-grid #alarmTypeChipList formControlName="typeList"> <mat-chip-grid #alarmTypeChipList formControlName="typeList">
<mat-chip-row *ngFor="let type of alarmTypeList()" <mat-chip-row *ngFor="let type of alarmTypeList()"
[removable]="true" (removed)="removeAlarmType(type)"> [removable]="true" (removed)="removeAlarmType(type)">
@ -92,10 +91,9 @@
</mat-chip-grid> </mat-chip-grid>
</mat-form-field> </mat-form-field>
</div> </div>
<div class="tb-form-row" ngClass.xs="filters-row-mobile"> <div class="tb-form-row column-xs">
<div class="fixed-title-width" ngClass.xs="filters-title-mobile" translate>alarm.assignee</div> <div class="fixed-title-width" translate>alarm.assignee</div>
<tb-alarm-assignee-select fxFlex inline="true" <tb-alarm-assignee-select fxFlex inline="true"
ngClass.xs="filters-fields-width-mobile"
[userMode]="userMode" [userMode]="userMode"
formControlName="assigneeId"> formControlName="assigneeId">
</tb-alarm-assignee-select> </tb-alarm-assignee-select>

29
ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.scss

@ -14,25 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
:host { :host {
display: block; display: flex;
overflow: scroll;
max-width: 100%; max-width: 100%;
.mdc-button { .mdc-button {
max-width: 100%; max-width: 100%;
} }
.filters-row-mobile {
flex-direction: column;
align-items: start;
border: none;
padding: 0;
}
.filters-title-mobile {
font-size: 14px;
}
.filters-fields-width-mobile {
width: 100%;
}
} }
:host ::ng-deep { :host ::ng-deep {
@ -45,9 +31,16 @@
text-overflow: ellipsis; text-overflow: ellipsis;
} }
} }
.mat-mdc-chip { }
.mdc-evolution-chip__cell, .mat-mdc-chip-action, .mat-mdc-chip-action-label {
overflow: hidden; ::ng-deep {
.tb-alarm-filter-config-component {
flex: 1;
.mat-mdc-chip {
.mdc-evolution-chip__cell, .mat-mdc-chip-action, .mat-mdc-chip-action-label {
overflow: hidden;
}
} }
} }
} }

7
ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts

@ -44,6 +44,8 @@ import { MatChipInputEvent } from '@angular/material/chips';
import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes'; import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { deepClone } from '@core/utils'; import { deepClone } from '@core/utils';
import { Subscription } from 'rxjs';
import { UtilsService } from '@core/services/utils.service';
export const ALARM_FILTER_CONFIG_DATA = new InjectionToken<any>('AlarmFilterConfigData'); export const ALARM_FILTER_CONFIG_DATA = new InjectionToken<any>('AlarmFilterConfigData');
@ -114,6 +116,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal
panelResult: AlarmFilterConfig = null; panelResult: AlarmFilterConfig = null;
private alarmFilterConfig: AlarmFilterConfig; private alarmFilterConfig: AlarmFilterConfig;
private resizeWindows: Subscription;
private propagateChange = (_: any) => {}; private propagateChange = (_: any) => {};
@ -125,6 +128,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal
private translate: TranslateService, private translate: TranslateService,
private overlay: Overlay, private overlay: Overlay,
private nativeElement: ElementRef, private nativeElement: ElementRef,
private utils: UtilsService,
private viewContainerRef: ViewContainerRef) { private viewContainerRef: ViewContainerRef) {
} }
@ -213,6 +217,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal
}); });
this.alarmFilterOverlayRef.attach(new TemplatePortal(this.alarmFilterPanel, this.alarmFilterOverlayRef.attach(new TemplatePortal(this.alarmFilterPanel,
this.viewContainerRef)); this.viewContainerRef));
this.resizeWindows = this.utils.updateOverlayMaxHeigth(this.alarmFilterOverlayRef);
} }
cancel() { cancel() {
@ -220,6 +225,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal
if (this.overlayRef) { if (this.overlayRef) {
this.overlayRef.dispose(); this.overlayRef.dispose();
} else { } else {
this.resizeWindows.unsubscribe();
this.alarmFilterOverlayRef.dispose(); this.alarmFilterOverlayRef.dispose();
} }
} }
@ -233,6 +239,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal
if (this.overlayRef) { if (this.overlayRef) {
this.overlayRef.dispose(); this.overlayRef.dispose();
} else { } else {
this.resizeWindows.unsubscribe();
this.alarmFilterOverlayRef.dispose(); this.alarmFilterOverlayRef.dispose();
} }
} }

15
ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts

@ -585,10 +585,13 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit,
$event.stopPropagation(); $event.stopPropagation();
} }
const target = $event.target || $event.srcElement || $event.currentTarget; const target = $event.target || $event.srcElement || $event.currentTarget;
const config = new OverlayConfig(); const config = new OverlayConfig({
config.backdropClass = 'cdk-overlay-transparent-backdrop'; panelClass: 'tb-filter-panel',
config.panelClass = 'tb-filter-panel'; backdropClass: 'cdk-overlay-transparent-backdrop',
config.hasBackdrop = true; hasBackdrop: true,
height: 'fit-content',
maxHeight: '75vh'
});
const connectedPosition: ConnectedPosition = { const connectedPosition: ConnectedPosition = {
originX: 'end', originX: 'end',
originY: 'bottom', originY: 'bottom',
@ -630,7 +633,11 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit,
const injector = Injector.create({parent: this.viewContainerRef.injector, providers}); const injector = Injector.create({parent: this.viewContainerRef.injector, providers});
const componentRef = overlayRef.attach(new ComponentPortal(AlarmFilterConfigComponent, const componentRef = overlayRef.attach(new ComponentPortal(AlarmFilterConfigComponent,
this.viewContainerRef, injector)); this.viewContainerRef, injector));
const resizeWindows = this.utils.updateOverlayMaxHeigth(overlayRef, componentRef.location);
componentRef.onDestroy(() => { componentRef.onDestroy(() => {
resizeWindows.unsubscribe();
if (componentRef.instance.panelResult) { if (componentRef.instance.panelResult) {
const result = componentRef.instance.panelResult; const result = componentRef.instance.panelResult;
const alarmFilter = this.entityService.resolveAlarmFilter(result, false); const alarmFilter = this.entityService.resolveAlarmFilter(result, false);

Loading…
Cancel
Save