11import { raiseORMException } from "#/orm/orm-exception.ts" ;
22import convertString from "#/utils/convert-string.ts" ;
33import type { ChildEntryType } from "#/orm/child-entry/child-entry.ts" ;
4- import type { BaseTypeInfo } from "#/orm/shared/shared-types.ts" ;
4+ import type {
5+ BaseTypeInfo ,
6+ FieldGroup ,
7+ FieldGroupConfig ,
8+ } from "#/orm/shared/shared-types.ts" ;
59import type { InField } from "#/orm/field/field-def-types.ts" ;
610
711export class BaseType < N extends string = string > {
812 name : N ;
913 label : string ;
1014
1115 description : string ;
12- /**
13- * The fields of the settings type.
14- */
1516 fields : Map < string , InField > = new Map ( ) ;
1617 displayFields : Map < string , InField > = new Map ( ) ;
18+ fieldGroups : Map < string , FieldGroup > = new Map ( ) ;
1719 connectionTitleFields : Map < string , InField > = new Map ( ) ;
1820 children ?: Map < string , ChildEntryType < any > > ;
1921 #baseInfo: BaseTypeInfo ;
@@ -22,6 +24,7 @@ export class BaseType<N extends string = string> {
2224 name : N ,
2325 config : {
2426 fields : Array < InField > ;
27+ fieldGroups ?: Array < FieldGroupConfig > ;
2528 label ?: string ;
2629 description ?: string ;
2730 children ?: Array < ChildEntryType < any > > ;
@@ -52,13 +55,15 @@ export class BaseType<N extends string = string> {
5255 }
5356
5457 this . #setDisplayFields( ) ;
58+ this . #addFieldGroups( config . fieldGroups ) ;
5559 this . #baseInfo = {
5660 name : this . name ,
5761 label : this . label ,
5862 description : this . description ,
5963 fields : Array . from ( this . fields . values ( ) ) ,
6064 titleFields : Array . from ( this . connectionTitleFields . values ( ) ) ,
6165 displayFields : Array . from ( this . displayFields . values ( ) ) ,
66+ fieldGroups : Array . from ( this . fieldGroups . values ( ) ) ,
6267 } ;
6368 this . #addChildren( config . children ) ;
6469 }
@@ -97,6 +102,50 @@ export class BaseType<N extends string = string> {
97102 ) ;
98103 }
99104
105+ #addFieldGroups( fieldGroups ?: Array < FieldGroupConfig > ) : void {
106+ const allFields = new Set ( Array . from ( this . fields . keys ( ) ) ) ;
107+ for ( const group of fieldGroups || [ ] ) {
108+ this . #addFieldGroup( group , allFields ) ;
109+ }
110+ if ( allFields . size > 0 ) {
111+ const defaultGroup : FieldGroupConfig = {
112+ key : "default" ,
113+ label : "" ,
114+ fields : Array . from ( allFields ) ,
115+ } ;
116+ this . #addFieldGroup( defaultGroup , allFields ) ;
117+ }
118+ }
119+ #addFieldGroup( fieldGroupConfig : FieldGroupConfig , allFields : Set < string > ) {
120+ const fieldGroup : FieldGroup = {
121+ ...fieldGroupConfig ,
122+ label : fieldGroupConfig . label === undefined
123+ ? convertString ( fieldGroupConfig . key , "title" , true )
124+ : fieldGroupConfig . label ,
125+ fields : [ ] ,
126+ displayFields : [ ] ,
127+ } ;
128+ if ( this . fieldGroups . has ( fieldGroupConfig . key ) ) {
129+ raiseORMException (
130+ `Field group ${ fieldGroupConfig . key } already exists in ${ this . name } ` ,
131+ ) ;
132+ }
133+ for ( const fieldKey of fieldGroupConfig . fields ) {
134+ const field = this . fields . get ( fieldKey as string ) ;
135+ if ( ! field ) {
136+ raiseORMException (
137+ `field ${ fieldKey as string } does not exists in ${ this . name } ` ,
138+ ) ;
139+ }
140+ allFields . delete ( field . key ) ;
141+ fieldGroup . fields . push ( field ) ;
142+ const displayField = this . displayFields . get ( field . key ) ;
143+ if ( displayField ) {
144+ fieldGroup . displayFields . push ( displayField ) ;
145+ }
146+ }
147+ this . fieldGroups . set ( fieldGroup . key , fieldGroup ) ;
148+ }
100149 set info ( info : Record < string , any > ) {
101150 this . #info = info ;
102151 }
0 commit comments