55based on company size.
66"""
77
8- from typing import Any
9-
108import reflex as rx
119from reflex .experimental .client_state import ClientStateVar
1210
1311import reflex_ui as ui
12+ from reflex_ui .components .base .button import BUTTON_VARIANTS , DEFAULT_CLASS_NAME
1413
1514demo_form_error_message = ClientStateVar .create ("demo_form_error_message" , "" )
1615demo_form_open_cs = ClientStateVar .create ("demo_form_open" , False )
@@ -60,70 +59,7 @@ def check_if_company_email(email: str) -> bool:
6059
6160def check_if_default_value_is_selected (value : str ) -> bool :
6261 """Check if the default value is selected."""
63- return value .strip () != "Select"
64-
65-
66- class DemoFormStateUI (rx .State ):
67- """State for handling demo form submissions and validation."""
68-
69- @rx .event
70- def on_submit (self , form_data : dict [str , Any ]):
71- """Handle form submission with validation logic.
72-
73- Validates company email and required fields. If successful, clears errors.
74- The actual submission is handled by the external script.
75-
76- Args:
77- form_data: Form data dictionary containing user inputs
78- """
79- if not check_if_company_email (form_data .get ("email" , "" )):
80- return [
81- rx .set_focus ("email" ),
82- rx .toast .error (
83- "Please enter a valid company email - gmails, aol, me, etc are not allowed" ,
84- position = "top-center" ,
85- ),
86- demo_form_error_message .push (
87- "Please enter a valid company email - gmails, aol, me, etc are not allowed"
88- ),
89- ]
90-
91- # Check if the has selected a number of employees
92- if not check_if_default_value_is_selected (
93- form_data .get ("number_of_employees" , "" )
94- ):
95- return [
96- rx .toast .error (
97- "Please select a number of employees" ,
98- position = "top-center" ,
99- ),
100- demo_form_error_message .push ("Please select a number of employees" ),
101- ]
102-
103- # Check if the has entered a referral source
104- if not check_if_default_value_is_selected (
105- form_data .get ("how_did_you_hear_about_us" , "" )
106- ):
107- return [
108- rx .toast .error (
109- "Please select how did you hear about us" ,
110- position = "top-center" ,
111- ),
112- demo_form_error_message .push ("Please select how did you hear about us" ),
113- ]
114-
115- # Check if the has entered a technical level
116- if not check_if_default_value_is_selected (form_data .get ("technical_level" , "" )):
117- return [
118- rx .set_focus ("technical_level" ),
119- rx .toast .error (
120- "Please select a technical level" ,
121- position = "top-center" ,
122- ),
123- demo_form_error_message .push ("Please select a technical level" ),
124- ]
125-
126- return None
62+ return bool (value .strip ())
12763
12864
12965def input_field (
@@ -211,12 +147,24 @@ def select_field(
211147 label + (" *" if required else "" ),
212148 class_name = "block text-xs lg:text-sm font-medium text-secondary-12 truncate min-w-0" ,
213149 ),
214- ui .select (
215- default_value = "Select" ,
216- name = name ,
217- items = items ,
218- required = required ,
219- class_name = "w-full" ,
150+ rx .el .div (
151+ rx .el .select (
152+ rx .el .option ("Select" , value = "" ),
153+ * [rx .el .option (item , value = item ) for item in items ],
154+ default_value = "" ,
155+ name = name ,
156+ required = required ,
157+ class_name = ui .cn (
158+ "w-full appearance-none pr-9" ,
159+ DEFAULT_CLASS_NAME ,
160+ BUTTON_VARIANTS ["variant" ]["outline" ],
161+ BUTTON_VARIANTS ["size" ]["md" ],
162+ ),
163+ ),
164+ ui .select_arrow (
165+ class_name = "size-4 text-secondary-9 absolute right-2.5 top-1/2 -translate-y-1/2 pointer-events-none"
166+ ),
167+ class_name = "relative" ,
220168 ),
221169 class_name = "flex flex-col gap-1.5 min-w-0" ,
222170 )
@@ -258,6 +206,7 @@ def demo_form(**props) -> rx.Component:
258206 "Number of employees?" ,
259207 "number_of_employees" ,
260208 ["1" , "2-5" , "6-10" , "11-50" , "51-100" , "101-500" , "500+" ],
209+ required = True ,
261210 ),
262211 select_field (
263212 "How did you hear about us?" ,
@@ -270,6 +219,7 @@ def demo_form(**props) -> rx.Component:
270219 "Conference" ,
271220 "Other" ,
272221 ],
222+ required = True ,
273223 ),
274224 class_name = "grid grid-cols-1 md:grid-cols-2 gap-4" ,
275225 ),
@@ -291,7 +241,6 @@ def demo_form(**props) -> rx.Component:
291241 type = "submit" ,
292242 class_name = "w-full" ,
293243 ),
294- on_submit = DemoFormStateUI .on_submit ,
295244 class_name = ui .cn (
296245 "@container flex flex-col lg:gap-6 gap-2 p-6" ,
297246 props .pop ("class_name" , "" ),
0 commit comments