From 550d60f71fac3961b4d6e2a224781578c6c4ed5f Mon Sep 17 00:00:00 2001 From: Epagris Date: Wed, 25 Sep 2024 22:45:06 +0200 Subject: [PATCH] - Add/remove members to a group added --- class/GroupMgr.php | 15 +++++++-- class/UserMgr.php | 6 ++++ common_func.php | 6 +++- group_manager_frame.php | 20 ++++++++++-- interface.php | 70 +++++++++++++---------------------------- js/groupmgr.js | 42 +++++++++++++++++++++++++ js/result_analyzer.js | 16 +++++----- 7 files changed, 115 insertions(+), 60 deletions(-) diff --git a/class/GroupMgr.php b/class/GroupMgr.php index c1b5c75..36cd02d 100644 --- a/class/GroupMgr.php +++ b/class/GroupMgr.php @@ -42,7 +42,8 @@ class Group extends AutoStoring // Create Group from array static function fromArray(GroupMgr &$groupMgr, array $a): Group { - return new Group($groupMgr, $a["groupname"], $a["description"], $a["owner"], $a["_id"], $a["unique"], $a["editors"], $a["users"], $a["games"]); + $id = $a["_id"] ?? -1; + return new Group($groupMgr, $a["groupname"], $a["description"], $a["owner"], $id, $a["unique"], $a["editors"], $a["users"], $a["games"]); } // Convert Group to array @@ -170,6 +171,16 @@ class Group extends AutoStoring $this->storeMods(); // store changes } + // Add members + function addMembers(array $nicknames) : void { + $this->changeMembers($nicknames, []); + } + + // Remove members + function removeMembers(array $nicknames) : void { + $this->changeMembers([], $nicknames); + } + // Include/exclude games. function changeGames(array $gameids_add, array $gameids_remove): void { @@ -266,7 +277,7 @@ class GroupMgr "owner" => $owner, "description" => $description, "editors" => [], - "members" => [], + "users" => [], "games" => [] ]; diff --git a/class/UserMgr.php b/class/UserMgr.php index 2886b38..402faf8 100644 --- a/class/UserMgr.php +++ b/class/UserMgr.php @@ -221,4 +221,10 @@ class UserMgr $qb = $this->db->createQueryBuilder(); return array_map(fn($c): string => $c["nickname"], $qb->select(["nickname"])->getQuery()->fetch()); } + + // Sanitize nicknames. Clear non-existent nicknames from the array. + function sanitizeNicknames(array $nicknames): array { + $a = $this->db->findBy(["nickname", "IN", $nicknames]); + return array_map(fn($a) => $a["nickname"], $a); + } } \ No newline at end of file diff --git a/common_func.php b/common_func.php index 0523946..5c5a463 100644 --- a/common_func.php +++ b/common_func.php @@ -1,7 +1,11 @@ - - + +
+ + + + + +
@@ -74,6 +80,16 @@ if (!get_autologin_state() || ($user_data["privilege"] !== PRIVILEGE_QUIZMASTER)
+
+
+
+
+
+ + +
+
+ diff --git a/interface.php b/interface.php index acc2031..e9c04da 100644 --- a/interface.php +++ b/interface.php @@ -322,10 +322,8 @@ $requester_nickname = $is_quizmaster ? "*" : $nickname; // "*" means every game function create_update_game(ReqHandler &$rh, array $params): array { - global $userMgr; global $user; global $nickname; - global $is_quizmaster; global $gameMgr; $update = $params[ReqHandler::ACTION_KEY] === "update_game"; @@ -340,20 +338,8 @@ function create_update_game(ReqHandler &$rh, array $params): array $description = $data["description"]; $contributors = explode_list($data["contributors"] ?? ""); $owner = $update ? trim($data["owner"] ?? $nickname) : $nickname; - $groups = explode_list($data["groups"] ?? ""); $properties = $data["properties"] ?? []; - // convert group compounds to group IDs - $groupids = get_groupids_by_compounds($groups); // convert group compounds to _ids - - // remove group ID's this user cannot edit -// $groupids_with_editor_access = []; -// foreach ($groupids as $groupid) { -// if (is_user_editor_to_group($groupid, $nickname) || $is_quizmaster) { -// $groupids_with_editor_access[] = $groupid; -// } -// } - // result $result = []; @@ -364,21 +350,6 @@ function create_update_game(ReqHandler &$rh, array $params): array $game = $gameMgr->getGame($gameid); // fetch game if (($game !== null) && $game->isUserContributorOrOwner($nickname) || $user->hasQuizmasterPrivilege()) { - // group management TODO: átkerül a csoportkezelőbe -// $old_groupids = $game_data["groups"]; // retain old groupids -// $new_groupids = $groupids; // get new groupids -// $groupids_add = array_diff($new_groupids, $old_groupids); // groups this user needs to be added to -// $groupids_remove = array_diff($old_groupids, $new_groupids); // groups this user need to be removed from -// foreach ($groupids_add as $groupid) { // execute insertion and removal -// change_group_game_assignments($groupid, $gameid, null); -// } -// foreach ($groupids_remove as $groupid) { -// change_group_game_assignments($groupid, null, $gameid); -// } - - // re-fetch game data -// $game_data = get_game($gameid); - // disable autostoring $game->disableAutoStoring(); @@ -644,31 +615,13 @@ function create_update_user(ReqHandler &$rh, array $params): string $realname = trim($params["realname"]); $privilege = trim($params["privilege"]); - // $groupids = get_groupids_by_compounds($groups); // convert group compounds to _ids FIXME!!! - $success = false; if (($target_nickname !== "")) { if ((!$update) && ($password !== "")) { // CREATE - $success = $userMgr->addUser($target_nickname, $password, $realname, $privilege); // FIXME!!! + $success = $userMgr->addUser($target_nickname, $password, $realname, $privilege); } else if ($update) { // UPDATE $tuser = $userMgr->getUser($target_nickname); // load user data if ($tuser !== null) { - - // group management FIXME!!! -// $old_groupids = $tuser->getGroups(); // retain old groupids -// $new_groupids = $groupids; // get new groupids -// $groupids_add = array_diff($new_groupids, $old_groupids); // groups this user needs to be added to -// $groupids_remove = array_diff($old_groupids, $new_groupids); // groups this user need to be removed from -// foreach ($groupids_add as $groupid) { // execute insertion and removal -// change_group_user_assignments($groupid, $target_nickname, null); -// } -// foreach ($groupids_remove as $groupid) { -// change_group_user_assignments($groupid, null, $target_nickname); -// } - - // re-fetch user - //$tuser = get_user($target_nickname); // load user data - // further field update $tuser->disableAutoStoring(); $tuser->setRealname($realname); @@ -727,6 +680,26 @@ function get_game_groups(ReqHandler &$rh, array $params): array { return $groups; } +function change_group_members(ReqHandler &$rh, array $params): string { + global $groupMgr; + global $user; + global $userMgr; + + $group = $groupMgr->getGroup($params["groupid"]); + if ($group !== null) { + if ($group->isUserContributor($user->getNickname())) { + $add = explode_list(trim($params["add"])); + $add = $userMgr->sanitizeNicknames($add); + $remove = explode_list(trim($params["remove"])); + $remove = $userMgr->sanitizeNicknames($remove); + $group->changeMembers($add, $remove); + return "OK"; + } + } + + return "FAIL"; +} + function import_users_from_csv(ReqHandler &$rh, array $params): string { if (!isset($_FILES["users_table"])) { @@ -740,6 +713,7 @@ $rh->add("update_group", ["groupname", "description", "owner", "editors", "id"], $rh->add("delete_groups", ["ids"], PRIVILEGE_QUIZMASTER, "delete_groups", RESP_PLAIN, "Delete group."); $rh->add("get_all_groups", [], PRIVILEGE_QUIZMASTER, "get_all_player_groups", RESP_JSON, "Get all player groups."); $rh->add("search_groups", ["needle"], PRIVILEGE_QUIZMASTER, "search_player_groups", RESP_JSON, "Serach and fetch player groups."); +$rh->add("change_group_members", ["groupid", "add", "remove"], PRIVILEGE_QUIZMASTER,"change_group_members", RESP_PLAIN, "Change group members."); $rh->add(["create_user", "update_user"], ["nickname", "password", "realname", "privilege"], PRIVILEGE_QUIZMASTER, "create_update_user", RESP_PLAIN, "Create or update user."); $rh->add("delete_users", ["users"], PRIVILEGE_QUIZMASTER, "delete_users", RESP_PLAIN, "Delete users."); diff --git a/js/groupmgr.js b/js/groupmgr.js index c489886..172de25 100644 --- a/js/groupmgr.js +++ b/js/groupmgr.js @@ -31,9 +31,13 @@ function list_all_groups() { }); } +let EDITED_GROUP = null; + function create_edit_group(group = null) { let update = group !== null; + EDITED_GROUP = group; + let groupnameF = document.getElementById("groupname"); let group_descriptionF = document.getElementById("group_description"); let submit_btn = document.getElementById("group_editor_submit_btn"); @@ -122,4 +126,42 @@ function print_group_name(group_data) { record += "#" + group_data["_id"]; } return record; +} + +let MEMBER_ACTION = ""; + +function open_member_change_window(action) { + MEMBER_ACTION = action; + let winCap = document.getElementById("member_manager_window_title"); + + // print window title + if (action === "add") { + winCap.innerText = "Tagok hozzáadása"; + } else if (action === "remove") { + winCap.innerText = "Tagok eltávolítása"; + } + + show("member_manager_window"); +} + +function change_group_members() { + let userListTA = document.getElementById("add_remove_member_area"); + + let req = { + action: "change_group_members", + groupid: EDITED_GROUP["_id"], + add: [], + remove: [] + }; + + if (MEMBER_ACTION === "add") { + req["add"] = userListTA.value; + } else if (MEMBER_ACTION === "remove") { + req["remove"] = userListTA.value; + } + + request(req).then(resp => { + userListTA.value = ""; + hide("member_manager_window"); + }); } \ No newline at end of file diff --git a/js/result_analyzer.js b/js/result_analyzer.js index b526cab..fec5b8c 100644 --- a/js/result_analyzer.js +++ b/js/result_analyzer.js @@ -204,11 +204,13 @@ function toggle_test_selection() { } function delete_tests() { - let req = { - action: "delete_tests", - ids: get_selected_ids().join(",") - }; - request(req).then(resp => { - fetch_results(); // refresh results - }); + if (confirm("Biztosan törölni kívánja a kijelölt eredményeket?")) { + let req = { + action: "delete_tests", + ids: get_selected_ids().join(",") + }; + request(req).then(resp => { + fetch_results(); // refresh results + }); + } } \ No newline at end of file