summaryrefslogtreecommitdiffstats
path: root/sdc-workflow-designer-ui/src/app/components/editable-property/editable-property.component.ts
blob: 7f6ffbe22106732602e45e314cd64198343b9213 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
 * Copyright (c) 2017 ZTE Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and the Apache License 2.0 which both accompany this distribution,
 * and are available at http://www.eclipse.org/legal/epl-v10.html
 * and http://www.apache.org/licenses/LICENSE-2.0
 *
 * Contributors:
 *     ZTE - initial API and implementation and/or initial documentation
 */

import {Component, EventEmitter, Input, Output, ViewChild} from "@angular/core";
import {TranslateService} from "@ngx-translate/core";
import {isArray, isObject} from "util";
import {ModelService} from "../../services/model.service";
import {NoticeService} from "../../services/notice.service";
import {NodeType} from "../../model/workflow/node-type.enum";
import {ValueSource} from "../../model/value-source.enum";
import {JsPlumbService} from "../../services/jsplumb.service";
import {WorkflowNode} from "../../model/workflow/workflow-node";

/**
 * node or workflow-line name
 */
@Component({
    selector: 'wfm-editable-property',
    templateUrl: 'editable-property.component.html',
    styleUrls: ['./editable-property.component.css']
})
export class EditablePropertyComponent {
    @Input() public value: string;
    @Output() public valueChange = new EventEmitter<string>();
    @ViewChild('editInput') private editInput: any;

    public editValue = '';
    public editable = false;

    public preEdit(): void {
        if (!this.editable) {
            this.editable = true;
            this.editValue = this.value;
        }
    }

    public afterEdit(): void {
        if (this.editable) {
            this.editable = false;
            if (this.value === this.editValue) {
                return;
            }

            if (this.editInput.wfInput.valid) {
                this.value = this.editValue;
                this.valueChange.emit(this.value);
            } else {
                this.editValue = this.value;
            }
        }
    }

    /*private validate(): boolean {
        const nodes = this.modelService.getNodes();
        const existNode = nodes.find(node => node.id === this.editValue);
        if (existNode) {
            this.translate.get('WORKFLOW.MSG.NODE_ID_SAME', {value: existNode.id}).subscribe((res: string) => {
                this.notice.error(res, 10000);
            });
            return false;
        }
        return true;
    }

    private changeReferencedValue(): void {
        const newNodeConnections = [];
        const nodes = this.modelService.getNodes();
        nodes.forEach((node: any) => {
            this.changeConnectionReferencedValue(node, this.value, this.editValue);

            if (node.type === NodeType[NodeType.restTask]) {
                const parameters = node.parameters || [];
                parameters.forEach(param => {
                    this.changeRestTaskReferencedValue(param, this.value, this.editValue);
                });
            }
        });
    }

    private changeConnectionReferencedValue(node: WorkflowNode, oldValue: string, newValue: string): void {
        node.connection.forEach(connection => {
            if (connection.sourceRef === oldValue) {
                connection.sourceRef = newValue;
            } else if (connection.targetRef === oldValue) {
                connection.targetRef = newValue;
            }
        });
    }

    // 当restTask类型的节点的属性中valueSource是Plan时,value的值为引用其他节点id
    // value格式为[restTask_2].[responseBody].[name],可能有更多层,当时第一个[]里面的值为被引用节点的id
    private changeRestTaskReferencedValue(param: any, oldValue: string, newValue: string): void {
        if (param.valueSource === ValueSource[ValueSource.Plan]) {
            const value = param.value || '';
            const index = value.indexOf('].[');
            if (index > -1) {
                const nodeId = value.substring(1, index);
                if (nodeId === oldValue) {
                    param.value = '[' + newValue + value.substring(index);
                }
            }
        } else if (param.valueSource === ValueSource[ValueSource.Definition]) {
            const value = param.value;
            if (isArray(value)) {
                value.forEach(subValue => {
                    this.changeRestTaskReferencedValue(subValue, oldValue, newValue);
                });
            } else if (isObject(value)) {
                this.changeRestTaskReferencedValue(value, oldValue, newValue);
            }
        }
    }*/
}