@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.
@@ -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
- for (let r of packages) {
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 = packages.filter(r => r.score > 0);
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
- swal.queue([{
786
- title: 'Dependencies required',
787
- text: 'Dualbox will load additional required dependencies to paste your selection',
788
- showLoaderOnConfirm: true,
789
- preConfirm: async () => {
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;
@@ -274,47 +274,176 @@ class GraphModel {
274
274
  paste(json) {
275
275
  var currentMetanode = this.getCurrentMetanode();
276
276
 
277
- this.batch(() => {
278
- // paste metanodes
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 === undefined) {
282
- _.set(currentMetanode, ["metanodes", mmName], mmDef);
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 === undefined) {
290
- _.set(currentMetanode, ["input", inputName], inputDef);
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 === undefined) {
298
- _.set(currentMetanode, ["output", outputName], outputDef);
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 === undefined) {
306
- _.set(currentMetanode, ["modules", moduleName], moduleDef);
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 === undefined) {
314
- _.set(currentMetanode, ["ui", uiName], uiDef);
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
- for (const dependencyName of Object.keys(pkg.dependencies)) {
413
- if (utils.isLibrary(dependencyName) || utils.isType(dependencyName)) {
414
- console.log('[*] Adding dependency: ' + dependencyName);
415
- // await this.e.loadPackage(dependencyName, dependencyVersion); // Is this better ?
416
- await this.e.loadPackage(dependencyName); // or should we just load the last version ?
417
- let pkg = this.e.packages[dependencyName]
418
- this.data.root.libs[pkg.name] = pkg.version;
419
- await this.addDependencies(pkg);
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
- .find(".app-interface-select")
1134
- .append(
1135
- $("<option/>", {
1136
- value: name
1137
- }).append(name)
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dualbox/editor",
3
- "version": "1.0.93",
3
+ "version": "1.0.94",
4
4
  "description": "Editor of Dualbox apps",
5
5
  "browser": "js/dist/GraphEditor.js",
6
6
  "main": "js/dist/GraphEditor.js",