From 4cb6a69816bbe50b45c81fdaa923ebf89d88a633 Mon Sep 17 00:00:00 2001 From: Conrad Nelson Date: Thu, 18 Sep 2025 16:20:35 -0500 Subject: [PATCH] Additional form control and presentation logic. --- crudkit/core/service.py | 46 ++++++- crudkit/ui/fragments.py | 223 +++++++++++++++++++++++++++++--- crudkit/ui/templates/field.html | 72 +++++++---- crudkit/ui/templates/form.html | 40 +++++- 4 files changed, 333 insertions(+), 48 deletions(-) diff --git a/crudkit/core/service.py b/crudkit/core/service.py index e7acf1d..1220e04 100644 --- a/crudkit/core/service.py +++ b/crudkit/core/service.py @@ -1,7 +1,7 @@ from typing import Any, Callable, Dict, Iterable, List, Tuple, Type, TypeVar, Generic, Optional, Protocol, runtime_checkable, cast from sqlalchemy import and_, func, inspect, or_, text from sqlalchemy.engine import Engine, Connection -from sqlalchemy.orm import Load, Session, raiseload, selectinload, with_polymorphic, Mapper, RelationshipProperty +from sqlalchemy.orm import Load, Session, raiseload, selectinload, with_polymorphic, Mapper, RelationshipProperty, class_mapper from sqlalchemy.orm.attributes import InstrumentedAttribute from sqlalchemy.orm.util import AliasedClass from sqlalchemy.sql import operators @@ -12,6 +12,35 @@ from crudkit.core.spec import CRUDSpec from crudkit.core.types import OrderSpec, SeekWindow from crudkit.backend import BackendInfo, make_backend_info +def _loader_options_for_fields(root_alias, model_cls, fields: list[str]) -> list[Load]: + """ + For bare MANYTOONE names in fields (e.g. "location"), selectinload the relationship + and only fetch the related PK. This is enough for preselecting - {% if options %} - - {% for opt in options %} - - {% endfor %} - {% else %} - - {% endif %} - + {% elif field_type == 'textarea' %} - + {% elif field_type == 'checkbox' %} - + + +{% elif field_type == 'hidden' %} + + +{% elif field_type == 'display' %} +
{{ value }}
{% else %} - + {% endif %} {% if help %} -
{{ help }}
+
{{ help }}
{% endif %} diff --git a/crudkit/ui/templates/form.html b/crudkit/ui/templates/form.html index 7ab1d50..b073fc3 100644 --- a/crudkit/ui/templates/form.html +++ b/crudkit/ui/templates/form.html @@ -1,6 +1,40 @@
- {% for field in fields %} - {{ render_field(field, values.get(field.name, '')) | safe }} + {% macro render_row(row) %} + + {% if row.fields or row.children or row.legend %} + {% if row.legend %}{{ row.legend }}{% endif %} +
+ {% for field in row.fields %} +
+ {{ render_field(field, values.get(field.name, '')) | safe }} +
+ {% endfor %} + {% for child in row.children %} + {{ render_row(child) }} + {% endfor %} +
+ {% endif %} + {% endmacro %} + + {% if rows %} + {% for row in rows %} + {{ render_row(row) }} {% endfor %} - + {% else %} + {% for field in fields %} + {{ render_field(field, values.get(field.name, '')) | safe }} + {% endfor %} + {% endif %} + +