Add the ability to add/delete users from overview page
This commit is contained in:
8
app.py
8
app.py
@@ -83,7 +83,7 @@ def users():
|
|||||||
|
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
# create a new user
|
# create a new user
|
||||||
data = request.json
|
data = request.form
|
||||||
name = data['name']
|
name = data['name']
|
||||||
|
|
||||||
# create a new user and add it to the database
|
# create a new user and add it to the database
|
||||||
@@ -91,7 +91,8 @@ def users():
|
|||||||
db.session.add(new_user)
|
db.session.add(new_user)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
return jsonify({'message': 'User created successfully.'}), 201
|
users = User.query.all()
|
||||||
|
return render_template('users.html', users=users)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/user/<int:user_id>', methods=['DELETE'])
|
@app.route('/user/<int:user_id>', methods=['DELETE'])
|
||||||
@@ -100,7 +101,8 @@ def delete_user(user_id):
|
|||||||
if user:
|
if user:
|
||||||
db.session.delete(user)
|
db.session.delete(user)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'message': 'User deleted successfully.'}), 200
|
users = User.query.all()
|
||||||
|
return render_template('users.html', users=users)
|
||||||
else:
|
else:
|
||||||
return jsonify({'error': 'User not found.'}), 404
|
return jsonify({'error': 'User not found.'}), 404
|
||||||
|
|
||||||
|
|||||||
41
templates/users.html
Normal file
41
templates/users.html
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<table class="w-full">
|
||||||
|
<thead>
|
||||||
|
<tr class="bg-gray-200 text-gray-600 uppercase text-sm leading-normal">
|
||||||
|
<th class="py-3 px-6 text-left">Name</th>
|
||||||
|
<th class="py-3 px-6 text-left">Workouts</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for u in users %}
|
||||||
|
<tr class="hover:bg-gray-100">
|
||||||
|
<td class="py-4 px-6 border-b border-gray-200"><a href="{{ url_for('new_workout', user_id=u.id) }}">{{
|
||||||
|
u.name }}</a></td>
|
||||||
|
<td class="py-4 px-6 border-b border-gray-200 flex inline">
|
||||||
|
<div class="flex justify-between w-full">
|
||||||
|
<div>{{ u.workouts_count }}</div>
|
||||||
|
<div class="flex">
|
||||||
|
<div hx-delete="{{ url_for('delete_user', user_id=u.id) }}"
|
||||||
|
hx-confirm="Are you sure you wish to delete your account?" hx-target="#users-container"
|
||||||
|
class="pr-1">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||||
|
stroke="currentColor" class="w-6 h-6">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round"
|
||||||
|
d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div hx-get="{{ url_for('workouts', user_id=u.id) }}" hx-target="#container">
|
||||||
|
<svg class="w-6 h-6 dark:text-white" xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||||
|
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round"
|
||||||
|
d="M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15">
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
<a class="text-gray-800 text-xl font-bold" href="/">Cardio Tracker</a>
|
<a class="text-gray-800 text-xl font-bold" href="/">Cardio Tracker</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<form class="flex py-1" action="/" method="POST">
|
<form class="flex py-1" hx-post="{{ url_for('users') }}" hx-target="#users-container">
|
||||||
<input
|
<input
|
||||||
class="rounded-l-lg p-2 border-t mr-0 border-b border-l text-gray-800 border-gray-200 bg-white"
|
class="rounded-l-lg p-2 border-t mr-0 border-b border-l text-gray-800 border-gray-200 bg-white"
|
||||||
name="name" placeholder="New user name" required />
|
name="name" placeholder="New user name" required />
|
||||||
@@ -35,44 +35,15 @@
|
|||||||
<div class="flex flex-col sm:flex-row justify-between">
|
<div class="flex flex-col sm:flex-row justify-between">
|
||||||
<div class="w-full sm:w-1/2 px-4 mb-8">
|
<div class="w-full sm:w-1/2 px-4 mb-8">
|
||||||
<h1 class="text-gray-800 font-bold text-2xl mb-4">Users</h1>
|
<h1 class="text-gray-800 font-bold text-2xl mb-4">Users</h1>
|
||||||
<div class="bg-white shadow-md rounded-lg overflow-hidden">
|
<div class="bg-white shadow-md rounded-lg overflow-hidden" id="users-container">
|
||||||
<table class="w-full">
|
|
||||||
<thead>
|
{% with users=users %}
|
||||||
<tr class="bg-gray-200 text-gray-600 uppercase text-sm leading-normal">
|
{% include 'users.html' %}
|
||||||
<th class="py-3 px-6 text-left">Name</th>
|
{% endwith %}
|
||||||
<th class="py-3 px-6 text-left">Workouts</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for u in users %}
|
|
||||||
<tr class="hover:bg-gray-100">
|
|
||||||
<td class="py-4 px-6 border-b border-gray-200"><a
|
|
||||||
href="{{ url_for('new_workout', user_id=u.id) }}">{{ u.name }}</a></td>
|
|
||||||
<td class="py-4 px-6 border-b border-gray-200 flex inline">
|
|
||||||
<div class="flex justify-between w-full">
|
|
||||||
<div>{{ u.workouts_count }}</div>
|
|
||||||
<div hx-get="{{ url_for('workouts', user_id=u.id) }}" hx-target="#container">
|
|
||||||
<svg class="w-6 h-6 dark:text-white" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
|
||||||
stroke="currentColor">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round"
|
|
||||||
d="M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15">
|
|
||||||
</path>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full sm:w-1/2 px-4 mb-8" id="container">
|
<div class="w-full sm:w-1/2 px-4 mb-8" id="container">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user