ballerina-core 1.0.149 → 1.0.150
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 +1 -1
- package/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/state.ts +1 -1
- package/src/forms/domains/dispatched-forms/runner/domains/abstract-renderers/table/template.tsx +1 -1
- package/src/forms/domains/dispatched-forms/runner/domains/deltas/state.ts +16 -17
- package/src/forms/domains/dispatched-forms/runner/domains/traversal/state.ts +420 -8
- package/src/forms/domains/primitives/domains/searchable-infinite-stream-multiselect/template.tsx +2 -1
package/package.json
CHANGED
|
@@ -160,7 +160,7 @@ export type AbstractTableRendererView<
|
|
|
160
160
|
clearRows: SimpleCallback<void>;
|
|
161
161
|
add: SimpleCallback<void>;
|
|
162
162
|
remove: SimpleCallback<string>;
|
|
163
|
-
moveTo: (key: string, to:
|
|
163
|
+
moveTo: (key: string, to: string) => void;
|
|
164
164
|
duplicate: SimpleCallback<string>;
|
|
165
165
|
},
|
|
166
166
|
{
|
|
@@ -205,7 +205,7 @@ export type DispatchDeltaTable =
|
|
|
205
205
|
| {
|
|
206
206
|
kind: "TableMoveTo";
|
|
207
207
|
id: string;
|
|
208
|
-
to:
|
|
208
|
+
to: string;
|
|
209
209
|
type: DispatchParsedType<any>;
|
|
210
210
|
}
|
|
211
211
|
| {
|
|
@@ -320,10 +320,10 @@ export type DispatchDeltaTransferTable<DispatchDeltaTransferCustom> =
|
|
|
320
320
|
Item2: DispatchDeltaTransfer<DispatchDeltaTransferCustom>;
|
|
321
321
|
};
|
|
322
322
|
}
|
|
323
|
-
| { Discriminator: "
|
|
324
|
-
| { Discriminator: "
|
|
325
|
-
| { Discriminator: "
|
|
326
|
-
| { Discriminator: "
|
|
323
|
+
| { Discriminator: "TableAddEmpty" }
|
|
324
|
+
| { Discriminator: "TableRemoveAt"; RemoveAt: string }
|
|
325
|
+
| { Discriminator: "TableDuplicateAt"; DuplicateAt: string }
|
|
326
|
+
| { Discriminator: "TableMoveFromTo"; MoveFromTo: [string, string] };
|
|
327
327
|
|
|
328
328
|
export type DispatchDeltaTransfer<DispatchDeltaTransferCustom> =
|
|
329
329
|
| DispatchDeltaTransferPrimitive
|
|
@@ -1131,9 +1131,9 @@ export const DispatchDeltaTransfer = {
|
|
|
1131
1131
|
string
|
|
1132
1132
|
>([
|
|
1133
1133
|
{
|
|
1134
|
-
Discriminator: "
|
|
1134
|
+
Discriminator: "TableAddEmpty",
|
|
1135
1135
|
},
|
|
1136
|
-
`[
|
|
1136
|
+
`[TableAddEmpty]`,
|
|
1137
1137
|
delta.isWholeEntityMutation,
|
|
1138
1138
|
]);
|
|
1139
1139
|
}
|
|
@@ -1147,10 +1147,10 @@ export const DispatchDeltaTransfer = {
|
|
|
1147
1147
|
string
|
|
1148
1148
|
>([
|
|
1149
1149
|
{
|
|
1150
|
-
Discriminator: "
|
|
1151
|
-
|
|
1150
|
+
Discriminator: "TableRemoveAt",
|
|
1151
|
+
RemoveAt: delta.id,
|
|
1152
1152
|
},
|
|
1153
|
-
`[
|
|
1153
|
+
`[TableRemoveAt][${delta.id}]`,
|
|
1154
1154
|
delta.isWholeEntityMutation,
|
|
1155
1155
|
]);
|
|
1156
1156
|
}
|
|
@@ -1164,10 +1164,10 @@ export const DispatchDeltaTransfer = {
|
|
|
1164
1164
|
string
|
|
1165
1165
|
>([
|
|
1166
1166
|
{
|
|
1167
|
-
Discriminator: "
|
|
1168
|
-
|
|
1167
|
+
Discriminator: "TableDuplicateAt",
|
|
1168
|
+
DuplicateAt: delta.id,
|
|
1169
1169
|
},
|
|
1170
|
-
`[
|
|
1170
|
+
`[TableDuplicateAt][${delta.id}]`,
|
|
1171
1171
|
delta.isWholeEntityMutation,
|
|
1172
1172
|
]);
|
|
1173
1173
|
}
|
|
@@ -1181,11 +1181,10 @@ export const DispatchDeltaTransfer = {
|
|
|
1181
1181
|
string
|
|
1182
1182
|
>([
|
|
1183
1183
|
{
|
|
1184
|
-
Discriminator: "
|
|
1185
|
-
|
|
1186
|
-
To: delta.to,
|
|
1184
|
+
Discriminator: "TableMoveFromTo",
|
|
1185
|
+
MoveFromTo: [delta.id, delta.to],
|
|
1187
1186
|
},
|
|
1188
|
-
`[
|
|
1187
|
+
`[TableMoveFromTo][${delta.id}][${delta.to}]`,
|
|
1189
1188
|
delta.isWholeEntityMutation,
|
|
1190
1189
|
]);
|
|
1191
1190
|
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
FormLayout,
|
|
13
13
|
Unit,
|
|
14
14
|
unit,
|
|
15
|
+
TableLayout,
|
|
15
16
|
} from "ballerina-core";
|
|
16
17
|
import { List, Map, Set } from "immutable";
|
|
17
18
|
|
|
@@ -64,12 +65,20 @@ export const RendererTraversal = {
|
|
|
64
65
|
|
|
65
66
|
const traverseNode = traversalContext.traverseSingleType(type);
|
|
66
67
|
|
|
67
|
-
if (
|
|
68
|
+
if (
|
|
69
|
+
type.kind == "primitive" ||
|
|
70
|
+
type.kind == "singleSelection" ||
|
|
71
|
+
type.kind == "multiSelection"
|
|
72
|
+
) {
|
|
68
73
|
return ValueOrErrors.Default.return(traverseNode);
|
|
69
74
|
}
|
|
70
75
|
|
|
76
|
+
// TODO -- later when we only resolve lookups at the last moment, we can remove the other type checks
|
|
71
77
|
if (
|
|
72
|
-
(type.kind == "lookup" ||
|
|
78
|
+
(type.kind == "lookup" ||
|
|
79
|
+
type.kind == "record" ||
|
|
80
|
+
type.kind == "union" ||
|
|
81
|
+
type.kind == "table") &&
|
|
73
82
|
renderer.kind == "lookupRenderer"
|
|
74
83
|
) {
|
|
75
84
|
if (traversalContext.primitiveRendererNamesByType.has(type.name)) {
|
|
@@ -147,7 +156,11 @@ export const RendererTraversal = {
|
|
|
147
156
|
)
|
|
148
157
|
)
|
|
149
158
|
return ValueOrErrors.Default.throwOne(
|
|
150
|
-
`Error: traversal iterator is not a record, got ${
|
|
159
|
+
`Error: traversal iterator is not a record, got ${JSON.stringify(
|
|
160
|
+
evalContext.traversalIterator,
|
|
161
|
+
undefined,
|
|
162
|
+
2,
|
|
163
|
+
)}`,
|
|
151
164
|
);
|
|
152
165
|
const visibleFieldsRes =
|
|
153
166
|
FormLayout.Operations.ComputeVisibleFieldsForRecord(
|
|
@@ -235,10 +248,7 @@ export const RendererTraversal = {
|
|
|
235
248
|
);
|
|
236
249
|
}
|
|
237
250
|
if (renderer.kind == "sumRenderer") {
|
|
238
|
-
|
|
239
|
-
Option<ValueTraversal<T, Res>>,
|
|
240
|
-
string
|
|
241
|
-
> = rec(type.args[0], renderer, traversalContext).Then(
|
|
251
|
+
return rec(type.args[0], renderer, traversalContext).Then(
|
|
242
252
|
(leftTraversal) =>
|
|
243
253
|
rec(type.args[1], renderer, traversalContext).Then(
|
|
244
254
|
(rightTraversal) => {
|
|
@@ -340,7 +350,6 @@ export const RendererTraversal = {
|
|
|
340
350
|
},
|
|
341
351
|
),
|
|
342
352
|
);
|
|
343
|
-
return res;
|
|
344
353
|
}
|
|
345
354
|
}
|
|
346
355
|
|
|
@@ -411,6 +420,409 @@ export const RendererTraversal = {
|
|
|
411
420
|
});
|
|
412
421
|
}
|
|
413
422
|
|
|
423
|
+
if (type.kind == "union" && renderer.kind == "unionRenderer") {
|
|
424
|
+
return ValueOrErrors.Operations.All(
|
|
425
|
+
List(
|
|
426
|
+
renderer.cases
|
|
427
|
+
.map((caseRenderer, caseName) =>
|
|
428
|
+
rec(caseRenderer.type, caseRenderer, traversalContext).Then(
|
|
429
|
+
(caseTraversal) =>
|
|
430
|
+
ValueOrErrors.Default.return({
|
|
431
|
+
caseName: caseName,
|
|
432
|
+
caseTraversal: caseTraversal,
|
|
433
|
+
}),
|
|
434
|
+
),
|
|
435
|
+
)
|
|
436
|
+
.valueSeq(),
|
|
437
|
+
),
|
|
438
|
+
).Then((caseTraversals) => {
|
|
439
|
+
if (
|
|
440
|
+
caseTraversals.every((c) => c.caseTraversal.kind == "l") &&
|
|
441
|
+
traverseNode.kind == "l"
|
|
442
|
+
) {
|
|
443
|
+
return ValueOrErrors.Default.return(Option.Default.none());
|
|
444
|
+
}
|
|
445
|
+
return ValueOrErrors.Default.return(
|
|
446
|
+
Option.Default.some((evalContext: EvalContext<T, Res>) => {
|
|
447
|
+
const iterator = evalContext.traversalIterator;
|
|
448
|
+
if (!PredicateValue.Operations.IsUnionCase(iterator)) {
|
|
449
|
+
return ValueOrErrors.Default.throwOne(
|
|
450
|
+
`Error: traversal iterator is not a union case, got ${evalContext.traversalIterator}`,
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
const caseName = iterator.caseName;
|
|
454
|
+
const caseTraversal = caseTraversals.find(
|
|
455
|
+
(c) => c.caseName == caseName,
|
|
456
|
+
)?.caseTraversal;
|
|
457
|
+
if (!caseTraversal) {
|
|
458
|
+
return ValueOrErrors.Default.throwOne(
|
|
459
|
+
`Error: cannot find case traversal for case ${caseName}`,
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
return caseTraversal.kind == "r"
|
|
463
|
+
? caseTraversal
|
|
464
|
+
.value({
|
|
465
|
+
...evalContext,
|
|
466
|
+
traversalIterator: iterator.fields,
|
|
467
|
+
})
|
|
468
|
+
.Then((caseRes) => {
|
|
469
|
+
return traverseNode.kind == "r"
|
|
470
|
+
? traverseNode
|
|
471
|
+
.value(evalContext)
|
|
472
|
+
.Then((nodeResult: Res) => {
|
|
473
|
+
return ValueOrErrors.Default.return(
|
|
474
|
+
traversalContext.joinRes([nodeResult, caseRes]),
|
|
475
|
+
);
|
|
476
|
+
})
|
|
477
|
+
: ValueOrErrors.Default.return(caseRes);
|
|
478
|
+
})
|
|
479
|
+
: traverseNode.kind == "r"
|
|
480
|
+
? traverseNode.value(evalContext).Then((nodeResult: Res) => {
|
|
481
|
+
return ValueOrErrors.Default.return(nodeResult);
|
|
482
|
+
})
|
|
483
|
+
: ValueOrErrors.Default.return(
|
|
484
|
+
traversalContext.zeroRes(unit),
|
|
485
|
+
);
|
|
486
|
+
}),
|
|
487
|
+
);
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
// TODO -- add recursion for the detailsRenderer, but requires state
|
|
491
|
+
if (type.kind == "table" && renderer.kind == "tableRenderer") {
|
|
492
|
+
return ValueOrErrors.Operations.All(
|
|
493
|
+
List(
|
|
494
|
+
renderer.columns
|
|
495
|
+
.map((column, columnName) => {
|
|
496
|
+
return rec(
|
|
497
|
+
column.renderer.type,
|
|
498
|
+
column.renderer,
|
|
499
|
+
traversalContext,
|
|
500
|
+
).Then((columnTraversal) => {
|
|
501
|
+
return ValueOrErrors.Default.return({
|
|
502
|
+
columnName: columnName,
|
|
503
|
+
columnTraversal: columnTraversal,
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
})
|
|
507
|
+
.valueSeq(),
|
|
508
|
+
),
|
|
509
|
+
).Then((columnTraversals) => {
|
|
510
|
+
if (
|
|
511
|
+
columnTraversals.every((c) => c.columnTraversal.kind == "l") &&
|
|
512
|
+
traverseNode.kind == "l"
|
|
513
|
+
) {
|
|
514
|
+
return ValueOrErrors.Default.return(Option.Default.none());
|
|
515
|
+
}
|
|
516
|
+
return ValueOrErrors.Default.return(
|
|
517
|
+
Option.Default.some((evalContext: EvalContext<T, Res>) => {
|
|
518
|
+
const iterator = evalContext.traversalIterator;
|
|
519
|
+
if (!PredicateValue.Operations.IsTable(iterator)) {
|
|
520
|
+
return ValueOrErrors.Default.throwOne(
|
|
521
|
+
`Error: traversal iterator is not a table, got ${evalContext.traversalIterator}`,
|
|
522
|
+
);
|
|
523
|
+
}
|
|
524
|
+
return TableLayout.Operations.ComputeLayout(
|
|
525
|
+
Map([
|
|
526
|
+
["global", evalContext.global],
|
|
527
|
+
["local", evalContext.local],
|
|
528
|
+
["root", evalContext.root],
|
|
529
|
+
]),
|
|
530
|
+
renderer.visibleColumns,
|
|
531
|
+
).Then((visibleColumns) => {
|
|
532
|
+
// Note: we do not allow visiblity predicates on individual column cells
|
|
533
|
+
return ValueOrErrors.Operations.All<Res, string>(
|
|
534
|
+
columnTraversals.flatMap((c) => {
|
|
535
|
+
const colTraversal = c.columnTraversal;
|
|
536
|
+
if (
|
|
537
|
+
colTraversal.kind == "l" ||
|
|
538
|
+
!visibleColumns.columns.includes(c.columnName)
|
|
539
|
+
) {
|
|
540
|
+
return [];
|
|
541
|
+
}
|
|
542
|
+
return iterator.data.valueSeq().flatMap((row) => {
|
|
543
|
+
// TODO make this monadic
|
|
544
|
+
const columnValue = row.fields.get(c.columnName);
|
|
545
|
+
if (!columnValue) {
|
|
546
|
+
return [
|
|
547
|
+
ValueOrErrors.Default.throwOne(
|
|
548
|
+
`Error: cannot find column ${
|
|
549
|
+
c.columnName
|
|
550
|
+
} in row ${JSON.stringify(row)}`,
|
|
551
|
+
),
|
|
552
|
+
];
|
|
553
|
+
}
|
|
554
|
+
return [
|
|
555
|
+
colTraversal.value({
|
|
556
|
+
...evalContext,
|
|
557
|
+
traversalIterator: columnValue,
|
|
558
|
+
}),
|
|
559
|
+
];
|
|
560
|
+
});
|
|
561
|
+
}),
|
|
562
|
+
).Then((columnResults) => {
|
|
563
|
+
return traverseNode.kind == "r"
|
|
564
|
+
? traverseNode
|
|
565
|
+
.value(evalContext)
|
|
566
|
+
.Then((nodeResult: Res) =>
|
|
567
|
+
ValueOrErrors.Default.return(
|
|
568
|
+
columnResults.reduce(
|
|
569
|
+
(acc, res) =>
|
|
570
|
+
traversalContext.joinRes([acc, res]),
|
|
571
|
+
nodeResult,
|
|
572
|
+
),
|
|
573
|
+
),
|
|
574
|
+
)
|
|
575
|
+
: ValueOrErrors.Default.return(
|
|
576
|
+
columnResults.reduce(
|
|
577
|
+
(acc, res) => traversalContext.joinRes([acc, res]),
|
|
578
|
+
traversalContext.zeroRes(unit),
|
|
579
|
+
),
|
|
580
|
+
);
|
|
581
|
+
});
|
|
582
|
+
});
|
|
583
|
+
}),
|
|
584
|
+
);
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
// TODO -- should we also look at the previewRenderer? Woud also requite state
|
|
588
|
+
if (type.kind == "one" && renderer.kind == "oneRenderer") {
|
|
589
|
+
return rec(
|
|
590
|
+
renderer.detailsRenderer.renderer.type,
|
|
591
|
+
renderer.detailsRenderer.renderer,
|
|
592
|
+
traversalContext,
|
|
593
|
+
).Then((itemTraversal) => {
|
|
594
|
+
if (itemTraversal.kind == "l" && traverseNode.kind == "l") {
|
|
595
|
+
return ValueOrErrors.Default.return(Option.Default.none());
|
|
596
|
+
}
|
|
597
|
+
return ValueOrErrors.Default.return(
|
|
598
|
+
Option.Default.some<ValueTraversal<T, Res>>(
|
|
599
|
+
(evalContext: EvalContext<T, Res>) => {
|
|
600
|
+
const iterator = evalContext.traversalIterator;
|
|
601
|
+
|
|
602
|
+
// Handle partial ones
|
|
603
|
+
if (PredicateValue.Operations.IsUnit(iterator)) {
|
|
604
|
+
return traverseNode.kind == "r"
|
|
605
|
+
? traverseNode.value(evalContext)
|
|
606
|
+
: ValueOrErrors.Default.return(
|
|
607
|
+
traversalContext.zeroRes(unit),
|
|
608
|
+
);
|
|
609
|
+
}
|
|
610
|
+
if (!PredicateValue.Operations.IsOption(iterator)) {
|
|
611
|
+
return ValueOrErrors.Default.throwOne<Res, string>(
|
|
612
|
+
`Error: traversal iterator for one is not an option, got ${iterator}`,
|
|
613
|
+
);
|
|
614
|
+
}
|
|
615
|
+
const isSome =
|
|
616
|
+
PredicateValue.Operations.IsOption(iterator) &&
|
|
617
|
+
iterator.isSome;
|
|
618
|
+
|
|
619
|
+
if (!isSome) {
|
|
620
|
+
return traverseNode.kind == "r"
|
|
621
|
+
? traverseNode.value(evalContext)
|
|
622
|
+
: ValueOrErrors.Default.return(
|
|
623
|
+
traversalContext.zeroRes(unit),
|
|
624
|
+
);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
return traverseNode.kind == "r"
|
|
628
|
+
? traverseNode.value(evalContext).Then((nodeResult: Res) => {
|
|
629
|
+
return itemTraversal.kind == "r"
|
|
630
|
+
? itemTraversal
|
|
631
|
+
.value({
|
|
632
|
+
...evalContext,
|
|
633
|
+
traversalIterator: iterator.value,
|
|
634
|
+
})
|
|
635
|
+
.Then((itemResult: Res) => {
|
|
636
|
+
return ValueOrErrors.Default.return(
|
|
637
|
+
traversalContext.joinRes([
|
|
638
|
+
nodeResult,
|
|
639
|
+
itemResult,
|
|
640
|
+
]),
|
|
641
|
+
);
|
|
642
|
+
})
|
|
643
|
+
: ValueOrErrors.Default.return(nodeResult);
|
|
644
|
+
})
|
|
645
|
+
: itemTraversal.kind == "r"
|
|
646
|
+
? itemTraversal.value({
|
|
647
|
+
...evalContext,
|
|
648
|
+
traversalIterator: iterator.value,
|
|
649
|
+
})
|
|
650
|
+
: ValueOrErrors.Default.return(
|
|
651
|
+
traversalContext.zeroRes(unit),
|
|
652
|
+
);
|
|
653
|
+
},
|
|
654
|
+
),
|
|
655
|
+
);
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
if (type.kind == "list" && renderer.kind == "listRenderer") {
|
|
660
|
+
return rec(type.args[0], renderer, traversalContext).Then(
|
|
661
|
+
(elementTraversal) => {
|
|
662
|
+
if (elementTraversal.kind == "l" && traverseNode.kind == "l") {
|
|
663
|
+
return ValueOrErrors.Default.return(Option.Default.none());
|
|
664
|
+
}
|
|
665
|
+
return ValueOrErrors.Default.return(
|
|
666
|
+
Option.Default.some((evalContext: EvalContext<T, Res>) => {
|
|
667
|
+
const iterator = evalContext.traversalIterator;
|
|
668
|
+
if (!PredicateValue.Operations.IsTuple(iterator)) {
|
|
669
|
+
return ValueOrErrors.Default.throwOne<Res, string>(
|
|
670
|
+
`Error: traversal iterator for list is not a tuple, got ${JSON.stringify(
|
|
671
|
+
iterator,
|
|
672
|
+
null,
|
|
673
|
+
2,
|
|
674
|
+
)}`,
|
|
675
|
+
);
|
|
676
|
+
}
|
|
677
|
+
return ValueOrErrors.Operations.All<Res, string>(
|
|
678
|
+
iterator.values.map((value) =>
|
|
679
|
+
elementTraversal.kind == "r"
|
|
680
|
+
? elementTraversal.value({
|
|
681
|
+
...evalContext,
|
|
682
|
+
traversalIterator: value,
|
|
683
|
+
})
|
|
684
|
+
: ValueOrErrors.Default.return(
|
|
685
|
+
traversalContext.zeroRes(unit),
|
|
686
|
+
),
|
|
687
|
+
),
|
|
688
|
+
).Then((elementResults) =>
|
|
689
|
+
traverseNode.kind == "r"
|
|
690
|
+
? traverseNode
|
|
691
|
+
.value(evalContext)
|
|
692
|
+
.Then((nodeResult: Res) =>
|
|
693
|
+
ValueOrErrors.Default.return(
|
|
694
|
+
elementResults.reduce(
|
|
695
|
+
(acc, res) =>
|
|
696
|
+
traversalContext.joinRes([acc, res]),
|
|
697
|
+
nodeResult,
|
|
698
|
+
),
|
|
699
|
+
),
|
|
700
|
+
)
|
|
701
|
+
: ValueOrErrors.Default.return(
|
|
702
|
+
elementResults.reduce(
|
|
703
|
+
(acc, res) => traversalContext.joinRes([acc, res]),
|
|
704
|
+
traversalContext.zeroRes(unit),
|
|
705
|
+
),
|
|
706
|
+
),
|
|
707
|
+
);
|
|
708
|
+
}),
|
|
709
|
+
);
|
|
710
|
+
},
|
|
711
|
+
);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
if (type.kind == "map" && renderer.kind == "mapRenderer") {
|
|
715
|
+
return rec(
|
|
716
|
+
type.args[0],
|
|
717
|
+
renderer.keyRenderer.renderer,
|
|
718
|
+
traversalContext,
|
|
719
|
+
).Then((keyTraversal) => {
|
|
720
|
+
return rec(
|
|
721
|
+
type.args[1],
|
|
722
|
+
renderer.valueRenderer.renderer,
|
|
723
|
+
traversalContext,
|
|
724
|
+
).Then((valueTraversal) => {
|
|
725
|
+
if (
|
|
726
|
+
keyTraversal.kind == "l" &&
|
|
727
|
+
valueTraversal.kind == "l" &&
|
|
728
|
+
traverseNode.kind == "l"
|
|
729
|
+
) {
|
|
730
|
+
return ValueOrErrors.Default.return(Option.Default.none());
|
|
731
|
+
}
|
|
732
|
+
return ValueOrErrors.Default.return(
|
|
733
|
+
Option.Default.some<ValueTraversal<T, Res>>(
|
|
734
|
+
(evalContext: EvalContext<T, Res>) => {
|
|
735
|
+
if (keyTraversal.kind == "l" && valueTraversal.kind == "l") {
|
|
736
|
+
return traverseNode.kind == "r"
|
|
737
|
+
? traverseNode.value(evalContext)
|
|
738
|
+
: ValueOrErrors.Default.return<Res, string>(
|
|
739
|
+
traversalContext.zeroRes(unit),
|
|
740
|
+
);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const iterator = evalContext.traversalIterator;
|
|
744
|
+
if (!PredicateValue.Operations.IsTuple(iterator)) {
|
|
745
|
+
return ValueOrErrors.Default.throwOne<Res, string>(
|
|
746
|
+
`Error: traversal iterator for map is not a tuple, got ${JSON.stringify(
|
|
747
|
+
iterator,
|
|
748
|
+
null,
|
|
749
|
+
2,
|
|
750
|
+
)}`,
|
|
751
|
+
);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
return ValueOrErrors.Operations.All<Res, string>(
|
|
755
|
+
iterator.values.map((value) => {
|
|
756
|
+
if (!PredicateValue.Operations.IsTuple(value)) {
|
|
757
|
+
return ValueOrErrors.Default.throwOne<Res, string>(
|
|
758
|
+
`Error: traversal iterator for map keyValue is not a tuple, got ${JSON.stringify(
|
|
759
|
+
value,
|
|
760
|
+
null,
|
|
761
|
+
2,
|
|
762
|
+
)}`,
|
|
763
|
+
);
|
|
764
|
+
}
|
|
765
|
+
const keyRes =
|
|
766
|
+
keyTraversal.kind == "r"
|
|
767
|
+
? keyTraversal.value({
|
|
768
|
+
...evalContext,
|
|
769
|
+
traversalIterator: value.values.get(0)!,
|
|
770
|
+
})
|
|
771
|
+
: ValueOrErrors.Default.return(
|
|
772
|
+
traversalContext.zeroRes(unit),
|
|
773
|
+
);
|
|
774
|
+
|
|
775
|
+
const valueRes =
|
|
776
|
+
valueTraversal.kind == "r"
|
|
777
|
+
? valueTraversal.value({
|
|
778
|
+
...evalContext,
|
|
779
|
+
traversalIterator: value.values.get(1)!,
|
|
780
|
+
})
|
|
781
|
+
: ValueOrErrors.Default.return(
|
|
782
|
+
traversalContext.zeroRes(unit),
|
|
783
|
+
);
|
|
784
|
+
|
|
785
|
+
if (keyRes.kind == "errors") {
|
|
786
|
+
return keyRes as ValueOrErrors<Res, string>;
|
|
787
|
+
}
|
|
788
|
+
if (valueRes.kind == "errors") {
|
|
789
|
+
return valueRes as ValueOrErrors<Res, string>;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
return ValueOrErrors.Default.return<Res, string>(
|
|
793
|
+
traversalContext.joinRes([
|
|
794
|
+
keyRes.value,
|
|
795
|
+
valueRes.value,
|
|
796
|
+
]),
|
|
797
|
+
);
|
|
798
|
+
}),
|
|
799
|
+
).Then((keyValueResults) => {
|
|
800
|
+
return traverseNode.kind == "r"
|
|
801
|
+
? traverseNode
|
|
802
|
+
.value(evalContext)
|
|
803
|
+
.Then((nodeResult: Res) => {
|
|
804
|
+
return ValueOrErrors.Default.return<Res, string>(
|
|
805
|
+
keyValueResults.reduce(
|
|
806
|
+
(acc, res) =>
|
|
807
|
+
traversalContext.joinRes([acc, res]),
|
|
808
|
+
nodeResult,
|
|
809
|
+
),
|
|
810
|
+
);
|
|
811
|
+
})
|
|
812
|
+
: ValueOrErrors.Default.return<Res, string>(
|
|
813
|
+
keyValueResults.reduce(
|
|
814
|
+
(acc, res) => traversalContext.joinRes([acc, res]),
|
|
815
|
+
traversalContext.zeroRes(unit),
|
|
816
|
+
),
|
|
817
|
+
);
|
|
818
|
+
});
|
|
819
|
+
},
|
|
820
|
+
),
|
|
821
|
+
);
|
|
822
|
+
});
|
|
823
|
+
});
|
|
824
|
+
}
|
|
825
|
+
|
|
414
826
|
return ValueOrErrors.Default.return(Option.Default.none());
|
|
415
827
|
},
|
|
416
828
|
},
|
package/src/forms/domains/primitives/domains/searchable-infinite-stream-multiselect/template.tsx
CHANGED
|
@@ -179,6 +179,7 @@ export const InfiniteMultiselectDropdownForm = <
|
|
|
179
179
|
),
|
|
180
180
|
),
|
|
181
181
|
toggleSelection: (elementRecord: ValueRecord) => {
|
|
182
|
+
// TODO - updater logic is using old value rather than inside an updater
|
|
182
183
|
const updater = props.context.value.fields.has(
|
|
183
184
|
elementRecord.fields.get("Id")! as string,
|
|
184
185
|
)
|
|
@@ -192,7 +193,7 @@ export const InfiniteMultiselectDropdownForm = <
|
|
|
192
193
|
|
|
193
194
|
const delta: Delta = {
|
|
194
195
|
kind: "SetReplace",
|
|
195
|
-
// Maybe unsafe - check
|
|
196
|
+
// TODO: Maybe unsafe - check
|
|
196
197
|
replace: updater(props.context.value),
|
|
197
198
|
state: {
|
|
198
199
|
commonFormState: props.context.commonFormState,
|