@saltcorn/builder 0.9.4-beta.2 → 0.9.4-beta.20
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 +23 -11
- package/package.json +3 -1
- package/src/components/Builder.js +92 -66
- package/src/components/Library.js +46 -22
- package/src/components/RenderNode.js +5 -0
- package/src/components/Toolbox.js +173 -165
- package/src/components/elements/Action.js +12 -0
- package/src/components/elements/Aggregation.js +193 -104
- package/src/components/elements/BoxModelEditor.js +8 -8
- package/src/components/elements/Column.js +16 -2
- package/src/components/elements/Columns.js +4 -4
- package/src/components/elements/Container.js +26 -2
- package/src/components/elements/DropMenu.js +31 -2
- package/src/components/elements/Field.js +22 -20
- package/src/components/elements/HTMLCode.js +1 -1
- package/src/components/elements/JoinField.js +25 -1
- package/src/components/elements/Link.js +1 -0
- package/src/components/elements/ListColumn.js +177 -0
- package/src/components/elements/ListColumns.js +62 -0
- package/src/components/elements/RelationBadges.js +53 -44
- package/src/components/elements/Tabs.js +118 -40
- package/src/components/elements/Text.js +4 -2
- package/src/components/elements/View.js +125 -68
- package/src/components/elements/ViewLink.js +100 -48
- package/src/components/elements/utils.js +198 -98
- package/src/components/storage.js +67 -5
- package/tests/relations_finder.test.js +58 -92
- package/tests/test_data.js +0 -163
|
@@ -35,6 +35,7 @@ import {
|
|
|
35
35
|
SegmentedNav,
|
|
36
36
|
TextareaT,
|
|
37
37
|
} from "react-bootstrap-icons";
|
|
38
|
+
import { chunk } from "lodash";
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
41
|
*
|
|
@@ -489,7 +490,7 @@ const AggregationElem = ({ connectors, child_field_list, agg_field_opts }) => (
|
|
|
489
490
|
>
|
|
490
491
|
<Aggregation
|
|
491
492
|
agg_relation={child_field_list[0]}
|
|
492
|
-
agg_field={headOr(agg_field_opts[child_field_list[0]], "")}
|
|
493
|
+
agg_field={headOr(agg_field_opts[child_field_list[0]], "")?.name}
|
|
493
494
|
stat={"Count"}
|
|
494
495
|
textStyle={""}
|
|
495
496
|
aggwhere={""}
|
|
@@ -510,13 +511,24 @@ const TableElem = ({ connectors }) => (
|
|
|
510
511
|
</WrapElem>
|
|
511
512
|
);
|
|
512
513
|
|
|
514
|
+
const chunkToolBox = (elems, expanded) => {
|
|
515
|
+
const chunks = chunk(elems, expanded ? 3 : 2);
|
|
516
|
+
return chunks.map((es, ix) => (
|
|
517
|
+
<div className="toolbar-row" key={ix}>
|
|
518
|
+
{es.map((e, j) => (
|
|
519
|
+
<Fragment key={j}>{e}</Fragment>
|
|
520
|
+
))}
|
|
521
|
+
</div>
|
|
522
|
+
));
|
|
523
|
+
};
|
|
524
|
+
|
|
513
525
|
export /**
|
|
514
526
|
* @returns {Fragment}
|
|
515
527
|
* @category saltcorn-builder
|
|
516
528
|
* @subcategory components / Toolbox
|
|
517
529
|
* @namespace
|
|
518
530
|
*/
|
|
519
|
-
const ToolboxShow = () => {
|
|
531
|
+
const ToolboxShow = ({ expanded }) => {
|
|
520
532
|
const { connectors, query } = useEditor();
|
|
521
533
|
const options = useContext(optionsCtx);
|
|
522
534
|
const {
|
|
@@ -527,105 +539,131 @@ const ToolboxShow = () => {
|
|
|
527
539
|
views,
|
|
528
540
|
images,
|
|
529
541
|
} = options;
|
|
530
|
-
return (
|
|
531
|
-
|
|
532
|
-
<
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
<
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
<
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
</div>
|
|
560
|
-
<div className="toolbar-row">
|
|
561
|
-
<ContainerElem connectors={connectors} />
|
|
562
|
-
<CardElem connectors={connectors} />
|
|
563
|
-
</div>
|
|
564
|
-
<div className="toolbar-row">
|
|
565
|
-
<TabsElem connectors={connectors} />
|
|
566
|
-
<ImageElem connectors={connectors} images={images} />
|
|
567
|
-
</div>
|
|
568
|
-
<div className="toolbar-row">
|
|
569
|
-
<HTMLElem connectors={connectors} />
|
|
570
|
-
<DropMenuElem connectors={connectors} />
|
|
571
|
-
</div>
|
|
572
|
-
<div className="toolbar-row">
|
|
573
|
-
<TableElem connectors={connectors} />
|
|
574
|
-
</div>
|
|
575
|
-
</Fragment>
|
|
542
|
+
return chunkToolBox(
|
|
543
|
+
[
|
|
544
|
+
<TextElem connectors={connectors} />,
|
|
545
|
+
<ColumnsElem connectors={connectors} />,
|
|
546
|
+
<FieldElem
|
|
547
|
+
connectors={connectors}
|
|
548
|
+
fields={fields}
|
|
549
|
+
field_view_options={field_view_options}
|
|
550
|
+
/>,
|
|
551
|
+
<LineBreakElem connectors={connectors} />,
|
|
552
|
+
<JoinFieldElem connectors={connectors} options={options} />,
|
|
553
|
+
<ViewLinkElem connectors={connectors} options={options} />,
|
|
554
|
+
<ActionElem connectors={connectors} options={options} />,
|
|
555
|
+
<LinkElem connectors={connectors} />,
|
|
556
|
+
<AggregationElem
|
|
557
|
+
connectors={connectors}
|
|
558
|
+
child_field_list={child_field_list}
|
|
559
|
+
agg_field_opts={agg_field_opts}
|
|
560
|
+
/>,
|
|
561
|
+
<ViewElem connectors={connectors} views={views} />,
|
|
562
|
+
<ContainerElem connectors={connectors} />,
|
|
563
|
+
<CardElem connectors={connectors} />,
|
|
564
|
+
<TabsElem connectors={connectors} />,
|
|
565
|
+
<ImageElem connectors={connectors} images={images} />,
|
|
566
|
+
<HTMLElem connectors={connectors} />,
|
|
567
|
+
<DropMenuElem connectors={connectors} />,
|
|
568
|
+
<TableElem connectors={connectors} />,
|
|
569
|
+
],
|
|
570
|
+
expanded
|
|
576
571
|
);
|
|
577
572
|
};
|
|
578
|
-
|
|
579
573
|
export /**
|
|
580
574
|
* @returns {Fragment}
|
|
581
575
|
* @category saltcorn-builder
|
|
582
576
|
* @subcategory components / Toolbox
|
|
583
577
|
* @namespace
|
|
584
578
|
*/
|
|
585
|
-
const
|
|
579
|
+
const ToolboxList = ({ expanded }) => {
|
|
586
580
|
const { connectors, query } = useEditor();
|
|
587
581
|
const options = useContext(optionsCtx);
|
|
588
|
-
const {
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
<
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
582
|
+
const {
|
|
583
|
+
fields,
|
|
584
|
+
field_view_options,
|
|
585
|
+
child_field_list,
|
|
586
|
+
agg_field_opts,
|
|
587
|
+
views,
|
|
588
|
+
images,
|
|
589
|
+
} = options;
|
|
590
|
+
return chunkToolBox(
|
|
591
|
+
[
|
|
592
|
+
<TextElem connectors={connectors} />,
|
|
593
|
+
<FieldElem
|
|
594
|
+
connectors={connectors}
|
|
595
|
+
fields={fields}
|
|
596
|
+
field_view_options={field_view_options}
|
|
597
|
+
/>,
|
|
598
|
+
<JoinFieldElem connectors={connectors} options={options} />,
|
|
599
|
+
<ViewLinkElem connectors={connectors} options={options} />,
|
|
600
|
+
<ActionElem connectors={connectors} options={options} />,
|
|
601
|
+
<LinkElem connectors={connectors} />,
|
|
602
|
+
<AggregationElem
|
|
603
|
+
connectors={connectors}
|
|
604
|
+
child_field_list={child_field_list}
|
|
605
|
+
agg_field_opts={agg_field_opts}
|
|
606
|
+
/>,
|
|
607
|
+
// <ViewElem connectors={connectors} views={views} />,
|
|
608
|
+
// <ContainerElem connectors={connectors} />,
|
|
609
|
+
// <CardElem connectors={connectors} />,
|
|
610
|
+
// <TabsElem connectors={connectors} />,
|
|
611
|
+
<HTMLElem connectors={connectors} />,
|
|
612
|
+
<DropMenuElem connectors={connectors} />,
|
|
613
|
+
// <TableElem connectors={connectors} />,
|
|
614
|
+
...(options.allowMultipleElementsPerColumn
|
|
615
|
+
? [<LineBreakElem connectors={connectors} />]
|
|
616
|
+
: []),
|
|
617
|
+
],
|
|
618
|
+
expanded
|
|
619
|
+
);
|
|
620
|
+
};
|
|
613
621
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
622
|
+
export /**
|
|
623
|
+
* @returns {Fragment}
|
|
624
|
+
* @category saltcorn-builder
|
|
625
|
+
* @subcategory components / Toolbox
|
|
626
|
+
* @namespace
|
|
627
|
+
*/
|
|
628
|
+
const ToolboxFilter = ({ expanded }) => {
|
|
629
|
+
const { connectors, query } = useEditor();
|
|
630
|
+
const options = useContext(optionsCtx);
|
|
631
|
+
const {
|
|
632
|
+
fields,
|
|
633
|
+
views,
|
|
634
|
+
field_view_options,
|
|
635
|
+
child_field_list,
|
|
636
|
+
agg_field_opts,
|
|
637
|
+
} = options;
|
|
638
|
+
return chunkToolBox(
|
|
639
|
+
[
|
|
640
|
+
<TextElem connectors={connectors} />,
|
|
641
|
+
<ColumnsElem connectors={connectors} />,
|
|
642
|
+
<FieldElem
|
|
643
|
+
connectors={connectors}
|
|
644
|
+
fields={fields}
|
|
645
|
+
field_view_options={field_view_options}
|
|
646
|
+
/>,
|
|
647
|
+
<LineBreakElem connectors={connectors} />,
|
|
648
|
+
<DropDownFilterElem connectors={connectors} fields={fields} />,
|
|
649
|
+
<ToggleFilterElem connectors={connectors} fields={fields} />,
|
|
650
|
+
<SearchElem connectors={connectors} />,
|
|
651
|
+
<ActionElem connectors={connectors} options={options} />,
|
|
652
|
+
<AggregationElem
|
|
653
|
+
connectors={connectors}
|
|
654
|
+
child_field_list={child_field_list}
|
|
655
|
+
agg_field_opts={agg_field_opts}
|
|
656
|
+
/>,
|
|
657
|
+
<ContainerElem connectors={connectors} />,
|
|
658
|
+
<CardElem connectors={connectors} />,
|
|
659
|
+
<TabsElem connectors={connectors} />,
|
|
660
|
+
<ViewElem connectors={connectors} views={views} />,
|
|
661
|
+
<HTMLElem connectors={connectors} />,
|
|
662
|
+
<LinkElem connectors={connectors} />,
|
|
663
|
+
<TableElem connectors={connectors} />,
|
|
664
|
+
<DropMenuElem connectors={connectors} />,
|
|
665
|
+
],
|
|
666
|
+
expanded
|
|
629
667
|
);
|
|
630
668
|
};
|
|
631
669
|
|
|
@@ -635,49 +673,34 @@ export /**
|
|
|
635
673
|
* @subcategory components / Toolbox
|
|
636
674
|
* @namespace
|
|
637
675
|
*/
|
|
638
|
-
const ToolboxEdit = () => {
|
|
676
|
+
const ToolboxEdit = ({ expanded }) => {
|
|
639
677
|
const { connectors, query } = useEditor();
|
|
640
678
|
const options = useContext(optionsCtx);
|
|
641
679
|
const { fields, field_view_options, images, views } = options;
|
|
642
|
-
return (
|
|
643
|
-
|
|
644
|
-
<
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
<
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
<
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
<ImageElem connectors={connectors} images={images} />
|
|
667
|
-
</div>
|
|
668
|
-
<div className="toolbar-row">
|
|
669
|
-
<HTMLElem connectors={connectors} />
|
|
670
|
-
<ViewElem connectors={connectors} views={views} />
|
|
671
|
-
</div>
|
|
672
|
-
<div className="toolbar-row">
|
|
673
|
-
<JoinFieldElem connectors={connectors} options={options} />
|
|
674
|
-
<DropMenuElem connectors={connectors} />
|
|
675
|
-
</div>
|
|
676
|
-
<div className="toolbar-row">
|
|
677
|
-
<TableElem connectors={connectors} />
|
|
678
|
-
<ViewLinkElem connectors={connectors} options={options} />
|
|
679
|
-
</div>
|
|
680
|
-
</Fragment>
|
|
680
|
+
return chunkToolBox(
|
|
681
|
+
[
|
|
682
|
+
<TextElem connectors={connectors} />,
|
|
683
|
+
<ColumnsElem connectors={connectors} />,
|
|
684
|
+
<FieldElem
|
|
685
|
+
connectors={connectors}
|
|
686
|
+
fields={fields}
|
|
687
|
+
field_view_options={field_view_options}
|
|
688
|
+
/>,
|
|
689
|
+
<LineBreakElem connectors={connectors} />,
|
|
690
|
+
<ActionElem connectors={connectors} options={options} />,
|
|
691
|
+
<ContainerElem connectors={connectors} />,
|
|
692
|
+
<CardElem connectors={connectors} />,
|
|
693
|
+
<TabsElem connectors={connectors} />,
|
|
694
|
+
<LinkElem connectors={connectors} />,
|
|
695
|
+
<ImageElem connectors={connectors} images={images} />,
|
|
696
|
+
<HTMLElem connectors={connectors} />,
|
|
697
|
+
<ViewElem connectors={connectors} views={views} />,
|
|
698
|
+
<JoinFieldElem connectors={connectors} options={options} />,
|
|
699
|
+
<DropMenuElem connectors={connectors} />,
|
|
700
|
+
<TableElem connectors={connectors} />,
|
|
701
|
+
<ViewLinkElem connectors={connectors} options={options} />,
|
|
702
|
+
],
|
|
703
|
+
expanded
|
|
681
704
|
);
|
|
682
705
|
};
|
|
683
706
|
|
|
@@ -687,43 +710,28 @@ export /**
|
|
|
687
710
|
* @subcategory components / Toolbox
|
|
688
711
|
* @namespace
|
|
689
712
|
*/
|
|
690
|
-
const ToolboxPage = () => {
|
|
713
|
+
const ToolboxPage = ({ expanded }) => {
|
|
691
714
|
const { connectors, query } = useEditor();
|
|
692
715
|
const options = useContext(optionsCtx);
|
|
693
716
|
const { views, pages, images } = options;
|
|
694
|
-
return (
|
|
695
|
-
|
|
696
|
-
<
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
<
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
<
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
<
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
<SearchElem connectors={connectors} />
|
|
714
|
-
<ActionElem connectors={connectors} options={options} />
|
|
715
|
-
</div>
|
|
716
|
-
<div className="toolbar-row">
|
|
717
|
-
<ContainerElem connectors={connectors} />
|
|
718
|
-
<TabsElem connectors={connectors} />
|
|
719
|
-
</div>
|
|
720
|
-
<div className="toolbar-row">
|
|
721
|
-
<DropMenuElem connectors={connectors} />
|
|
722
|
-
<PageElem connectors={connectors} pages={pages} />
|
|
723
|
-
</div>
|
|
724
|
-
<div className="toolbar-row">
|
|
725
|
-
<TableElem connectors={connectors} />
|
|
726
|
-
</div>
|
|
727
|
-
</Fragment>
|
|
717
|
+
return chunkToolBox(
|
|
718
|
+
[
|
|
719
|
+
<TextElem connectors={connectors} />,
|
|
720
|
+
<ColumnsElem connectors={connectors} />,
|
|
721
|
+
<LineBreakElem connectors={connectors} />,
|
|
722
|
+
<HTMLElem connectors={connectors} />,
|
|
723
|
+
<CardElem connectors={connectors} />,
|
|
724
|
+
<ImageElem connectors={connectors} images={images} />,
|
|
725
|
+
<LinkElem connectors={connectors} />,
|
|
726
|
+
<ViewElem connectors={connectors} views={views} isPageEdit={true} />,
|
|
727
|
+
<SearchElem connectors={connectors} />,
|
|
728
|
+
<ActionElem connectors={connectors} options={options} />,
|
|
729
|
+
<ContainerElem connectors={connectors} />,
|
|
730
|
+
<TabsElem connectors={connectors} />,
|
|
731
|
+
<DropMenuElem connectors={connectors} />,
|
|
732
|
+
<PageElem connectors={connectors} pages={pages} />,
|
|
733
|
+
<TableElem connectors={connectors} />,
|
|
734
|
+
],
|
|
735
|
+
expanded
|
|
728
736
|
);
|
|
729
737
|
};
|
|
@@ -110,6 +110,7 @@ const ActionSettings = () => {
|
|
|
110
110
|
step_only_ifs: node.data.props.step_only_ifs,
|
|
111
111
|
step_action_names: node.data.props.step_action_names,
|
|
112
112
|
setting_action_n: node.data.props.setting_action_n,
|
|
113
|
+
spinner: node.data.props.spinner,
|
|
113
114
|
}));
|
|
114
115
|
const {
|
|
115
116
|
actions: { setProp },
|
|
@@ -127,6 +128,7 @@ const ActionSettings = () => {
|
|
|
127
128
|
setting_action_n,
|
|
128
129
|
step_only_ifs,
|
|
129
130
|
step_action_names,
|
|
131
|
+
spinner,
|
|
130
132
|
} = node;
|
|
131
133
|
const options = useContext(optionsCtx);
|
|
132
134
|
const getCfgFields = (fv) => (options.actionConfigForms || {})[fv];
|
|
@@ -278,6 +280,16 @@ const ActionSettings = () => {
|
|
|
278
280
|
/>
|
|
279
281
|
<label className="form-check-label">User confirmation?</label>
|
|
280
282
|
</div>
|
|
283
|
+
<div className="form-check">
|
|
284
|
+
<input
|
|
285
|
+
className="form-check-input"
|
|
286
|
+
name="block"
|
|
287
|
+
type="checkbox"
|
|
288
|
+
checked={spinner}
|
|
289
|
+
onChange={setAProp("spinner", { checked: true })}
|
|
290
|
+
/>
|
|
291
|
+
<label className="form-check-label">Spinner on click</label>
|
|
292
|
+
</div>
|
|
281
293
|
{action_style !== "on_page_load" ? (
|
|
282
294
|
<BlockSetting block={block} setProp={setProp} />
|
|
283
295
|
) : null}
|