@saltcorn/builder 1.6.0-alpha.1 → 1.6.0-alpha.11
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/dist/builder_bundle.js +85 -1
- package/dist/builder_bundle.js.LICENSE.txt +18 -51
- package/package.json +31 -27
- package/src/components/Builder.js +445 -155
- package/src/components/Library.js +25 -13
- package/src/components/RenderNode.js +26 -8
- package/src/components/Toolbox.js +333 -269
- package/src/components/elements/Action.js +144 -29
- package/src/components/elements/Aggregation.js +20 -23
- package/src/components/elements/ArrayManager.js +17 -10
- package/src/components/elements/BoxModelEditor.js +19 -17
- package/src/components/elements/Card.js +47 -34
- package/src/components/elements/Clone.js +74 -2
- package/src/components/elements/Column.js +1 -1
- package/src/components/elements/Columns.js +130 -121
- package/src/components/elements/Container.js +185 -92
- package/src/components/elements/DropDownFilter.js +10 -8
- package/src/components/elements/DropMenu.js +18 -9
- package/src/components/elements/Field.js +9 -7
- package/src/components/elements/HTMLCode.js +3 -1
- package/src/components/elements/Image.js +20 -15
- package/src/components/elements/JoinField.js +15 -11
- package/src/components/elements/Link.js +18 -16
- package/src/components/elements/ListColumn.js +7 -3
- package/src/components/elements/ListColumns.js +4 -1
- package/src/components/elements/MonacoEditor.js +4 -2
- package/src/components/elements/Page.js +7 -4
- package/src/components/elements/RelationBadges.js +16 -11
- package/src/components/elements/RelationOnDemandPicker.js +18 -12
- package/src/components/elements/SearchBar.js +37 -10
- package/src/components/elements/Table.js +72 -65
- package/src/components/elements/Tabs.js +18 -15
- package/src/components/elements/Text.js +19 -14
- package/src/components/elements/ToggleFilter.js +28 -25
- package/src/components/elements/View.js +36 -18
- package/src/components/elements/ViewLink.js +15 -11
- package/src/components/elements/utils.js +224 -55
- package/src/components/storage.js +33 -134
- package/src/hooks/useTranslation.js +11 -0
- package/src/index.js +6 -3
|
@@ -26,10 +26,10 @@ import { Link } from "./elements/Link";
|
|
|
26
26
|
import { View } from "./elements/View";
|
|
27
27
|
import { Page } from "./elements/Page";
|
|
28
28
|
import { SearchBar } from "./elements/SearchBar";
|
|
29
|
-
import { Container } from "./elements/Container";
|
|
30
29
|
import { DropDownFilter } from "./elements/DropDownFilter";
|
|
31
30
|
import { ToggleFilter } from "./elements/ToggleFilter";
|
|
32
31
|
import { DropMenu } from "./elements/DropMenu";
|
|
32
|
+
import { Container } from "./elements/Container";
|
|
33
33
|
import { rand_ident } from "./elements/utils";
|
|
34
34
|
|
|
35
35
|
/**
|
|
@@ -67,11 +67,11 @@ const allElements = [
|
|
|
67
67
|
LineBreak,
|
|
68
68
|
Aggregation,
|
|
69
69
|
Card,
|
|
70
|
+
Container,
|
|
70
71
|
Image,
|
|
71
72
|
Link,
|
|
72
73
|
View,
|
|
73
74
|
SearchBar,
|
|
74
|
-
Container,
|
|
75
75
|
DropDownFilter,
|
|
76
76
|
Tabs,
|
|
77
77
|
ToggleFilter,
|
|
@@ -100,14 +100,31 @@ const layoutToNodes = (
|
|
|
100
100
|
options,
|
|
101
101
|
index = false
|
|
102
102
|
) => {
|
|
103
|
-
//console.log("layoutToNodes", JSON.stringify(layout));
|
|
104
103
|
/**
|
|
105
104
|
* @param {object} segment
|
|
106
105
|
* @param {string} ix
|
|
107
106
|
* @returns {Element|Text|View|Action|Tabs|Columns}
|
|
108
107
|
*/
|
|
109
108
|
function toTag(segment, ix) {
|
|
110
|
-
if (!segment) return
|
|
109
|
+
if (!segment) return null;
|
|
110
|
+
|
|
111
|
+
if (
|
|
112
|
+
(segment.type === "card" || segment.type === "container") &&
|
|
113
|
+
typeof segment.contents === "string"
|
|
114
|
+
) {
|
|
115
|
+
segment.contents = {
|
|
116
|
+
type: "blank",
|
|
117
|
+
contents: segment.contents,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (segment.type === "container" && typeof segment.display === "undefined") {
|
|
122
|
+
segment.display = segment.block === true
|
|
123
|
+
? "block"
|
|
124
|
+
: segment.block === false
|
|
125
|
+
? "inline-block"
|
|
126
|
+
: "block";
|
|
127
|
+
}
|
|
111
128
|
|
|
112
129
|
const MatchElement = allElements.find(
|
|
113
130
|
(e) =>
|
|
@@ -123,8 +140,10 @@ const layoutToNodes = (
|
|
|
123
140
|
const props = {};
|
|
124
141
|
related.fields.forEach((f) => {
|
|
125
142
|
if (f.type === "Nodes" && f.nodeID) {
|
|
126
|
-
|
|
127
|
-
|
|
143
|
+
const v = segment[f.segment_name || f.name || f];
|
|
144
|
+
if (typeof v !== "undefined") {
|
|
145
|
+
props[f.name || f] = toTag(v);
|
|
146
|
+
}
|
|
128
147
|
} else {
|
|
129
148
|
const v = segment[f.segment_name || f.name || f];
|
|
130
149
|
props[f.name || f] = typeof v === "undefined" ? f.default : v;
|
|
@@ -212,72 +231,6 @@ const layoutToNodes = (
|
|
|
212
231
|
isFormula={segment.isFormula || {}}
|
|
213
232
|
/>
|
|
214
233
|
);
|
|
215
|
-
} else if (segment.type === "container") {
|
|
216
|
-
return (
|
|
217
|
-
<Element
|
|
218
|
-
key={ix}
|
|
219
|
-
custom={segment._custom || {}}
|
|
220
|
-
canvas
|
|
221
|
-
gradStartColor={segment.gradStartColor}
|
|
222
|
-
gradEndColor={segment.gradEndColor}
|
|
223
|
-
gradDirection={segment.gradDirection}
|
|
224
|
-
rotate={segment.rotate || 0}
|
|
225
|
-
animateName={segment.animateName}
|
|
226
|
-
animateDuration={segment.animateDuration}
|
|
227
|
-
animateDelay={segment.animateDelay}
|
|
228
|
-
animateInitialHide={segment.animateInitialHide}
|
|
229
|
-
customClass={segment.customClass}
|
|
230
|
-
customId={segment.customId}
|
|
231
|
-
customCSS={segment.customCSS}
|
|
232
|
-
overflow={segment.overflow}
|
|
233
|
-
margin={segment.margin || [0, 0, 0, 0]}
|
|
234
|
-
padding={segment.padding || [0, 0, 0, 0]}
|
|
235
|
-
minHeight={segment.minHeight}
|
|
236
|
-
height={segment.height}
|
|
237
|
-
width={segment.width}
|
|
238
|
-
click_action={segment.click_action}
|
|
239
|
-
url={segment.url}
|
|
240
|
-
hoverColor={segment.hoverColor}
|
|
241
|
-
minHeightUnit={segment.minHeightUnit || "px"}
|
|
242
|
-
heightUnit={segment.heightUnit || "px"}
|
|
243
|
-
widthUnit={segment.widthUnit || "px"}
|
|
244
|
-
vAlign={segment.vAlign}
|
|
245
|
-
hAlign={segment.hAlign}
|
|
246
|
-
htmlElement={segment.htmlElement || "div"}
|
|
247
|
-
display={
|
|
248
|
-
segment.display ||
|
|
249
|
-
(segment.block === true
|
|
250
|
-
? "block"
|
|
251
|
-
: segment.block === false
|
|
252
|
-
? "inline-block"
|
|
253
|
-
: "block")
|
|
254
|
-
}
|
|
255
|
-
fullPageWidth={
|
|
256
|
-
typeof segment.fullPageWidth === "undefined"
|
|
257
|
-
? false
|
|
258
|
-
: segment.fullPageWidth
|
|
259
|
-
}
|
|
260
|
-
bgFileId={segment.bgFileId}
|
|
261
|
-
bgField={segment.bgField}
|
|
262
|
-
imageSize={segment.imageSize || "contain"}
|
|
263
|
-
imgResponsiveWidths={segment.imgResponsiveWidths}
|
|
264
|
-
bgType={segment.bgType || "None"}
|
|
265
|
-
style={segment.style || {}}
|
|
266
|
-
transform={segment.transform || {}}
|
|
267
|
-
bgColor={segment.bgColor || "#ffffff"}
|
|
268
|
-
setTextColor={!!segment.setTextColor}
|
|
269
|
-
textColor={segment.textColor || "#000000"}
|
|
270
|
-
isFormula={segment.isFormula || {}}
|
|
271
|
-
showIfFormula={segment.showIfFormula || ""}
|
|
272
|
-
showForRole={segment.showForRole || []}
|
|
273
|
-
minScreenWidth={segment.minScreenWidth || ""}
|
|
274
|
-
maxScreenWidth={segment.maxScreenWidth || ""}
|
|
275
|
-
show_for_owner={!!segment.show_for_owner}
|
|
276
|
-
is={Container}
|
|
277
|
-
>
|
|
278
|
-
{toTag(segment.contents)}
|
|
279
|
-
</Element>
|
|
280
|
-
);
|
|
281
234
|
} else if (segment.type === "tabs") {
|
|
282
235
|
let contentsArray = segment.contents.map(toTag);
|
|
283
236
|
let contents;
|
|
@@ -365,7 +318,7 @@ const layoutToNodes = (
|
|
|
365
318
|
colClasses={segment.colClasses}
|
|
366
319
|
colStyles={segment.colStyles}
|
|
367
320
|
aligns={segment.aligns}
|
|
368
|
-
setting_col_n={
|
|
321
|
+
setting_col_n={segment.setting_col_n !== undefined ? segment.setting_col_n : 0}
|
|
369
322
|
contents={segment.besides.map(toTag)}
|
|
370
323
|
/>
|
|
371
324
|
);
|
|
@@ -401,7 +354,7 @@ const layoutToNodes = (
|
|
|
401
354
|
colClasses={segment.colClasses}
|
|
402
355
|
colStyles={segment.colStyles}
|
|
403
356
|
aligns={segment.aligns}
|
|
404
|
-
setting_col_n={
|
|
357
|
+
setting_col_n={segment.setting_col_n !== undefined ? segment.setting_col_n : 0}
|
|
405
358
|
contents={segment.besides.map(toTag)}
|
|
406
359
|
/>
|
|
407
360
|
)
|
|
@@ -412,18 +365,14 @@ const layoutToNodes = (
|
|
|
412
365
|
if (Array.isArray(tag)) {
|
|
413
366
|
tag.forEach((t) => {
|
|
414
367
|
const node = query.parseReactElement(t).toNodeTree();
|
|
415
|
-
//console.log("other", node);
|
|
416
368
|
actions.addNodeTree(node, parent, ix);
|
|
417
369
|
});
|
|
418
370
|
} else if (tag) {
|
|
419
371
|
const node = query.parseReactElement(tag).toNodeTree();
|
|
420
|
-
//console.log("other", node);
|
|
421
372
|
actions.addNodeTree(node, parent, ix);
|
|
422
373
|
}
|
|
423
374
|
}
|
|
424
375
|
}
|
|
425
|
-
//const node1 = query.createNode(toTag(layout));
|
|
426
|
-
//actions.add(node1, );
|
|
427
376
|
go(layout, parent, index);
|
|
428
377
|
};
|
|
429
378
|
|
|
@@ -440,12 +389,12 @@ export /**
|
|
|
440
389
|
* @namespace
|
|
441
390
|
*/
|
|
442
391
|
const craftToSaltcorn = (nodes, startFrom = "ROOT", options) => {
|
|
443
|
-
//console.log(JSON.stringify(nodes, null, 2));
|
|
444
392
|
var columns = [];
|
|
445
393
|
/**
|
|
446
394
|
* @param {object} node
|
|
447
395
|
* @returns {void|object}
|
|
448
396
|
*/
|
|
397
|
+
|
|
449
398
|
const removeEmpty = ({ above }) => {
|
|
450
399
|
const valids = above.filter(Boolean);
|
|
451
400
|
if (valids.length === 1) return valids[0];
|
|
@@ -480,7 +429,6 @@ const craftToSaltcorn = (nodes, startFrom = "ROOT", options) => {
|
|
|
480
429
|
if (related.hasContents) s.contents = get_nodes(node);
|
|
481
430
|
related.fields.forEach((f) => {
|
|
482
431
|
if (f.type === "Nodes" && f.nodeID) {
|
|
483
|
-
//console.log("nodetype", node);
|
|
484
432
|
s[f.segment_name || f.name || f] = go(
|
|
485
433
|
nodes[node.linkedNodes[f.nodeID]]
|
|
486
434
|
);
|
|
@@ -525,57 +473,7 @@ const craftToSaltcorn = (nodes, startFrom = "ROOT", options) => {
|
|
|
525
473
|
return lc;
|
|
526
474
|
}
|
|
527
475
|
if (node.isCanvas) {
|
|
528
|
-
|
|
529
|
-
return {
|
|
530
|
-
contents: get_nodes(node),
|
|
531
|
-
type: "container",
|
|
532
|
-
customCSS: node.props.customCSS,
|
|
533
|
-
customClass: node.props.customClass,
|
|
534
|
-
customId: node.props.customId,
|
|
535
|
-
animateName: node.props.animateName,
|
|
536
|
-
animateDelay: node.props.animateDelay,
|
|
537
|
-
animateDuration: node.props.animateDuration,
|
|
538
|
-
animateInitialHide: node.props.animateInitialHide,
|
|
539
|
-
minHeight: node.props.minHeight,
|
|
540
|
-
height: node.props.height,
|
|
541
|
-
width: node.props.width,
|
|
542
|
-
url: node.props.url,
|
|
543
|
-
hoverColor: node.props.hoverColor,
|
|
544
|
-
minHeightUnit: node.props.minHeightUnit,
|
|
545
|
-
heightUnit: node.props.heightUnit,
|
|
546
|
-
widthUnit: node.props.widthUnit,
|
|
547
|
-
vAlign: node.props.vAlign,
|
|
548
|
-
hAlign: node.props.hAlign,
|
|
549
|
-
htmlElement: node.props.htmlElement,
|
|
550
|
-
margin: node.props.margin,
|
|
551
|
-
padding: node.props.padding,
|
|
552
|
-
overflow: node.props.overflow,
|
|
553
|
-
display: node.props.display,
|
|
554
|
-
fullPageWidth: node.props.fullPageWidth || false,
|
|
555
|
-
bgFileId: node.props.bgFileId,
|
|
556
|
-
bgField: node.props.bgField,
|
|
557
|
-
bgType: node.props.bgType,
|
|
558
|
-
imageSize: node.props.imageSize,
|
|
559
|
-
imgResponsiveWidths: node.props.imgResponsiveWidths,
|
|
560
|
-
bgColor: node.props.bgColor,
|
|
561
|
-
setTextColor: node.props.setTextColor,
|
|
562
|
-
textColor: node.props.textColor,
|
|
563
|
-
isFormula: node.props.isFormula,
|
|
564
|
-
showIfFormula: node.props.showIfFormula,
|
|
565
|
-
showForRole: node.props.showForRole,
|
|
566
|
-
minScreenWidth: node.props.minScreenWidth,
|
|
567
|
-
maxScreenWidth: node.props.maxScreenWidth,
|
|
568
|
-
show_for_owner: node.props.show_for_owner,
|
|
569
|
-
gradStartColor: node.props.gradStartColor,
|
|
570
|
-
gradEndColor: node.props.gradEndColor,
|
|
571
|
-
gradDirection: node.props.gradDirection,
|
|
572
|
-
click_action: node.props.click_action,
|
|
573
|
-
rotate: node.props.rotate,
|
|
574
|
-
style: node.props.style,
|
|
575
|
-
transform: node.props.transform,
|
|
576
|
-
...customProps,
|
|
577
|
-
};
|
|
578
|
-
else return get_nodes(node);
|
|
476
|
+
return get_nodes(node);
|
|
579
477
|
}
|
|
580
478
|
|
|
581
479
|
if (node.displayName === Text.craft.displayName) {
|
|
@@ -624,14 +522,15 @@ const craftToSaltcorn = (nodes, startFrom = "ROOT", options) => {
|
|
|
624
522
|
besides: widths.map((w, ix) => go(nodes[node.linkedNodes["Col" + ix]])),
|
|
625
523
|
breakpoints: node.props.breakpoints,
|
|
626
524
|
customClass: node.props.customClass,
|
|
627
|
-
gx: +node.props.gx,
|
|
628
|
-
gy: +node.props.gy,
|
|
525
|
+
gx: node.props.gx != null ? +node.props.gx : undefined,
|
|
526
|
+
gy: node.props.gy != null ? +node.props.gy : undefined,
|
|
629
527
|
aligns: node.props.aligns,
|
|
630
528
|
vAligns: node.props.vAligns,
|
|
631
529
|
colClasses: node.props.colClasses,
|
|
632
530
|
colStyles: node.props.colStyles,
|
|
633
531
|
style: node.props.style,
|
|
634
532
|
widths,
|
|
533
|
+
setting_col_n: node.props.setting_col_n,
|
|
635
534
|
...customProps,
|
|
636
535
|
};
|
|
637
536
|
}
|
|
@@ -747,7 +646,7 @@ const craftToSaltcorn = (nodes, startFrom = "ROOT", options) => {
|
|
|
747
646
|
};
|
|
748
647
|
}
|
|
749
648
|
};
|
|
750
|
-
const layout = go(nodes[startFrom]) || {
|
|
649
|
+
const layout = go(nodes[startFrom]) || {};
|
|
751
650
|
/*console.log("nodes", JSON.stringify(nodes));
|
|
752
651
|
console.log("cols", JSON.stringify(columns));
|
|
753
652
|
console.log("layout", JSON.stringify(layout));*/
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import optionsCtx from "../components/context";
|
|
3
|
+
|
|
4
|
+
const useTranslation = () => {
|
|
5
|
+
const options = useContext(optionsCtx);
|
|
6
|
+
const translations = options.translations || {};
|
|
7
|
+
const t = (phrase) => translations[phrase] || phrase;
|
|
8
|
+
return { t };
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default useTranslation;
|
package/src/index.js
CHANGED
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
*/
|
|
50
50
|
|
|
51
51
|
import React from "react";
|
|
52
|
+
import { createRoot } from "react-dom/client";
|
|
52
53
|
import Builder from "./components/Builder";
|
|
53
|
-
import ReactDOM from "react-dom";
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
*
|
|
@@ -60,13 +60,16 @@ import ReactDOM from "react-dom";
|
|
|
60
60
|
* @param {string} mode
|
|
61
61
|
*/
|
|
62
62
|
function renderBuilder(id, options, layout, mode) {
|
|
63
|
-
|
|
63
|
+
const container = document.getElementById(id);
|
|
64
|
+
if (!container) return;
|
|
65
|
+
const root = container.__scRoot || createRoot(container);
|
|
66
|
+
container.__scRoot = root;
|
|
67
|
+
root.render(
|
|
64
68
|
<Builder
|
|
65
69
|
options={JSON.parse(decodeURIComponent(options))}
|
|
66
70
|
layout={JSON.parse(decodeURIComponent(layout))}
|
|
67
71
|
mode={mode}
|
|
68
72
|
/>,
|
|
69
|
-
document.getElementById(id)
|
|
70
73
|
);
|
|
71
74
|
}
|
|
72
75
|
|