@themarioga/grid-editor 8.5.0 → 8.6.0

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.
Files changed (105) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +78 -4
  3. package/dist/grideditor.bundle.min.js +3 -3
  4. package/dist/grideditor.css +15 -4
  5. package/dist/grideditor.d.ts +59 -3
  6. package/dist/grideditor.esm.js +200 -36
  7. package/dist/grideditor.js +200 -36
  8. package/dist/grideditor.min.css +1 -1
  9. package/dist/grideditor.min.css.map +1 -1
  10. package/dist/grideditor.min.js +2 -2
  11. package/dist/grideditor.min.js.map +3 -3
  12. package/dist/locales/grideditor.es.esm.js +4 -0
  13. package/dist/locales/grideditor.es.js +4 -0
  14. package/dist/locales/grideditor.es.min.js +1 -1
  15. package/dist/locales/grideditor.es.min.js.map +2 -2
  16. package/dist/plugins/grideditor.accordion.esm.js +7 -0
  17. package/dist/plugins/grideditor.accordion.js +7 -0
  18. package/dist/plugins/grideditor.accordion.min.js +1 -1
  19. package/dist/plugins/grideditor.accordion.min.js.map +3 -3
  20. package/dist/plugins/grideditor.autosave.esm.js +309 -0
  21. package/dist/plugins/grideditor.autosave.js +316 -0
  22. package/dist/plugins/grideditor.autosave.min.js +1 -0
  23. package/dist/plugins/grideditor.autosave.min.js.map +7 -0
  24. package/dist/plugins/grideditor.card.esm.js +10 -0
  25. package/dist/plugins/grideditor.card.js +10 -0
  26. package/dist/plugins/grideditor.card.min.js +1 -1
  27. package/dist/plugins/grideditor.card.min.js.map +3 -3
  28. package/dist/plugins/grideditor.ckeditor.esm.js +29 -0
  29. package/dist/plugins/grideditor.ckeditor.js +29 -0
  30. package/dist/plugins/grideditor.ckeditor.min.js +1 -1
  31. package/dist/plugins/grideditor.ckeditor.min.js.map +3 -3
  32. package/dist/plugins/grideditor.clipboard.esm.js +3 -0
  33. package/dist/plugins/grideditor.clipboard.js +3 -0
  34. package/dist/plugins/grideditor.clipboard.min.js +1 -1
  35. package/dist/plugins/grideditor.clipboard.min.js.map +2 -2
  36. package/dist/plugins/grideditor.codemirror-inline.esm.js +11 -0
  37. package/dist/plugins/grideditor.codemirror-inline.js +11 -0
  38. package/dist/plugins/grideditor.codemirror-inline.min.js +1 -1
  39. package/dist/plugins/grideditor.codemirror-inline.min.js.map +3 -3
  40. package/dist/plugins/grideditor.elements.esm.js +6 -3
  41. package/dist/plugins/grideditor.elements.js +6 -3
  42. package/dist/plugins/grideditor.elements.min.js +1 -1
  43. package/dist/plugins/grideditor.elements.min.js.map +3 -3
  44. package/dist/plugins/grideditor.gutters.esm.js +5 -0
  45. package/dist/plugins/grideditor.gutters.js +5 -0
  46. package/dist/plugins/grideditor.gutters.min.js +1 -1
  47. package/dist/plugins/grideditor.gutters.min.js.map +3 -3
  48. package/dist/plugins/grideditor.inline-style.esm.js +18 -10
  49. package/dist/plugins/grideditor.inline-style.js +18 -10
  50. package/dist/plugins/grideditor.inline-style.min.js +3 -3
  51. package/dist/plugins/grideditor.inline-style.min.js.map +3 -3
  52. package/dist/plugins/grideditor.order.esm.js +5 -0
  53. package/dist/plugins/grideditor.order.js +5 -0
  54. package/dist/plugins/grideditor.order.min.js +1 -1
  55. package/dist/plugins/grideditor.order.min.js.map +3 -3
  56. package/dist/plugins/grideditor.popup.esm.js +17 -6
  57. package/dist/plugins/grideditor.popup.js +17 -6
  58. package/dist/plugins/grideditor.popup.min.js +1 -1
  59. package/dist/plugins/grideditor.popup.min.js.map +3 -3
  60. package/dist/plugins/grideditor.sections.esm.js +6 -3
  61. package/dist/plugins/grideditor.sections.js +6 -3
  62. package/dist/plugins/grideditor.sections.min.js +1 -1
  63. package/dist/plugins/grideditor.sections.min.js.map +3 -3
  64. package/dist/plugins/grideditor.summernote.esm.js +39 -0
  65. package/dist/plugins/grideditor.summernote.js +39 -0
  66. package/dist/plugins/grideditor.summernote.min.js +1 -1
  67. package/dist/plugins/grideditor.summernote.min.js.map +3 -3
  68. package/dist/plugins/grideditor.tabs.esm.js +7 -0
  69. package/dist/plugins/grideditor.tabs.js +7 -0
  70. package/dist/plugins/grideditor.tabs.min.js +1 -1
  71. package/dist/plugins/grideditor.tabs.min.js.map +3 -3
  72. package/dist/plugins/grideditor.tinymce.esm.js +31 -0
  73. package/dist/plugins/grideditor.tinymce.js +31 -0
  74. package/dist/plugins/grideditor.tinymce.min.js +1 -1
  75. package/dist/plugins/grideditor.tinymce.min.js.map +3 -3
  76. package/docs/events.md +8 -0
  77. package/docs/locale-keys.md +14 -0
  78. package/docs/plugins.md +54 -2
  79. package/example/autosave.html +39 -22
  80. package/example/index.html +1 -1
  81. package/example/plugins.html +10 -0
  82. package/package.json +1 -2
  83. package/src/js/grideditor.js +242 -28
  84. package/src/js/inline-style/display.js +4 -3
  85. package/src/js/inline-style/drawerflow.js +10 -5
  86. package/src/js/locales/grideditor.es.js +4 -0
  87. package/src/js/plugins/grideditor.accordion.js +6 -0
  88. package/src/js/plugins/grideditor.autosave.js +349 -0
  89. package/src/js/plugins/grideditor.card.js +6 -0
  90. package/src/js/plugins/grideditor.ckeditor.js +6 -0
  91. package/src/js/plugins/grideditor.clipboard.js +3 -0
  92. package/src/js/plugins/grideditor.codemirror-inline.js +7 -0
  93. package/src/js/plugins/grideditor.elements.js +4 -3
  94. package/src/js/plugins/grideditor.gutters.js +4 -0
  95. package/src/js/plugins/grideditor.inline-style.js +2 -0
  96. package/src/js/plugins/grideditor.order.js +4 -0
  97. package/src/js/plugins/grideditor.popup.js +15 -6
  98. package/src/js/plugins/grideditor.sections.js +4 -3
  99. package/src/js/plugins/grideditor.summernote.js +14 -0
  100. package/src/js/plugins/grideditor.tabs.js +6 -0
  101. package/src/js/plugins/grideditor.tinymce.js +8 -0
  102. package/src/js/text/grideditor.text.js +26 -0
  103. package/src/less/grideditor.less +16 -8
  104. package/types/grideditor.d.ts +59 -3
  105. package/AUTO_SAVE.md +0 -30
