Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Type Error when using mixed type dictionaries and numeric_inputs. #34

Open
raven-black-dream opened this issue Oct 19, 2023 · 1 comment

Comments

@raven-black-dream
Copy link

raven-black-dream commented Oct 19, 2023

Describe the bug

NumberInput (number_input) gives an error:

"TypeError: Invalid var passed for prop value, expected type <class 'str'>, got value _["reps"] of type typing.Any."

When using a state variable which returns a dictionary of mixed types. Given that the required type annotations only really allow a single type annotation for dictionaries. Dict[str, str] for example being a dictionary where the keys and values are all strings.

To Reproduce

Create a state variable which returns a dictionary with mixed types and provide the type annotation Dict[str, Any].

Create a form which requires both text elements and numeric inputs.

Try to use the state variable's values to set the initial values for the form.

  • Code/Link to Repo:
@rx.var
    def items(self) -> List[Dict[str, Any]]:
        preds = [pred for pred in self.user_program['predictions'] if pred['day_name'] == self.day_name]
        items = []
        if self.day == [{}]:
            return [{}]
        for item in self.day:
            exercise_name = item['exercise'] if not item['myoreps'] else f"{item['exercise']}-myoreps"
            exercise_pred = [exercise for exercise in preds if exercise['exercise'] == item['exercise']][0]
            for i in range(item['num_sets']):
                if i + 1 == item['num_sets'] and item['amrap']:
                    items.append(
                        {
                            'exercise_name': exercise_name,
                            'input_id_reps': f"{item['exercise']}_i_reps",
                            'input_id_weight': f"{item['exercise']}_i_weight",
                            'input_id_rpe': f"{item['exercise']}_i_rpe",
                            'reps': item['min_reps'],
                            'weight': exercise_pred['weight'],
                            'unit': exercise_pred['unit'],
                            'rpe': 10.0
                        }
                    )
                else:
                    items.append(
                        {
                            'exercise_name': exercise_name,
                            'input_id_reps': f"{item['exercise']}_i_reps",
                            'input_id_weight': f"{item['exercise']}_i_weight",
                            'input_id_rpe': f"{item['exercise']}_i_rpe",
                            'reps': int(item['min_reps']),
                            'weight': float(exercise_pred['weight']),
                            'unit': exercise_pred['unit'],
                            'rpe': float(item['avg_rpe'])
                        }
                    )

        return items

def record_workout():
    return PageView([
        rx.heading("Record Workout", color='#aaaaaa', font_size="2em"),
        rx.center(rx.form(
            rx.vstack(
                rx.hstack(
                    rx.box(rx.text("Exercise"), width='20%', bg_color='#1a472a', color='#ffffff',
                           border_radius="md"),
                    rx.box(rx.text("Reps"), width='20%', bg_color='#1a472a', color='#ffffff',
                           border_radius="md"),
                    rx.box(rx.text("Weight"), width='20%', bg_color='#1a472a', color='#ffffff',
                           border_radius="md"),
                    rx.box(rx.text("RPE"), width='20%', bg_color='#1a472a', color='#ffffff',
                           border_radius="md"),
                    width='100%'
                ),
                rx.foreach(
                    WorkoutFormState.items,
                    lambda item: rx.hstack(
                        rx.box(rx.text(item['exercise_name']), width='20%', bg_color='#1a472a',
                               color='#ffffff', border_radius="md"),
                        rx.number_input(value=item['reps'], id=item["input_id_reps"], size='sm', width='20%'),
                        rx.number_input(value=item['weight'], input_mode='decimal',
                                 id=item["input_id_weight"], size='sm', width='20%'),
                        rx.number_input(value=item['rpe'], input_mode='decimal',
                                 id=item["input_id_rpe"], size='sm', width='20%'),
                        width='100%'


                    )
                )
            ),

            rx.button("Submit", type_="submit", color_scheme='green'),
            on_submit=WorkoutFormState.submit,
        ))
    ]).build()

Expected behavior

Page should render with NumberInputs where they should be in the form.

Screenshots
If applicable, add screenshots to help explain your problem.

Specifics (please complete the following information):

  • Python Version: 3.11
  • Reflex Version: 2.0.9
  • OS: Ubuntu 22.04.03 LTS
  • Browser (Optional): Chrome

Additional context

I am working around the issue by using regular inputs, and casting the numeric values to strings, then will be casting them back to numeric values before writing to the database.

@Lendemor Lendemor transferred this issue from reflex-dev/reflex Jan 21, 2025
Copy link

linear bot commented Jan 21, 2025

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant