@dualbox/editor 1.0.93 → 1.0.94
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/dist/GraphEditor.js +179 -57
- package/js/dist/GraphEditor.min.js +178 -56
- package/js/src/GraphEditor.js +4 -4
- package/js/src/c/GraphController.js +5 -10
- package/js/src/m/GraphModel.js +157 -26
- package/js/src/v/templates/editType.vue +1 -1
- package/js/src/v/templates/main.vue +10 -16
- package/package.json +1 -1
package/js/src/GraphEditor.js
CHANGED
|
@@ -73,7 +73,7 @@ class DualboxEditor {
|
|
|
73
73
|
packages = this.filterPackages(text, packages);
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
return packages;
|
|
76
|
+
return Promise.resolve(packages);
|
|
77
77
|
} else {
|
|
78
78
|
return new Promise((resolve, reject) => {
|
|
79
79
|
attrs.search(text, (err, packages) => {
|
|
@@ -175,7 +175,7 @@ class DualboxEditor {
|
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
// aggregate scores
|
|
178
|
-
|
|
178
|
+
_.each(packages, r => {
|
|
179
179
|
r.score = 0;
|
|
180
180
|
_.each(r.wordscore, (wordScores, field) => {
|
|
181
181
|
let fieldScore = 0;
|
|
@@ -185,9 +185,9 @@ class DualboxEditor {
|
|
|
185
185
|
fieldScore /= words.length;
|
|
186
186
|
r.score += fieldScore * ponderation[field];
|
|
187
187
|
});
|
|
188
|
-
}
|
|
188
|
+
});
|
|
189
189
|
|
|
190
|
-
packages =
|
|
190
|
+
packages = _.filter(packages, r => r.score > 0);
|
|
191
191
|
|
|
192
192
|
// return result sorted by score
|
|
193
193
|
return _.sortBy(packages, r => 1 - (r.score || 0));
|
|
@@ -782,16 +782,11 @@ class GraphController {
|
|
|
782
782
|
var clipboard = await this.getClipboard();
|
|
783
783
|
try {
|
|
784
784
|
var json = JSON.parse(clipboard);
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
await this.e.loadPackages(json);
|
|
791
|
-
this.m.paste(json);
|
|
792
|
-
await this.v.repaint();
|
|
793
|
-
}
|
|
794
|
-
}])
|
|
785
|
+
await this.e.loadPackages(json);
|
|
786
|
+
let validPaste = this.m.paste(json);
|
|
787
|
+
if (validPaste) {
|
|
788
|
+
await this.v.repaint();
|
|
789
|
+
}
|
|
795
790
|
} catch (e) {
|
|
796
791
|
swal.fire("Invalid content for copy/paste", "You must first copy boxes from Dualbox", "error");
|
|
797
792
|
return;
|
package/js/src/m/GraphModel.js
CHANGED
|
@@ -274,47 +274,176 @@ class GraphModel {
|
|
|
274
274
|
paste(json) {
|
|
275
275
|
var currentMetanode = this.getCurrentMetanode();
|
|
276
276
|
|
|
277
|
-
|
|
278
|
-
|
|
277
|
+
var checkValidPaste = () => {
|
|
278
|
+
let valid = true;
|
|
279
|
+
|
|
279
280
|
_.each(json.metamodules, (mmDef, mmName) => {
|
|
280
281
|
var metamodule = _.get(currentMetanode, ["metanodes", mmName]);
|
|
281
|
-
if (metamodule
|
|
282
|
-
|
|
282
|
+
if (metamodule !== undefined) {
|
|
283
|
+
valid = false;
|
|
284
|
+
const Toast = swal.mixin({
|
|
285
|
+
toast: true,
|
|
286
|
+
position: 'bottom-end',
|
|
287
|
+
showConfirmButton: false,
|
|
288
|
+
timer: 5000,
|
|
289
|
+
timerProgressBar: true,
|
|
290
|
+
html: "",
|
|
291
|
+
onOpen: (toast) => {
|
|
292
|
+
toast.addEventListener('mouseenter', swal.stopTimer)
|
|
293
|
+
toast.addEventListener('mouseleave', swal.resumeTimer)
|
|
294
|
+
}
|
|
295
|
+
})
|
|
296
|
+
Toast.fire({
|
|
297
|
+
icon: 'error',
|
|
298
|
+
title: '<span class="text-danger">Invalid paste : metanode ' + mmName + ' already exists here</span>'
|
|
299
|
+
})
|
|
283
300
|
}
|
|
284
|
-
})
|
|
285
|
-
|
|
286
|
-
// paste inputs
|
|
301
|
+
})
|
|
287
302
|
_.each(json.input, (inputDef, inputName) => {
|
|
288
303
|
var input = _.get(currentMetanode, ["input", inputName]);
|
|
289
|
-
if (input
|
|
290
|
-
|
|
304
|
+
if (input !== undefined) {
|
|
305
|
+
valid = false;
|
|
306
|
+
const Toast = swal.mixin({
|
|
307
|
+
toast: true,
|
|
308
|
+
position: 'bottom-end',
|
|
309
|
+
showConfirmButton: false,
|
|
310
|
+
timer: 5000,
|
|
311
|
+
timerProgressBar: true,
|
|
312
|
+
html: "",
|
|
313
|
+
onOpen: (toast) => {
|
|
314
|
+
toast.addEventListener('mouseenter', swal.stopTimer)
|
|
315
|
+
toast.addEventListener('mouseleave', swal.resumeTimer)
|
|
316
|
+
}
|
|
317
|
+
})
|
|
318
|
+
Toast.fire({
|
|
319
|
+
icon: 'error',
|
|
320
|
+
title: '<span class="text-danger">Invalid paste : input ' + inputName + ' already exists here</span>'
|
|
321
|
+
})
|
|
291
322
|
}
|
|
292
|
-
})
|
|
293
|
-
|
|
323
|
+
})
|
|
294
324
|
// paste outputs
|
|
295
325
|
_.each(json.output, (outputDef, outputName) => {
|
|
296
326
|
var output = _.get(currentMetanode, ["output", outputName]);
|
|
297
|
-
if (output
|
|
298
|
-
|
|
327
|
+
if (output !== undefined) {
|
|
328
|
+
valid = false;
|
|
329
|
+
const Toast = swal.mixin({
|
|
330
|
+
toast: true,
|
|
331
|
+
position: 'bottom-end',
|
|
332
|
+
showConfirmButton: false,
|
|
333
|
+
timer: 5000,
|
|
334
|
+
timerProgressBar: true,
|
|
335
|
+
html: "",
|
|
336
|
+
onOpen: (toast) => {
|
|
337
|
+
toast.addEventListener('mouseenter', swal.stopTimer)
|
|
338
|
+
toast.addEventListener('mouseleave', swal.resumeTimer)
|
|
339
|
+
}
|
|
340
|
+
})
|
|
341
|
+
Toast.fire({
|
|
342
|
+
icon: 'error',
|
|
343
|
+
title: '<span class="text-danger">Invalid paste : output ' + outputName + ' already exists here</span>'
|
|
344
|
+
})
|
|
299
345
|
}
|
|
300
346
|
});
|
|
301
347
|
|
|
302
348
|
// paste modules
|
|
303
349
|
_.each(json.modules, (moduleDef, moduleName) => {
|
|
304
350
|
var node = _.get(currentMetanode, ["modules", moduleName]);
|
|
305
|
-
if (node
|
|
306
|
-
|
|
351
|
+
if (node !== undefined) {
|
|
352
|
+
valid = false;
|
|
353
|
+
const Toast = swal.mixin({
|
|
354
|
+
toast: true,
|
|
355
|
+
position: 'bottom-end',
|
|
356
|
+
showConfirmButton: false,
|
|
357
|
+
timer: 5000,
|
|
358
|
+
timerProgressBar: true,
|
|
359
|
+
html: "",
|
|
360
|
+
onOpen: (toast) => {
|
|
361
|
+
toast.addEventListener('mouseenter', swal.stopTimer)
|
|
362
|
+
toast.addEventListener('mouseleave', swal.resumeTimer)
|
|
363
|
+
}
|
|
364
|
+
})
|
|
365
|
+
Toast.fire({
|
|
366
|
+
icon: 'error',
|
|
367
|
+
title: '<span class="text-danger">Invalid paste : compute box ' + moduleName + ' already exists here</span>'
|
|
368
|
+
})
|
|
307
369
|
}
|
|
308
370
|
});
|
|
309
371
|
|
|
310
372
|
// paste uis
|
|
311
373
|
_.each(json.ui, (uiDef, uiName) => {
|
|
312
374
|
var ui = _.get(currentMetanode, ["ui", uiName]);
|
|
313
|
-
if (ui
|
|
314
|
-
|
|
375
|
+
if (ui !== undefined) {
|
|
376
|
+
valid = false;
|
|
377
|
+
const Toast = swal.mixin({
|
|
378
|
+
toast: true,
|
|
379
|
+
position: 'bottom-end',
|
|
380
|
+
showConfirmButton: false,
|
|
381
|
+
timer: 5000,
|
|
382
|
+
timerProgressBar: true,
|
|
383
|
+
html: "",
|
|
384
|
+
onOpen: (toast) => {
|
|
385
|
+
toast.addEventListener('mouseenter', swal.stopTimer)
|
|
386
|
+
toast.addEventListener('mouseleave', swal.resumeTimer)
|
|
387
|
+
}
|
|
388
|
+
})
|
|
389
|
+
Toast.fire({
|
|
390
|
+
icon: 'error',
|
|
391
|
+
title: '<span class="text-danger">Invalid paste : ui ' + uiName + ' already exists here</span>'
|
|
392
|
+
})
|
|
315
393
|
}
|
|
316
394
|
});
|
|
317
|
-
|
|
395
|
+
|
|
396
|
+
return valid;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
let validPaste = checkValidPaste();
|
|
400
|
+
if (validPaste) {
|
|
401
|
+
this.batch(() => {
|
|
402
|
+
// paste metanodes
|
|
403
|
+
_.each(json.metamodules, (mmDef, mmName) => {
|
|
404
|
+
var metamodule = _.get(currentMetanode, ["metanodes", mmName]);
|
|
405
|
+
if (metamodule === undefined) {
|
|
406
|
+
_.set(currentMetanode, ["metanodes", mmName], mmDef);
|
|
407
|
+
} else {
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
// paste inputs
|
|
413
|
+
_.each(json.input, (inputDef, inputName) => {
|
|
414
|
+
var input = _.get(currentMetanode, ["input", inputName]);
|
|
415
|
+
if (input === undefined) {
|
|
416
|
+
_.set(currentMetanode, ["input", inputName], inputDef);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
// paste outputs
|
|
421
|
+
_.each(json.output, (outputDef, outputName) => {
|
|
422
|
+
var output = _.get(currentMetanode, ["output", outputName]);
|
|
423
|
+
if (output === undefined) {
|
|
424
|
+
_.set(currentMetanode, ["output", outputName], outputDef);
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
// paste modules
|
|
429
|
+
_.each(json.modules, (moduleDef, moduleName) => {
|
|
430
|
+
var node = _.get(currentMetanode, ["modules", moduleName]);
|
|
431
|
+
if (node === undefined) {
|
|
432
|
+
_.set(currentMetanode, ["modules", moduleName], moduleDef);
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// paste uis
|
|
437
|
+
_.each(json.ui, (uiDef, uiName) => {
|
|
438
|
+
var ui = _.get(currentMetanode, ["ui", uiName]);
|
|
439
|
+
if (ui === undefined) {
|
|
440
|
+
_.set(currentMetanode, ["ui", uiName], uiDef);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
return validPaste;
|
|
318
447
|
}
|
|
319
448
|
|
|
320
449
|
/**
|
|
@@ -409,14 +538,16 @@ class GraphModel {
|
|
|
409
538
|
|
|
410
539
|
// add pkg dependencies (lib, types, etc) to app graph
|
|
411
540
|
async addDependencies(pkg) {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
541
|
+
if (pkg.dependencies) {
|
|
542
|
+
for (const dependencyName of Object.keys(pkg.dependencies)) {
|
|
543
|
+
if (utils.isLibrary(dependencyName) || utils.isType(dependencyName)) {
|
|
544
|
+
console.log('[*] Adding dependency: ' + dependencyName);
|
|
545
|
+
// await this.e.loadPackage(dependencyName, dependencyVersion); // Is this better ?
|
|
546
|
+
await this.e.loadPackage(dependencyName); // or should we just load the last version ?
|
|
547
|
+
let pkg = this.e.packages[dependencyName]
|
|
548
|
+
this.data.root.libs[pkg.name] = pkg.version;
|
|
549
|
+
await this.addDependencies(pkg);
|
|
550
|
+
}
|
|
420
551
|
}
|
|
421
552
|
}
|
|
422
553
|
}
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<span class="d-inline-block"><span class="type-display">{{typePrefix}}</span></span>
|
|
34
34
|
<select class="selectpicker d-inline-block">
|
|
35
35
|
<option disabled value='default' :selected="!selectedType || selectedType=='*'" >Select a type</option>
|
|
36
|
-
<option v-for="typeName in getMatchingTypes()" :value="typeName" :selected="typeName == selectedType">{{typeName}}</option>
|
|
36
|
+
<option v-for="typeName in getMatchingTypes()" :key="typeName" :value="typeName" :selected="typeName == selectedType">{{typeName}}</option>
|
|
37
37
|
</select>
|
|
38
38
|
<span class="d-inline-block type-display">{{typeSuffix}}</span>
|
|
39
39
|
<button v-if="displayOKButton!==false" class="btn btn-success d-inline-block" @click="emitType">Ok</button>
|
|
@@ -541,7 +541,7 @@ button.close {
|
|
|
541
541
|
<button class="btn btn-success btn-sm btn-add-interface" @click="addInterface"><i class="fas fa-plus"></i></button>
|
|
542
542
|
<select class="form-control btn-sm app-interface-select" @change="selectInterface" style="width: 150px; height: 32px;">
|
|
543
543
|
<option>Load UI...</option>
|
|
544
|
-
<option v-for="interfaceName in getInterfacesNames()" :value="interfaceName">{{interfaceName}}</option>
|
|
544
|
+
<option v-for="interfaceName in getInterfacesNames()" :key="interfaceName" :value="interfaceName">{{interfaceName}}</option>
|
|
545
545
|
</select>
|
|
546
546
|
<button class="btn btn-sm btn-light btn-edit-panel-description" @click="editPanelDescription"><i class="fas fa-info" style="padding-left: 8px; padding-right: 8px;"></i></button>
|
|
547
547
|
<button class="btn btn-danger btn-sm btn-remove-interface" @click="removeInterface"><i class="fas fa-minus"></i></button>
|
|
@@ -1129,13 +1129,14 @@ export default {
|
|
|
1129
1129
|
};
|
|
1130
1130
|
|
|
1131
1131
|
// add the value to our select, and load it
|
|
1132
|
-
$(self.$el)
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1132
|
+
// $(self.$el)
|
|
1133
|
+
// .find(".app-interface-select")
|
|
1134
|
+
// .append(
|
|
1135
|
+
// $("<option/>", {
|
|
1136
|
+
// value: name
|
|
1137
|
+
// }).append(name)
|
|
1138
|
+
// );
|
|
1139
|
+
self.$forceUpdate();
|
|
1139
1140
|
$(document).ready(() => {
|
|
1140
1141
|
$(self.$el)
|
|
1141
1142
|
.find(".app-interface-select")
|
|
@@ -1174,17 +1175,10 @@ export default {
|
|
|
1174
1175
|
}).then(result => {
|
|
1175
1176
|
if (result.value) {
|
|
1176
1177
|
// set the interface back to first value
|
|
1177
|
-
$(this.$el)
|
|
1178
|
-
.find(
|
|
1179
|
-
".app-interface-select option[value='" + name + "']"
|
|
1180
|
-
)
|
|
1181
|
-
.remove();
|
|
1182
|
-
$(this.$el)
|
|
1183
|
-
.find(".app-interface-select")
|
|
1184
|
-
.change();
|
|
1185
1178
|
delete self.view.m.data.root.interface[name];
|
|
1186
1179
|
self.htmlCode.setValue("");
|
|
1187
1180
|
self.view.m.save();
|
|
1181
|
+
self.view.m.repaint();
|
|
1188
1182
|
self.view.runApp(self.getOptions());
|
|
1189
1183
|
}
|
|
1190
1184
|
});
|