From 72971f6d3ee028978ecbc987a9cd064104177394 Mon Sep 17 00:00:00 2001 From: Ryan Kegel Date: Tue, 25 Nov 2025 16:08:10 -0500 Subject: [PATCH] round 1 --- api/child_api.py | 4 +- api/task_api.py | 40 + requirements.txt | Bin 0 -> 534 bytes web/vue-app/src/components/ChildForm.vue | 687 ------------------ ...{ChildrenList.vue => ChildrenListView.vue} | 2 +- web/vue-app/src/components/ImagePicker.vue | 432 +++++++++++ web/vue-app/src/components/LoginButton.vue | 27 +- .../{ => child}/ChildDetailCard.vue | 2 +- .../src/components/child/ChildForm.vue | 229 ++++++ .../src/components/{ => child}/ChildView.vue | 6 +- .../src/components/{ => child}/ParentView.vue | 8 +- .../{ => reward}/ChildRewardList.vue | 2 +- .../src/components/reward/RewardView.vue | 14 + .../components/{ => task}/ChildTaskList.vue | 2 +- .../src/components/task/TaskEditView.vue | 320 ++++++++ web/vue-app/src/components/task/TaskList.vue | 226 ++++++ web/vue-app/src/components/task/TaskView.vue | 148 ++++ web/vue-app/src/layout/ParentLayout.vue | 175 +++-- web/vue-app/src/router/index.ts | 56 +- 19 files changed, 1595 insertions(+), 785 deletions(-) create mode 100644 requirements.txt delete mode 100644 web/vue-app/src/components/ChildForm.vue rename web/vue-app/src/components/{ChildrenList.vue => ChildrenListView.vue} (99%) create mode 100644 web/vue-app/src/components/ImagePicker.vue rename web/vue-app/src/components/{ => child}/ChildDetailCard.vue (96%) create mode 100644 web/vue-app/src/components/child/ChildForm.vue rename web/vue-app/src/components/{ => child}/ChildView.vue (95%) rename web/vue-app/src/components/{ => child}/ParentView.vue (94%) rename web/vue-app/src/components/{ => reward}/ChildRewardList.vue (99%) create mode 100644 web/vue-app/src/components/reward/RewardView.vue rename web/vue-app/src/components/{ => task}/ChildTaskList.vue (99%) create mode 100644 web/vue-app/src/components/task/TaskEditView.vue create mode 100644 web/vue-app/src/components/task/TaskList.vue create mode 100644 web/vue-app/src/components/task/TaskView.vue diff --git a/api/child_api.py b/api/child_api.py index 7374e17..a81e8f9 100644 --- a/api/child_api.py +++ b/api/child_api.py @@ -128,7 +128,7 @@ def list_child_tasks(id): ct = ChildTask(task.get('name'), task.get('is_good'), task.get('points'), task.get('image_id'), task.get('id')) child_tasks.append(ct.to_dict()) - return jsonify({'child_tasks': child_tasks}), 200 + return jsonify({'tasks': child_tasks}), 200 @child_api.route('/child//list-assignable-tasks', methods=['GET']) def list_assignable_tasks(id): @@ -156,7 +156,7 @@ def list_assignable_tasks(id): ct = ChildTask(task.get('name'), task.get('is_good'), task.get('points'), task.get('image_id'), task.get('id')) assignable_tasks.append(ct.to_dict()) - return jsonify({'assignable_tasks': assignable_tasks, 'count': len(assignable_tasks)}), 200 + return jsonify({'tasks': assignable_tasks, 'count': len(assignable_tasks)}), 200 @child_api.route('/child//trigger-task', methods=['POST']) def trigger_child_task(id): diff --git a/api/task_api.py b/api/task_api.py index 349f9b4..28ede5c 100644 --- a/api/task_api.py +++ b/api/task_api.py @@ -46,3 +46,43 @@ def delete_task(id): child_db.update({'tasks': tasks}, ChildQuery.id == child.get('id')) return jsonify({'message': f'Task {id} deleted.'}), 200 return jsonify({'error': 'Task not found'}), 404 + +@task_api.route('/task//edit', methods=['PUT']) +def edit_task(id): + TaskQuery = Query() + existing = task_db.get(TaskQuery.id == id) + if not existing: + return jsonify({'error': 'Task not found'}), 404 + + data = request.get_json(force=True) or {} + updates = {} + + if 'name' in data: + name = data.get('name', '').strip() + if not name: + return jsonify({'error': 'Name cannot be empty'}), 400 + updates['name'] = name + + if 'points' in data: + points = data.get('points') + if not isinstance(points, int): + return jsonify({'error': 'Points must be an integer'}), 400 + if points <= 0: + return jsonify({'error': 'Points must be a positive integer'}), 400 + updates['points'] = points + + if 'is_good' in data: + is_good = data.get('is_good') + if not isinstance(is_good, bool): + return jsonify({'error': 'is_good must be a boolean'}), 400 + updates['is_good'] = is_good + + if 'image_id' in data: + updates['image_id'] = data.get('image_id', '') + + if not updates: + return jsonify({'error': 'No valid fields to update'}), 400 + + task_db.update(updates, TaskQuery.id == id) + updated = task_db.get(TaskQuery.id == id) + return jsonify(updated), 200 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..cc49e4475bfdbb1aa51a09af71364e96970de0b1 GIT binary patch literal 534 zcmYk3!AiqW5Jm4=@Kcl~YSD#T7lI(TaGlmB#MUGTJfhxX)E`rtTX0lnrdBl`hfX`Hj2Y4tK# zePS0>vC0?rW$0u_ z$?X&Od%PYr=!O3pE%%fvxuPdBKs=9%T6UKm-JGfn-0xyCpOIh84zh~@b|A0Oaps;^ zrqA3q%yWab`?3RfP{dZ!>;_^cB1YckXbcylTDH72yx7hk)`9eOjV F!(VoUOfUcd literal 0 HcmV?d00001 diff --git a/web/vue-app/src/components/ChildForm.vue b/web/vue-app/src/components/ChildForm.vue deleted file mode 100644 index 593181b..0000000 --- a/web/vue-app/src/components/ChildForm.vue +++ /dev/null @@ -1,687 +0,0 @@ - - - - - diff --git a/web/vue-app/src/components/ChildrenList.vue b/web/vue-app/src/components/ChildrenListView.vue similarity index 99% rename from web/vue-app/src/components/ChildrenList.vue rename to web/vue-app/src/components/ChildrenListView.vue index 9b8072f..c316e6a 100644 --- a/web/vue-app/src/components/ChildrenList.vue +++ b/web/vue-app/src/components/ChildrenListView.vue @@ -3,7 +3,7 @@ import { ref, onMounted, onBeforeUnmount } from 'vue' import { useRouter } from 'vue-router' import { getCachedImageUrl, revokeAllImageUrls } from '../common/imageCache' import { isParentAuthenticated } from '../stores/auth' -import ChildForm from './ChildForm.vue' +import ChildForm from './child/ChildForm.vue' interface Child { id: string | number diff --git a/web/vue-app/src/components/ImagePicker.vue b/web/vue-app/src/components/ImagePicker.vue new file mode 100644 index 0000000..4202318 --- /dev/null +++ b/web/vue-app/src/components/ImagePicker.vue @@ -0,0 +1,432 @@ + + + + + diff --git a/web/vue-app/src/components/LoginButton.vue b/web/vue-app/src/components/LoginButton.vue index 5162c5d..79bf6f4 100644 --- a/web/vue-app/src/components/LoginButton.vue +++ b/web/vue-app/src/components/LoginButton.vue @@ -42,13 +42,9 @@ const handleLogout = () => { - diff --git a/web/vue-app/src/components/ChildView.vue b/web/vue-app/src/components/child/ChildView.vue similarity index 95% rename from web/vue-app/src/components/ChildView.vue rename to web/vue-app/src/components/child/ChildView.vue index 675dc11..9b0dd00 100644 --- a/web/vue-app/src/components/ChildView.vue +++ b/web/vue-app/src/components/child/ChildView.vue @@ -1,9 +1,9 @@ + + + + diff --git a/web/vue-app/src/components/task/TaskList.vue b/web/vue-app/src/components/task/TaskList.vue new file mode 100644 index 0000000..d7a20fa --- /dev/null +++ b/web/vue-app/src/components/task/TaskList.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/web/vue-app/src/components/task/TaskView.vue b/web/vue-app/src/components/task/TaskView.vue new file mode 100644 index 0000000..d4dbc53 --- /dev/null +++ b/web/vue-app/src/components/task/TaskView.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/web/vue-app/src/layout/ParentLayout.vue b/web/vue-app/src/layout/ParentLayout.vue index 58859dd..f352904 100644 --- a/web/vue-app/src/layout/ParentLayout.vue +++ b/web/vue-app/src/layout/ParentLayout.vue @@ -14,18 +14,91 @@ const handleBack = () => { } } -const showBack = computed(() => route.path !== '/parent') +const showBack = computed( + () => !(route.path === '/parent' || route.name === 'TaskView' || route.name === 'RewardView'), +)