@saltcorn/builder 0.9.4-beta.5 → 0.9.4-beta.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saltcorn/builder",
3
- "version": "0.9.4-beta.5",
3
+ "version": "0.9.4-beta.7",
4
4
  "description": "Drag and drop view builder for Saltcorn, open-source no-code platform",
5
5
  "main": "index.js",
6
6
  "homepage": "https://saltcorn.com",
@@ -396,8 +396,8 @@ const Builder = ({ options, layout, mode }) => {
396
396
  const nodekeys = useRef([]);
397
397
  const [isSaving, setIsSaving] = useState(false);
398
398
  const [isEnlarged, setIsEnlarged] = useState(false);
399
+ const [isLeftEnlarged, setIsLeftEnlarged] = useState(false);
399
400
  const [relationsCache, setRelationsCache] = useState({});
400
-
401
401
  return (
402
402
  <ErrorBoundary>
403
403
  <Editor onRender={RenderNode}>
@@ -412,7 +412,13 @@ const Builder = ({ options, layout, mode }) => {
412
412
  }}
413
413
  >
414
414
  <div className="row" style={{ marginTop: "-5px" }}>
415
- <div className="col-sm-auto left-builder-col">
415
+ <div
416
+ className={`col-sm-auto left-builder-col ${
417
+ isLeftEnlarged
418
+ ? "builder-left-enlarged"
419
+ : "builder-left-shrunk"
420
+ }`}
421
+ >
416
422
  <div className="componets-and-library-accordion toolbox-card">
417
423
  <InitNewElement
418
424
  nodekeys={nodekeys}
@@ -421,19 +427,34 @@ const Builder = ({ options, layout, mode }) => {
421
427
  <Accordion>
422
428
  <div className="card mt-1" accordiontitle="Components">
423
429
  {{
424
- show: <ToolboxShow />,
425
- edit: <ToolboxEdit />,
426
- page: <ToolboxPage />,
427
- filter: <ToolboxFilter />,
430
+ show: <ToolboxShow expanded={isLeftEnlarged} />,
431
+ edit: <ToolboxEdit expanded={isLeftEnlarged} />,
432
+ page: <ToolboxPage expanded={isLeftEnlarged} />,
433
+ filter: <ToolboxFilter expanded={isLeftEnlarged} />,
428
434
  }[mode] || <div>Missing mode</div>}
429
435
  </div>
430
436
  <div accordiontitle="Library">
431
- <Library />
437
+ <Library expanded={isLeftEnlarged} />
432
438
  </div>
433
439
  </Accordion>
434
440
  </div>
435
- <div className="card toolbox-card pe-0">
436
- <div className="card-header">Layers</div>
441
+ <div
442
+ className="card toolbox-card pe-0"
443
+ style={isLeftEnlarged ? { width: "12.35rem" } : {}}
444
+ >
445
+ <div className="card-header p-2 d-flex justify-content-between">
446
+ <div>Layers</div>
447
+ <FontAwesomeIcon
448
+ icon={
449
+ isLeftEnlarged
450
+ ? faCaretSquareLeft
451
+ : faCaretSquareRight
452
+ }
453
+ className={"float-end fa-lg"}
454
+ onClick={() => setIsLeftEnlarged(!isLeftEnlarged)}
455
+ title={isLeftEnlarged ? "Shrink" : "Enlarge"}
456
+ />
457
+ </div>
437
458
  {showLayers && (
438
459
  <div className="card-body p-0 builder-layers">
439
460
  <Layers expandRootOnLoad={true} />
@@ -488,6 +509,7 @@ const Builder = ({ options, layout, mode }) => {
488
509
  icon={isEnlarged ? faCaretSquareRight : faCaretSquareLeft}
489
510
  className={"float-end me-2 mt-1 fa-lg"}
490
511
  onClick={() => setIsEnlarged(!isEnlarged)}
512
+ title={isEnlarged ? "Shrink" : "Enlarge"}
491
513
  />
492
514
 
493
515
  <SettingsPanel />
@@ -20,18 +20,7 @@ import faIcons from "./elements/faicons";
20
20
  import { craftToSaltcorn, layoutToNodes } from "./storage";
21
21
  import optionsCtx from "./context";
22
22
  import { WrapElem } from "./Toolbox";
23
- import { isEqual, throttle } from "lodash";
24
-
25
- /**
26
- *
27
- * @param {object[]} xs
28
- * @returns {object[]}
29
- */
30
- const twoByTwos = (xs) => {
31
- if (xs.length <= 2) return [xs];
32
- const [x, y, ...rest] = xs;
33
- return [[x, y], ...twoByTwos(rest)];
34
- };
23
+ import { isEqual, throttle, chunk } from "lodash";
35
24
 
36
25
  export /**
37
26
  * @param {object} props
@@ -184,7 +173,7 @@ export /**
184
173
  * @subcategory components
185
174
  * @namespace
186
175
  */
187
- const Library = () => {
176
+ const Library = ({ expanded }) => {
188
177
  const { actions, selected, query, connectors } = useEditor((state, query) => {
189
178
  return {
190
179
  selected: state.events.selected,
@@ -216,7 +205,10 @@ const Library = () => {
216
205
  setRecent([...recent, data]);
217
206
  };
218
207
 
219
- const elemRows = twoByTwos([...(options.library || []), ...recent]);
208
+ const elemRows = chunk(
209
+ [...(options.library || []), ...recent],
210
+ expanded ? 3 : 2
211
+ );
220
212
  return (
221
213
  <div className="builder-library">
222
214
  <div className="dropdown">
@@ -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
  *
@@ -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,52 +539,35 @@ const ToolboxShow = () => {
527
539
  views,
528
540
  images,
529
541
  } = options;
530
- return (
531
- <Fragment>
532
- <div className="toolbar-row">
533
- <TextElem connectors={connectors} />
534
- <ColumnsElem connectors={connectors} />
535
- </div>
536
- <div className="toolbar-row">
537
- <FieldElem
538
- connectors={connectors}
539
- fields={fields}
540
- field_view_options={field_view_options}
541
- />
542
- <LineBreakElem connectors={connectors} />
543
- </div>
544
- <div className="toolbar-row">
545
- <JoinFieldElem connectors={connectors} options={options} />
546
- <ViewLinkElem connectors={connectors} options={options} />
547
- </div>
548
- <div className="toolbar-row">
549
- <ActionElem connectors={connectors} options={options} />
550
- <LinkElem connectors={connectors} />
551
- </div>
552
- <div className="toolbar-row">
553
- <AggregationElem
554
- connectors={connectors}
555
- child_field_list={child_field_list}
556
- agg_field_opts={agg_field_opts}
557
- />
558
- <ViewElem connectors={connectors} views={views} />
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
573
 
@@ -582,50 +577,34 @@ export /**
582
577
  * @subcategory components / Toolbox
583
578
  * @namespace
584
579
  */
585
- const ToolboxFilter = () => {
580
+ const ToolboxFilter = ({ expanded }) => {
586
581
  const { connectors, query } = useEditor();
587
582
  const options = useContext(optionsCtx);
588
583
  const { fields, views, field_view_options } = options;
589
- return (
590
- <Fragment>
591
- <div className="toolbar-row">
592
- <TextElem connectors={connectors} />
593
- <ColumnsElem connectors={connectors} />
594
- </div>
595
- <div className="toolbar-row">
596
- <FieldElem
597
- connectors={connectors}
598
- fields={fields}
599
- field_view_options={field_view_options}
600
- />
601
- <LineBreakElem connectors={connectors} />
602
- </div>
603
- <div className="toolbar-row">
604
- <DropDownFilterElem connectors={connectors} fields={fields} />
605
- <ToggleFilterElem connectors={connectors} fields={fields} />
606
- </div>
607
- <div className="toolbar-row">
608
- <SearchElem connectors={connectors} />
609
- <ActionElem connectors={connectors} options={options} />
610
- </div>
611
- <div className="toolbar-row">
612
- <ContainerElem connectors={connectors} />
613
-
614
- <CardElem connectors={connectors} />
615
- </div>
616
- <div className="toolbar-row">
617
- <TabsElem connectors={connectors} />
618
- <ViewElem connectors={connectors} views={views} />
619
- </div>
620
- <div className="toolbar-row">
621
- <HTMLElem connectors={connectors} />
622
- <LinkElem connectors={connectors} />
623
- </div>
624
- <div className="toolbar-row">
625
- <TableElem connectors={connectors} />
626
- <DropMenuElem connectors={connectors} />
627
- </div>
628
- </Fragment>
584
+ return chunkToolBox(
585
+ [
586
+ <TextElem connectors={connectors} />,
587
+ <ColumnsElem connectors={connectors} />,
588
+ <FieldElem
589
+ connectors={connectors}
590
+ fields={fields}
591
+ field_view_options={field_view_options}
592
+ />,
593
+ <LineBreakElem connectors={connectors} />,
594
+ <DropDownFilterElem connectors={connectors} fields={fields} />,
595
+ <ToggleFilterElem connectors={connectors} fields={fields} />,
596
+ <SearchElem connectors={connectors} />,
597
+ <ActionElem connectors={connectors} options={options} />,
598
+ <ContainerElem connectors={connectors} />,
599
+ <CardElem connectors={connectors} />,
600
+ <TabsElem connectors={connectors} />,
601
+ <ViewElem connectors={connectors} views={views} />,
602
+ <HTMLElem connectors={connectors} />,
603
+ <LinkElem connectors={connectors} />,
604
+ <TableElem connectors={connectors} />,
605
+ <DropMenuElem connectors={connectors} />,
606
+ ],
607
+ expanded
629
608
  );
630
609
  };
631
610
 
@@ -635,49 +614,34 @@ export /**
635
614
  * @subcategory components / Toolbox
636
615
  * @namespace
637
616
  */
638
- const ToolboxEdit = () => {
617
+ const ToolboxEdit = ({ expanded }) => {
639
618
  const { connectors, query } = useEditor();
640
619
  const options = useContext(optionsCtx);
641
620
  const { fields, field_view_options, images, views } = options;
642
- return (
643
- <Fragment>
644
- <div className="toolbar-row">
645
- <TextElem connectors={connectors} />
646
- <ColumnsElem connectors={connectors} />
647
- </div>
648
- <div className="toolbar-row">
649
- <FieldElem
650
- connectors={connectors}
651
- fields={fields}
652
- field_view_options={field_view_options}
653
- />
654
- <LineBreakElem connectors={connectors} />
655
- </div>
656
- <div className="toolbar-row">
657
- <ActionElem connectors={connectors} options={options} />
658
- <ContainerElem connectors={connectors} />
659
- </div>
660
- <div className="toolbar-row">
661
- <CardElem connectors={connectors} />
662
- <TabsElem connectors={connectors} />
663
- </div>
664
- <div className="toolbar-row">
665
- <LinkElem connectors={connectors} />
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>
621
+ return chunkToolBox(
622
+ [
623
+ <TextElem connectors={connectors} />,
624
+ <ColumnsElem connectors={connectors} />,
625
+ <FieldElem
626
+ connectors={connectors}
627
+ fields={fields}
628
+ field_view_options={field_view_options}
629
+ />,
630
+ <LineBreakElem connectors={connectors} />,
631
+ <ActionElem connectors={connectors} options={options} />,
632
+ <ContainerElem connectors={connectors} />,
633
+ <CardElem connectors={connectors} />,
634
+ <TabsElem connectors={connectors} />,
635
+ <LinkElem connectors={connectors} />,
636
+ <ImageElem connectors={connectors} images={images} />,
637
+ <HTMLElem connectors={connectors} />,
638
+ <ViewElem connectors={connectors} views={views} />,
639
+ <JoinFieldElem connectors={connectors} options={options} />,
640
+ <DropMenuElem connectors={connectors} />,
641
+ <TableElem connectors={connectors} />,
642
+ <ViewLinkElem connectors={connectors} options={options} />,
643
+ ],
644
+ expanded
681
645
  );
682
646
  };
683
647
 
@@ -687,43 +651,28 @@ export /**
687
651
  * @subcategory components / Toolbox
688
652
  * @namespace
689
653
  */
690
- const ToolboxPage = () => {
654
+ const ToolboxPage = ({ expanded }) => {
691
655
  const { connectors, query } = useEditor();
692
656
  const options = useContext(optionsCtx);
693
657
  const { views, pages, images } = options;
694
- return (
695
- <Fragment>
696
- <div className="toolbar-row">
697
- <TextElem connectors={connectors} />
698
- <ColumnsElem connectors={connectors} />
699
- </div>
700
- <div className="toolbar-row">
701
- <LineBreakElem connectors={connectors} />
702
- <HTMLElem connectors={connectors} />
703
- </div>
704
- <div className="toolbar-row">
705
- <CardElem connectors={connectors} />
706
- <ImageElem connectors={connectors} images={images} />{" "}
707
- </div>
708
- <div className="toolbar-row">
709
- <LinkElem connectors={connectors} />
710
- <ViewElem connectors={connectors} views={views} isPageEdit={true} />
711
- </div>
712
- <div className="toolbar-row">
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>
658
+ return chunkToolBox(
659
+ [
660
+ <TextElem connectors={connectors} />,
661
+ <ColumnsElem connectors={connectors} />,
662
+ <LineBreakElem connectors={connectors} />,
663
+ <HTMLElem connectors={connectors} />,
664
+ <CardElem connectors={connectors} />,
665
+ <ImageElem connectors={connectors} images={images} />,
666
+ <LinkElem connectors={connectors} />,
667
+ <ViewElem connectors={connectors} views={views} isPageEdit={true} />,
668
+ <SearchElem connectors={connectors} />,
669
+ <ActionElem connectors={connectors} options={options} />,
670
+ <ContainerElem connectors={connectors} />,
671
+ <TabsElem connectors={connectors} />,
672
+ <DropMenuElem connectors={connectors} />,
673
+ <PageElem connectors={connectors} pages={pages} />,
674
+ <TableElem connectors={connectors} />,
675
+ ],
676
+ expanded
728
677
  );
729
678
  };
@@ -250,7 +250,7 @@ const ColumnsSettings = () => {
250
250
  setProp={setProp}
251
251
  props={node}
252
252
  ></ConfigField>
253
- <table>
253
+ <table className="w-100">
254
254
  <tbody>
255
255
  <SettingsSectionHeaderRow title="Align" />
256
256
  <SettingsRow
@@ -424,7 +424,7 @@ const TabsSettings = () => {
424
424
  />
425
425
  </td>
426
426
  </tr>
427
- {options.mode === "show" ? (
427
+ {options.mode === "show" || options.mode === "edit" ? (
428
428
  <Fragment>
429
429
  <tr>
430
430
  <th colSpan="2">Show if formula</th>
@@ -1505,6 +1505,14 @@ export const buildBootstrapOptions = (values) => {
1505
1505
  ));
1506
1506
  };
1507
1507
 
1508
+ export const arrayChunks = (xs, n) => {
1509
+ const arrayOfArrays = [];
1510
+ for (var i = 0; i < bigarray.length; i += n) {
1511
+ arrayOfArrays.push(bigarray.slice(i, i + n));
1512
+ }
1513
+ return arrayOfArrays;
1514
+ };
1515
+
1508
1516
  export const prepCacheAndFinder = ({
1509
1517
  tables,
1510
1518
  views,