ballerina-core 1.0.251 → 1.0.253

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
@@ -2,7 +2,7 @@
2
2
  "name": "ballerina-core",
3
3
  "author": "Dr. Giuseppe Maggiore",
4
4
  "private": false,
5
- "version": "1.0.251",
5
+ "version": "1.0.253",
6
6
  "main": "main.ts",
7
7
  "scripts": {
8
8
  "prettier": "prettier --write ."
@@ -12,6 +12,10 @@ import {
12
12
  BasicUpdater,
13
13
  DispatchDelta,
14
14
  NestedRenderer,
15
+ BaseFlags,
16
+ replaceWith,
17
+ ValueReadOnly,
18
+ Updater,
15
19
  } from "../../../../../../../../main";
16
20
  import { Template } from "../../../../../../../template/state";
17
21
  import {
@@ -27,7 +31,7 @@ import {
27
31
  export const ReadOnlyAbstractRenderer = <
28
32
  T extends DispatchParsedType<T>,
29
33
  CustomPresentationContext = Unit,
30
- Flags = Unit,
34
+ Flags extends BaseFlags = BaseFlags,
31
35
  ExtraContext = Unit,
32
36
  >(
33
37
  GetDefaultChildState: () => CommonAbstractRendererState,
@@ -88,15 +92,37 @@ export const ReadOnlyAbstractRenderer = <
88
92
  .mapForeignMutationsFromProps<{
89
93
  onChange: DispatchOnChange<PredicateValue, Flags>;
90
94
  }>(
91
- (): {
95
+ (
96
+ props,
97
+ ): {
92
98
  onChange: DispatchOnChange<PredicateValue, Flags>;
93
99
  } => ({
94
100
  onChange: (
95
101
  elementUpdater: Option<BasicUpdater<PredicateValue>>,
96
102
  nestedDelta: DispatchDelta<Flags>,
97
103
  ) => {
98
- console.debug(
99
- "ReadOnly field onChange intercepted - no changes allowed",
104
+ const flags = { kind: "localOnly" };
105
+ const delta: DispatchDelta<Flags> = {
106
+ kind: "UnitReplace",
107
+ replace: PredicateValue.Default.unit(),
108
+ state: {},
109
+ type: DispatchParsedType.Default.primitive("unit"),
110
+ flags: flags as Flags,
111
+ sourceAncestorLookupTypeNames:
112
+ nestedDelta.sourceAncestorLookupTypeNames,
113
+ };
114
+
115
+ props.foreignMutations.onChange(
116
+ elementUpdater.kind == "l"
117
+ ? Option.Default.none()
118
+ : Option.Default.some(
119
+ Updater<PredicateValue>((value) =>
120
+ ValueReadOnly.Updaters.ReadOnly(elementUpdater.value)(
121
+ value as ValueReadOnly,
122
+ ),
123
+ ),
124
+ ),
125
+ delta,
100
126
  );
101
127
  },
102
128
  }),
@@ -567,7 +567,6 @@ export const RendererTraversal = {
567
567
  );
568
568
  });
569
569
  }
570
- // TODO -- add recursion for the detailsRenderer, but requires state
571
570
  if (renderer.type.kind == "table" && renderer.kind == "tableRenderer") {
572
571
  return ValueOrErrors.Operations.All(
573
572
  List(
@@ -584,83 +583,109 @@ export const RendererTraversal = {
584
583
  })
585
584
  .valueSeq(),
586
585
  ),
587
- ).Then((columnTraversals) => {
588
- if (
589
- columnTraversals.every((c) => c.columnTraversal.kind == "l") &&
590
- traverseNode.kind == "l"
591
- ) {
592
- return ValueOrErrors.Default.return(Option.Default.none());
593
- }
594
- return ValueOrErrors.Default.return(
595
- Option.Default.some((evalContext: EvalContext<T, Res>) => {
596
- const iterator = evalContext.traversalIterator;
597
- if (!PredicateValue.Operations.IsTable(iterator)) {
598
- return ValueOrErrors.Default.throwOne(
599
- `Error: traversal iterator is not a table, got ${evalContext.traversalIterator}`,
600
- );
601
- }
602
- return TableLayout.Operations.ComputeLayout(
603
- Map([
604
- ["global", evalContext.global],
605
- ["local", evalContext.local],
606
- ["root", evalContext.root],
607
- ]),
608
- renderer.visibleColumns,
609
- ).Then((visibleColumns) => {
610
- // Note: we do not allow visiblity predicates on individual column cells
611
- return ValueOrErrors.Operations.All<Res, string>(
612
- columnTraversals.flatMap((c) => {
613
- const colTraversal = c.columnTraversal;
614
- if (
615
- colTraversal.kind == "l" ||
616
- !visibleColumns.columns.includes(c.columnName)
617
- ) {
618
- return [];
619
- }
620
- return iterator.data.valueSeq().flatMap((row) => {
621
- // TODO make this monadic
622
- const columnValue = row.fields.get(c.columnName);
623
- if (!columnValue) {
624
- return [
625
- ValueOrErrors.Default.throwOne(
626
- `Error: cannot find column ${
627
- c.columnName
628
- } in row ${JSON.stringify(row)}`,
629
- ),
630
- ];
631
- }
632
- return [
633
- colTraversal.value({
634
- ...evalContext,
635
- traversalIterator: columnValue,
636
- }),
637
- ];
638
- });
586
+ )
587
+ .Then((columnTraversals) =>
588
+ renderer.detailsRenderer
589
+ ? rec(renderer.detailsRenderer.renderer, traversalContext).Map(
590
+ (detailsTraversal) => ({
591
+ detailsTraversal: detailsTraversal,
592
+ columnTraversals: columnTraversals,
639
593
  }),
640
- ).Then((columnResults) => {
641
- return traverseNode.kind == "r"
642
- ? traverseNode
643
- .value(evalContext)
644
- .Then((nodeResult: Res) =>
645
- ValueOrErrors.Default.return(
646
- columnResults.reduce(
647
- (acc, res) =>
648
- traversalContext.joinRes([acc, res]),
649
- nodeResult,
594
+ )
595
+ : ValueOrErrors.Default.return({
596
+ detailsTraversal:
597
+ Option.Default.none<ValueTraversal<T, Res>>(),
598
+ columnTraversals: columnTraversals,
599
+ }),
600
+ )
601
+ .Then(({ detailsTraversal, columnTraversals }) => {
602
+ if (
603
+ columnTraversals.every((c) => c.columnTraversal.kind == "l") &&
604
+ traverseNode.kind == "l"
605
+ ) {
606
+ return ValueOrErrors.Default.return(Option.Default.none());
607
+ }
608
+ return ValueOrErrors.Default.return(
609
+ Option.Default.some((evalContext: EvalContext<T, Res>) => {
610
+ const iterator = evalContext.traversalIterator;
611
+ if (!PredicateValue.Operations.IsTable(iterator)) {
612
+ return ValueOrErrors.Default.throwOne(
613
+ `Error: traversal iterator is not a table, got ${evalContext.traversalIterator}`,
614
+ );
615
+ }
616
+ return TableLayout.Operations.ComputeLayout(
617
+ Map([
618
+ ["global", evalContext.global],
619
+ ["local", evalContext.local],
620
+ ["root", evalContext.root],
621
+ ]),
622
+ renderer.visibleColumns,
623
+ ).Then((visibleColumns) => {
624
+ // Note: we do not allow visiblity predicates on individual column cells
625
+ return ValueOrErrors.Operations.All<Res, string>(
626
+ columnTraversals
627
+ .flatMap<ValueOrErrors<Res, string>>((c) => {
628
+ const colTraversal = c.columnTraversal;
629
+ if (
630
+ colTraversal.kind == "l" ||
631
+ !visibleColumns.columns.includes(c.columnName)
632
+ ) {
633
+ return [];
634
+ }
635
+ return iterator.data.valueSeq().flatMap((row) => {
636
+ // TODO make this monadic
637
+ const columnValue = row.fields.get(c.columnName);
638
+ if (!columnValue) {
639
+ return [
640
+ ValueOrErrors.Default.throwOne(
641
+ `Error: cannot find column ${
642
+ c.columnName
643
+ } in row ${JSON.stringify(row)}`,
644
+ ),
645
+ ];
646
+ }
647
+ return [
648
+ colTraversal.value({
649
+ ...evalContext,
650
+ traversalIterator: columnValue,
651
+ }),
652
+ ];
653
+ });
654
+ })
655
+ .concat(
656
+ detailsTraversal.kind == "l"
657
+ ? []
658
+ : iterator.data.valueSeq().map((row) => {
659
+ return detailsTraversal.value({
660
+ ...evalContext,
661
+ traversalIterator: row,
662
+ });
663
+ }),
664
+ ),
665
+ ).Then((columnAndDetailsResults) => {
666
+ return traverseNode.kind == "r"
667
+ ? traverseNode
668
+ .value(evalContext)
669
+ .Then((nodeResult: Res) =>
670
+ ValueOrErrors.Default.return(
671
+ columnAndDetailsResults.reduce(
672
+ (acc, res) =>
673
+ traversalContext.joinRes([acc, res]),
674
+ nodeResult,
675
+ ),
650
676
  ),
677
+ )
678
+ : ValueOrErrors.Default.return(
679
+ columnAndDetailsResults.reduce(
680
+ (acc, res) => traversalContext.joinRes([acc, res]),
681
+ traversalContext.zeroRes(unit),
651
682
  ),
652
- )
653
- : ValueOrErrors.Default.return(
654
- columnResults.reduce(
655
- (acc, res) => traversalContext.joinRes([acc, res]),
656
- traversalContext.zeroRes(unit),
657
- ),
658
- );
683
+ );
684
+ });
659
685
  });
660
- });
661
- }),
662
- );
663
- });
686
+ }),
687
+ );
688
+ });
664
689
  }
665
690
  // TODO -- should we also look at the previewRenderer? Woud also requite state
666
691
  if (renderer.type.kind == "one" && renderer.kind == "oneRenderer") {
@@ -364,6 +364,16 @@ export type ValueReadOnly = {
364
364
  ReadOnly: PredicateValue;
365
365
  };
366
366
 
367
+ export const ValueReadOnly = {
368
+ Default: (value: PredicateValue): ValueReadOnly => ({
369
+ kind: "readOnly",
370
+ ReadOnly: value,
371
+ }),
372
+ Updaters: {
373
+ ...simpleUpdater<ValueReadOnly>()("ReadOnly"),
374
+ },
375
+ };
376
+
367
377
  export const ValueTable = {
368
378
  Default: {
369
379
  empty: (): ValueTable => ({