Browse Source

updated connectors management logic

pull/8337/head
Maksym Dudnik 3 years ago
parent
commit
26f69ff2bc
  1. 77
      ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.ts

77
ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.ts

@ -24,14 +24,13 @@ import { MatDialog } from '@angular/material/dialog';
import { AttributeService } from '@core/http/attribute.service'; import { AttributeService } from '@core/http/attribute.service';
import { DeviceService } from '@core/http/device.service'; import { DeviceService } from '@core/http/device.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { forkJoin, merge } from 'rxjs'; import { forkJoin } from 'rxjs';
import { AttributeData, AttributeScope } from '@shared/models/telemetry/telemetry.models'; import { AttributeData, AttributeScope } from '@shared/models/telemetry/telemetry.models';
import { PageComponent } from '@shared/components/page.component'; import { PageComponent } from '@shared/components/page.component';
import { PageLink } from '@shared/models/page/page-link'; import { PageLink } from '@shared/models/page/page-link';
import { AttributeDatasource } from '@home/models/datasource/attribute-datasource'; import { AttributeDatasource } from '@home/models/datasource/attribute-datasource';
import { Direction, SortOrder } from '@shared/models/page/sort-order'; import { Direction, SortOrder } from '@shared/models/page/sort-order';
import { MatSort } from '@angular/material/sort'; import { MatSort } from '@angular/material/sort';
import { tap } from 'rxjs/operators';
import { TelemetryWebsocketService } from '@core/ws/telemetry-websocket.service'; import { TelemetryWebsocketService } from '@core/ws/telemetry-websocket.service';
import { MatTableDataSource } from '@angular/material/table'; import { MatTableDataSource } from '@angular/material/table';
import { GatewayLogLevel } from '@home/components/widget/lib/gateway/gateway-configuration.component'; import { GatewayLogLevel } from '@home/components/widget/lib/gateway/gateway-configuration.component';
@ -40,6 +39,7 @@ import { DialogService } from '@core/services/dialog.service';
import { WidgetContext } from '@home/models/widget-component.models'; import { WidgetContext } from '@home/models/widget-component.models';
import { deepClone } from '@core/utils'; import { deepClone } from '@core/utils';
import { NULL_UUID } from '@shared/models/id/has-uuid'; import { NULL_UUID } from '@shared/models/id/has-uuid';
import { tap } from 'rxjs/operators';
export interface gatewayConnector { export interface gatewayConnector {
@ -83,10 +83,10 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
attributeDataSource: AttributeDatasource; attributeDataSource: AttributeDatasource;
sharedAttributeData: Array<AttributeData> = [];
inactiveConnectorsDataSource: AttributeDatasource; inactiveConnectorsDataSource: AttributeDatasource;
serverDataSource: AttributeDatasource;
dataSource: MatTableDataSource<AttributeData>; dataSource: MatTableDataSource<AttributeData>;
displayedColumns = ['enabled', 'key', 'type', 'syncStatus', 'actions']; displayedColumns = ['enabled', 'key', 'type', 'syncStatus', 'actions'];
@ -100,7 +100,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
device: EntityId; device: EntityId;
@ViewChild('nameInput') nameInput: ElementRef; @ViewChild('nameInput') nameInput: ElementRef;
@ViewChild(MatSort, { static: false }) sort: MatSort; @ViewChild(MatSort, {static: false}) sort: MatSort;
connectorForm: FormGroup; connectorForm: FormGroup;
@ -120,6 +120,8 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
inactiveData: Array<any> = []; inactiveData: Array<any> = [];
sharedAttributeData: Array<AttributeData> = [];
initialConnector: gatewayConnector; initialConnector: gatewayConnector;
constructor(protected router: Router, constructor(protected router: Router,
@ -138,6 +140,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
this.pageLink = new PageLink(1000, 0, null, sortOrder); this.pageLink = new PageLink(1000, 0, null, sortOrder);
this.attributeDataSource = new AttributeDatasource(this.attributeService, this.telemetryWsService, this.zone, this.translate); this.attributeDataSource = new AttributeDatasource(this.attributeService, this.telemetryWsService, this.zone, this.translate);
this.inactiveConnectorsDataSource = new AttributeDatasource(this.attributeService, this.telemetryWsService, this.zone, this.translate); this.inactiveConnectorsDataSource = new AttributeDatasource(this.attributeService, this.telemetryWsService, this.zone, this.translate);
this.serverDataSource = new AttributeDatasource(this.attributeService, this.telemetryWsService, this.zone, this.translate);
this.dataSource = new MatTableDataSource<AttributeData>([]); this.dataSource = new MatTableDataSource<AttributeData>([]);
this.connectorForm = this.fb.group({ this.connectorForm = this.fb.group({
name: ['', [Validators.required, this.uniqNameRequired()]], name: ['', [Validators.required, this.uniqNameRequired()]],
@ -155,11 +158,16 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
this.connectorForm.valueChanges.subscribe(() => { this.connectorForm.valueChanges.subscribe(() => {
this.cd.detectChanges(); this.cd.detectChanges();
}); });
merge(this.sort.sortChange)
.pipe( this.dataSource.sort = this.sort;
tap(() => this.updateData()) this.dataSource.sortingDataAccessor = (data: AttributeData, sortHeaderId: string) => {
) if (sortHeaderId === 'syncStatus') {
.subscribe(); return this.isConnectorSynced(data) ? 1 : 0;
} else if (sortHeaderId === 'enabled') {
return this.activeConnectors.includes(data.key) ? 1 : 0;
}
return data[sortHeaderId];
};
this.viewsInited = true; this.viewsInited = true;
if (this.device) { if (this.device) {
@ -239,7 +247,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
this.inactiveConnectors.push(value.name); this.inactiveConnectors.push(value.name);
updateActiveConnectors = true; updateActiveConnectors = true;
} }
const tasks = [this.attributeService.saveEntityAttributes(this.device, AttributeScope.SHARED_SCOPE, attributesToSave)]; const tasks = [this.attributeService.saveEntityAttributes(this.device, scope, attributesToSave)];
if (updateActiveConnectors) { if (updateActiveConnectors) {
tasks.push(this.attributeService.saveEntityAttributes(this.device, scope, [{ tasks.push(this.attributeService.saveEntityAttributes(this.device, scope, [{
key: scope == AttributeScope.SHARED_SCOPE ? 'active_connectors' : 'inactive_connectors', key: scope == AttributeScope.SHARED_SCOPE ? 'active_connectors' : 'inactive_connectors',
@ -248,7 +256,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
} }
if (attributesToDelete.length) { if (attributesToDelete.length) {
tasks.push(this.attributeService.deleteEntityAttributes(this.device, AttributeScope.SHARED_SCOPE, attributesToDelete)); tasks.push(this.attributeService.deleteEntityAttributes(this.device, scope, attributesToDelete));
} }
forkJoin(tasks).subscribe(_ => { forkJoin(tasks).subscribe(_ => {
this.initialConnector = value; this.initialConnector = value;
@ -257,19 +265,6 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
}); });
} }
resetSortAndFilter(update: boolean = true) {
this.textSearchMode = false;
this.pageLink.textSearch = null;
if (this.viewsInited) {
const sortable = this.sort.sortables.get('key');
this.sort.active = sortable.id;
this.sort.direction = 'asc';
if (update) {
this.updateData(true);
}
}
}
updateData(reload: boolean = false) { updateData(reload: boolean = false) {
this.pageLink.sortOrder.property = this.sort.active; this.pageLink.sortOrder.property = this.sort.active;
this.pageLink.sortOrder.direction = Direction[this.sort.direction.toUpperCase()]; this.pageLink.sortOrder.direction = Direction[this.sort.direction.toUpperCase()];
@ -278,10 +273,14 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
this.combineData(); this.combineData();
}); });
this.inactiveConnectorsDataSource.loadAttributes(this.device, AttributeScope.SHARED_SCOPE, this.pageLink, reload).subscribe(data => { this.inactiveConnectorsDataSource.loadAttributes(this.device, AttributeScope.SHARED_SCOPE, this.pageLink, reload).subscribe(data => {
this.inactiveData = data.data.filter(value => this.inactiveConnectors.includes(value.key));
this.sharedAttributeData = data.data.filter(value => this.activeConnectors.includes(value.key)); this.sharedAttributeData = data.data.filter(value => this.activeConnectors.includes(value.key));
this.combineData(); this.combineData();
}); });
this.serverDataSource.loadAttributes(this.device, AttributeScope.SERVER_SCOPE, this.pageLink, reload).subscribe(data => {
this.inactiveData = data.data.filter(value => this.inactiveConnectors.includes(value.key));
this.combineData();
});
} }
isConnectorSynced(attribute: AttributeData) { isConnectorSynced(attribute: AttributeData) {
@ -300,7 +299,9 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
} }
combineData() { combineData() {
this.dataSource.data = [...this.activeData, ...this.inactiveData]; this.dataSource.data = [...this.activeData, ...this.inactiveData, ...this.sharedAttributeData].filter((item, index, self) =>
index === self.findIndex((t) => t.key === item.key)
);
} }
addAttribute(): void { addAttribute(): void {
@ -377,7 +378,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
if (result) { if (result) {
const tasks = []; const tasks = [];
const scope = (this.initialConnector && this.activeConnectors.includes(this.initialConnector.name)) ? AttributeScope.SHARED_SCOPE : AttributeScope.SERVER_SCOPE; const scope = (this.initialConnector && this.activeConnectors.includes(this.initialConnector.name)) ? AttributeScope.SHARED_SCOPE : AttributeScope.SERVER_SCOPE;
tasks.push(this.attributeService.deleteEntityAttributes(this.device, AttributeScope.SHARED_SCOPE, [attribute])); tasks.push(this.attributeService.deleteEntityAttributes(this.device, scope, [attribute]));
const activeIndex = this.activeConnectors.indexOf(attribute.key); const activeIndex = this.activeConnectors.indexOf(attribute.key);
const inactiveIndex = this.inactiveConnectors.indexOf(attribute.key); const inactiveIndex = this.inactiveConnectors.indexOf(attribute.key);
if (activeIndex !== -1) { if (activeIndex !== -1) {
@ -431,6 +432,16 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
enableConnector(attribute): void { enableConnector(attribute): void {
const wasEnabled = this.activeConnectors.includes(attribute.key); const wasEnabled = this.activeConnectors.includes(attribute.key);
const scopeOld = wasEnabled ? AttributeScope.SHARED_SCOPE : AttributeScope.SERVER_SCOPE;
const scopeNew = !wasEnabled ? AttributeScope.SHARED_SCOPE : AttributeScope.SERVER_SCOPE;
const tasks = [this.attributeService.saveEntityAttributes(this.device, AttributeScope.SHARED_SCOPE, [{
key: 'active_connectors',
value: this.activeConnectors
}]), this.attributeService.saveEntityAttributes(this.device, AttributeScope.SERVER_SCOPE, [{
key: 'inactive_connectors',
value: this.inactiveConnectors
}]), this.attributeService.deleteEntityAttributes(this.device, scopeOld, [attribute]),
this.attributeService.saveEntityAttributes(this.device, scopeNew, [attribute])];
if (wasEnabled) { if (wasEnabled) {
const index = this.activeConnectors.indexOf(attribute.key); const index = this.activeConnectors.indexOf(attribute.key);
this.activeConnectors.splice(index, 1); this.activeConnectors.splice(index, 1);
@ -440,14 +451,8 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
this.inactiveConnectors.splice(index, 1); this.inactiveConnectors.splice(index, 1);
this.activeConnectors.push(attribute.key); this.activeConnectors.push(attribute.key);
} }
forkJoin([this.attributeService.saveEntityAttributes(this.device, AttributeScope.SHARED_SCOPE, [{ forkJoin(tasks).subscribe(_ => {
key: 'active_connectors', this.updateData(true);
value: this.activeConnectors
}]), this.attributeService.saveEntityAttributes(this.device, AttributeScope.SERVER_SCOPE, [{
key: 'inactive_connectors',
value: this.inactiveConnectors
}]),]).subscribe(_ => {
this.updateData();
}); });
} }

Loading…
Cancel
Save