diff --git a/form-designer/alembic/versions/4c92535dbbbd_add_hidden_to_response.py b/form-designer/alembic/versions/4c92535dbbbd_add_hidden_to_response.py new file mode 100644 index 00000000..4c9fd72d --- /dev/null +++ b/form-designer/alembic/versions/4c92535dbbbd_add_hidden_to_response.py @@ -0,0 +1,39 @@ +"""Add hidden to response. + +Revision ID: 4c92535dbbbd +Revises: 481d2a7a6d6f +Create Date: 2025-07-31 13:41:08.311239 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +import sqlmodel + +# revision identifiers, used by Alembic. +revision: str = "4c92535dbbbd" +down_revision: Union[str, None] = "481d2a7a6d6f" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("response", schema=None) as batch_op: + batch_op.add_column( + sa.Column( + "hidden", sa.Boolean(), server_default=sa.text("0"), nullable=False + ) + ) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("response", schema=None) as batch_op: + batch_op.drop_column("hidden") + + # ### end Alembic commands ### diff --git a/form-designer/form_designer/components/form_editor.py b/form-designer/form_designer/components/form_editor.py index edcbe6f2..0963e542 100644 --- a/form-designer/form_designer/components/form_editor.py +++ b/form-designer/form_designer/components/form_editor.py @@ -42,13 +42,16 @@ def set_name(self, name: str): if not self._user_has_access(): return with rx.session() as session: - self.form.name = name - session.add(self.form) + if self.form.id is not None: + form = session.get(Form, self.form.id) + else: + form = self.form + form.name = name + session.add(form) session.commit() - session.refresh(self.form) yield FormSelectState.load_forms - if self.form.id > 0: - return rx.redirect(routes.edit_form(self.form.id)) + if form.id is not None and form.id > 0: + return rx.redirect(routes.edit_form(form.id)) def update_field(self, field: Field): if not self._user_has_access(): diff --git a/form-designer/form_designer/models.py b/form-designer/form_designer/models.py index 92766ad5..49e4be52 100644 --- a/form-designer/form_designer/models.py +++ b/form-designer/form_designer/models.py @@ -80,6 +80,7 @@ class Response(rx.Model, table=True): server_default=sqlmodel.func.now(), ), ) + hidden: bool = False form: Form = sqlmodel.Relationship(back_populates="responses") field_values: list[FieldValue] = sqlmodel.Relationship( diff --git a/form-designer/form_designer/pages/response.py b/form-designer/form_designer/pages/response.py index 88b04a57..d37c5c86 100644 --- a/form-designer/form_designer/pages/response.py +++ b/form-designer/form_designer/pages/response.py @@ -13,14 +13,18 @@ class ResponsesState(AppState): def load_responses(self): if not self.is_authenticated: return + try: + form_id = int(self.form_id) + except ValueError: + return with rx.session() as session: - form = session.get(Form, self.form_id) + form = session.get(Form, form_id) if not self._user_has_access(form) or form is None: self.form = Form() return self.form = form self.responses = session.exec( - Response.select().where(Response.form_id == self.form_id) + Response.select().where(Response.form_id == form_id) ).all() def delete_response(self, id: int): @@ -60,7 +64,7 @@ def response(r: Response): rx.icon(tag="x", size=16), color_scheme="tomato", margin_right="1em", - on_click=ResponsesState.delete_response(r.id), + on_click=ResponsesState.delete_response(r.id).stop_propagation, ), content="Delete this Response", ), diff --git a/form-designer/rxconfig.py b/form-designer/rxconfig.py index 776e0360..9a0c3f81 100644 --- a/form-designer/rxconfig.py +++ b/form-designer/rxconfig.py @@ -2,5 +2,5 @@ config = rx.Config( app_name="form_designer", - tailwind=None, + plugins=[rx.plugins.sitemap.SitemapPlugin()], )