@themarioga/grid-editor 8.3.0 → 8.5.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 +40 -0
- package/README.md +43 -1
- package/dist/grideditor.bundle.min.js +3 -3
- package/dist/grideditor.css +49 -0
- package/dist/grideditor.d.ts +21 -1
- package/dist/grideditor.esm.js +211 -9
- package/dist/grideditor.js +211 -9
- 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.elements.esm.js +72 -1
- package/dist/plugins/grideditor.elements.js +72 -1
- package/dist/plugins/grideditor.elements.min.js +1 -1
- package/dist/plugins/grideditor.elements.min.js.map +3 -3
- 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 +5 -1
- package/docs/plugins.md +24 -1
- package/package.json +1 -1
- package/src/js/grideditor.js +252 -8
- package/src/js/locales/grideditor.es.js +4 -0
- package/src/js/plugins/grideditor.elements.js +94 -1
- package/src/js/plugins/grideditor.sections.js +1 -0
- package/src/js/text/grideditor.text.js +1 -0
- package/src/less/grideditor.less +58 -0
- package/types/grideditor.d.ts +21 -1
package/dist/grideditor.css
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
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 */
|
|
5
8
|
/* toolbar_overflow: 'menu'. The add buttons keep to one line, and the
|
|
6
9
|
ones that don't fit go behind a button at its end. The right-hand
|
|
7
10
|
buttons come before in the markup, so they are ordered back to how
|
|
@@ -49,6 +52,13 @@
|
|
|
49
52
|
.ge-mainControls .ge-layout-mode {
|
|
50
53
|
margin-left: 5px;
|
|
51
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
|
+
}
|
|
52
62
|
.ge-mainControls .ge-wrapper.ge-toolbar-menu {
|
|
53
63
|
display: flex;
|
|
54
64
|
align-items: flex-start;
|
|
@@ -70,6 +80,14 @@
|
|
|
70
80
|
flex: 1 1 auto;
|
|
71
81
|
min-width: 0;
|
|
72
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;
|
|
73
91
|
}
|
|
74
92
|
.ge-mainControls .ge-toolbar-more {
|
|
75
93
|
display: none;
|
|
@@ -966,6 +984,37 @@
|
|
|
966
984
|
.ge-canvas.ge-editing .column.ge-resizing > .ge-tools-drawer > .ge-resize-size {
|
|
967
985
|
display: block;
|
|
968
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
|
+
}
|
|
969
1018
|
/* The handle belongs to editing, and never to the output */
|
|
970
1019
|
.ge-canvas:not(.ge-editing) .ge-resize-handle {
|
|
971
1020
|
display: none;
|
package/dist/grideditor.d.ts
CHANGED
|
@@ -109,6 +109,10 @@ export interface GridEditorOptions {
|
|
|
109
109
|
toolbar_drag?: 'auto' | boolean;
|
|
110
110
|
/** The add buttons that don't fit on the toolbar's line: behind a more button, or onto another line. Default 'menu'. */
|
|
111
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;
|
|
112
116
|
/** A click in a column or a section makes it where the toolbar's buttons add. Default false. */
|
|
113
117
|
active_target?: boolean;
|
|
114
118
|
/** The plugins to use, of any kind; null is every one loaded. */
|
|
@@ -121,7 +125,7 @@ export interface GridEditorOptions {
|
|
|
121
125
|
inline_style?: InlineStyleOptions;
|
|
122
126
|
/** The tabs plugin: the variant of the tabs containers made new. */
|
|
123
127
|
tabs?: TabsOptions;
|
|
124
|
-
elements?: { enabled?: boolean | 'auto'; selector?: string; auto?: boolean };
|
|
128
|
+
elements?: { enabled?: boolean | 'auto'; selector?: string; auto?: boolean; types?: ElementType[] };
|
|
125
129
|
custom_filter?: CustomFilter | CustomFilter[] | '';
|
|
126
130
|
valid_col_sizes?: ColumnSize[];
|
|
127
131
|
valid_col_offsets?: number[];
|
|
@@ -282,6 +286,22 @@ export type GridEditorCallbacks = {
|
|
|
282
286
|
};
|
|
283
287
|
|
|
284
288
|
/** A plugin's factory: called once per editor with the handle in docs/plugins.md. */
|
|
289
|
+
/** An element the toolbar offers, from elements.types. */
|
|
290
|
+
export interface ElementType {
|
|
291
|
+
/** What it is: its data-ge-element. */
|
|
292
|
+
type: string;
|
|
293
|
+
/** Its markup: html, or a function called for each one made that returns html or a node. */
|
|
294
|
+
html: string | (() => string | Node);
|
|
295
|
+
/** Its button's label, as it is. */
|
|
296
|
+
label?: string;
|
|
297
|
+
/** Its button's label, a locale key: wins over label, and follows setLocale. */
|
|
298
|
+
labelKey?: string;
|
|
299
|
+
/** The button shows this icon alone, with the label as its title. */
|
|
300
|
+
iconClass?: string;
|
|
301
|
+
/** Its toolbar_groups category. Default 'elements'. */
|
|
302
|
+
group?: string;
|
|
303
|
+
}
|
|
304
|
+
|
|
285
305
|
export type PluginFactory = ((ge: any) => Record<string, unknown>) & { always?: boolean };
|
|
286
306
|
|
|
287
307
|
export interface CreateColumnOptions extends Placement {
|
package/dist/grideditor.esm.js
CHANGED
|
@@ -392,8 +392,10 @@ var NESTED_SETTINGS = {
|
|
|
392
392
|
// 'auto' turns them on when the page has any
|
|
393
393
|
selector: "[data-ge-element]",
|
|
394
394
|
// What the host marks an element with
|
|
395
|
-
auto: false
|
|
395
|
+
auto: false,
|
|
396
396
|
// Treat every child of a content area as an element
|
|
397
|
+
types: []
|
|
398
|
+
// The elements the toolbar offers: { type, html, label | labelKey, iconClass, group }
|
|
397
399
|
},
|
|
398
400
|
resize: {
|
|
399
401
|
enabled: true,
|
|
@@ -444,6 +446,10 @@ function translate(settings, key, params) {
|
|
|
444
446
|
return params && params[name] !== void 0 ? params[name] : placeholder;
|
|
445
447
|
});
|
|
446
448
|
}
|
|
449
|
+
function hasString(settings, key) {
|
|
450
|
+
var locales = GridEditor.locales;
|
|
451
|
+
return (settings.locale_strings || {})[key] !== void 0 || (locales[settings.locale] || {})[key] !== void 0 || locales.en[key] !== void 0;
|
|
452
|
+
}
|
|
447
453
|
function warn(message) {
|
|
448
454
|
if (window.console && window.console.warn) {
|
|
449
455
|
window.console.warn("grid-editor: " + message);
|
|
@@ -572,6 +578,10 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
572
578
|
// Drag the toolbar's buttons onto the canvas. 'auto' follows drag_handle
|
|
573
579
|
"toolbar_overflow": "menu",
|
|
574
580
|
// What doesn't fit on one line: 'menu' behind a button, 'wrap' onto another line
|
|
581
|
+
"drawer_overflow": "menu",
|
|
582
|
+
// The same for the drawers' tools: 'menu' behind a button, 'wrap' onto another line
|
|
583
|
+
"toolbar_groups": false,
|
|
584
|
+
// The add buttons in categories, one shown at a time, picked with tabs
|
|
575
585
|
"active_target": false,
|
|
576
586
|
// A click in a column makes it where the toolbar's buttons add
|
|
577
587
|
"element_tools": [],
|
|
@@ -639,6 +649,10 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
639
649
|
var toolbarLifetime = null;
|
|
640
650
|
var closeOverflowMenu = function() {
|
|
641
651
|
};
|
|
652
|
+
var refitToolbar = function() {
|
|
653
|
+
};
|
|
654
|
+
var addButtons = [];
|
|
655
|
+
var toolbarGroup = null;
|
|
642
656
|
var warnedHere = {};
|
|
643
657
|
var sortables = [];
|
|
644
658
|
var instanceId = ++editorCounter;
|
|
@@ -1035,6 +1049,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1035
1049
|
htmlTextArea = element("textarea", { "class": "ge-html-output" });
|
|
1036
1050
|
canvas.parentNode.insertBefore(htmlTextArea, canvas);
|
|
1037
1051
|
createMainControls();
|
|
1052
|
+
watchDrawers();
|
|
1038
1053
|
var signal = { signal: lifetime.signal };
|
|
1039
1054
|
window.addEventListener("scroll", onScroll, signal);
|
|
1040
1055
|
delegate(canvas, "click", ".ge-content", onContentClick, signal);
|
|
@@ -1058,6 +1073,10 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1058
1073
|
return;
|
|
1059
1074
|
}
|
|
1060
1075
|
var region = closest(e.target, targetSelector());
|
|
1076
|
+
if (region && region === activeTarget && (e.target === region || e.target === child(region, ".ge-tools-drawer"))) {
|
|
1077
|
+
changeTarget(null);
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
1061
1080
|
changeTarget(region && region !== canvas && canvas.contains(region) ? region : null);
|
|
1062
1081
|
}, signal);
|
|
1063
1082
|
document.addEventListener("keydown", function(e) {
|
|
@@ -1089,6 +1108,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1089
1108
|
addClass(wrapper, "ge-toolbar-menu");
|
|
1090
1109
|
start = wrapper.appendChild(element("div", { "class": "ge-toolbar-start" }));
|
|
1091
1110
|
}
|
|
1111
|
+
addButtons = [];
|
|
1092
1112
|
addRowGroup = start.appendChild(element("div", { "class": "ge-addRowGroup btn-group" }));
|
|
1093
1113
|
addContainerGroup = element("div", { "class": "ge-addContainerGroup btn-group ms-1" });
|
|
1094
1114
|
settings.new_row_layouts.forEach(function(layout) {
|
|
@@ -1115,6 +1135,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1115
1135
|
}
|
|
1116
1136
|
});
|
|
1117
1137
|
addRowGroup.appendChild(btn);
|
|
1138
|
+
addButtons.push({ button: btn, home: addRowGroup, group: "rows" });
|
|
1118
1139
|
btn.appendChild(create('<i class="bi bi-plus"></i>'));
|
|
1119
1140
|
var sizes = grouped ? rowColsIcon(layout) : layout;
|
|
1120
1141
|
var icon = '<div class="row ge-row-icon">';
|
|
@@ -1146,6 +1167,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1146
1167
|
}, { parent: canvas, source: "tool" });
|
|
1147
1168
|
});
|
|
1148
1169
|
addContainerGroup.appendChild(button);
|
|
1170
|
+
addButtons.push({ button, home: addContainerGroup, group: toolbarGroupOf(definition.group) || "content" });
|
|
1149
1171
|
});
|
|
1150
1172
|
var endItems = [];
|
|
1151
1173
|
Object.keys(FEATURES).forEach(function(name) {
|
|
@@ -1155,6 +1177,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1155
1177
|
endItems.push(button);
|
|
1156
1178
|
} else {
|
|
1157
1179
|
addContainerGroup.appendChild(button);
|
|
1180
|
+
addButtons.push({ button, home: addContainerGroup, group: toolbarGroupOf(item.group) || name });
|
|
1158
1181
|
}
|
|
1159
1182
|
});
|
|
1160
1183
|
});
|
|
@@ -1208,11 +1231,82 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1208
1231
|
end.appendChild(button);
|
|
1209
1232
|
});
|
|
1210
1233
|
}
|
|
1234
|
+
if (settings.toolbar_groups) {
|
|
1235
|
+
createGroupTabs(start);
|
|
1236
|
+
}
|
|
1211
1237
|
if (overflowMenu) {
|
|
1212
1238
|
createOverflowMenu(start);
|
|
1213
1239
|
}
|
|
1214
1240
|
makeToolbarDraggable();
|
|
1215
1241
|
}
|
|
1242
|
+
var CORE_GROUPS = [
|
|
1243
|
+
{ name: "rows", labelKey: "group.rows" },
|
|
1244
|
+
{ name: "content", labelKey: "group.content" },
|
|
1245
|
+
{ name: "elements", labelKey: "group.elements" }
|
|
1246
|
+
];
|
|
1247
|
+
function toolbarGroupOf(value) {
|
|
1248
|
+
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
1249
|
+
}
|
|
1250
|
+
function createGroupTabs(start) {
|
|
1251
|
+
var names = CORE_GROUPS.map(function(group) {
|
|
1252
|
+
return group.name;
|
|
1253
|
+
});
|
|
1254
|
+
addButtons.forEach(function(entry) {
|
|
1255
|
+
if (names.indexOf(entry.group) < 0) {
|
|
1256
|
+
names.push(entry.group);
|
|
1257
|
+
}
|
|
1258
|
+
});
|
|
1259
|
+
names = names.filter(function(name) {
|
|
1260
|
+
return addButtons.some(function(entry) {
|
|
1261
|
+
return entry.group === name;
|
|
1262
|
+
});
|
|
1263
|
+
});
|
|
1264
|
+
if (names.length < 2) {
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
var tabs = element("div", { "class": "ge-toolbar-groups btn-group", role: "tablist", "aria-label": t("group.select") });
|
|
1268
|
+
start.insertBefore(tabs, start.firstChild);
|
|
1269
|
+
var stash = mainControls.appendChild(element("div", { "class": "ge-toolbar-stash", hidden: "hidden" }));
|
|
1270
|
+
names.forEach(function(name) {
|
|
1271
|
+
var tab = tabs.appendChild(element("button", {
|
|
1272
|
+
type: "button",
|
|
1273
|
+
"class": "btn btn-sm btn-outline-primary",
|
|
1274
|
+
role: "tab",
|
|
1275
|
+
"data-ge-group": name
|
|
1276
|
+
}, groupLabel(name)));
|
|
1277
|
+
tab.addEventListener("click", function() {
|
|
1278
|
+
showGroup(name);
|
|
1279
|
+
});
|
|
1280
|
+
});
|
|
1281
|
+
showGroup(names.indexOf(toolbarGroup) >= 0 ? toolbarGroup : names[0]);
|
|
1282
|
+
function showGroup(name) {
|
|
1283
|
+
toolbarGroup = name;
|
|
1284
|
+
addButtons.forEach(function(entry) {
|
|
1285
|
+
(entry.group === name ? entry.home : stash).appendChild(entry.button);
|
|
1286
|
+
});
|
|
1287
|
+
children(tabs).forEach(function(tab) {
|
|
1288
|
+
var chosen = tab.getAttribute("data-ge-group") === name;
|
|
1289
|
+
toggleClass(tab, "active", chosen);
|
|
1290
|
+
tab.setAttribute("aria-selected", chosen ? "true" : "false");
|
|
1291
|
+
});
|
|
1292
|
+
refitToolbar();
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
function groupLabel(name) {
|
|
1296
|
+
var key = "group." + name;
|
|
1297
|
+
if (hasString(settings, key)) {
|
|
1298
|
+
return t(key);
|
|
1299
|
+
}
|
|
1300
|
+
var first = addButtons.filter(function(entry) {
|
|
1301
|
+
return entry.group === name;
|
|
1302
|
+
})[0];
|
|
1303
|
+
return first.button.getAttribute("title") || name;
|
|
1304
|
+
}
|
|
1305
|
+
function shownAddButtons() {
|
|
1306
|
+
return addButtons.filter(function(entry) {
|
|
1307
|
+
return !closest(entry.button, ".ge-toolbar-stash");
|
|
1308
|
+
});
|
|
1309
|
+
}
|
|
1216
1310
|
function removeMainControls() {
|
|
1217
1311
|
if (toolbarLifetime) {
|
|
1218
1312
|
toolbarLifetime.abort();
|
|
@@ -1220,6 +1314,8 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1220
1314
|
toolbarLifetime = null;
|
|
1221
1315
|
closeOverflowMenu = function() {
|
|
1222
1316
|
};
|
|
1317
|
+
refitToolbar = function() {
|
|
1318
|
+
};
|
|
1223
1319
|
mainControls.remove();
|
|
1224
1320
|
}
|
|
1225
1321
|
function createOverflowMenu(start) {
|
|
@@ -1228,12 +1324,9 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1228
1324
|
var toggle2 = one(more, "button");
|
|
1229
1325
|
var panel = one(more, ".ge-toolbar-overflow");
|
|
1230
1326
|
var spares = all(panel, ".btn-group");
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
homes.push({ button, home: group, spare: spares[index] });
|
|
1235
|
-
});
|
|
1236
|
-
});
|
|
1327
|
+
function spareOf(home) {
|
|
1328
|
+
return home === addRowGroup ? spares[0] : spares[1];
|
|
1329
|
+
}
|
|
1237
1330
|
toggle2.setAttribute("title", t("tool.more"));
|
|
1238
1331
|
toggle2.setAttribute("aria-haspopup", "true");
|
|
1239
1332
|
toggle2.setAttribute("aria-expanded", "false");
|
|
@@ -1260,6 +1353,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1260
1353
|
closeOverflowMenu = function() {
|
|
1261
1354
|
openOverflow(false);
|
|
1262
1355
|
};
|
|
1356
|
+
refitToolbar = fit;
|
|
1263
1357
|
fit();
|
|
1264
1358
|
if (window.ResizeObserver) {
|
|
1265
1359
|
var pending = false;
|
|
@@ -1287,6 +1381,7 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1287
1381
|
toggle2.setAttribute("aria-expanded", open ? "true" : "false");
|
|
1288
1382
|
}
|
|
1289
1383
|
function fit() {
|
|
1384
|
+
var homes = shownAddButtons();
|
|
1290
1385
|
homes.forEach(function(entry) {
|
|
1291
1386
|
entry.home.appendChild(entry.button);
|
|
1292
1387
|
});
|
|
@@ -1297,7 +1392,8 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1297
1392
|
}
|
|
1298
1393
|
addClass(more, "ge-needed");
|
|
1299
1394
|
for (var i = homes.length - 1; i >= 0 && start.scrollWidth > start.clientWidth; i--) {
|
|
1300
|
-
|
|
1395
|
+
var into = spareOf(homes[i].home);
|
|
1396
|
+
into.insertBefore(homes[i].button, into.firstChild);
|
|
1301
1397
|
}
|
|
1302
1398
|
}
|
|
1303
1399
|
}
|
|
@@ -1327,6 +1423,9 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1327
1423
|
return;
|
|
1328
1424
|
}
|
|
1329
1425
|
var made = item.create();
|
|
1426
|
+
if (!made) {
|
|
1427
|
+
return;
|
|
1428
|
+
}
|
|
1330
1429
|
var placed = item.inColumn ? inRowOfItsOwn(made) : made;
|
|
1331
1430
|
var added = addNode(item.kind, made, function() {
|
|
1332
1431
|
canvas.appendChild(placed);
|
|
@@ -1435,6 +1534,9 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
1435
1534
|
function insertFeatureFromToolbar(button, where, source) {
|
|
1436
1535
|
var item = FEATURES[button.getAttribute("data-ge-feature")].toolbar[parseInt(button.getAttribute("data-ge-item"), 10)];
|
|
1437
1536
|
var made = item.create();
|
|
1537
|
+
if (!made) {
|
|
1538
|
+
return null;
|
|
1539
|
+
}
|
|
1438
1540
|
var placed = made;
|
|
1439
1541
|
if (item.inColumn) {
|
|
1440
1542
|
if (!is(where.region, ".column")) {
|
|
@@ -2824,6 +2926,102 @@ function build(instance, baseElem, optionsOrMethod) {
|
|
|
2824
2926
|
}
|
|
2825
2927
|
return createTool(drawer, t("tool.move"), "ge-move", "bi bi-arrows-move");
|
|
2826
2928
|
}
|
|
2929
|
+
var FITTED_DRAWERS = ".ge-tools-drawer:not(.ge-text-drawer):not(.ge-pane-drawer):not(.ge-code-inline)";
|
|
2930
|
+
function watchDrawers() {
|
|
2931
|
+
if (settings.drawer_overflow === "wrap" || !window.ResizeObserver || !window.MutationObserver) {
|
|
2932
|
+
return;
|
|
2933
|
+
}
|
|
2934
|
+
var due = /* @__PURE__ */ new Set();
|
|
2935
|
+
var frame = null;
|
|
2936
|
+
function schedule(drawer) {
|
|
2937
|
+
due.add(drawer);
|
|
2938
|
+
if (frame === null) {
|
|
2939
|
+
frame = window.requestAnimationFrame(flush);
|
|
2940
|
+
}
|
|
2941
|
+
}
|
|
2942
|
+
function flush() {
|
|
2943
|
+
frame = null;
|
|
2944
|
+
var drawers = Array.from(due);
|
|
2945
|
+
due.clear();
|
|
2946
|
+
drawers.forEach(function(drawer) {
|
|
2947
|
+
if (!drawer.isConnected) {
|
|
2948
|
+
drawerResizes.unobserve(drawer);
|
|
2949
|
+
return;
|
|
2950
|
+
}
|
|
2951
|
+
fitDrawer(drawer);
|
|
2952
|
+
});
|
|
2953
|
+
}
|
|
2954
|
+
var drawerResizes = new window.ResizeObserver(function(entries) {
|
|
2955
|
+
entries.forEach(function(entry) {
|
|
2956
|
+
schedule(entry.target);
|
|
2957
|
+
});
|
|
2958
|
+
});
|
|
2959
|
+
var mutations = new window.MutationObserver(function(records) {
|
|
2960
|
+
records.forEach(function(record) {
|
|
2961
|
+
var target = record.target;
|
|
2962
|
+
if (record.type === "attributes") {
|
|
2963
|
+
var parent = target.parentNode;
|
|
2964
|
+
if (parent && parent.nodeType === 1 && parent.matches(FITTED_DRAWERS)) {
|
|
2965
|
+
schedule(parent);
|
|
2966
|
+
}
|
|
2967
|
+
return;
|
|
2968
|
+
}
|
|
2969
|
+
if (target.nodeType === 1 && target.matches(FITTED_DRAWERS)) {
|
|
2970
|
+
schedule(target);
|
|
2971
|
+
return;
|
|
2972
|
+
}
|
|
2973
|
+
record.addedNodes.forEach(function(node) {
|
|
2974
|
+
if (node.nodeType !== 1) {
|
|
2975
|
+
return;
|
|
2976
|
+
}
|
|
2977
|
+
selfAndAll(node, FITTED_DRAWERS).forEach(function(drawer) {
|
|
2978
|
+
addClass(drawer, "ge-drawer-fit");
|
|
2979
|
+
drawerResizes.observe(drawer);
|
|
2980
|
+
schedule(drawer);
|
|
2981
|
+
});
|
|
2982
|
+
});
|
|
2983
|
+
});
|
|
2984
|
+
});
|
|
2985
|
+
mutations.observe(canvas, { childList: true, subtree: true, attributes: true, attributeFilter: ["style"] });
|
|
2986
|
+
lifetime.signal.addEventListener("abort", function() {
|
|
2987
|
+
mutations.disconnect();
|
|
2988
|
+
drawerResizes.disconnect();
|
|
2989
|
+
if (frame !== null) {
|
|
2990
|
+
window.cancelAnimationFrame(frame);
|
|
2991
|
+
}
|
|
2992
|
+
});
|
|
2993
|
+
}
|
|
2994
|
+
function fitDrawer(drawer) {
|
|
2995
|
+
var tools = children(drawer, "a").filter(function(tool) {
|
|
2996
|
+
return !hasClass(tool, "ge-drawer-more");
|
|
2997
|
+
});
|
|
2998
|
+
var expanded = hasClass(drawer, "ge-drawer-expanded");
|
|
2999
|
+
removeClass(drawer, "ge-drawer-overflow ge-drawer-expanded");
|
|
3000
|
+
tools.forEach(function(tool) {
|
|
3001
|
+
removeClass(tool, "ge-tool-overflow");
|
|
3002
|
+
});
|
|
3003
|
+
if (!drawerOverflows(drawer, tools)) {
|
|
3004
|
+
return;
|
|
3005
|
+
}
|
|
3006
|
+
addClass(drawer, "ge-drawer-overflow");
|
|
3007
|
+
if (!child(drawer, ".ge-drawer-more")) {
|
|
3008
|
+
createTool(drawer, t("tool.more"), "ge-drawer-more", "bi bi-three-dots", function() {
|
|
3009
|
+
toggleClass(drawer, "ge-drawer-expanded");
|
|
3010
|
+
});
|
|
3011
|
+
}
|
|
3012
|
+
for (var i = tools.length - 1; i >= 0 && drawerOverflows(drawer, tools); i--) {
|
|
3013
|
+
addClass(tools[i], "ge-tool-overflow");
|
|
3014
|
+
}
|
|
3015
|
+
toggleClass(drawer, "ge-drawer-expanded", expanded);
|
|
3016
|
+
}
|
|
3017
|
+
function drawerOverflows(drawer, tools) {
|
|
3018
|
+
var style = window.getComputedStyle(drawer);
|
|
3019
|
+
var limit = drawer.getBoundingClientRect().right - parseFloat(style.borderRightWidth) - parseFloat(style.paddingRight);
|
|
3020
|
+
return tools.some(function(tool) {
|
|
3021
|
+
var rects = tool.getClientRects();
|
|
3022
|
+
return rects.length > 0 && rects[0].right > limit + 0.5;
|
|
3023
|
+
});
|
|
3024
|
+
}
|
|
2827
3025
|
function createTool(drawer, title, className, iconClass, eventHandlers) {
|
|
2828
3026
|
var tool = element("a", { title, "class": className });
|
|
2829
3027
|
tool.appendChild(element("i", { "class": iconClass }));
|
|
@@ -4323,7 +4521,7 @@ GridEditor.t = translate;
|
|
|
4323
4521
|
GridEditor._plainHtml = plainHtml;
|
|
4324
4522
|
GridEditor.Sortable = null;
|
|
4325
4523
|
GridEditor.bootstrap = null;
|
|
4326
|
-
GridEditor.version = false ? "dev" : "8.
|
|
4524
|
+
GridEditor.version = false ? "dev" : "8.5.0";
|
|
4327
4525
|
GridEditor.locales = {
|
|
4328
4526
|
en: {
|
|
4329
4527
|
"tool.move": "Move",
|
|
@@ -4349,6 +4547,10 @@ GridEditor.locales = {
|
|
|
4349
4547
|
"tool.edit_source": "Edit Source Code",
|
|
4350
4548
|
"tool.preview": "Preview",
|
|
4351
4549
|
"tool.more": "More",
|
|
4550
|
+
"group.rows": "Rows",
|
|
4551
|
+
"group.content": "Content",
|
|
4552
|
+
"group.elements": "Elements",
|
|
4553
|
+
"group.select": "Add",
|
|
4352
4554
|
"panel.title": "{kind} settings",
|
|
4353
4555
|
"panel.close": "Close",
|
|
4354
4556
|
"panel.done": "Done",
|