- Game to group assignments management added
- Printing of group and game IDs added - some bugfixes
This commit is contained in:
parent
f3ae982c9c
commit
139c3aa38d
@ -430,5 +430,34 @@ class GameMgr
|
|||||||
return $games;
|
return $games;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sanitize games and return game IDs.
|
||||||
|
function sanitizeGames(array $games) : array {
|
||||||
|
$sanitized = [];
|
||||||
|
foreach ($games as $game) {
|
||||||
|
// explode game identifier
|
||||||
|
[$name, $id] = explode("#", $game);
|
||||||
|
|
||||||
|
// fetch game
|
||||||
|
if ($id !== null) {
|
||||||
|
$records = $this->db->findBy([["name", "=", $name], "AND", ["_id", "=", (int)$id]]);
|
||||||
|
} else {
|
||||||
|
$records = $this->db->findBy(["name", "=", $name]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// put game ID into sanitized list only if identifier is not ambiguous
|
||||||
|
if (count($records) === 1) {
|
||||||
|
$sanitized[] = $records[0]["_id"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sanitized;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve group IDs to full group identifiers.
|
||||||
|
function resolveGames(array &$gameIds): void {
|
||||||
|
$a = $this->db->findBy([["_id", "IN", $gameIds]]); // no caching here...
|
||||||
|
$gameIds = array_map(fn($r) => $r["name"] . "#" . $r["_id"] ,$a);
|
||||||
|
}
|
||||||
|
|
||||||
// -------
|
// -------
|
||||||
}
|
}
|
||||||
|
@ -192,7 +192,7 @@ class Group extends AutoStoring
|
|||||||
alter_array_contents($this->games, $gameid, null);
|
alter_array_contents($this->games, $gameid, null);
|
||||||
}
|
}
|
||||||
foreach ($gameids_remove as $gameid) { // remove games
|
foreach ($gameids_remove as $gameid) { // remove games
|
||||||
alter_array_contents($this->members, null, $gameid);
|
alter_array_contents($this->games, null, $gameid);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->storeMods(); // store changes
|
$this->storeMods(); // store changes
|
||||||
|
@ -67,13 +67,23 @@ if (!get_autologin_state() || ($user_data["privilege"] !== PRIVILEGE_QUIZMASTER)
|
|||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<label for="group_members">Tagok:</label><br>
|
<label for="group_members">Tagok:</label><br>
|
||||||
<input type="button" value="+" onclick="open_member_change_window('add')">
|
<input type="button" value="+" onclick="open_element_change_window('add', 'member')">
|
||||||
<input type="button" value="-" onclick="open_member_change_window('remove')">
|
<input type="button" value="-" onclick="open_element_change_window('remove', 'member')">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<textarea id="group_members" readonly></textarea>
|
<textarea id="group_members" readonly></textarea>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="group_games">Játékok:</label><br>
|
||||||
|
<input type="button" value="+" onclick="open_element_change_window('add', 'game')">
|
||||||
|
<input type="button" value="-" onclick="open_element_change_window('remove', 'game')">
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<textarea id="group_games" readonly></textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<section style="display: block; text-align: right">
|
<section style="display: block; text-align: right">
|
||||||
<input type="button" value="" id="group_editor_submit_btn">
|
<input type="button" value="" id="group_editor_submit_btn">
|
||||||
@ -82,13 +92,13 @@ if (!get_autologin_state() || ($user_data["privilege"] !== PRIVILEGE_QUIZMASTER)
|
|||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="window" shown="false" id="member_manager_window">
|
<section class="window" shown="false" id="element_manager_window">
|
||||||
<section class="window-inner">
|
<section class="window-inner">
|
||||||
<section id="member_manager_window_title">
|
<section id="element_manager_window_title">
|
||||||
</section>
|
</section>
|
||||||
<textarea id="add_remove_member_area"></textarea><br>
|
<textarea id="add_remove_element_area"></textarea><br>
|
||||||
<input type="button" value="OK" onclick="change_group_members()">
|
<input type="button" value="OK" onclick="change_group_elements()">
|
||||||
<input type="button" value="Mégse" onclick="hide('member_manager_window')">
|
<input type="button" value="Mégse" onclick="hide('element_manager_window')">
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
@ -721,10 +721,14 @@ function delete_groups(ReqHandler &$rh, array $params): string
|
|||||||
function get_all_groups(ReqHandler &$rh, array $params): array
|
function get_all_groups(ReqHandler &$rh, array $params): array
|
||||||
{
|
{
|
||||||
global $groupMgr;
|
global $groupMgr;
|
||||||
|
global $gameMgr;
|
||||||
|
|
||||||
$groups = $groupMgr->getAllGroups();
|
$groups = $groupMgr->getAllGroups();
|
||||||
$a = [];
|
$a = [];
|
||||||
foreach ($groups as $g) {
|
foreach ($groups as $g) {
|
||||||
$a[] = $g->toArray();
|
$r = $g->toArray();
|
||||||
|
$gameMgr->resolveGames($r["games"]);
|
||||||
|
$a[] = $r;
|
||||||
}
|
}
|
||||||
return $a;
|
return $a;
|
||||||
}
|
}
|
||||||
@ -825,7 +829,7 @@ function change_group_members(ReqHandler &$rh, array $params): string
|
|||||||
|
|
||||||
$group = $groupMgr->getGroup($params["groupid"]);
|
$group = $groupMgr->getGroup($params["groupid"]);
|
||||||
if ($group !== null) {
|
if ($group !== null) {
|
||||||
if ($group->isUserContributor($user->getNickname())) {
|
if ($group->isUserContributor($user->getNickname()) || $user->hasQuizmasterPrivilege()) {
|
||||||
$add = explode_list(trim($params["add"]));
|
$add = explode_list(trim($params["add"]));
|
||||||
$add = $userMgr->sanitizeNicknames($add);
|
$add = $userMgr->sanitizeNicknames($add);
|
||||||
$remove = explode_list(trim($params["remove"]));
|
$remove = explode_list(trim($params["remove"]));
|
||||||
@ -838,6 +842,27 @@ function change_group_members(ReqHandler &$rh, array $params): string
|
|||||||
return "FAIL";
|
return "FAIL";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function change_group_games(ReqHandler &$rh, array $params): string
|
||||||
|
{
|
||||||
|
global $groupMgr;
|
||||||
|
global $user;
|
||||||
|
global $gameMgr;
|
||||||
|
|
||||||
|
$group = $groupMgr->getGroup($params["groupid"]);
|
||||||
|
if ($group !== null) {
|
||||||
|
if ($group->isUserContributor($user->getNickname()) || $user->hasQuizmasterPrivilege()) {
|
||||||
|
$add = explode_list(trim($params["add"]));
|
||||||
|
$add = $gameMgr->sanitizeGames($add);
|
||||||
|
$remove = explode_list(trim($params["remove"]));
|
||||||
|
$remove = $gameMgr->sanitizeGames($remove);
|
||||||
|
$group->changeGames($add, $remove);
|
||||||
|
return "OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "FAIL";
|
||||||
|
}
|
||||||
|
|
||||||
function import_users_from_csv(ReqHandler &$rh, array $params): string
|
function import_users_from_csv(ReqHandler &$rh, array $params): string
|
||||||
{
|
{
|
||||||
if (!isset($_FILES["users_table"])) {
|
if (!isset($_FILES["users_table"])) {
|
||||||
@ -852,6 +877,7 @@ $rh->add("delete_groups", ["ids"], PRIVILEGE_QUIZMASTER, "delete_groups", RESP_P
|
|||||||
$rh->add("get_all_groups", [], PRIVILEGE_QUIZMASTER, "get_all_groups", RESP_JSON, "Get all player groups.");
|
$rh->add("get_all_groups", [], PRIVILEGE_QUIZMASTER, "get_all_groups", RESP_JSON, "Get all player groups.");
|
||||||
$rh->add("search_groups", ["needle"], PRIVILEGE_QUIZMASTER, "search_groups", RESP_JSON, "Serach and fetch player groups.");
|
$rh->add("search_groups", ["needle"], PRIVILEGE_QUIZMASTER, "search_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("change_group_members", ["groupid", "add", "remove"], PRIVILEGE_QUIZMASTER, "change_group_members", RESP_PLAIN, "Change group members.");
|
||||||
|
$rh->add("change_group_games", ["groupid", "add", "remove"], PRIVILEGE_QUIZMASTER, "change_group_games", RESP_PLAIN, "Change group games.");
|
||||||
|
|
||||||
$rh->add(["create_user", "update_user"], ["nickname", "password", "realname", "privilege"], PRIVILEGE_QUIZMASTER, "create_update_user", RESP_PLAIN, "Create or update user.");
|
$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.");
|
$rh->add("delete_users", ["users"], PRIVILEGE_QUIZMASTER, "delete_users", RESP_PLAIN, "Delete users.");
|
||||||
|
@ -26,7 +26,7 @@ function list_all_games() {
|
|||||||
let tdChkBox = document.createElement("td");
|
let tdChkBox = document.createElement("td");
|
||||||
tdChkBox.appendChild(chkbox);
|
tdChkBox.appendChild(chkbox);
|
||||||
tdChkBox.classList.add("checkbox");
|
tdChkBox.classList.add("checkbox");
|
||||||
let tdGameName = create_table_cell(g["name"]);
|
let tdGameName = create_table_cell(g["name"] + "<span style='color:gray'>#" + g["_id"] + "</span>");
|
||||||
let tdGameDescription = create_table_cell(g["description"]);
|
let tdGameDescription = create_table_cell(g["description"]);
|
||||||
let tdOwner = create_table_cell(g["owner"]);
|
let tdOwner = create_table_cell(g["owner"]);
|
||||||
row.append(tdChkBox, tdGameName, tdGameDescription, tdOwner);
|
row.append(tdChkBox, tdGameName, tdGameDescription, tdOwner);
|
||||||
|
@ -44,6 +44,7 @@ function create_edit_group(group = null) {
|
|||||||
let group_ownerF = document.getElementById("group_owner");
|
let group_ownerF = document.getElementById("group_owner");
|
||||||
let group_editorsF = document.getElementById("group_editors");
|
let group_editorsF = document.getElementById("group_editors");
|
||||||
let group_membersF = document.getElementById("group_members");
|
let group_membersF = document.getElementById("group_members");
|
||||||
|
let group_gamesF = document.getElementById("group_games");
|
||||||
|
|
||||||
if (!update) { // create a new group
|
if (!update) { // create a new group
|
||||||
groupnameF.value = "";
|
groupnameF.value = "";
|
||||||
@ -53,6 +54,7 @@ function create_edit_group(group = null) {
|
|||||||
group_ownerF.readOnly = true;
|
group_ownerF.readOnly = true;
|
||||||
group_editorsF.value = "";
|
group_editorsF.value = "";
|
||||||
group_membersF.value = "";
|
group_membersF.value = "";
|
||||||
|
group_gamesF.value = "";
|
||||||
hide("group_editor_additional_fields");
|
hide("group_editor_additional_fields");
|
||||||
} else { // update and existing one
|
} else { // update and existing one
|
||||||
groupnameF.value = group["groupname"];
|
groupnameF.value = group["groupname"];
|
||||||
@ -62,6 +64,7 @@ function create_edit_group(group = null) {
|
|||||||
group_ownerF.readOnly = false;
|
group_ownerF.readOnly = false;
|
||||||
group_editorsF.value = group["editors"].join(", ");
|
group_editorsF.value = group["editors"].join(", ");
|
||||||
group_membersF.value = group["users"].join(", ");
|
group_membersF.value = group["users"].join(", ");
|
||||||
|
group_gamesF.value = group["games"].join(", ");
|
||||||
show("group_editor_additional_fields");
|
show("group_editor_additional_fields");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,47 +126,48 @@ function delete_groups() {
|
|||||||
|
|
||||||
function print_group_name(group_data) {
|
function print_group_name(group_data) {
|
||||||
let record = group_data["groupname"];
|
let record = group_data["groupname"];
|
||||||
if (!group_data["unique"]) {
|
let seqNumStyle = (group_data["unique"]) ? "style='color:lightgray'" : "";
|
||||||
record += "#" + group_data["_id"];
|
record += `<span ${seqNumStyle}>#` + group_data["_id"] + `</span>`;
|
||||||
}
|
|
||||||
return record;
|
return record;
|
||||||
}
|
}
|
||||||
|
|
||||||
let MEMBER_ACTION = "";
|
let ACTION = "";
|
||||||
|
let TYPE = ""
|
||||||
|
|
||||||
function open_member_change_window(action) {
|
function open_element_change_window(action, type) {
|
||||||
MEMBER_ACTION = action;
|
ACTION = action;
|
||||||
let winCap = document.getElementById("member_manager_window_title");
|
TYPE = type;
|
||||||
|
|
||||||
|
let winCap = document.getElementById("element_manager_window_title");
|
||||||
|
|
||||||
|
let typeStr = (type === "member") ? "Tagok" : "Játékok";
|
||||||
|
let opStr = (action === "add") ? "hozzáadása" : "eltávolítása";
|
||||||
|
|
||||||
// print window title
|
// print window title
|
||||||
if (action === "add") {
|
winCap.innerText = typeStr + " " + opStr;
|
||||||
winCap.innerText = "Tagok hozzáadása";
|
|
||||||
} else if (action === "remove") {
|
|
||||||
winCap.innerText = "Tagok eltávolítása";
|
|
||||||
}
|
|
||||||
|
|
||||||
show("member_manager_window");
|
show("element_manager_window");
|
||||||
}
|
}
|
||||||
|
|
||||||
function change_group_members() {
|
function change_group_elements() {
|
||||||
let userListTA = document.getElementById("add_remove_member_area");
|
let elementListTA = document.getElementById("add_remove_element_area");
|
||||||
|
|
||||||
let req = {
|
let req = {
|
||||||
action: "change_group_members",
|
action: `change_group_${TYPE}s`,
|
||||||
groupid: EDITED_GROUP["_id"],
|
groupid: EDITED_GROUP["_id"],
|
||||||
add: [],
|
add: [],
|
||||||
remove: []
|
remove: []
|
||||||
};
|
};
|
||||||
|
|
||||||
if (MEMBER_ACTION === "add") {
|
if (ACTION === "add") {
|
||||||
req["add"] = userListTA.value;
|
req["add"] = elementListTA.value;
|
||||||
} else if (MEMBER_ACTION === "remove") {
|
} else if (ACTION === "remove") {
|
||||||
req["remove"] = userListTA.value;
|
req["remove"] = elementListTA.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
request(req).then(resp => {
|
request(req).then(resp => {
|
||||||
userListTA.value = "";
|
elementListTA.value = "";
|
||||||
hide("member_manager_window");
|
hide("element_manager_window");
|
||||||
hide("group_editor_window");
|
hide("group_editor_window");
|
||||||
list_all_groups();
|
list_all_groups();
|
||||||
});
|
});
|
||||||
|
@ -134,7 +134,7 @@
|
|||||||
|
|
||||||
% An environment to create a quiz containing questions. The parameter is either the title of the quiz, or the name of the course
|
% An environment to create a quiz containing questions. The parameter is either the title of the quiz, or the name of the course
|
||||||
\newenvironment{quiz}[2]{
|
\newenvironment{quiz}[2]{
|
||||||
% Create highlighted group title
|
% Create highlighted group title
|
||||||
\begin{mdframed}[backgroundcolor=colsbg]
|
\begin{mdframed}[backgroundcolor=colsbg]
|
||||||
{
|
{
|
||||||
\color{colsfg}
|
\color{colsfg}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user