Compare commits

...
Sign in to create a new pull request.

2 commits

Author SHA1 Message Date
2dd6c01cfe Workouts form rebuild for new UI and logic w Gemini 2026-02-25 16:45:16 -07:00
d19d495ae1 gemini changes v1 2026-02-24 20:17:41 -07:00
2 changed files with 88 additions and 74 deletions

3
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,3 @@
{
"github.copilot.nextEditSuggestions.enabled": false
}

View file

@ -13,91 +13,102 @@ host = os.getenv('host')
database = os.getenv('database') database = os.getenv('database')
port = os.getenv('port') port = os.getenv('port')
workout_table = ['chest','back','legs'] # --- Database Helper Functions ---
selected_workout = st.selectbox('Select a Workout',options=workout_table) def get_db_connection():
try:
return mysql.connector.connect(
user=user, password=password, host=host, port=port, database=database
)
except mysql.connector.Error as err:
st.error(f"Database Error: {err}")
return None
try: def load_template(workout_type):
conn = mysql.connector.connect(user=user,password=password, host=host,port=port,database=database) conn = get_db_connection()
except mysql.connector.Error as err: if not conn: return pd.DataFrame()
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with your user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err)
else:
cursor = conn.cursor() cursor = conn.cursor()
if selected_workout == 'chest': # Map selection to table name safely
query = ("SELECT * FROM `chest`") table_map = {'chest': 'chest', 'back': 'back', 'legs': 'legs'}
elif selected_workout == 'back': table = table_map.get(workout_type, 'chest')
query = ("SELECT * FROM `back`")
else: query = f"SELECT * FROM `{table}`"
query = ("SELECT * FROM `legs`")
cursor.execute(query) cursor.execute(query)
data = cursor.fetchall() data = cursor.fetchall()
conn.commit() columns = cursor.column_names
cursor.close() cursor.close()
conn.close() conn.close()
df = pd.DataFrame(data, columns=columns)
df['date'] = date.today()
return df
today=date.today() def save_workout(df):
df = pd.DataFrame(data,columns=cursor.column_names) conn = get_db_connection()
df['date']=today if not conn: return
# Initialize session state to keep track of the current row index
if 'current_row' not in st.session_state:
st.session_state.current_row = 0
if 'edited_df' not in st.session_state:
st.session_state.edited_df = df.copy()
def display_row(row):
st.text_input("Date", value=row['date'], key='date')
st.text_input("Group",value=row['group'], key='group')
st.text_input("Exercise",value=row['exercise'], key='exercise')
st.number_input("Set",value=row['set'], key='set',format="%i")
st.number_input("Weight",value=row['weight'], key='weight',format="%0.1f",step=0.5)
st.number_input("Reps",value=row['reps'], key='reps',format="%i")
st.text_input("Notes",value=row['notes'], key='notes')
def save_edited_row(index):
st.session_state.edited_df.at[index,'group'] = st.session_state.group
st.session_state.edited_df.at[index,'exercise'] = st.session_state.exercise
st.session_state.edited_df.at[index,'set'] = st.session_state.set
st.session_state.edited_df.at[index,'weight'] = st.session_state.weight
st.session_state.edited_df.at[index,'reps'] = st.session_state.reps
st.session_state.edited_df.at[index,'notes'] = st.session_state.notes
# Display the current row of data
if st.session_state.current_row < len(df):
row_data = df.iloc[st.session_state.current_row]
display_row(row_data)
else:
st.write("No more rows to display")
# Button to clear form and move to the next row
if st.button('Save and Next'):
if st.session_state.current_row < len(df):
save_edited_row(st.session_state.current_row)
st.session_state.current_row += 1
st.rerun() # Rerun the app to display the next row
st.write("")
# Button to save all changes back to the dataframe
if st.button('Save All Changes'):
df.update(st.session_state.edited_df)
st.write("All changes saved!")
st.write(df)
conn = mysql.connector.connect(user=user,password=password, host=host,port=port,database=database)
cursor = conn.cursor() cursor = conn.cursor()
for index, row in df.iterrows(): # Note: Target table uses 'inputdate'
query = ("INSERT INTO `workouts`" query = ("INSERT INTO `workouts` "
"(`inputdate`,`group`,`exercise`,`set`,`weight`,`reps`,`notes`) " "(`inputdate`, `group`, `exercise`, `set`, `weight`, `reps`, `notes`) "
"VALUES (%s,%s,%s,%s,%s,%s,%s)") "VALUES (%s, %s, %s, %s, %s, %s, %s)")
cursor.execute(query,(row.iloc[1],row.iloc[2],row.iloc[3],row.iloc[4],row.iloc[5],row.iloc[6],row.iloc[7]))
for _, row in df.iterrows():
cursor.execute(query, (
row['date'], row['group'], row['exercise'],
row['set'], row['weight'], row['reps'], row['notes']
))
conn.commit() conn.commit()
cursor.close() cursor.close()
conn.close() conn.close()
st.success("Workout saved successfully!")
# --- Main Application ---
st.title("Workout Logger")
workout_options = ['chest', 'back', 'legs']
selected_workout = st.selectbox('Select a Workout', options=workout_options)
if 'current_workout' not in st.session_state or st.session_state.current_workout != selected_workout:
st.session_state.current_workout = selected_workout
st.session_state.workout_df = load_template(selected_workout)
st.session_state.current_index = 0
df = st.session_state.workout_df
if not df.empty:
# Navigation Dropdown
step_labels = [f"{i+1}. {row['exercise']} (Set {row['set']})" for i, row in df.iterrows()]
selected_step = st.selectbox("Jump to Exercise", options=step_labels, index=st.session_state.current_index)
st.session_state.current_index = step_labels.index(selected_step)
# Current Row Data
idx = st.session_state.current_index
row = df.iloc[idx]
st.divider()
# Input Form - Using dynamic key to ensure fresh widgets for each row
with st.form(key=f"row_form_{idx}"):
st.subheader(f"{row['exercise']}")
st.caption(f"Set: {row['set']} | Group: {row['group']}")
c1, c2 = st.columns(2)
new_weight = c1.number_input("Weight", value=float(row['weight']), step=2.5)
new_reps = c2.number_input("Reps", value=int(row['reps']), step=1)
new_notes = st.text_input("Notes", value=str(row['notes']) if row['notes'] else "")
if st.form_submit_button("Save & Next"):
st.session_state.workout_df.at[idx, 'weight'] = new_weight
st.session_state.workout_df.at[idx, 'reps'] = new_reps
st.session_state.workout_df.at[idx, 'notes'] = new_notes
if idx < len(df) - 1:
st.session_state.current_index += 1
st.rerun()
st.divider()
st.dataframe(st.session_state.workout_df)
if st.button("Commit Workout to Database"):
save_workout(st.session_state.workout_df)