44from nicegui import ui
55from pydantic import ValidationError
66
7- from fastapi_forge .dtos import ModelField
7+ from fastapi_forge .dtos import ModelField , ModelFieldMetadata
88from fastapi_forge .enums import FieldDataType
99from fastapi_forge .frontend .notifications import notify_validation_error
1010from fastapi_forge .frontend .state import state
@@ -40,6 +40,7 @@ def _build(self) -> None:
4040 self .field_type = ui .select (
4141 list (FieldDataType ),
4242 label = "Field Type" ,
43+ on_change = self ._toggle_metadata_visibility ,
4344 ).props ("outlined dense" )
4445 self .default_value = ui .input (label = "Default Value" ).props (
4546 "outlined dense"
@@ -51,6 +52,23 @@ def _build(self) -> None:
5152 self .unique = ui .checkbox ("Unique" ).props ("dense" )
5253 self .index = ui .checkbox ("Index" ).props ("dense" )
5354
55+ self .metadata_card = (
56+ ui .card ()
57+ .classes ("w-full p-4 border rounded-lg" )
58+ .bind_visibility_from (self , "show_metadata" )
59+ )
60+ with self .metadata_card :
61+ with ui .row ().classes ("w-full justify-between items-center mb-2" ):
62+ ui .label ("Field Metadata" ).classes ("text-md font-medium" )
63+
64+ with ui .row ().classes ("w-full gap-4" ):
65+ self .created_at = ui .checkbox ("Created At Timestamp" ).props (
66+ "dense"
67+ )
68+ self .updated_at = ui .checkbox ("Updated At Timestamp" ).props (
69+ "dense"
70+ )
71+
5472 with ui .card ().classes ("w-full p-4 border rounded-lg" ):
5573 with ui .row ().classes ("w-full justify-between items-center" ):
5674 ui .label ("Extra Column Arguments" ).classes (
@@ -65,6 +83,9 @@ def _build(self) -> None:
6583 with ui .row ().classes ("w-full justify-end p-4 border-t gap-2" ):
6684 self ._build_action_buttons ()
6785
86+ def _toggle_metadata_visibility (self ):
87+ self .show_metadata = self .field_type .value == FieldDataType .DATETIME
88+
6889 def _add_kwarg_row (self , key : str = "" , value : str = "" ) -> None :
6990 with (
7091 self .kwargs_container ,
@@ -113,6 +134,15 @@ def _show_field_preview(self) -> None:
113134 index = self .index .value ,
114135 default_value = self .default_value .value or None ,
115136 extra_kwargs = self .extra_kwargs or None ,
137+ metadata = ModelFieldMetadata (
138+ is_created_at_timestamp = (
139+ self .created_at .value if self .show_metadata else False
140+ ),
141+ is_updated_at_timestamp = (
142+ self .updated_at .value if self .show_metadata else False
143+ ),
144+ is_foreign_key = False ,
145+ ),
116146 )
117147 ui .code (generate_field (preview_field )).classes ("w-full" )
118148 modal .open ()
@@ -127,6 +157,9 @@ def reset(self) -> None:
127157 self .unique .value = False
128158 self .index .value = False
129159 self .default_value .value = ""
160+ self .created_at .value = False
161+ self .updated_at .value = False
162+ self .show_metadata = False
130163 self .extra_kwargs = {}
131164 self .kwargs_container .clear ()
132165
@@ -137,6 +170,7 @@ class AddFieldModal(BaseFieldModal):
137170 def __init__ (self , on_add_field : Callable ):
138171 super ().__init__ ()
139172 self .on_add_field = on_add_field
173+ self .show_metadata = False
140174
141175 def _build_action_buttons (self ) -> None :
142176 ui .button ("Cancel" , on_click = self .close )
@@ -151,6 +185,15 @@ def _build_action_buttons(self) -> None:
151185 index = self .index .value ,
152186 default_value = self .default_value .value or None ,
153187 extra_kwargs = self .extra_kwargs or None ,
188+ metadata = ModelFieldMetadata (
189+ is_created_at_timestamp = (
190+ self .created_at .value if self .show_metadata else False
191+ ),
192+ is_updated_at_timestamp = (
193+ self .updated_at .value if self .show_metadata else False
194+ ),
195+ is_foreign_key = False ,
196+ ),
154197 ),
155198 )
156199
@@ -161,6 +204,7 @@ class UpdateFieldModal(BaseFieldModal):
161204 def __init__ (self , on_update_field : Callable ):
162205 super ().__init__ ()
163206 self .on_update_field = on_update_field
207+ self .show_metadata = False
164208
165209 def _build_action_buttons (self ) -> None :
166210 ui .button ("Cancel" , on_click = self .close )
@@ -182,6 +226,15 @@ def _handle_update(self) -> None:
182226 index = self .index .value ,
183227 default_value = self .default_value .value or None ,
184228 extra_kwargs = self .extra_kwargs or None ,
229+ metadata = ModelFieldMetadata (
230+ is_created_at_timestamp = (
231+ self .created_at .value if self .show_metadata else False
232+ ),
233+ is_updated_at_timestamp = (
234+ self .updated_at .value if self .show_metadata else False
235+ ),
236+ is_foreign_key = False ,
237+ ),
185238 )
186239 self .close ()
187240
@@ -195,6 +248,9 @@ def _set_field(self, field: ModelField) -> None:
195248 self .unique .value = field .unique
196249 self .index .value = field .index
197250 self .default_value .value = field .default_value or ""
251+ self .created_at .value = field .metadata .is_created_at_timestamp
252+ self .updated_at .value = field .metadata .is_updated_at_timestamp
253+ self .show_metadata = field .type == FieldDataType .DATETIME
198254 self .extra_kwargs = field .extra_kwargs .copy () if field .extra_kwargs else {}
199255 self .kwargs_container .clear ()
200256
0 commit comments