@@ -5,7 +5,7 @@ import { flatMap, merge, isEqual } from 'lodash';
5
5
import { TrackedWeakMap } from ' tracked-built-ins' ;
6
6
import { WatchedArray } from ' ./watched-array' ;
7
7
import { BoxelInput , FieldContainer } from ' @cardstack/boxel-ui/components' ;
8
- import { cn , eq , pick } from ' @cardstack/boxel-ui/helpers' ;
8
+ import { cn , and , eq , not , pick } from ' @cardstack/boxel-ui/helpers' ;
9
9
import { on } from ' @ember/modifier' ;
10
10
import { startCase } from ' lodash' ;
11
11
import { getBoxComponent , type BoxComponent } from ' ./field-component' ;
@@ -50,6 +50,7 @@ import {
50
50
} from ' @cardstack/runtime-common' ;
51
51
import type { ComponentLike } from ' @glint/template' ;
52
52
import { initSharedState } from ' ./shared-state' ;
53
+ import ContextConsumer from ' ember-provide-consume-context/components/context-consumer' ;
53
54
54
55
export { primitive , isField , type BoxComponent };
55
56
export const serialize = Symbol .for (' cardstack-serialize' );
@@ -284,7 +285,7 @@ export interface Field<
284
285
): Promise <any >;
285
286
emptyValue(instance : BaseDef ): any ;
286
287
validate(instance : BaseDef , value : any ): void ;
287
- component(model : Box <BaseDef >, defaultFormat : Format ): BoxComponent ;
288
+ component(model : Box <BaseDef >): BoxComponent ;
288
289
getter(instance : BaseDef ): BaseInstanceType <CardT >;
289
290
queryableValue(value : any , stack : BaseDef []): SearchT ;
290
291
queryMatcher(
@@ -578,27 +579,17 @@ class ContainsMany<FieldT extends FieldDefConstructor>
578
579
);
579
580
}
580
581
581
- component(model : Box <BaseDef >, format : Format ): BoxComponent {
582
+ component(model : Box <BaseDef >): BoxComponent {
582
583
let fieldName = this .name as keyof BaseDef ;
583
584
let arrayField = model .field (
584
585
fieldName ,
585
586
useIndexBasedKey in this .card ,
586
587
) as unknown as Box <BaseDef []>;
587
588
588
- let renderFormat: Format | undefined = undefined ;
589
- if (
590
- format === ' edit' &&
591
- ' isFieldDef' in model .value .constructor &&
592
- model .value .constructor .isFieldDef
593
- ) {
594
- renderFormat = ' atom' ;
595
- }
596
-
597
589
return getContainsManyComponent ({
598
590
model ,
599
591
arrayField ,
600
592
field: this ,
601
- format: renderFormat ?? format ,
602
593
cardTypeFor ,
603
594
});
604
595
}
@@ -750,8 +741,8 @@ class Contains<CardT extends FieldDefConstructor> implements Field<CardT, any> {
750
741
);
751
742
}
752
743
753
- component(model : Box <BaseDef >, format : Format ): BoxComponent {
754
- return fieldComponent (this , model , format );
744
+ component(model : Box <BaseDef >): BoxComponent {
745
+ return fieldComponent (this , model );
755
746
}
756
747
}
757
748
@@ -1042,14 +1033,38 @@ class LinksTo<CardT extends CardDefConstructor> implements Field<CardT> {
1042
1033
return fieldInstance ;
1043
1034
}
1044
1035
1045
- component(model : Box <CardDef >, format : Format ): BoxComponent {
1046
- if (format === ' edit' && ! this .computeVia ) {
1047
- let innerModel = model .field (
1048
- this .name as keyof BaseDef ,
1049
- ) as unknown as Box <CardDef | null >;
1050
- return getLinksToEditor (innerModel , this );
1051
- }
1052
- return fieldComponent (this , model , format );
1036
+ component(model : Box <CardDef >): BoxComponent {
1037
+ let isComputed = !! this .computeVia ;
1038
+ let fieldName = this .name as keyof CardDef ;
1039
+ let linksToField = this ;
1040
+ let getInnerModel = () => {
1041
+ let innerModel = model .field (fieldName );
1042
+ return innerModel as unknown as Box <CardDef | null >;
1043
+ };
1044
+ return class LinksToComponent extends GlimmerComponent <{
1045
+ Args: { Named: { format? : Format ; displayContainer? : boolean } };
1046
+ Blocks: {};
1047
+ }> {
1048
+ <template >
1049
+ <ContextConsumer @ key =' default-format' as | defaultFormat | >
1050
+ {{#if ( and ( eq defaultFormat ' edit' ) ( not isComputed ) ) }}
1051
+ {{#let
1052
+ ( getLinksToEditor ( getInnerModel ) linksToField )
1053
+ as | LinksToEditor |
1054
+ }}
1055
+ <LinksToEditor />
1056
+ {{/let }}
1057
+ {{else }}
1058
+ {{#let ( fieldComponent linksToField model ) as | FieldComponent | }}
1059
+ <FieldComponent
1060
+ @ format ={{@ format }}
1061
+ @ displayContainer ={{@ displayContainer }}
1062
+ />
1063
+ {{/let }}
1064
+ {{/if }}
1065
+ </ContextConsumer >
1066
+ </template >
1067
+ };
1053
1068
}
1054
1069
}
1055
1070
@@ -1424,28 +1439,16 @@ class LinksToMany<FieldT extends CardDefConstructor>
1424
1439
return fieldInstances ;
1425
1440
}
1426
1441
1427
- component(model : Box <CardDef >, format : Format ): BoxComponent {
1442
+ component(model : Box <CardDef >): BoxComponent {
1428
1443
let fieldName = this .name as keyof BaseDef ;
1429
1444
let arrayField = model .field (
1430
1445
fieldName ,
1431
1446
useIndexBasedKey in this .card ,
1432
1447
) as unknown as Box <CardDef []>;
1433
- let renderFormat: Format | undefined = undefined ;
1434
- if (
1435
- format === ' edit' &&
1436
- ' isFieldDef' in model .value .constructor &&
1437
- model .value .constructor .isFieldDef
1438
- ) {
1439
- renderFormat = ' atom' ;
1440
- }
1441
- if (format === ' edit' && this .computeVia ) {
1442
- renderFormat = ' embedded' ;
1443
- }
1444
1448
return getLinksToManyComponent ({
1445
1449
model ,
1446
1450
arrayField ,
1447
1451
field: this ,
1448
- format: renderFormat ?? format ,
1449
1452
cardTypeFor ,
1450
1453
});
1451
1454
}
@@ -1454,7 +1457,6 @@ class LinksToMany<FieldT extends CardDefConstructor>
1454
1457
function fieldComponent(
1455
1458
field : Field <typeof BaseDef >,
1456
1459
model : Box <BaseDef >,
1457
- defaultFormat : Format ,
1458
1460
): BoxComponent {
1459
1461
let fieldName = field .name as keyof BaseDef ;
1460
1462
let card: typeof BaseDef ;
@@ -1465,7 +1467,7 @@ function fieldComponent(
1465
1467
(model .value [fieldName ]?.constructor as typeof BaseDef ) ?? field .card ;
1466
1468
}
1467
1469
let innerModel = model .field (fieldName ) as unknown as Box <BaseDef >;
1468
- return getBoxComponent (card , innerModel , field , defaultFormat );
1470
+ return getBoxComponent (card , innerModel , field );
1469
1471
}
1470
1472
1471
1473
// our decorators are implemented by Babel, not TypeScript, so they have a
@@ -1643,8 +1645,8 @@ export class BaseDef {
1643
1645
return _createFromSerialized (this , data , doc , relativeTo , identityContext );
1644
1646
}
1645
1647
1646
- static getComponent(card : BaseDef , format : Format , field ? : Field ) {
1647
- return getComponent (card , format , field );
1648
+ static getComponent(card : BaseDef , field ? : Field ) {
1649
+ return getComponent (card , field );
1648
1650
}
1649
1651
1650
1652
static assignInitialFieldValue(
@@ -2712,17 +2714,12 @@ export type SignatureFor<CardT extends BaseDefConstructor> = {
2712
2714
};
2713
2715
};
2714
2716
2715
- export function getComponent(
2716
- model : BaseDef ,
2717
- format : Format ,
2718
- field ? : Field ,
2719
- ): BoxComponent {
2717
+ export function getComponent(model : BaseDef , field ? : Field ): BoxComponent {
2720
2718
let box = Box .create (model );
2721
2719
let boxComponent = getBoxComponent (
2722
2720
model .constructor as BaseDefConstructor ,
2723
2721
box ,
2724
2722
field ,
2725
- format ,
2726
2723
);
2727
2724
return boxComponent ;
2728
2725
}
0 commit comments