blob: 9846cf2d0b14e6bc75afb8d1f497d947c6f875a4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { UUID } from 'angular2-uuid';
import { TreeNode } from '@ali-hm/angular-tree-component';
import {
EventProperty,
EventPropertyList,
EventPropertyNested,
EventPropertyPrimitive,
EventPropertyUnion,
EventSchema,
FieldStatusInfo,
TransformationRuleDescription,
} from '@streampipes/platform-services';
import { EditEventPropertyComponent } from '../../../../dialog/edit-event-property/edit-event-property.component';
import { DialogService, PanelType } from '@streampipes/shared-ui';
import { StaticValueTransformService } from '../../../../services/static-value-transform.service';
import { EventPropertyUtilsService } from '../../../../services/event-property-utils.service';
import { ShepherdService } from '../../../../../services/tour/shepherd.service';
@Component({
selector: 'sp-event-property-row',
templateUrl: './event-property-row.component.html',
styleUrls: ['./event-property-row.component.scss'],
})
export class EventPropertyRowComponent implements OnInit {
@Input() node: TreeNode;
@Input() isEditable = true;
@Input() eventSchema: EventSchema = new EventSchema();
@Input() originalEventSchema: EventSchema;
@Input() countSelected: number;
@Input() fieldStatusInfo: Record<string, FieldStatusInfo>;
@Output() isEditableChange = new EventEmitter<boolean>();
@Output() eventSchemaChange = new EventEmitter<EventSchema>();
@Output() originalEventSchemaChange = new EventEmitter<EventSchema>();
@Output() refreshTreeEmitter = new EventEmitter<boolean>();
@Output() countSelectedChange = new EventEmitter<number>();
label: string;
isPrimitive = false;
isNested = false;
isList = false;
isStaticValue = false;
timestampProperty = false;
showFieldStatus = false;
runtimeType: string;
originalRuntimeType: string;
originalRuntimeName: string;
originalProperty: EventPropertyUnion;
constructor(
private staticValueService: StaticValueTransformService,
private dialogService: DialogService,
private epUtils: EventPropertyUtilsService,
private shepherdService: ShepherdService,
) {}
ngOnInit() {
this.label = this.getLabel(this.node.data);
this.isPrimitive = this.isEventPropertyPrimitive(this.node.data);
this.isList = this.isEventPropertyList(this.node.data);
this.isNested = this.isEventPropertyNested(this.node.data);
this.isStaticValue = this.staticValueService.isStaticValueProperty(
this.node.data.elementId,
);
this.timestampProperty = this.isTimestampProperty(this.node.data);
if (this.node.data instanceof EventProperty) {
this.originalProperty = this.epUtils.findPropertyByElementId(
this.originalEventSchema.eventProperties,
this.node.data.elementId,
);
this.checkAndDisplayProperties();
}
if (!this.node.data.propertyScope) {
this.node.data.propertyScope = 'MEASUREMENT_PROPERTY';
}
}
private checkAndDisplayProperties() {
if (this.originalProperty) {
this.applyDisplayedProperties(this.originalProperty);
} else {
this.applyDisplayedProperties(this.node.data);
}
}
private applyDisplayedProperties(ep: EventProperty) {
this.originalRuntimeName = ep.runtimeName;
this.showFieldStatus =
this.fieldStatusInfo &&
this.fieldStatusInfo[this.originalRuntimeName] !== undefined;
if (this.isPrimitive) {
this.originalRuntimeType = this.parseType(
(ep as EventPropertyPrimitive).runtimeType,
);
this.runtimeType = this.parseType(
(this.node.data as EventPropertyPrimitive).runtimeType,
);
}
}
private parseType(runtimeType: string) {
return runtimeType.split('#')[1].toUpperCase();
}
private isEventPropertyPrimitive(instance: EventProperty): boolean {
return instance instanceof EventPropertyPrimitive;
}
private isEventPropertyNested(instance: EventProperty): boolean {
return instance instanceof EventPropertyNested;
}
private isEventPropertyList(instance: EventProperty): boolean {
return instance instanceof EventPropertyList;
}
public getLabel(eventProperty: EventProperty) {
if (eventProperty.label && eventProperty.label !== '') {
return eventProperty.label;
} else if (
eventProperty.runtimeName !== undefined &&
eventProperty.runtimeName !== ''
) {
return eventProperty.runtimeName;
}
if (this.isEventPropertyNested(eventProperty)) {
return 'Nested Property';
}
if (eventProperty instanceof EventSchema) {
return '';
}
return 'Property';
}
isTimestampProperty(node) {
if (
node.domainProperties &&
node.domainProperties.some(
dp => dp === 'http://schema.org/DateTime',
)
) {
node.runtimeType = 'http://www.w3.org/2001/XMLSchema#long';
return true;
} else {
return false;
}
}
public openEditDialog(data): void {
const dialogRef = this.dialogService.open(EditEventPropertyComponent, {
panelType: PanelType.SLIDE_IN_PANEL,
title: 'Edit field ' + data.runtimeName,
width: '50vw',
data: {
property: data,
originalProperty: this.originalProperty,
isEditable: this.isEditable,
},
});
this.shepherdService.trigger('adapter-edit-field-clicked');
dialogRef.afterClosed().subscribe(refresh => {
this.timestampProperty = this.isTimestampProperty(this.node.data);
this.label = this.getLabel(this.node.data);
this.checkAndDisplayProperties();
this.refreshTreeEmitter.emit(true);
});
}
public selectProperty(id: string, eventProperties: any): void {
if (!this.isEditable) {
return;
}
eventProperties = eventProperties || this.eventSchema.eventProperties;
for (const eventProperty of eventProperties) {
if (
eventProperty.eventProperties &&
eventProperty.eventProperties.length > 0
) {
if (eventProperty.id === id) {
if (eventProperty.selected) {
eventProperty.selected = undefined;
this.countSelected--;
this.selectProperty(
'none',
eventProperty.eventProperties,
);
} else {
eventProperty.selected = true;
this.countSelected++;
this.selectProperty(
'all',
eventProperty.eventProperties,
);
}
} else if (id === 'all') {
eventProperty.selected = true;
this.countSelected++;
this.selectProperty('all', eventProperty.eventProperties);
} else if (id === 'none') {
eventProperty.selected = undefined;
this.countSelected--;
this.selectProperty('none', eventProperty.eventProperties);
} else {
this.selectProperty(id, eventProperty.eventProperties);
}
} else {
if (eventProperty.id === id) {
if (eventProperty.selected) {
eventProperty.selected = undefined;
this.countSelected--;
} else {
eventProperty.selected = true;
this.countSelected++;
}
} else if (id === 'all') {
eventProperty.selected = true;
this.countSelected++;
} else if (id === 'none') {
eventProperty.selected = undefined;
this.countSelected--;
}
}
}
this.countSelectedChange.emit(this.countSelected);
this.refreshTreeEmitter.emit(false);
}
public addNestedProperty(eventProperty: EventPropertyNested): void {
const uuid: string = UUID.UUID();
if (!eventProperty.eventProperties) {
eventProperty.eventProperties = new Array<EventPropertyUnion>();
}
const property: EventPropertyNested = new EventPropertyNested();
property.elementId = uuid;
eventProperty.eventProperties.push(property);
this.refreshTreeEmitter.emit(false);
}
}