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
123
124
125
126
127
128
129
|
import { observer } from "mobx-react";
import 'react-image-lightbox/style.css'; // This only needs to be imported once in your app
import { Document } from '../../../fields/Document';
import { FieldWaiting, Field } from '../../../fields/Field';
import { KeyStore } from '../../../fields/KeyStore';
import { FieldView, FieldViewProps } from './FieldView';
import "./KeyValueBox.scss";
import { KeyValuePair } from "./KeyValuePair";
import React = require("react")
import { CompileScript, ToField } from "../../util/Scripting";
import { Key } from '../../../fields/Key';
import { observable, action } from "mobx";
@observer
export class KeyValueBox extends React.Component<FieldViewProps> {
public static LayoutString(fieldStr: string = "DataKey") { return FieldView.LayoutString(KeyValueBox, fieldStr) }
@observable private _keyInput: string = "";
@observable private _valueInput: string = "";
constructor(props: FieldViewProps) {
super(props);
}
shouldComponentUpdate() {
return false;
}
@action
onEnterKey = (e: React.KeyboardEvent): void => {
if (e.key == 'Enter') {
if (this._keyInput && this._valueInput) {
let doc = this.props.doc.GetT(KeyStore.Data, Document);
if (!doc || doc == FieldWaiting) {
return
}
let realDoc = doc;
let script = CompileScript(this._valueInput, undefined, true);
if (!script.compiled) {
return;
}
let field = script();
if (field instanceof Field) {
realDoc.Set(new Key(this._keyInput), field);
} else {
let dataField = ToField(field);
if (dataField) {
realDoc.Set(new Key(this._keyInput), dataField);
}
}
this._keyInput = ""
this._valueInput = ""
}
}
}
onPointerDown = (e: React.PointerEvent): void => {
if (e.buttons === 1 && this.props.isSelected()) {
e.stopPropagation();
}
}
onPointerWheel = (e: React.WheelEvent): void => {
e.stopPropagation();
}
createTable = () => {
let doc = this.props.doc.GetT(KeyStore.Data, Document);
if (!doc || doc == FieldWaiting) {
return <tr><td>Loading...</td></tr>
}
let realDoc = doc;
let ids: { [key: string]: string } = {};
let protos = doc.GetAllPrototypes();
for (const proto of protos) {
proto._proxies.forEach((val: any, key: string) => {
if (!(key in ids)) {
ids[key] = key;
}
})
}
let rows: JSX.Element[] = [];
let i = 0;
for (let key in ids) {
rows.push(<KeyValuePair doc={realDoc} rowStyle={"keyValueBox-" + (i++ % 2 ? "oddRow" : "evenRow")} fieldId={key} key={key} />)
}
return rows;
}
@action
keyChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
this._keyInput = e.currentTarget.value;
}
@action
valueChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
this._valueInput = e.currentTarget.value;
}
newKeyValue = () => {
return (
<tr>
<td><input type="text" value={this._keyInput} placeholder="Key" onChange={this.keyChanged} /></td>
<td><input type="text" value={this._valueInput} placeholder="Value" onChange={this.valueChanged} onKeyPress={this.onEnterKey} /></td>
</tr>
)
}
render() {
return (<div className="keyValueBox-cont" onWheel={this.onPointerWheel}>
<table className="keyValueBox-table">
<tbody>
<tr className="keyValueBox-header">
<th>Key</th>
<th>Fields</th>
</tr>
{this.createTable()}
{this.newKeyValue()}
</tbody>
</table>
</div>)
}
}
|