@@ -763,31 +763,53 @@
763
763
  whenConfirmed();
764
764
  return;
765
765
  }
766
- var Modal = modalLibrary();
767
- if (!Modal) {
768
- if (window.confirm(message)) {
766
+ confirmWith(message, { danger: true }, function(confirmed) {
767
+ if (confirmed) {
769
768
  whenConfirmed();
770
769
  }
770
+ });
771
+ }
772
+ function confirmWith(message, options, answer) {
773
+ options = options || {};
774
+ var Modal = modalLibrary();
775
+ if (!Modal) {
776
+ answer(window.confirm(message));
771
777
  return;
772
778
  }
773
779
  var modal = confirmModal();
774
780
  var confirmed = false;
781
+ var ok = one(modal, ".ge-confirm-ok");
782
+ if (pendingAnswer) {
783
+ pendingAnswer(null);
784
+ }
785
+ var settle = function(value) {
786
+ if (pendingAnswer !== settle) {
787
+ return;
788
+ }
789
+ pendingAnswer = null;
790
+ answer(value);
791
+ };
792
+ pendingAnswer = settle;
793
+ one(modal, ".modal-title").textContent = options.title || t("confirm.title");
794
+ one(modal, ".ge-confirm-cancel").textContent = options.cancel || t("confirm.cancel");
795
+ ok.textContent = options.ok || t("confirm.ok");
796
+ toggleClass(ok, "btn-danger", !!options.danger);
797
+ toggleClass(ok, "btn-primary", !options.danger);
775
798
  one(modal, ".ge-confirm-message").textContent = message;
776
- one(modal, ".ge-confirm-ok").onclick = function() {
799
+ ok.onclick = function() {
777
800
  confirmed = true;
778
801
  Modal.getInstance(modal).hide();
779
802
  };
780
803
  confirmHandlers.hidden = function() {
781
- if (confirmed) {
782
- whenConfirmed();
783
- }
804
+ settle(confirmed);
784
805
  };
785
806
  confirmHandlers.shown = function() {
786
- one(modal, ".ge-confirm-ok").focus();
807
+ ok.focus();
787
808
  };
788
809
  Modal.getOrCreateInstance(modal).show();
789
810
  }
790
811
  var confirmHandlers = { hidden: null, shown: null };
812
+ var pendingAnswer = null;
791
813
  function confirmModal() {
792
814
  if (confirmDialog) {
793
815
  return confirmDialog;
@@ -801,13 +823,14 @@
801
823
  one(confirmDialog, ".ge-confirm-cancel").textContent = t("confirm.cancel");
802
824
  one(confirmDialog, ".ge-confirm-ok").textContent = t("confirm.ok");
803
825
  trackModal(confirmDialog);
826
+ var asking = confirmDialog;
804
827
  confirmDialog.addEventListener("hidden.bs.modal", function() {
805
- if (confirmHandlers.hidden) {
828
+ if (asking === confirmDialog && confirmHandlers.hidden) {
806
829
  confirmHandlers.hidden();
807
830
  }
808
831
  });
809
832
  confirmDialog.addEventListener("shown.bs.modal", function() {
810
- if (confirmHandlers.shown) {
833
+ if (asking === confirmDialog && confirmHandlers.shown) {
811
834
  confirmHandlers.shown();
812
835
  }
813
836
  });
@@ -821,6 +844,9 @@
821
844
  confirmHandlers.shown = null;
822
845
  retireModal(confirmDialog);
823
846
  confirmDialog = null;
847
+ if (pendingAnswer) {
848
+ pendingAnswer(null);
849
+ }
824
850
  }
825
851
  function retireModal(panel) {
826
852
  var Modal = modalLibrary();
@@ -1115,7 +1141,7 @@
1115
1141
  settings.new_row_layouts.forEach(function(layout) {
1116
1142
  var grouped = !Array.isArray(layout);
1117
1143
  var btn = element("a", {
1118
- "class": "btn btn-sm btn-primary",
1144
+ "class": "btn btn-sm btn-light",
1119
1145
  title: grouped ? t("row.add_row_cols", { columns: layout.columns, counts: rowColsText(layout.row_cols) }) : t("row.add", { layout: layout.join("-") }),
1120
1146
  // What this button makes, in the markup rather than in
1121
1147
  // memory: a drag works on a clone of it
@@ -1150,7 +1176,7 @@
1150
1176
  Object.keys(CONTAINERS).forEach(function(type) {
1151
1177
  var definition = CONTAINERS[type];
1152
1178
  var button = labelButton(
1153
- element("a", { "class": "btn btn-sm btn-primary ge-add-container" }),
1179
+ element("a", { "class": "btn btn-sm btn-light ge-add-container" }),
1154
1180
  t(definition.labelKey),
1155
1181
  definition.iconClass
1156
1182
  );
@@ -1271,7 +1297,7 @@
1271
1297
  names.forEach(function(name) {
1272
1298
  var tab = tabs.appendChild(element("button", {
1273
1299
  type: "button",
1274
- "class": "btn btn-sm btn-outline-primary",
1300
+ "class": "btn btn-sm btn-outline-secondary",
1275
1301
  role: "tab",
1276
1302
  "data-ge-group": name
1277
1303
  }, groupLabel(name)));
@@ -1320,7 +1346,7 @@
1320
1346
  mainControls.remove();
1321
1347
  }
1322
1348
  function createOverflowMenu(start) {
1323
- var more = create('<div class="ge-toolbar-more"><button type="button" class="btn btn-sm btn-primary"><i class="bi bi-three-dots"></i></button><div class="ge-toolbar-overflow"><div class="ge-addRowGroup btn-group"></div><div class="ge-addContainerGroup btn-group"></div></div></div>');
1349
+ var more = create('<div class="ge-toolbar-more"><button type="button" class="btn btn-sm btn-light"><i class="bi bi-three-dots"></i></button><div class="ge-toolbar-overflow"><div class="ge-addRowGroup btn-group"></div><div class="ge-addContainerGroup btn-group"></div></div></div>');
1324
1350
  start.parentNode.insertBefore(more, start.nextSibling);
1325
1351
  var toggle2 = one(more, "button");
1326
1352
  var panel = one(more, ".ge-toolbar-overflow");
@@ -1411,7 +1437,8 @@
1411
1437
  function featureButton(name, item, index) {
1412
1438
  var iconClass = item.iconClass || (item.align === "end" ? "bi bi-plus" : null);
1413
1439
  var label = typeof item.label === "function" ? item.label() : item.label || t(item.labelKey);
1414
- var button = labelButton(element("a", { "class": "btn btn-sm btn-primary ge-add-container ge-add-feature" }), label, iconClass);
1440
+ var colour = item.align === "end" ? "btn-primary" : "btn-light";
1441
+ var button = labelButton(element("a", { "class": "btn btn-sm " + colour + " ge-add-container ge-add-feature" }), label, iconClass);
1415
1442
  addClass(button, item.className || "");
1416
1443
  attr(button, {
1417
1444
  "data-ge-toolbar": "feature",
@@ -1919,22 +1946,122 @@
1919
1946
  closeSizePicker();
1920
1947
  hideDropMarker();
1921
1948
  closeDialog();
1922
- all(canvas, ".ge-tools-drawer").forEach(function(drawer) {
1923
- drawer.remove();
1924
- });
1949
+ removeDrawers(canvas);
1925
1950
  pluginFields.clear();
1926
- unwrapTexts();
1951
+ unwrapTexts(canvas);
1927
1952
  plugins("onDeinit");
1928
1953
  clearPreviews(canvas);
1929
- all(canvas, "[data-ge-row-cols]").forEach(function(row) {
1930
- row.removeAttribute("data-ge-row-cols");
1931
- });
1954
+ clearRowCols(canvas);
1932
1955
  unmarkContainers();
1933
1956
  removeSortable();
1934
1957
  removeResizable();
1935
- runFilter(false);
1958
+ runFilter(false, canvas);
1936
1959
  }
1937
- function getHtml() {
1960
+ function removeDrawers(root) {
1961
+ all(root, ".ge-tools-drawer").forEach(function(drawer) {
1962
+ drawer.remove();
1963
+ });
1964
+ }
1965
+ function clearRowCols(root) {
1966
+ all(root, "[data-ge-row-cols]").forEach(function(row) {
1967
+ row.removeAttribute("data-ge-row-cols");
1968
+ });
1969
+ }
1970
+ function pluginsWithoutCleanMarkup() {
1971
+ var names = [];
1972
+ [CONTAINERS, FEATURES, UTILITIES].forEach(function(registry) {
1973
+ Object.keys(registry).forEach(function(name) {
1974
+ var plugin = registry[name];
1975
+ var marks = plugin.unmark || plugin.onDeinit || plugin.onBeforeDeinit;
1976
+ if (marks && !plugin.cleanMarkup) {
1977
+ names.push(name);
1978
+ }
1979
+ });
1980
+ });
1981
+ return names;
1982
+ }
1983
+ function copyCanvas() {
1984
+ var copy = canvas.cloneNode(true);
1985
+ var toLive = /* @__PURE__ */ new Map();
1986
+ var toCopy = /* @__PURE__ */ new Map();
1987
+ var live = document.createTreeWalker(canvas, NodeFilter.SHOW_ELEMENT);
1988
+ var copied = document.createTreeWalker(copy, NodeFilter.SHOW_ELEMENT);
1989
+ var a = live.currentNode;
1990
+ var b = copied.currentNode;
1991
+ while (a && b) {
1992
+ toLive.set(b, a);
1993
+ toCopy.set(a, b);
1994
+ a = live.nextNode();
1995
+ b = copied.nextNode();
1996
+ }
1997
+ return {
1998
+ root: copy,
1999
+ liveOf: function(node) {
2000
+ return toLive.get(node) || null;
2001
+ },
2002
+ copyOf: function(node) {
2003
+ return toCopy.get(node) || null;
2004
+ }
2005
+ };
2006
+ }
2007
+ function snapshotHtml() {
2008
+ if (sourceOpen) {
2009
+ return getHtml();
2010
+ }
2011
+ var missing = pluginsWithoutCleanMarkup();
2012
+ if (missing.length) {
2013
+ missing.forEach(function(name) {
2014
+ warnOnceHere("snapshot:" + name, 'the "' + name + '" plugin has no cleanMarkup, so the canvas leaves editing to be read: open texts and settings panels close');
2015
+ });
2016
+ return getHtml();
2017
+ }
2018
+ var copy = copyCanvas();
2019
+ var root = copy.root;
2020
+ [root].concat(all(root, ".ge-active-target, .ge-settings-target")).forEach(function(node) {
2021
+ removeClass(node, "ge-active-target ge-settings-target");
2022
+ dropEmptyClass(node);
2023
+ });
2024
+ all(root, ".ge-drop-marker").forEach(function(marker) {
2025
+ marker.remove();
2026
+ });
2027
+ removeDrawers(root);
2028
+ unwrapTexts(root);
2029
+ var refused = null;
2030
+ [CONTAINERS, FEATURES, UTILITIES].forEach(function(registry) {
2031
+ Object.keys(registry).forEach(function(name) {
2032
+ var plugin = registry[name];
2033
+ if (refused || !plugin.cleanMarkup) {
2034
+ return;
2035
+ }
2036
+ if (plugin.cleanMarkup(root, copy.liveOf) === false) {
2037
+ refused = name;
2038
+ }
2039
+ });
2040
+ });
2041
+ if (refused) {
2042
+ warnOnceHere("snapshot-refused:" + refused, 'the "' + refused + '" plugin cannot take its marking off a copy right now, so the canvas leaves editing to be read');
2043
+ return getHtml();
2044
+ }
2045
+ clearPreviews(root);
2046
+ clearRowCols(root);
2047
+ all(root, "[data-ge-container]").forEach(unmarkContainerClasses);
2048
+ sortables.forEach(function(sortableInstance) {
2049
+ var list = copy.copyOf(sortableInstance.el);
2050
+ if (list) {
2051
+ all(list, "[draggable]").forEach(function(node) {
2052
+ node.removeAttribute("draggable");
2053
+ });
2054
+ }
2055
+ });
2056
+ removeResizeFurniture(root);
2057
+ runFilter(false, root);
2058
+ stripPixelWidths(root);
2059
+ return root.innerHTML;
2060
+ }
2061
+ function getHtml(options) {
2062
+ if (options && options.keepEditing) {
2063
+ return snapshotHtml();
2064
+ }
1938
2065
  deinit();
1939
2066
  stripPixelWidths(canvas);
1940
2067
  var html = canvas.innerHTML;
@@ -1948,10 +2075,24 @@
1948
2075
  init();
1949
2076
  return html;
1950
2077
  }
1951
- function getPlainHtml() {
1952
- return plainHtml(getHtml());
2078
+ function getPlainHtml(options) {
2079
+ return plainHtml(getHtml(options));
2080
+ }
2081
+ function setHtml2(html) {
2082
+ if (sourceOpen) {
2083
+ closeSource();
2084
+ if (mainControls) {
2085
+ all(mainControls, ".gm-edit-mode").forEach(function(button) {
2086
+ removeClass(button, "active btn-danger");
2087
+ });
2088
+ }
2089
+ }
2090
+ deinit();
2091
+ setHtml(canvas, html);
2092
+ init();
1953
2093
  }
1954
2094
  function destroy() {
2095
+ plugins("onDestroy");
1955
2096
  if (sourceOpen) {
1956
2097
  closeSource();
1957
2098
  }
@@ -2064,6 +2205,11 @@
2064
2205
  closeDialog,
2065
2206
  rowFromLayout: rowFromLayoutValue,
2066
2207
  nodeHtml,
2208
+ // The markup as getHtml gives it, with the canvas left editing
2209
+ snapshotHtml,
2210
+ setHtml: setHtml2,
2211
+ // A question in the editor's confirm modal
2212
+ confirm: confirmWith,
2067
2213
  // A text editor has rewritten a content area, so whatever the
2068
2214
  // editor and its plugins had put in there goes back in
2069
2215
  textReady,
@@ -2586,10 +2732,13 @@
2586
2732
  if (definition) {
2587
2733
  definition.unmark(container);
2588
2734
  }
2589
- removeClass(container, "ge-container ge-container-" + containerTypeOf(container));
2590
- dropEmptyClass(container);
2735
+ unmarkContainerClasses(container);
2591
2736
  });
2592
2737
  }
2738
+ function unmarkContainerClasses(container) {
2739
+ removeClass(container, "ge-container ge-container-" + containerTypeOf(container));
2740
+ dropEmptyClass(container);
2741
+ }
2593
2742
  function prependDrawer(node, className) {
2594
2743
  var drawer = element("div", { "class": className });
2595
2744
  node.insertBefore(drawer, node.firstChild);
@@ -3990,13 +4139,16 @@
3990
4139
  on(handle, "pointerup pointercancel", onUp);
3991
4140
  }
3992
4141
  function removeResizable() {
3993
- all(canvas, ".ge-resize-handle").forEach(function(handle) {
4142
+ removeResizeFurniture(canvas);
4143
+ }
4144
+ function removeResizeFurniture(root) {
4145
+ all(root, ".ge-resize-handle").forEach(function(handle) {
3994
4146
  handle.remove();
3995
4147
  });
3996
- all(canvas, ".ge-resize-size").forEach(function(readout) {
4148
+ all(root, ".ge-resize-size").forEach(function(readout) {
3997
4149
  readout.remove();
3998
4150
  });
3999
- stripPixelWidths(canvas);
4151
+ stripPixelWidths(root);
4000
4152
  }
4001
4153
  function snapUnits(col, pixels) {
4002
4154
  var units = Math.round(pixels / rowContentWidth(col.parentElement) * MAX_COL_SIZE);
@@ -4204,7 +4356,7 @@
4204
4356
  setOffset(column, tier, wanted.offset);
4205
4357
  return column;
4206
4358
  }
4207
- function runFilter(isInit) {
4359
+ function runFilter(isInit, root) {
4208
4360
  if (!settings.custom_filter || !settings.custom_filter.length) {
4209
4361
  return;
4210
4362
  }
@@ -4213,7 +4365,7 @@
4213
4365
  if (typeof func == "string") {
4214
4366
  func = window[func];
4215
4367
  }
4216
- func(canvas, isInit);
4368
+ func(root || canvas, isInit);
4217
4369
  });
4218
4370
  }
4219
4371
  function textCutter() {
@@ -4333,8 +4485,8 @@
4333
4485
  }
4334
4486
  });
4335
4487
  }
4336
- function unwrapTexts() {
4337
- all(canvas, ".ge-text-block").forEach(function(textBlock) {
4488
+ function unwrapTexts(root) {
4489
+ all(root, ".ge-text-block").forEach(function(textBlock) {
4338
4490
  unwrap(textBlock);
4339
4491
  });
4340
4492
  }
@@ -4507,6 +4659,18 @@
4507
4659
  instances.set(canvas, instance);
4508
4660
  loadPlugins();
4509
4661
  instance.settings = settingsCopy();
4662
+ Object.keys(featureMethods).forEach(function(name) {
4663
+ if (Object.prototype.hasOwnProperty.call(own, name) || name in instance) {
4664
+ return;
4665
+ }
4666
+ instance[name] = function() {
4667
+ if (destroyed) {
4668
+ warnOnceHere("destroyed:" + name, t("warning.destroyed", { method: name }));
4669
+ return null;
4670
+ }
4671
+ return featureMethods[name].apply(null, arguments);
4672
+ };
4673
+ });
4510
4674
  setup();
4511
4675
  init();
4512
4676
  GridEditor._created.forEach(function(hook) {
@@ -4522,7 +4686,7 @@
4522
4686
  GridEditor._plainHtml = plainHtml;
4523
4687
  GridEditor.Sortable = null;
4524
4688
  GridEditor.bootstrap = null;
4525
- GridEditor.version = false ? "dev" : "8.5.0";
4689
+ GridEditor.version = false ? "dev" : "8.6.0";
4526
4690
  GridEditor.locales = {
4527
4691
  en: {
4528
4692
  "tool.move": "Move",