-
Notifications
You must be signed in to change notification settings - Fork 364
Expand file tree
/
Copy pathform_editor.py
More file actions
173 lines (157 loc) · 5.34 KB
/
form_editor.py
File metadata and controls
173 lines (157 loc) · 5.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import reflex as rx
from .. import constants, routes
from ..models import Field, Form
from ..state import AppState
from .field_view import field_input, field_prompt
from .form_select import FormSelectState
class FormEditorState(AppState):
form: Form = Form()
def _new_form(self):
return Form(owner_id=self.authenticated_user.id)
def load_form(self):
if not self.is_authenticated:
return
if self.form_id != "":
self.load_form_by_id(self.form_id)
else:
self.form = self._new_form()
def load_form_by_id(self, id_: int):
with rx.session() as session:
form = session.get(Form, id_)
if not self._user_has_access(form) or form is None:
self.form = self._new_form()
return
self.form = form
def delete_form(self):
if self.form.id is not None:
if not self._user_has_access():
return
with rx.session() as session:
session.delete(session.get(Form, self.form.id))
session.commit()
yield rx.redirect(routes.FORM_EDIT_NEW)
def set_name(self, name: str):
if not self._user_has_access():
return
with rx.session() as session:
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()
yield FormSelectState.load_forms
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():
return
with rx.session() as session:
session.add(self.form)
session.commit()
if field.id is None:
self.form.fields.append(field)
session.add(field)
session.add(self.form)
session.commit()
else:
for existing_field in self.form.fields:
if existing_field.id == field.id:
existing_field.name = field.name
existing_field.type_ = field.type_
existing_field.required = field.required
existing_field.prompt = field.prompt
session.add(existing_field)
session.commit()
return FormEditorState.load_form_by_id(self.form.id)
def delete_field(self, field_id):
if not self._user_has_access():
return
with rx.session() as session:
session.delete(session.get(Field, field_id))
session.commit()
return FormEditorState.load_form_by_id(self.form.id)
def field_edit_view(field: Field):
return rx.card(
rx.hstack(
rx.link(
field_prompt(field, show_name=True),
href=routes.edit_field(FormEditorState.form.id, field.id),
),
rx.spacer(),
rx.tooltip(
rx.link(
rx.icon(tag="x"), on_click=FormEditorState.delete_field(field.id)
),
content="Delete Field",
),
margin_bottom="12px",
),
rx.hstack(
rx.hstack(
field_input(field),
flex_wrap="wrap",
),
rx.text(
rx.cond(field.required, "(required)", "(optional)"), size="1", ml="3"
),
justify="between",
),
)
def form_editor():
return rx.vstack(
rx.hstack(
rx.el.label(
"Form Name",
rx.input(
placeholder="Form Name",
name="name",
value=FormEditorState.form.name,
on_change=FormEditorState.set_name,
debounce_timeout=1000,
),
),
rx.cond(
FormEditorState.form_id != "",
rx.hstack(
rx.button(
"Preview",
on_click=rx.redirect(routes.show_form(FormEditorState.form.id)),
type="button",
),
rx.button(
"Responses",
on_click=rx.redirect(
routes.form_responses(FormEditorState.form.id)
),
),
rx.spacer(),
rx.button(
"Delete Form",
color_scheme="tomato",
on_click=FormEditorState.delete_form,
type="button",
),
),
),
align="end",
justify="start",
),
rx.divider(),
rx.foreach(
FormEditorState.form.fields,
field_edit_view,
),
)
def form_edit_title():
form_name = rx.cond(
rx.State.form_id == "",
"New Form",
rx.cond(
FormEditorState.form,
FormEditorState.form.name,
"Unknown Form",
),
)
return f"{constants.TITLE} | {form_name}"