@@ -5,10 +5,14 @@ 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
- import { getBoxComponent , type BoxComponent } from ' ./field-component' ;
11
+ import {
12
+ getBoxComponent ,
13
+ type BoxComponent ,
14
+ DefaultFormatConsumer ,
15
+ } from ' ./field-component' ;
12
16
import { getContainsManyComponent } from ' ./contains-many-component' ;
13
17
import { getLinksToEditor } from ' ./links-to-editor' ;
14
18
import { getLinksToManyComponent } from ' ./links-to-many-component' ;
@@ -284,7 +288,7 @@ export interface Field<
284
288
): Promise <any >;
285
289
emptyValue(instance : BaseDef ): any ;
286
290
validate(instance : BaseDef , value : any ): void ;
287
- component(model : Box <BaseDef >, defaultFormat : Format ): BoxComponent ;
291
+ component(model : Box <BaseDef >): BoxComponent ;
288
292
getter(instance : BaseDef ): BaseInstanceType <CardT >;
289
293
queryableValue(value : any , stack : BaseDef []): SearchT ;
290
294
queryMatcher(
@@ -578,27 +582,17 @@ class ContainsMany<FieldT extends FieldDefConstructor>
578
582
);
579
583
}
580
584
581
- component(model : Box <BaseDef >, format : Format ): BoxComponent {
585
+ component(model : Box <BaseDef >): BoxComponent {
582
586
let fieldName = this .name as keyof BaseDef ;
583
587
let arrayField = model .field (
584
588
fieldName ,
585
589
useIndexBasedKey in this .card ,
586
590
) as unknown as Box <BaseDef []>;
587
591
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
592
return getContainsManyComponent ({
598
593
model ,
599
594
arrayField ,
600
595
field: this ,
601
- format: renderFormat ?? format ,
602
596
cardTypeFor ,
603
597
});
604
598
}
@@ -750,8 +744,8 @@ class Contains<CardT extends FieldDefConstructor> implements Field<CardT, any> {
750
744
);
751
745
}
752
746
753
- component(model : Box <BaseDef >, format : Format ): BoxComponent {
754
- return fieldComponent (this , model , format );
747
+ component(model : Box <BaseDef >): BoxComponent {
748
+ return fieldComponent (this , model );
755
749
}
756
750
}
757
751
@@ -1042,14 +1036,38 @@ class LinksTo<CardT extends CardDefConstructor> implements Field<CardT> {
1042
1036
return fieldInstance ;
1043
1037
}
1044
1038
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 );
1039
+ component(model : Box <CardDef >): BoxComponent {
1040
+ let isComputed = !! this .computeVia ;
1041
+ let fieldName = this .name as keyof CardDef ;
1042
+ let linksToField = this ;
1043
+ let getInnerModel = () => {
1044
+ let innerModel = model .field (fieldName );
1045
+ return innerModel as unknown as Box <CardDef | null >;
1046
+ };
1047
+ return class LinksToComponent extends GlimmerComponent <{
1048
+ Args: { Named: { format? : Format ; displayContainer? : boolean } };
1049
+ Blocks: {};
1050
+ }> {
1051
+ <template >
1052
+ <DefaultFormatConsumer as | defaultFormat | >
1053
+ {{#if ( and ( eq defaultFormat ' edit' ) ( not isComputed ) ) }}
1054
+ {{#let
1055
+ ( getLinksToEditor ( getInnerModel ) linksToField )
1056
+ as | LinksToEditor |
1057
+ }}
1058
+ <LinksToEditor />
1059
+ {{/let }}
1060
+ {{else }}
1061
+ {{#let ( fieldComponent linksToField model ) as | FieldComponent | }}
1062
+ <FieldComponent
1063
+ @ format ={{@ format }}
1064
+ @ displayContainer ={{@ displayContainer }}
1065
+ />
1066
+ {{/let }}
1067
+ {{/if }}
1068
+ </DefaultFormatConsumer >
1069
+ </template >
1070
+ };
1053
1071
}
1054
1072
}
1055
1073
@@ -1424,28 +1442,16 @@ class LinksToMany<FieldT extends CardDefConstructor>
1424
1442
return fieldInstances ;
1425
1443
}
1426
1444
1427
- component(model : Box <CardDef >, format : Format ): BoxComponent {
1445
+ component(model : Box <CardDef >): BoxComponent {
1428
1446
let fieldName = this .name as keyof BaseDef ;
1429
1447
let arrayField = model .field (
1430
1448
fieldName ,
1431
1449
useIndexBasedKey in this .card ,
1432
1450
) 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
1451
return getLinksToManyComponent ({
1445
1452
model ,
1446
1453
arrayField ,
1447
1454
field: this ,
1448
- format: renderFormat ?? format ,
1449
1455
cardTypeFor ,
1450
1456
});
1451
1457
}
@@ -1454,7 +1460,6 @@ class LinksToMany<FieldT extends CardDefConstructor>
1454
1460
function fieldComponent(
1455
1461
field : Field <typeof BaseDef >,
1456
1462
model : Box <BaseDef >,
1457
- defaultFormat : Format ,
1458
1463
): BoxComponent {
1459
1464
let fieldName = field .name as keyof BaseDef ;
1460
1465
let card: typeof BaseDef ;
@@ -1465,7 +1470,7 @@ function fieldComponent(
1465
1470
(model .value [fieldName ]?.constructor as typeof BaseDef ) ?? field .card ;
1466
1471
}
1467
1472
let innerModel = model .field (fieldName ) as unknown as Box <BaseDef >;
1468
- return getBoxComponent (card , innerModel , field , defaultFormat );
1473
+ return getBoxComponent (card , innerModel , field );
1469
1474
}
1470
1475
1471
1476
// our decorators are implemented by Babel, not TypeScript, so they have a
@@ -1643,8 +1648,8 @@ export class BaseDef {
1643
1648
return _createFromSerialized (this , data , doc , relativeTo , identityContext );
1644
1649
}
1645
1650
1646
- static getComponent(card : BaseDef , format : Format , field ? : Field ) {
1647
- return getComponent (card , format , field );
1651
+ static getComponent(card : BaseDef , field ? : Field ) {
1652
+ return getComponent (card , field );
1648
1653
}
1649
1654
1650
1655
static assignInitialFieldValue(
@@ -2712,17 +2717,12 @@ export type SignatureFor<CardT extends BaseDefConstructor> = {
2712
2717
};
2713
2718
};
2714
2719
2715
- export function getComponent(
2716
- model : BaseDef ,
2717
- format : Format ,
2718
- field ? : Field ,
2719
- ): BoxComponent {
2720
+ export function getComponent(model : BaseDef , field ? : Field ): BoxComponent {
2720
2721
let box = Box .create (model );
2721
2722
let boxComponent = getBoxComponent (
2722
2723
model .constructor as BaseDefConstructor ,
2723
2724
box ,
2724
2725
field ,
2725
- format ,
2726
2726
);
2727
2727
return boxComponent ;
2728
2728
}
0 commit comments