@themarioga/grid-editor 8.2.0 → 8.4.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.
- package/CHANGELOG.md +31 -0
- package/README.md +25 -1
- package/dist/grideditor.bundle.min.js +3 -3
- package/dist/grideditor.css +116 -0
- package/dist/grideditor.d.ts +6 -0
- package/dist/grideditor.esm.js +301 -5
- package/dist/grideditor.js +301 -5
- package/dist/grideditor.min.css +1 -1
- package/dist/grideditor.min.css.map +1 -1
- package/dist/grideditor.min.js +2 -2
- package/dist/grideditor.min.js.map +3 -3
- package/dist/locales/grideditor.es.esm.js +4 -0
- package/dist/locales/grideditor.es.js +4 -0
- package/dist/locales/grideditor.es.min.js +1 -1
- package/dist/locales/grideditor.es.min.js.map +2 -2
- package/dist/plugins/grideditor.ckeditor.esm.js +1 -0
- package/dist/plugins/grideditor.ckeditor.js +1 -0
- package/dist/plugins/grideditor.ckeditor.min.js +1 -1
- package/dist/plugins/grideditor.ckeditor.min.js.map +2 -2
- package/dist/plugins/grideditor.sections.esm.js +1 -0
- package/dist/plugins/grideditor.sections.js +1 -0
- package/dist/plugins/grideditor.sections.min.js +1 -1
- package/dist/plugins/grideditor.sections.min.js.map +2 -2
- package/dist/plugins/grideditor.summernote.esm.js +1 -0
- package/dist/plugins/grideditor.summernote.js +1 -0
- package/dist/plugins/grideditor.summernote.min.js +1 -1
- package/dist/plugins/grideditor.summernote.min.js.map +2 -2
- package/dist/plugins/grideditor.tinymce.esm.js +1 -0
- package/dist/plugins/grideditor.tinymce.js +1 -0
- package/dist/plugins/grideditor.tinymce.min.js +1 -1
- package/dist/plugins/grideditor.tinymce.min.js.map +2 -2
- package/docs/locale-keys.md +4 -0
- package/docs/plugins.md +22 -0
- package/package.json +1 -1
- package/src/js/grideditor.js +359 -4
- package/src/js/locales/grideditor.es.js +4 -0
- package/src/js/plugins/grideditor.sections.js +1 -0
- package/src/js/text/grideditor.text.js +1 -0
- package/src/less/grideditor.less +134 -0
- package/types/grideditor.d.ts +6 -0
package/dist/grideditor.css
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
position: relative;
|
|
3
3
|
min-height: 22px;
|
|
4
4
|
margin-bottom: 10px;
|
|
5
|
+
/* toolbar_groups: the tabs choosing which category of add buttons
|
|
6
|
+
shows, at the start of the line. Never squeezed, and never behind the
|
|
7
|
+
more button */
|
|
8
|
+
/* toolbar_overflow: 'menu'. The add buttons keep to one line, and the
|
|
9
|
+
ones that don't fit go behind a button at its end. The right-hand
|
|
10
|
+
buttons come before in the markup, so they are ordered back to how
|
|
11
|
+
floating them puts them. */
|
|
5
12
|
}
|
|
6
13
|
.ge-mainControls .ge-wrapper {
|
|
7
14
|
padding-top: 5px;
|
|
@@ -45,6 +52,84 @@
|
|
|
45
52
|
.ge-mainControls .ge-layout-mode {
|
|
46
53
|
margin-left: 5px;
|
|
47
54
|
}
|
|
55
|
+
.ge-mainControls .ge-toolbar-groups {
|
|
56
|
+
flex: none;
|
|
57
|
+
margin-right: 8px;
|
|
58
|
+
}
|
|
59
|
+
.ge-mainControls .ge-toolbar-groups > .btn {
|
|
60
|
+
white-space: nowrap;
|
|
61
|
+
}
|
|
62
|
+
.ge-mainControls .ge-wrapper.ge-toolbar-menu {
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: flex-start;
|
|
65
|
+
}
|
|
66
|
+
.ge-mainControls .ge-wrapper.ge-toolbar-menu > .pull-right {
|
|
67
|
+
float: none;
|
|
68
|
+
}
|
|
69
|
+
.ge-mainControls .ge-wrapper.ge-toolbar-menu > .ge-toolbar-end {
|
|
70
|
+
order: 1;
|
|
71
|
+
}
|
|
72
|
+
.ge-mainControls .ge-wrapper.ge-toolbar-menu > .btn-group.pull-right {
|
|
73
|
+
order: 2;
|
|
74
|
+
}
|
|
75
|
+
.ge-mainControls .ge-wrapper.ge-toolbar-menu > .ge-layout-mode {
|
|
76
|
+
order: 3;
|
|
77
|
+
}
|
|
78
|
+
.ge-mainControls .ge-toolbar-start {
|
|
79
|
+
display: flex;
|
|
80
|
+
flex: 1 1 auto;
|
|
81
|
+
min-width: 0;
|
|
82
|
+
overflow: hidden;
|
|
83
|
+
/* A group as wide as its buttons and a button as wide as its label:
|
|
84
|
+
squeezed, they would wrap their labels rather than overflow */
|
|
85
|
+
}
|
|
86
|
+
.ge-mainControls .ge-toolbar-start > .btn-group {
|
|
87
|
+
flex: none;
|
|
88
|
+
}
|
|
89
|
+
.ge-mainControls .ge-toolbar-start .btn {
|
|
90
|
+
white-space: nowrap;
|
|
91
|
+
}
|
|
92
|
+
.ge-mainControls .ge-toolbar-more {
|
|
93
|
+
display: none;
|
|
94
|
+
position: relative;
|
|
95
|
+
flex: none;
|
|
96
|
+
margin: 0 5px 0 4px;
|
|
97
|
+
}
|
|
98
|
+
.ge-mainControls .ge-toolbar-more.ge-needed {
|
|
99
|
+
display: block;
|
|
100
|
+
}
|
|
101
|
+
.ge-mainControls .ge-toolbar-overflow {
|
|
102
|
+
display: none;
|
|
103
|
+
position: absolute;
|
|
104
|
+
z-index: 30;
|
|
105
|
+
top: calc(100% + 4px);
|
|
106
|
+
right: 0;
|
|
107
|
+
flex-direction: column;
|
|
108
|
+
gap: 6px;
|
|
109
|
+
width: max-content;
|
|
110
|
+
max-width: min(420px, calc(100vw - 32px));
|
|
111
|
+
padding: 6px;
|
|
112
|
+
background: #fff;
|
|
113
|
+
border: 1px solid rgba(0, 0, 0, 0.15);
|
|
114
|
+
border-radius: 6px;
|
|
115
|
+
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.15);
|
|
116
|
+
/* Wrapped onto several lines, a group's buttons stand apart */
|
|
117
|
+
}
|
|
118
|
+
.ge-mainControls .ge-toolbar-overflow > .btn-group {
|
|
119
|
+
flex-wrap: wrap;
|
|
120
|
+
gap: 4px;
|
|
121
|
+
margin: 0;
|
|
122
|
+
}
|
|
123
|
+
.ge-mainControls .ge-toolbar-overflow > .btn-group:empty {
|
|
124
|
+
display: none;
|
|
125
|
+
}
|
|
126
|
+
.ge-mainControls .ge-toolbar-overflow > .btn-group > .btn.btn {
|
|
127
|
+
margin-left: 0;
|
|
128
|
+
border-radius: 4px;
|
|
129
|
+
}
|
|
130
|
+
.ge-mainControls .ge-toolbar-more.ge-open > .ge-toolbar-overflow {
|
|
131
|
+
display: flex;
|
|
132
|
+
}
|
|
48
133
|
.ge-mainControls .ge-toolbar-end {
|
|
49
134
|
margin-right: 5px;
|
|
50
135
|
}
|
|
@@ -899,6 +984,37 @@
|
|
|
899
984
|
.ge-canvas.ge-editing .column.ge-resizing > .ge-tools-drawer > .ge-resize-size {
|
|
900
985
|
display: block;
|
|
901
986
|
}
|
|
987
|
+
/* drawer_overflow: 'menu'. A drawer keeps its tools to one line; the ones
|
|
988
|
+
that don't fit are hidden behind a more tool at its end, which unfolds it
|
|
989
|
+
to show them all */
|
|
990
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit {
|
|
991
|
+
white-space: nowrap;
|
|
992
|
+
}
|
|
993
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit > .ge-details {
|
|
994
|
+
white-space: normal;
|
|
995
|
+
}
|
|
996
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit > a.ge-tool-overflow,
|
|
997
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit > a.ge-drawer-more {
|
|
998
|
+
display: none;
|
|
999
|
+
}
|
|
1000
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit.ge-drawer-overflow {
|
|
1001
|
+
padding-right: 26px;
|
|
1002
|
+
}
|
|
1003
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit.ge-drawer-overflow > a.ge-drawer-more {
|
|
1004
|
+
display: inline-block;
|
|
1005
|
+
position: absolute;
|
|
1006
|
+
top: 0;
|
|
1007
|
+
right: 0;
|
|
1008
|
+
}
|
|
1009
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit.ge-drawer-expanded {
|
|
1010
|
+
white-space: normal;
|
|
1011
|
+
}
|
|
1012
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit.ge-drawer-expanded > a.ge-tool-overflow {
|
|
1013
|
+
display: inline-block;
|
|
1014
|
+
}
|
|
1015
|
+
.ge-canvas.ge-editing .ge-tools-drawer.ge-drawer-fit.ge-drawer-expanded > a.ge-drawer-more {
|
|
1016
|
+
background: rgba(0, 0, 0, 0.08);
|
|
1017
|
+
}
|
|
902
1018
|
/* The handle belongs to editing, and never to the output */
|
|
903
1019
|
.ge-canvas:not(.ge-editing) .ge-resize-handle {
|
|
904
1020
|
display: none;
|
package/dist/grideditor.d.ts
CHANGED
|
@@ -107,6 +107,12 @@ export interface GridEditorOptions {
|
|
|
107
107
|
text_tools?: HostTool[];
|
|
108
108
|
drag_handle?: 'tool' | 'drawer';
|
|
109
109
|
toolbar_drag?: 'auto' | boolean;
|
|
110
|
+
/** The add buttons that don't fit on the toolbar's line: behind a more button, or onto another line. Default 'menu'. */
|
|
111
|
+
toolbar_overflow?: 'menu' | 'wrap';
|
|
112
|
+
/** The drawers' tools that don't fit on one line: behind a more tool, or onto more lines. Default 'menu'. */
|
|
113
|
+
drawer_overflow?: 'menu' | 'wrap';
|
|
114
|
+
/** The add buttons in categories - rows, content, and a plugin's own - one shown at a time, chosen with tabs. Default false. */
|
|
115
|
+
toolbar_groups?: boolean;
|
|
110
116
|
/** A click in a column or a section makes it where the toolbar's buttons add. Default false. */
|
|
111
117
|
active_target?: boolean;
|
|
112
118
|
/** The plugins to use, of any kind; null is every one loaded. */
|
package/dist/grideditor.esm.js
CHANGED
|
@@ -444,6 +444,10 @@ function translate(settings, key, params) {
|
|
|
444
444
|
return params && params[name] !== void 0 ? params[name] : placeholder;
|
|
445
445
|
});
|
|
446
446
|
}
|
|
447
|
+
function hasString(settings, key) {
|
|
448
|
+
var locales = GridEditor.locales;
|
|
449
|
+
return (settings.locale_strings || {})[key] !== void 0 || (locales[settings.locale] || {})[key] !== void 0 || locales.en[key] !== void 0;
|
|
450
|
+
}
|
|
447
451
|
function warn(message) {
|
|
448
452
|
if (window.console && window.console.warn) {
|
|
449
453
|
window.console.warn("grid-editor: " + message);
|
|
@@ -570,6 +574,12 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
570
574
|
// 'tool' for the move tool, 'drawer' for the whole drawer
|
|
571
575
|
"toolbar_drag": "auto",
|
|
572
576
|
// Drag the toolbar's buttons onto the canvas. 'auto' follows drag_handle
|
|
577
|
+
"toolbar_overflow": "menu",
|
|
578
|
+
// What doesn't fit on one line: 'menu' behind a button, 'wrap' onto another line
|
|
579
|
+
"drawer_overflow": "menu",
|
|
580
|
+
// The same for the drawers' tools: 'menu' behind a button, 'wrap' onto another line
|
|
581
|
+
"toolbar_groups": false,
|
|
582
|
+
// The add buttons in categories, one shown at a time, picked with tabs
|
|
573
583
|
"active_target": false,
|
|
574
584
|
// A click in a column makes it where the toolbar's buttons add
|
|
575
585
|
"element_tools": [],
|
|
@@ -634,6 +644,13 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
634
644
|
var sourceOpen = false;
|
|
635
645
|
var dropMarker = null;
|
|
636
646
|
var activeTarget = null;
|
|
647
|
+
var toolbarLifetime = null;
|
|
648
|
+
var closeOverflowMenu = function() {
|
|
649
|
+
};
|
|
650
|
+
var refitToolbar = function() {
|
|
651
|
+
};
|
|
652
|
+
var addButtons = [];
|
|
653
|
+
var toolbarGroup = null;
|
|
637
654
|
var warnedHere = {};
|
|
638
655
|
var sortables = [];
|
|
639
656
|
var instanceId = ++editorCounter;
|
|
@@ -661,7 +678,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
661
678
|
removeConfirmModal();
|
|
662
679
|
removeSettingsPanels();
|
|
663
680
|
removeDialog();
|
|
664
|
-
|
|
681
|
+
removeMainControls();
|
|
665
682
|
createMainControls();
|
|
666
683
|
reset();
|
|
667
684
|
}
|
|
@@ -1030,6 +1047,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1030
1047
|
htmlTextArea = element("textarea", { "class": "ge-html-output" });
|
|
1031
1048
|
canvas.parentNode.insertBefore(htmlTextArea, canvas);
|
|
1032
1049
|
createMainControls();
|
|
1050
|
+
watchDrawers();
|
|
1033
1051
|
var signal = { signal: lifetime.signal };
|
|
1034
1052
|
window.addEventListener("scroll", onScroll, signal);
|
|
1035
1053
|
delegate(canvas, "click", ".ge-content", onContentClick, signal);
|
|
@@ -1053,6 +1071,10 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1053
1071
|
return;
|
|
1054
1072
|
}
|
|
1055
1073
|
var region = closest(e.target, targetSelector());
|
|
1074
|
+
if (region && region === activeTarget && (e.target === region || e.target === child(region, ".ge-tools-drawer"))) {
|
|
1075
|
+
changeTarget(null);
|
|
1076
|
+
return;
|
|
1077
|
+
}
|
|
1056
1078
|
changeTarget(region && region !== canvas && canvas.contains(region) ? region : null);
|
|
1057
1079
|
}, signal);
|
|
1058
1080
|
document.addEventListener("keydown", function(e) {
|
|
@@ -1078,7 +1100,14 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1078
1100
|
mainControls = element("div", { "class": "ge-mainControls" });
|
|
1079
1101
|
htmlTextArea.parentNode.insertBefore(mainControls, htmlTextArea);
|
|
1080
1102
|
wrapper = mainControls.appendChild(element("div", { "class": "ge-wrapper ge-top" }));
|
|
1081
|
-
|
|
1103
|
+
var overflowMenu = settings.toolbar_overflow !== "wrap";
|
|
1104
|
+
var start = wrapper;
|
|
1105
|
+
if (overflowMenu) {
|
|
1106
|
+
addClass(wrapper, "ge-toolbar-menu");
|
|
1107
|
+
start = wrapper.appendChild(element("div", { "class": "ge-toolbar-start" }));
|
|
1108
|
+
}
|
|
1109
|
+
addButtons = [];
|
|
1110
|
+
addRowGroup = start.appendChild(element("div", { "class": "ge-addRowGroup btn-group" }));
|
|
1082
1111
|
addContainerGroup = element("div", { "class": "ge-addContainerGroup btn-group ms-1" });
|
|
1083
1112
|
settings.new_row_layouts.forEach(function(layout) {
|
|
1084
1113
|
var grouped = !Array.isArray(layout);
|
|
@@ -1104,6 +1133,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1104
1133
|
}
|
|
1105
1134
|
});
|
|
1106
1135
|
addRowGroup.appendChild(btn);
|
|
1136
|
+
addButtons.push({ button: btn, home: addRowGroup, group: "rows" });
|
|
1107
1137
|
btn.appendChild(create('<i class="bi bi-plus"></i>'));
|
|
1108
1138
|
var sizes = grouped ? rowColsIcon(layout) : layout;
|
|
1109
1139
|
var icon = '<div class="row ge-row-icon">';
|
|
@@ -1113,7 +1143,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1113
1143
|
icon += "</div>";
|
|
1114
1144
|
btn.appendChild(create(icon));
|
|
1115
1145
|
});
|
|
1116
|
-
|
|
1146
|
+
start.appendChild(addContainerGroup);
|
|
1117
1147
|
Object.keys(CONTAINERS).forEach(function(type) {
|
|
1118
1148
|
var definition = CONTAINERS[type];
|
|
1119
1149
|
var button = labelButton(
|
|
@@ -1135,6 +1165,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1135
1165
|
}, { parent: canvas, source: "tool" });
|
|
1136
1166
|
});
|
|
1137
1167
|
addContainerGroup.appendChild(button);
|
|
1168
|
+
addButtons.push({ button, home: addContainerGroup, group: toolbarGroupOf(definition.group) || "content" });
|
|
1138
1169
|
});
|
|
1139
1170
|
var endItems = [];
|
|
1140
1171
|
Object.keys(FEATURES).forEach(function(name) {
|
|
@@ -1144,6 +1175,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1144
1175
|
endItems.push(button);
|
|
1145
1176
|
} else {
|
|
1146
1177
|
addContainerGroup.appendChild(button);
|
|
1178
|
+
addButtons.push({ button, home: addContainerGroup, group: toolbarGroupOf(item.group) || name });
|
|
1147
1179
|
}
|
|
1148
1180
|
});
|
|
1149
1181
|
});
|
|
@@ -1197,8 +1229,171 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1197
1229
|
end.appendChild(button);
|
|
1198
1230
|
});
|
|
1199
1231
|
}
|
|
1232
|
+
if (settings.toolbar_groups) {
|
|
1233
|
+
createGroupTabs(start);
|
|
1234
|
+
}
|
|
1235
|
+
if (overflowMenu) {
|
|
1236
|
+
createOverflowMenu(start);
|
|
1237
|
+
}
|
|
1200
1238
|
makeToolbarDraggable();
|
|
1201
1239
|
}
|
|
1240
|
+
var CORE_GROUPS = [
|
|
1241
|
+
{ name: "rows", labelKey: "group.rows" },
|
|
1242
|
+
{ name: "content", labelKey: "group.content" }
|
|
1243
|
+
];
|
|
1244
|
+
function toolbarGroupOf(value) {
|
|
1245
|
+
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
1246
|
+
}
|
|
1247
|
+
function createGroupTabs(start) {
|
|
1248
|
+
var names = CORE_GROUPS.map(function(group) {
|
|
1249
|
+
return group.name;
|
|
1250
|
+
});
|
|
1251
|
+
addButtons.forEach(function(entry) {
|
|
1252
|
+
if (names.indexOf(entry.group) < 0) {
|
|
1253
|
+
names.push(entry.group);
|
|
1254
|
+
}
|
|
1255
|
+
});
|
|
1256
|
+
names = names.filter(function(name) {
|
|
1257
|
+
return addButtons.some(function(entry) {
|
|
1258
|
+
return entry.group === name;
|
|
1259
|
+
});
|
|
1260
|
+
});
|
|
1261
|
+
if (names.length < 2) {
|
|
1262
|
+
return;
|
|
1263
|
+
}
|
|
1264
|
+
var tabs = element("div", { "class": "ge-toolbar-groups btn-group", role: "tablist", "aria-label": t("group.select") });
|
|
1265
|
+
start.insertBefore(tabs, start.firstChild);
|
|
1266
|
+
var stash = mainControls.appendChild(element("div", { "class": "ge-toolbar-stash", hidden: "hidden" }));
|
|
1267
|
+
names.forEach(function(name) {
|
|
1268
|
+
var tab = tabs.appendChild(element("button", {
|
|
1269
|
+
type: "button",
|
|
1270
|
+
"class": "btn btn-sm btn-outline-primary",
|
|
1271
|
+
role: "tab",
|
|
1272
|
+
"data-ge-group": name
|
|
1273
|
+
}, groupLabel(name)));
|
|
1274
|
+
tab.addEventListener("click", function() {
|
|
1275
|
+
showGroup(name);
|
|
1276
|
+
});
|
|
1277
|
+
});
|
|
1278
|
+
showGroup(names.indexOf(toolbarGroup) >= 0 ? toolbarGroup : names[0]);
|
|
1279
|
+
function showGroup(name) {
|
|
1280
|
+
toolbarGroup = name;
|
|
1281
|
+
addButtons.forEach(function(entry) {
|
|
1282
|
+
(entry.group === name ? entry.home : stash).appendChild(entry.button);
|
|
1283
|
+
});
|
|
1284
|
+
children(tabs).forEach(function(tab) {
|
|
1285
|
+
var chosen = tab.getAttribute("data-ge-group") === name;
|
|
1286
|
+
toggleClass(tab, "active", chosen);
|
|
1287
|
+
tab.setAttribute("aria-selected", chosen ? "true" : "false");
|
|
1288
|
+
});
|
|
1289
|
+
refitToolbar();
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
function groupLabel(name) {
|
|
1293
|
+
var key = "group." + name;
|
|
1294
|
+
if (hasString(settings, key)) {
|
|
1295
|
+
return t(key);
|
|
1296
|
+
}
|
|
1297
|
+
var first = addButtons.filter(function(entry) {
|
|
1298
|
+
return entry.group === name;
|
|
1299
|
+
})[0];
|
|
1300
|
+
return first.button.getAttribute("title") || name;
|
|
1301
|
+
}
|
|
1302
|
+
function shownAddButtons() {
|
|
1303
|
+
return addButtons.filter(function(entry) {
|
|
1304
|
+
return !closest(entry.button, ".ge-toolbar-stash");
|
|
1305
|
+
});
|
|
1306
|
+
}
|
|
1307
|
+
function removeMainControls() {
|
|
1308
|
+
if (toolbarLifetime) {
|
|
1309
|
+
toolbarLifetime.abort();
|
|
1310
|
+
}
|
|
1311
|
+
toolbarLifetime = null;
|
|
1312
|
+
closeOverflowMenu = function() {
|
|
1313
|
+
};
|
|
1314
|
+
refitToolbar = function() {
|
|
1315
|
+
};
|
|
1316
|
+
mainControls.remove();
|
|
1317
|
+
}
|
|
1318
|
+
function createOverflowMenu(start) {
|
|
1319
|
+
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>');
|
|
1320
|
+
start.parentNode.insertBefore(more, start.nextSibling);
|
|
1321
|
+
var toggle2 = one(more, "button");
|
|
1322
|
+
var panel = one(more, ".ge-toolbar-overflow");
|
|
1323
|
+
var spares = all(panel, ".btn-group");
|
|
1324
|
+
function spareOf(home) {
|
|
1325
|
+
return home === addRowGroup ? spares[0] : spares[1];
|
|
1326
|
+
}
|
|
1327
|
+
toggle2.setAttribute("title", t("tool.more"));
|
|
1328
|
+
toggle2.setAttribute("aria-haspopup", "true");
|
|
1329
|
+
toggle2.setAttribute("aria-expanded", "false");
|
|
1330
|
+
var menuLifetime = toolbarLifetime = new AbortController();
|
|
1331
|
+
var signal = { signal: menuLifetime.signal };
|
|
1332
|
+
toggle2.addEventListener("click", function() {
|
|
1333
|
+
openOverflow(!hasClass(more, "ge-open"));
|
|
1334
|
+
});
|
|
1335
|
+
panel.addEventListener("click", function(e) {
|
|
1336
|
+
if (closest(e.target, "[data-ge-toolbar]")) {
|
|
1337
|
+
openOverflow(false);
|
|
1338
|
+
}
|
|
1339
|
+
});
|
|
1340
|
+
document.addEventListener("pointerdown", function(e) {
|
|
1341
|
+
if (!more.contains(e.target)) {
|
|
1342
|
+
openOverflow(false);
|
|
1343
|
+
}
|
|
1344
|
+
}, signal);
|
|
1345
|
+
document.addEventListener("keydown", function(e) {
|
|
1346
|
+
if (e.key === "Escape") {
|
|
1347
|
+
openOverflow(false);
|
|
1348
|
+
}
|
|
1349
|
+
}, signal);
|
|
1350
|
+
closeOverflowMenu = function() {
|
|
1351
|
+
openOverflow(false);
|
|
1352
|
+
};
|
|
1353
|
+
refitToolbar = fit;
|
|
1354
|
+
fit();
|
|
1355
|
+
if (window.ResizeObserver) {
|
|
1356
|
+
var pending = false;
|
|
1357
|
+
var observer = new window.ResizeObserver(function() {
|
|
1358
|
+
if (pending) {
|
|
1359
|
+
return;
|
|
1360
|
+
}
|
|
1361
|
+
pending = true;
|
|
1362
|
+
window.requestAnimationFrame(function() {
|
|
1363
|
+
pending = false;
|
|
1364
|
+
if (!menuLifetime.signal.aborted) {
|
|
1365
|
+
fit();
|
|
1366
|
+
}
|
|
1367
|
+
});
|
|
1368
|
+
});
|
|
1369
|
+
observer.observe(wrapper);
|
|
1370
|
+
observer.observe(start);
|
|
1371
|
+
menuLifetime.signal.addEventListener("abort", function() {
|
|
1372
|
+
observer.disconnect();
|
|
1373
|
+
});
|
|
1374
|
+
}
|
|
1375
|
+
function openOverflow(open) {
|
|
1376
|
+
open = open && hasClass(more, "ge-needed");
|
|
1377
|
+
toggleClass(more, "ge-open", open);
|
|
1378
|
+
toggle2.setAttribute("aria-expanded", open ? "true" : "false");
|
|
1379
|
+
}
|
|
1380
|
+
function fit() {
|
|
1381
|
+
var homes = shownAddButtons();
|
|
1382
|
+
homes.forEach(function(entry) {
|
|
1383
|
+
entry.home.appendChild(entry.button);
|
|
1384
|
+
});
|
|
1385
|
+
removeClass(more, "ge-needed");
|
|
1386
|
+
if (start.scrollWidth <= start.clientWidth) {
|
|
1387
|
+
openOverflow(false);
|
|
1388
|
+
return;
|
|
1389
|
+
}
|
|
1390
|
+
addClass(more, "ge-needed");
|
|
1391
|
+
for (var i = homes.length - 1; i >= 0 && start.scrollWidth > start.clientWidth; i--) {
|
|
1392
|
+
var into = spareOf(homes[i].home);
|
|
1393
|
+
into.insertBefore(homes[i].button, into.firstChild);
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1202
1397
|
function labelButton(button, label, iconClass) {
|
|
1203
1398
|
button.setAttribute("title", label);
|
|
1204
1399
|
if (iconClass) {
|
|
@@ -1273,6 +1468,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1273
1468
|
}
|
|
1274
1469
|
helper = addClass(button.cloneNode(true), "ge-toolbar-helper");
|
|
1275
1470
|
document.body.appendChild(helper);
|
|
1471
|
+
closeOverflowMenu();
|
|
1276
1472
|
addClass(canvas, "ge-dropping");
|
|
1277
1473
|
}
|
|
1278
1474
|
css(helper, { left: move.pageX - 14, top: move.pageY - 14 });
|
|
@@ -1754,7 +1950,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1754
1950
|
removeConfirmModal();
|
|
1755
1951
|
removeSettingsPanels();
|
|
1756
1952
|
removeDialog();
|
|
1757
|
-
|
|
1953
|
+
removeMainControls();
|
|
1758
1954
|
htmlTextArea.remove();
|
|
1759
1955
|
lifetime.abort();
|
|
1760
1956
|
instances.delete(canvas);
|
|
@@ -2721,6 +2917,102 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
2721
2917
|
}
|
|
2722
2918
|
return createTool(drawer, t("tool.move"), "ge-move", "bi bi-arrows-move");
|
|
2723
2919
|
}
|
|
2920
|
+
var FITTED_DRAWERS = ".ge-tools-drawer:not(.ge-text-drawer):not(.ge-pane-drawer):not(.ge-code-inline)";
|
|
2921
|
+
function watchDrawers() {
|
|
2922
|
+
if (settings.drawer_overflow === "wrap" || !window.ResizeObserver || !window.MutationObserver) {
|
|
2923
|
+
return;
|
|
2924
|
+
}
|
|
2925
|
+
var due = /* @__PURE__ */ new Set();
|
|
2926
|
+
var frame = null;
|
|
2927
|
+
function schedule(drawer) {
|
|
2928
|
+
due.add(drawer);
|
|
2929
|
+
if (frame === null) {
|
|
2930
|
+
frame = window.requestAnimationFrame(flush);
|
|
2931
|
+
}
|
|
2932
|
+
}
|
|
2933
|
+
function flush() {
|
|
2934
|
+
frame = null;
|
|
2935
|
+
var drawers = Array.from(due);
|
|
2936
|
+
due.clear();
|
|
2937
|
+
drawers.forEach(function(drawer) {
|
|
2938
|
+
if (!drawer.isConnected) {
|
|
2939
|
+
drawerResizes.unobserve(drawer);
|
|
2940
|
+
return;
|
|
2941
|
+
}
|
|
2942
|
+
fitDrawer(drawer);
|
|
2943
|
+
});
|
|
2944
|
+
}
|
|
2945
|
+
var drawerResizes = new window.ResizeObserver(function(entries) {
|
|
2946
|
+
entries.forEach(function(entry) {
|
|
2947
|
+
schedule(entry.target);
|
|
2948
|
+
});
|
|
2949
|
+
});
|
|
2950
|
+
var mutations = new window.MutationObserver(function(records) {
|
|
2951
|
+
records.forEach(function(record) {
|
|
2952
|
+
var target = record.target;
|
|
2953
|
+
if (record.type === "attributes") {
|
|
2954
|
+
var parent = target.parentNode;
|
|
2955
|
+
if (parent && parent.nodeType === 1 && parent.matches(FITTED_DRAWERS)) {
|
|
2956
|
+
schedule(parent);
|
|
2957
|
+
}
|
|
2958
|
+
return;
|
|
2959
|
+
}
|
|
2960
|
+
if (target.nodeType === 1 && target.matches(FITTED_DRAWERS)) {
|
|
2961
|
+
schedule(target);
|
|
2962
|
+
return;
|
|
2963
|
+
}
|
|
2964
|
+
record.addedNodes.forEach(function(node) {
|
|
2965
|
+
if (node.nodeType !== 1) {
|
|
2966
|
+
return;
|
|
2967
|
+
}
|
|
2968
|
+
selfAndAll(node, FITTED_DRAWERS).forEach(function(drawer) {
|
|
2969
|
+
addClass(drawer, "ge-drawer-fit");
|
|
2970
|
+
drawerResizes.observe(drawer);
|
|
2971
|
+
schedule(drawer);
|
|
2972
|
+
});
|
|
2973
|
+
});
|
|
2974
|
+
});
|
|
2975
|
+
});
|
|
2976
|
+
mutations.observe(canvas, { childList: true, subtree: true, attributes: true, attributeFilter: ["style"] });
|
|
2977
|
+
lifetime.signal.addEventListener("abort", function() {
|
|
2978
|
+
mutations.disconnect();
|
|
2979
|
+
drawerResizes.disconnect();
|
|
2980
|
+
if (frame !== null) {
|
|
2981
|
+
window.cancelAnimationFrame(frame);
|
|
2982
|
+
}
|
|
2983
|
+
});
|
|
2984
|
+
}
|
|
2985
|
+
function fitDrawer(drawer) {
|
|
2986
|
+
var tools = children(drawer, "a").filter(function(tool) {
|
|
2987
|
+
return !hasClass(tool, "ge-drawer-more");
|
|
2988
|
+
});
|
|
2989
|
+
var expanded = hasClass(drawer, "ge-drawer-expanded");
|
|
2990
|
+
removeClass(drawer, "ge-drawer-overflow ge-drawer-expanded");
|
|
2991
|
+
tools.forEach(function(tool) {
|
|
2992
|
+
removeClass(tool, "ge-tool-overflow");
|
|
2993
|
+
});
|
|
2994
|
+
if (!drawerOverflows(drawer, tools)) {
|
|
2995
|
+
return;
|
|
2996
|
+
}
|
|
2997
|
+
addClass(drawer, "ge-drawer-overflow");
|
|
2998
|
+
if (!child(drawer, ".ge-drawer-more")) {
|
|
2999
|
+
createTool(drawer, t("tool.more"), "ge-drawer-more", "bi bi-three-dots", function() {
|
|
3000
|
+
toggleClass(drawer, "ge-drawer-expanded");
|
|
3001
|
+
});
|
|
3002
|
+
}
|
|
3003
|
+
for (var i = tools.length - 1; i >= 0 && drawerOverflows(drawer, tools); i--) {
|
|
3004
|
+
addClass(tools[i], "ge-tool-overflow");
|
|
3005
|
+
}
|
|
3006
|
+
toggleClass(drawer, "ge-drawer-expanded", expanded);
|
|
3007
|
+
}
|
|
3008
|
+
function drawerOverflows(drawer, tools) {
|
|
3009
|
+
var style = window.getComputedStyle(drawer);
|
|
3010
|
+
var limit = drawer.getBoundingClientRect().right - parseFloat(style.borderRightWidth) - parseFloat(style.paddingRight);
|
|
3011
|
+
return tools.some(function(tool) {
|
|
3012
|
+
var rects = tool.getClientRects();
|
|
3013
|
+
return rects.length > 0 && rects[0].right > limit + 0.5;
|
|
3014
|
+
});
|
|
3015
|
+
}
|
|
2724
3016
|
function createTool(drawer, title, className, iconClass, eventHandlers) {
|
|
2725
3017
|
var tool = element("a", { title, "class": className });
|
|
2726
3018
|
tool.appendChild(element("i", { "class": iconClass }));
|
|
@@ -4220,7 +4512,7 @@ GridEditor.t = translate;
|
|
|
4220
4512
|
GridEditor._plainHtml = plainHtml;
|
|
4221
4513
|
GridEditor.Sortable = null;
|
|
4222
4514
|
GridEditor.bootstrap = null;
|
|
4223
|
-
GridEditor.version = false ? "dev" : "8.
|
|
4515
|
+
GridEditor.version = false ? "dev" : "8.4.0";
|
|
4224
4516
|
GridEditor.locales = {
|
|
4225
4517
|
en: {
|
|
4226
4518
|
"tool.move": "Move",
|
|
@@ -4245,6 +4537,10 @@ GridEditor.locales = {
|
|
|
4245
4537
|
"tool.indent_increase": "Increase indent\n(hold shift for max)",
|
|
4246
4538
|
"tool.edit_source": "Edit Source Code",
|
|
4247
4539
|
"tool.preview": "Preview",
|
|
4540
|
+
"tool.more": "More",
|
|
4541
|
+
"group.rows": "Rows",
|
|
4542
|
+
"group.content": "Content",
|
|
4543
|
+
"group.select": "Add",
|
|
4248
4544
|
"panel.title": "{kind} settings",
|
|
4249
4545
|
"panel.close": "Close",
|
|
4250
4546
|
"panel.done": "Done",
|