From 8125193378155c627efda58e199228dd0d6c8ba7 Mon Sep 17 00:00:00 2001 From: hyunho Date: Thu, 2 Apr 2026 10:38:47 +0900 Subject: [PATCH] Fix organization member editing and drag sync --- DashBoard-organization.html | 6 +- backend/app/member_routes.py | 25 +++-- frontend/public/index.html | 4 +- frontend/public/styles.css | 6 ++ legacy/static/organization.css | 17 +++- legacy/static/organization.js | 163 +++++++++++++++++++++++---------- 6 files changed, 155 insertions(+), 66 deletions(-) diff --git a/DashBoard-organization.html b/DashBoard-organization.html index c179731..792800c 100644 --- a/DashBoard-organization.html +++ b/DashBoard-organization.html @@ -8,8 +8,8 @@ - - + + @@ -60,6 +60,6 @@ - + diff --git a/backend/app/member_routes.py b/backend/app/member_routes.py index 27a3780..e3be780 100644 --- a/backend/app/member_routes.py +++ b/backend/app/member_routes.py @@ -3,7 +3,7 @@ from __future__ import annotations from datetime import datetime from typing import Callable -from fastapi import FastAPI, File, HTTPException, UploadFile +from fastapi import Body, FastAPI, File, HTTPException, UploadFile def register_member_routes( @@ -19,6 +19,7 @@ def register_member_routes( serialize_member_payload: Callable[[object, int], tuple[object, ...]], sync_auth_users_from_members: Callable[[object], None], create_history_revision: Callable[[object, str, str], int], + fetch_history_revision_created_at: Callable[[object, int], datetime], sync_member_versions: Callable[[object, list[int], str, int], None], sync_seat_assignment_versions: Callable[[object, list[int], str, int], None], replace_members: Callable[[list[object]], list[dict[str, object]]], @@ -46,7 +47,8 @@ def register_member_routes( return {"items": build_member_compare_items(from_items, to_items)} @app.post("/api/members") - def create_member(payload: member_payload_cls) -> dict[str, object]: + def create_member(payload: dict = Body(...)) -> dict[str, object]: + payload = member_payload_cls.model_validate(payload) with get_conn() as conn: with conn.cursor() as cur: cur.execute("SELECT COALESCE(MAX(sort_order), -1) + 1 AS next_order FROM members") @@ -67,16 +69,19 @@ def register_member_routes( member = cur.fetchone() sync_auth_users_from_members(cur) revision_no = create_history_revision(cur, "member-create", f"Member created id={int(member['id'])}") - sync_member_versions(cur, [int(member["id"])], "member-create", revision_no) + revision_created_at = fetch_history_revision_created_at(cur, revision_no) + sync_member_versions(cur, [int(member["id"])], "member-create", revision_no, revision_created_at) conn.commit() return {"item": member} @app.put("/api/members/bulk-sync") - def bulk_sync_members(payload: member_bulk_payload_cls) -> dict[str, list[dict[str, object]]]: + def bulk_sync_members(payload: dict = Body(...)) -> dict[str, list[dict[str, object]]]: + payload = member_bulk_payload_cls.model_validate(payload) return {"items": replace_members(payload.items)} @app.put("/api/members/{member_id}") - def update_member(member_id: int, payload: member_payload_cls) -> dict[str, object]: + def update_member(member_id: int, payload: dict = Body(...)) -> dict[str, object]: + payload = member_payload_cls.model_validate(payload) with get_conn() as conn: with conn.cursor() as cur: cur.execute( @@ -112,8 +117,9 @@ def register_member_routes( raise HTTPException(status_code=404, detail="Member not found.") sync_auth_users_from_members(cur) revision_no = create_history_revision(cur, "member-update", f"Member updated id={member_id}") - sync_member_versions(cur, [member_id], "member-update", revision_no) - sync_seat_assignment_versions(cur, [member_id], "member-update", revision_no) + revision_created_at = fetch_history_revision_created_at(cur, revision_no) + sync_member_versions(cur, [member_id], "member-update", revision_no, revision_created_at) + sync_seat_assignment_versions(cur, [member_id], "member-update", revision_no, revision_created_at) conn.commit() return {"item": member} @@ -126,8 +132,9 @@ def register_member_routes( if deleted: sync_auth_users_from_members(cur) revision_no = create_history_revision(cur, "member-delete", f"Member deleted id={member_id}") - sync_member_versions(cur, [member_id], "member-delete", revision_no) - sync_seat_assignment_versions(cur, [member_id], "member-delete", revision_no) + revision_created_at = fetch_history_revision_created_at(cur, revision_no) + sync_member_versions(cur, [member_id], "member-delete", revision_no, revision_created_at) + sync_seat_assignment_versions(cur, [member_id], "member-delete", revision_no, revision_created_at) conn.commit() if not deleted: raise HTTPException(status_code=404, detail="Member not found.") diff --git a/frontend/public/index.html b/frontend/public/index.html index b395b65..bf87a0e 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -16,7 +16,7 @@ - + @@ -105,7 +105,7 @@
- +