@dualbox/editor 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/js/src/GraphEditor.js +159 -0
- package/js/src/c/GraphController.js +646 -0
- package/js/src/libs/CodeMirror.js +8 -0
- package/js/src/libs/fontawesome.js +1 -0
- package/js/src/libs/jsoneditor.css +2 -0
- package/js/src/libs/jsoneditor.js +4 -0
- package/js/src/m/DualboxUtils.js +35 -0
- package/js/src/m/GraphModel.js +2167 -0
- package/js/src/m/History.js +94 -0
- package/js/src/m/Merger.js +357 -0
- package/js/src/v/AppManager.js +61 -0
- package/js/src/v/CanvasSizeHandler.js +136 -0
- package/js/src/v/ContextMenu.css +45 -0
- package/js/src/v/ContextMenu.js +239 -0
- package/js/src/v/GraphView.js +928 -0
- package/js/src/v/PlumbStyle.js +254 -0
- package/js/src/v/Selector.js +239 -0
- package/js/src/v/TemplateManager.js +79 -0
- package/js/src/v/Translater.js +174 -0
- package/js/src/v/Utils.js +7 -0
- package/js/src/v/Zoomer.js +201 -0
- package/js/src/v/templates/addNode.css +45 -0
- package/js/src/v/templates/addNode.html +62 -0
- package/js/src/v/templates/addNode.js +34 -0
- package/js/src/v/templates/debugNodeInfos.css +5 -0
- package/js/src/v/templates/debugNodeInfos.html +336 -0
- package/js/src/v/templates/debugNodeInfos.js +31 -0
- package/js/src/v/templates/editMainSettings.css +67 -0
- package/js/src/v/templates/editMainSettings.html +265 -0
- package/js/src/v/templates/editMainSettings.js +240 -0
- package/js/src/v/templates/editNodeSettings.css +86 -0
- package/js/src/v/templates/editNodeSettings.html +539 -0
- package/js/src/v/templates/editNodeSettings.js +356 -0
- package/js/src/v/templates/graphNode.css +333 -0
- package/js/src/v/templates/graphNode.html +227 -0
- package/js/src/v/templates/graphNode.js +412 -0
- package/js/src/v/templates/main.css +353 -0
- package/js/src/v/templates/main.html +149 -0
- package/js/src/v/templates/main.js +511 -0
- package/js/src/v/templates/searchResults.css +50 -0
- package/js/src/v/templates/searchResults.html +46 -0
- package/js/src/v/templates/searchResults.js +176 -0
- package/package.json +3 -2
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
@{ var utils = require('../Utils') }
|
|
2
|
+
|
|
3
|
+
@!(data)
|
|
4
|
+
<div class="edit-main-panel h100" id="edit-main-panel">
|
|
5
|
+
<div style="padding-left: 10px; padding-top: 10px; padding-right: 10px;">
|
|
6
|
+
<h2 class="edit-dualbox-app">
|
|
7
|
+
<div class="dualbox-node-name">
|
|
8
|
+
<span class="text-truncate d-inline-block" style="width: 290px">Application</span>
|
|
9
|
+
</div>
|
|
10
|
+
</h2>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="edit-body">
|
|
14
|
+
<div class="card">
|
|
15
|
+
<div class="card-header" id="dualbox-main-desc" data-toggle="collapse" data-target="#dualbox-main-desc-collapse" aria-expanded="false" aria-controls="dualbox-main-desc-collapse">
|
|
16
|
+
<h5 class="mb-0 btn-link">Description</h5>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<div id="dualbox-main-desc-collapse" class="collapse show" aria-labelledby="dualbox-main-desc" data-parent="#edit-main-panel">
|
|
20
|
+
<div class="card-body">
|
|
21
|
+
<p class="application-description">@(data.app.getDescription() || "[No description available]") <button class="btn btn-xs btn-light btn-edit-app-description"><i class="fa fa-edit"></i></button></p>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="card">
|
|
26
|
+
<div class="card-header" id="dualbox-main-events" data-toggle="collapse" data-target="#dualbox-main-events-collapse" aria-expanded="false" aria-controls="dualbox-main-events-collapse">
|
|
27
|
+
<h5 class="mb-0 btn-link">Events</h5>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div id="dualbox-main-events-collapse" class="collapse" aria-labelledby="dualbox-main-events" data-parent="#edit-main-panel">
|
|
31
|
+
<div class="card-body" style="padding-left: 4px; padding-right: 4px;">
|
|
32
|
+
<button class="btn btn-success btn-add-app-event mb-3">Add application event</button>
|
|
33
|
+
|
|
34
|
+
@{var keys = data.app.getEventsNames() }
|
|
35
|
+
@for(var k=0; k<keys.length; k++) {
|
|
36
|
+
@{ var key = keys[k]; }
|
|
37
|
+
<!--<p>@(key)</p>-->
|
|
38
|
+
<div class="card">
|
|
39
|
+
<div class="card-header" id="dualbox-event-@(key)" data-toggle="collapse" data-target="#dualbox-event-@(key)-collapse" aria-expanded="false" aria-controls="dualbox-event-@(key)-collapse">
|
|
40
|
+
<h5 class="mb-0 btn-link" style="font-size: 16px; font-weight: normal;">
|
|
41
|
+
@(key)
|
|
42
|
+
<div class="float-right d-inline-block">
|
|
43
|
+
<button class="btn btn-light btn-xs btn-rename-app-event" data-event="@(key)">
|
|
44
|
+
<i class="fa fa-edit"></i>
|
|
45
|
+
</button>
|
|
46
|
+
<button class="btn btn-danger btn-xs btn-remove-app-event" data-event="@(key)">
|
|
47
|
+
<i class="fa fa-minus"></i>
|
|
48
|
+
</button>
|
|
49
|
+
</div>
|
|
50
|
+
</h5>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div id="dualbox-event-@(key)-collapse" class="collapse" aria-labelledby="dualbox-event-@(key)" data-parent="#dualbox-main-events">
|
|
54
|
+
<div class="card-body" style="padding-left: 4px; padding-right: 4px;">
|
|
55
|
+
<h5 style="font-size: 16px; text-decoration: underline; font-weight: normal;">Description</h5>
|
|
56
|
+
<p>@(data.app.getEventDescription(key) || "[no description available]") <button class="btn btn-xs btn-light btn-edit-event-description" data-event="@key"><i class="fa fa-edit"></i></button></p>
|
|
57
|
+
<h5 class="mt-3" style="font-size: 16px; text-decoration: underline; font-weight: normal;">Triggers</h5>
|
|
58
|
+
|
|
59
|
+
<table class="table-desc table-striped" style="font-size: 12px!important;">
|
|
60
|
+
<thead class="thead-dark">
|
|
61
|
+
<th>Target</th>
|
|
62
|
+
<th>Event</th>
|
|
63
|
+
<th>If</th>
|
|
64
|
+
<th>Data</th>
|
|
65
|
+
<th>Action</th>
|
|
66
|
+
</thead>
|
|
67
|
+
<tbody>
|
|
68
|
+
@{ var events = data.app.getEventIn(key); }
|
|
69
|
+
@for(var i=0; i<events.length; i++) {
|
|
70
|
+
@{ var evt = events[i]; }
|
|
71
|
+
<tr data-index="@(i)">
|
|
72
|
+
<td>
|
|
73
|
+
@if(evt.node !== undefined) {
|
|
74
|
+
<select class="form-control form-control-sm select-event-target" dualbox-target="events-in" data-event="@key" data-index="@(i)" >
|
|
75
|
+
@{ var nodes = data.app.m.getNodes("ui"); }
|
|
76
|
+
@for(var j=0; j<nodes.length; j++) {
|
|
77
|
+
@{ var node = nodes[j]; }
|
|
78
|
+
@if( node.getEventsNames().length !== 0 ) {
|
|
79
|
+
<option value="@(node.getGraphId())" @if(node.getGraphId()===evt.node){selected}>@(node.getGraphId())</option>
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
</select>
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
<span>@(evt.selector)</span>
|
|
86
|
+
}
|
|
87
|
+
</td>
|
|
88
|
+
<td>
|
|
89
|
+
<select class="form-control form-control-sm select-event-name" dualbox-target="events-in" data-event="@key" data-index="@(i)" >
|
|
90
|
+
@if(evt.node) {
|
|
91
|
+
<!-- options will be dynamically changed when target change -->
|
|
92
|
+
@{ var targetNode = data.app.m.getNode(evt.node); }
|
|
93
|
+
@{ var targetEvents = targetNode.getEventsNames(); }
|
|
94
|
+
@for(var j=0; j<targetEvents.length; j++) {
|
|
95
|
+
@{ var targetEvent = targetEvents[j]; }
|
|
96
|
+
<option value="@(targetEvent)" @if(evt.event===targetEvent){selected}>@(targetEvent)</option>
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
<option value="hide">hide</option>
|
|
101
|
+
<option value="show">show</option>
|
|
102
|
+
}
|
|
103
|
+
</select>
|
|
104
|
+
</td>
|
|
105
|
+
<td>
|
|
106
|
+
<input class="form-control form-control-sm event-if" type="text" dualbox-target="events-in" data-event="@key" data-index="@(i)" value="@(evt.if)" />
|
|
107
|
+
</td>
|
|
108
|
+
<td>
|
|
109
|
+
<input class="form-control form-control-sm event-data" type="text" dualbox-target="events-in" data-event="@key" data-index="@(i)" value="@(evt.data)" />
|
|
110
|
+
</td>
|
|
111
|
+
<td>
|
|
112
|
+
<button class="btn btn-danger btn-xs btn-remove-in-event" data-event="@key" data-index="@(i)" >
|
|
113
|
+
<i class="fa fa-minus"></i>
|
|
114
|
+
</button>
|
|
115
|
+
</td>
|
|
116
|
+
</tr>
|
|
117
|
+
}
|
|
118
|
+
<tr>
|
|
119
|
+
<td colspan="5" style="padding-top: 0px; padding-bottom: 0px;">
|
|
120
|
+
<button class="btn btn-sm btn-add-subevent" data-event="@key" style="width: 100%;">Add a subevent</button>
|
|
121
|
+
</td>
|
|
122
|
+
<tr>
|
|
123
|
+
</tbody>
|
|
124
|
+
</table>
|
|
125
|
+
|
|
126
|
+
<h5 class="mt-3" style="font-size: 16px; text-decoration: underline; font-weight: normal;">Callback</h5>
|
|
127
|
+
|
|
128
|
+
<table class="table-desc table-striped" style="font-size: 12px!important;">
|
|
129
|
+
<thead class="thead-dark">
|
|
130
|
+
<th>Target</th>
|
|
131
|
+
<th>Event</th>
|
|
132
|
+
<th>Action</th>
|
|
133
|
+
</thead>
|
|
134
|
+
<tbody>
|
|
135
|
+
@{ var evt = data.app.getEventOut(key); }
|
|
136
|
+
@if( evt ) {
|
|
137
|
+
<tr data-index="@(i)">
|
|
138
|
+
<td>
|
|
139
|
+
@if(evt.node !== undefined) {
|
|
140
|
+
<select class="form-control form-control-sm select-event-target" dualbox-target="events-out" data-index="@(i)" >
|
|
141
|
+
@{ var nodes = data.app.m.getNodes("ui"); }
|
|
142
|
+
@for(var j=0; j<nodes.length; j++) {
|
|
143
|
+
@{ var node = nodes[j]; }
|
|
144
|
+
@if( node.getEventsNames().length !== 0 ) {
|
|
145
|
+
<option value="@(node.getGraphId())" @if(node.getGraphId()===evt.node){selected}>@(node.getGraphId())</option>
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
</select>
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
<span>@(evt.selector)</span>
|
|
152
|
+
}
|
|
153
|
+
</td>
|
|
154
|
+
<td>
|
|
155
|
+
<select class="form-control form-control-sm select-event-name" dualbox-target="events-out" data-index="@(i)" >
|
|
156
|
+
<!-- options will be dynamically changed when target change -->
|
|
157
|
+
@{ var targetNode = data.app.m.getNode(evt.node); }
|
|
158
|
+
@{ var targetEvents = targetNode.getEventsNames(); }
|
|
159
|
+
@for(var j=0; j<targetEvents.length; j++) {
|
|
160
|
+
@{ var targetEvent = targetEvents[j]; }
|
|
161
|
+
<option value="@(targetEvent)" @if(evt.event===targetEvent){selected}>@(targetEvent)</option>
|
|
162
|
+
}
|
|
163
|
+
</select>
|
|
164
|
+
</td>
|
|
165
|
+
<td>
|
|
166
|
+
<button class="btn btn-danger btn-xs btn-remove-out-event" data-event="@key">
|
|
167
|
+
<i class="fa fa-minus"></i>
|
|
168
|
+
</button>
|
|
169
|
+
</td>
|
|
170
|
+
</tr>
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
<tr>
|
|
174
|
+
<td colspan="3" style="padding-top: 0px; padding-bottom: 0px;">
|
|
175
|
+
<button class="btn btn-sm btn-add-callback" data-event="@key" style="width: 100%;">Add a callback</button>
|
|
176
|
+
</td>
|
|
177
|
+
</tr>
|
|
178
|
+
}
|
|
179
|
+
</tbody>
|
|
180
|
+
</table>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
}
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div class="modal edit-value-modal" tabindex="-1" role="dialog">
|
|
191
|
+
<div class="modal-dialog" role="document">
|
|
192
|
+
<div class="modal-content">
|
|
193
|
+
<div class="modal-header">
|
|
194
|
+
<h5 class="modal-title">Edit value</h5>
|
|
195
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
|
196
|
+
<span aria-hidden="true">×</span>
|
|
197
|
+
</button>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="modal-body">
|
|
200
|
+
<div>
|
|
201
|
+
<div class="form-check">
|
|
202
|
+
<input type="radio" class="form-check-input set-value unset-value" id="unset-value" name="set-value" value="unset-value" checked>
|
|
203
|
+
<label class="form-check-label" for="unset-value">
|
|
204
|
+
don't set a value
|
|
205
|
+
</label>
|
|
206
|
+
</div>
|
|
207
|
+
<div class="form-check">
|
|
208
|
+
<input type="radio" class="form-check-input set-value set-value-null" id="set-value-null" name="set-value" value="set-value-null">
|
|
209
|
+
<label class="form-check-label" for="set-value-null">
|
|
210
|
+
set null
|
|
211
|
+
</label>
|
|
212
|
+
</div>
|
|
213
|
+
<div class="form-check">
|
|
214
|
+
<input type="radio" class="form-check-input set-value set-value-type" id="set-value-type" name="set-value" value="set-value-type" aria-label="Set a value of type">
|
|
215
|
+
<div class="form-inline form-check-label" style="height: 24px;">
|
|
216
|
+
<label for="set-value-type">
|
|
217
|
+
set a value of type:
|
|
218
|
+
<select class="form-control choose-value-type d-inline-block form-control-sm ml-2">
|
|
219
|
+
<option value="string">String</option>
|
|
220
|
+
<option value="number">Number</option>
|
|
221
|
+
<option value="boolean">Boolean</option>
|
|
222
|
+
<option value="object">Object</option>
|
|
223
|
+
</select>
|
|
224
|
+
</label>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
<div class="has-value" style="display: none;">
|
|
229
|
+
<hr/>
|
|
230
|
+
<div class="define-value define-boolean" style="display: none;">
|
|
231
|
+
<div class="form-inline">
|
|
232
|
+
<label>Value: </label>
|
|
233
|
+
<select class="form-control form-control-sm bool-value d-inline-block ml-2">
|
|
234
|
+
<option value=true>True</option>
|
|
235
|
+
<option value=false>False</option>
|
|
236
|
+
</select>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="define-value define-number" style="display: none;">
|
|
240
|
+
<div class="form-inline">
|
|
241
|
+
<label>Value: </label>
|
|
242
|
+
<input type="number" class="form-control form-control-sm number-value ml-2"/>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
<div class="define-value define-string" style="display: none;">
|
|
246
|
+
<div class="form-inline">
|
|
247
|
+
<label>Value: </label>
|
|
248
|
+
<input type="text" class="form-control form-control-sm text-value ml-2"/>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
<div class="define-value define-object" style="display: none;">
|
|
252
|
+
<label>Value: </label>
|
|
253
|
+
<div class="json-editor" style="height: 400px;"></div>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
<div class="modal-footer">
|
|
258
|
+
<button type="button" class="btn btn-primary btn-save">Save changes</button>
|
|
259
|
+
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
|
260
|
+
</div>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
const swal = require('sweetalert2');
|
|
2
|
+
const _ = require('lodash');
|
|
3
|
+
|
|
4
|
+
const JSONEditor = require('@dualbox/dualbox-lib-jsoneditor');
|
|
5
|
+
|
|
6
|
+
var TemplateBinds = function(view, div, data) {
|
|
7
|
+
var editor = null;
|
|
8
|
+
|
|
9
|
+
div.ready(() => {
|
|
10
|
+
// bind the json editor
|
|
11
|
+
editor = new JSONEditor(div.find('.json-editor')[0], { modes: ['tree', 'code', 'text' ]});
|
|
12
|
+
editor.set({});
|
|
13
|
+
|
|
14
|
+
div.find('button[data-toggle="tooltip"]').tooltip();
|
|
15
|
+
|
|
16
|
+
div.find('.btn-edit-app-description').click(function(e) {
|
|
17
|
+
swal({
|
|
18
|
+
input: 'text',
|
|
19
|
+
title: 'Enter the description',
|
|
20
|
+
}).then((result) => {
|
|
21
|
+
view.c.setAppDescription(result.value);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
div.find('.btn-edit-event-description').click(function(e) {
|
|
26
|
+
var eventName = $(e.target).attr('data-event');
|
|
27
|
+
|
|
28
|
+
swal({
|
|
29
|
+
input: 'text',
|
|
30
|
+
title: 'Enter the description',
|
|
31
|
+
}).then((result) => {
|
|
32
|
+
view.c.setAppEventDescription(eventName, result.value);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
div.find('.btn-remove-app-event').click(function(e) {
|
|
37
|
+
var name = $(this).attr('data-event');
|
|
38
|
+
view.c.removeAppEvent(name);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
div.find('.btn-rename-app-event').click(function(e) {
|
|
42
|
+
var name = $(this).attr('data-event');
|
|
43
|
+
swal({
|
|
44
|
+
input: 'text',
|
|
45
|
+
title: 'Enter the new event name',
|
|
46
|
+
}).then((result) => {
|
|
47
|
+
if( result.value ) {
|
|
48
|
+
view.c.renameAppEvent(name, result.value);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
div.find('.event-if').change(function(e) {
|
|
54
|
+
var index = parseInt($(this).attr('data-index'));
|
|
55
|
+
var val = $(this).val();
|
|
56
|
+
view.c.setEventIf( "#application-" + $(this).attr('dualbox-target') + '-' + $(this).attr('data-event'), index, val );
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
div.find('.event-data').change(function(e) {
|
|
60
|
+
var index = parseInt($(this).attr('data-index'));
|
|
61
|
+
var val = $(this).val();
|
|
62
|
+
view.c.setEventData( "#application-" + $(this).attr('dualbox-target') + '-' + $(this).attr('data-event'), index, val );
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
div.find('.select-event-target').change(function(e) {
|
|
66
|
+
var target = $(this).val();
|
|
67
|
+
|
|
68
|
+
// change options of closest .select-event-name according to this new target
|
|
69
|
+
var targetNode = view.m.getNode(target);
|
|
70
|
+
var targetEvents = targetNode.getEventsNames();
|
|
71
|
+
var select = $(this).closest('tr').find('.select-event-name');
|
|
72
|
+
select.html('');
|
|
73
|
+
_.each(targetEvents, (eventName) => {
|
|
74
|
+
select.append( $('<option/>', {
|
|
75
|
+
value: eventName
|
|
76
|
+
}).append(eventName));
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
var index = parseInt($(this).attr('data-index'));
|
|
80
|
+
view.c.setEventTarget( "#application-" + $(this).attr('dualbox-target') + '-' + $(this).attr('data-event'), index, target );
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
div.find('.select-event-name').change(function(e) {
|
|
84
|
+
var index = parseInt($(this).attr('data-index'));
|
|
85
|
+
var val = $(this).val();
|
|
86
|
+
view.c.setEventName( "#application-" + $(this).attr('dualbox-target') + '-' + $(this).attr('data-event'), index, val );
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
div.find('.btn-add-app-event').click(function(e) {
|
|
90
|
+
swal({
|
|
91
|
+
input: 'text',
|
|
92
|
+
title: 'Enter the event name',
|
|
93
|
+
}).then((result) => {
|
|
94
|
+
view.c.addAppEvent(result.value);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
div.find('.btn-remove-in-event').click(function(e) {
|
|
99
|
+
var eventName = $(this).attr('data-event');
|
|
100
|
+
var index = parseInt($(this).attr('data-index'));
|
|
101
|
+
view.c.removeAppInEvent(eventName, index);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
div.find('.btn-remove-out-event').click(function(e) {
|
|
105
|
+
var eventName = $(this).attr('data-event');
|
|
106
|
+
view.c.removeAppOutEvent(eventName);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
div.find('.btn-add-subevent').click(function(e) {
|
|
110
|
+
var eventName = $(this).attr('data-event');
|
|
111
|
+
view.c.addSubEvent(eventName);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
div.find('.btn-add-callback').click(function(e) {
|
|
115
|
+
var eventName = $(this).attr('data-event');
|
|
116
|
+
view.c.addCallback(eventName);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
div.find('.setValue').click(function(e) {
|
|
120
|
+
e.preventDefault();
|
|
121
|
+
e.stopPropagation();
|
|
122
|
+
|
|
123
|
+
var modal = div.find('.edit-value-modal');
|
|
124
|
+
modal.modal('show');
|
|
125
|
+
|
|
126
|
+
// set the link data on the modal
|
|
127
|
+
modal.attr('data-id', $(this).attr('data-id'));
|
|
128
|
+
modal.attr('data-type', $(this).attr('data-type'));
|
|
129
|
+
modal.attr('data-name', $(this).attr('data-name'));
|
|
130
|
+
modal.attr('data-value', $(this).attr('data-value'));
|
|
131
|
+
modal.attr('data-valueType', $(this).attr('data-valueType'));
|
|
132
|
+
|
|
133
|
+
// choose the right settings according to the link data
|
|
134
|
+
if( $(this).attr('data-undefined') ) {
|
|
135
|
+
modal.find('.unset-value').prop('checked', true);
|
|
136
|
+
}
|
|
137
|
+
else if( $(this).attr('data-null') ) {
|
|
138
|
+
modal.find('.set-value-null').prop('checked', true);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
modal.find('.set-value-type').prop('checked', true);
|
|
142
|
+
modal.find('.has-value').show();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
var valueType = $(this).attr('data-valueType');
|
|
146
|
+
if( valueType ) {
|
|
147
|
+
modal.find('.choose-value-type').val( valueType );
|
|
148
|
+
modal.find('.define-value').hide();
|
|
149
|
+
modal.find('.define-' + valueType).show();
|
|
150
|
+
|
|
151
|
+
// set the existing value
|
|
152
|
+
var value = $(this).attr('data-value');
|
|
153
|
+
switch(valueType) {
|
|
154
|
+
case "string": val = modalSetValue.find('.text-value').val(value); break;
|
|
155
|
+
case "number": val = modalSetValue.find('.number-value').val(parseFloat(value)); break;
|
|
156
|
+
case "boolean": val = modalSetValue.find('.bool-value').val(value); break;
|
|
157
|
+
case "object": val = editor.set((value && JSON.parse(value)) || {}); break;
|
|
158
|
+
default:
|
|
159
|
+
console.log('couldnt find value type: ' + valueType);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// set up the modal control (for setting a value)
|
|
165
|
+
var modalSetValue = div.find('.edit-value-modal');
|
|
166
|
+
modalSetValue.find('.set-value-type').change(function(e) {
|
|
167
|
+
if( $(this).is(':checked') ) {
|
|
168
|
+
modalSetValue.find('.has-value').show();
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
modalSetValue.find('.has-value').hide();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
var valueType = modalSetValue.find('.choose-value-type').val();
|
|
175
|
+
modalSetValue.find('.define-value.define-' + valueType).show();
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
modalSetValue.find('.choose-value-type').change(function(e) {
|
|
179
|
+
var valueType = $(this).val();
|
|
180
|
+
modalSetValue.find('.define-value').hide();
|
|
181
|
+
modalSetValue.find('.define-' + valueType).show();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
modalSetValue.find('.btn-save').click(function(e) {
|
|
185
|
+
var val;
|
|
186
|
+
if( modalSetValue.find('.unset-value').is(':checked') ) {
|
|
187
|
+
// remove default value
|
|
188
|
+
val = undefined;
|
|
189
|
+
}
|
|
190
|
+
else if( modalSetValue.find('.set-value-null').is(':checked') ) {
|
|
191
|
+
val = null;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
var type = modalSetValue.find('.choose-value-type').val();
|
|
195
|
+
switch( type ) {
|
|
196
|
+
case "string": val = modalSetValue.find('.text-value').val(); break;
|
|
197
|
+
case "number": val = parseFloat(modalSetValue.find('.number-value').val()); break;
|
|
198
|
+
case "boolean": val = modalSetValue.find('.bool-value').val() == "true"; break;
|
|
199
|
+
case "object": val = editor.get(); break;
|
|
200
|
+
default:
|
|
201
|
+
throw "cant recognize type: " + type;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// set the new value
|
|
206
|
+
var destId = modalSetValue.attr('data-id');
|
|
207
|
+
var destName = modalSetValue.attr('data-name');
|
|
208
|
+
var destType = modalSetValue.attr('data-type'); // "attr" or "input"
|
|
209
|
+
|
|
210
|
+
/* TODO
|
|
211
|
+
if(val !== undefined){
|
|
212
|
+
view.m.getNode(destId).val( destType, destName, val );
|
|
213
|
+
}else{
|
|
214
|
+
view.m.getNode(destId).deleteVal( destType, destName );
|
|
215
|
+
}
|
|
216
|
+
*/
|
|
217
|
+
modalSetValue.modal('hide');
|
|
218
|
+
|
|
219
|
+
var field = $('.' + destType + '-' + destId + '-' + destName); // the display field
|
|
220
|
+
if( val === undefined ) {
|
|
221
|
+
field.text("");
|
|
222
|
+
}
|
|
223
|
+
else if ( val === null ) {
|
|
224
|
+
field.text("null");
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
switch(type) {
|
|
228
|
+
case "string": field.text( '"' + val + '"'); break;
|
|
229
|
+
case "number": field.text(val); break;
|
|
230
|
+
case "boolean": field.text(val ? "true" : "false"); break;
|
|
231
|
+
case "object": field.text('[Object]'); break;
|
|
232
|
+
default:
|
|
233
|
+
throw "cant recognize type: " + type;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
module.exports = TemplateBinds;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
.edit-dualbox-node-id {
|
|
2
|
+
margin-bottom: 0px;
|
|
3
|
+
display: inline-block;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.edit-dualbox-node-package-name {
|
|
7
|
+
font-style: italic;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.btn-edit-dualbox-node-name {
|
|
11
|
+
display: inline-block;
|
|
12
|
+
margin-left: 5px;
|
|
13
|
+
margin-top: -10px;
|
|
14
|
+
position: relative;
|
|
15
|
+
top: -10px;
|
|
16
|
+
vertical-align: bottom;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.module-left-description {
|
|
20
|
+
padding-top: 30px;
|
|
21
|
+
font-size: 12px;
|
|
22
|
+
text-align: center;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.card-settings .card-body {
|
|
26
|
+
font-size: 12px;
|
|
27
|
+
padding-left: 5px;
|
|
28
|
+
padding-right: 5px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.table-desc {
|
|
32
|
+
width: 100%;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.table-desc thead td {
|
|
36
|
+
margin-right: 6px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.table-desc tbody td {
|
|
40
|
+
margin-right: 6px;
|
|
41
|
+
padding-top: 8px;
|
|
42
|
+
padding-bottom: 8px;
|
|
43
|
+
height: 40px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.card-header[data-toggle="collapse"] {
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.card-header[data-toggle="collapse"] h5 {
|
|
51
|
+
user-select: none;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.card-header[data-toggle="collapse"]:hover .btn-link {
|
|
55
|
+
text-decoration: none;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.dualbox-node-name-input {
|
|
59
|
+
display: inline-block;
|
|
60
|
+
max-width: 270px;
|
|
61
|
+
border-radius: 4px;
|
|
62
|
+
padding: 4px 8px 4px 8px;
|
|
63
|
+
font-size: 20px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
.text-value, .number-value, .boolean-value {
|
|
69
|
+
max-width: 140px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.event-if, .event-data {
|
|
73
|
+
max-width: 80px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.select-event-target, .select-event-name, .event-if, .event-data {
|
|
77
|
+
font-size: 12px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.edit-body {
|
|
81
|
+
overflow-y: auto;
|
|
82
|
+
overflow-x: hidden;
|
|
83
|
+
max-height: calc(100% - 80px);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|