Skip to content

Commit 2f25db5

Browse files
authored
feature: Show metadata for DateTime fields (#17)
1 parent ddfb054 commit 2f25db5

2 files changed

Lines changed: 59 additions & 2 deletions

File tree

fastapi_forge/frontend/modals/field_modal.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from nicegui import ui
55
from pydantic import ValidationError
66

7-
from fastapi_forge.dtos import ModelField
7+
from fastapi_forge.dtos import ModelField, ModelFieldMetadata
88
from fastapi_forge.enums import FieldDataType
99
from fastapi_forge.frontend.notifications import notify_validation_error
1010
from 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

fastapi_forge/frontend/panels/model_editor_panel.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ def _handle_update_field(
407407
nullable: bool,
408408
unique: bool,
409409
index: bool,
410+
metadata: ModelFieldMetadata,
410411
default_value: str | None = None,
411412
extra_kwargs: dict[str, Any] | None = None,
412413
) -> None:
@@ -431,7 +432,7 @@ def _handle_update_field(
431432
index=index,
432433
default_value=default_value,
433434
extra_kwargs=extra_kwargs,
434-
metadata=state.selected_field.metadata,
435+
metadata=metadata,
435436
)
436437

437438
model_index = state.selected_model.fields.index(state.selected_field)

0 commit comments

Comments
 (0)