- automatic typecast to bool added
- searching by group's unique name added
This commit is contained in:
		
							parent
							
								
									5b2cc0b8f4
								
							
						
					
					
						commit
						0c44163bdf
					
				@ -20,6 +20,8 @@ class ExpressionBuilder
 | 
				
			|||||||
            } else { // is it a float?
 | 
					            } else { // is it a float?
 | 
				
			||||||
                return (double)$rval;
 | 
					                return (double)$rval;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (in_array(strtolower($rval), ["true", "false"]) ) { // it's a boolean
 | 
				
			||||||
 | 
					            return $rval === "true";
 | 
				
			||||||
        } else if (str_starts_with($rval, '"') && str_ends_with($rval, '"')){ // it's a string
 | 
					        } else if (str_starts_with($rval, '"') && str_ends_with($rval, '"')){ // it's a string
 | 
				
			||||||
            return substr($rval, 1, strlen($rval) - 2); // strip leading and trailing quotes
 | 
					            return substr($rval, 1, strlen($rval) - 2); // strip leading and trailing quotes
 | 
				
			||||||
        } else { // it must be a column name
 | 
					        } else { // it must be a column name
 | 
				
			||||||
 | 
				
			|||||||
@ -403,4 +403,17 @@ class GroupMgr
 | 
				
			|||||||
        $a = $qb->where(["games", "CONTAINS", (int)$gameid])->select(["_id"])->getQuery()->fetch();
 | 
					        $a = $qb->where(["games", "CONTAINS", (int)$gameid])->select(["_id"])->getQuery()->fetch();
 | 
				
			||||||
        return array_map(fn($r) => $r["_id"], $a);
 | 
					        return array_map(fn($r) => $r["_id"], $a);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get group by group compound (name#id).
 | 
				
			||||||
 | 
					    function getGroupByUniqueName(string $uniqueName): Group|null {
 | 
				
			||||||
 | 
					        $a = $this->db->findOneBy([ function($g) use ($uniqueName) : bool {
 | 
				
			||||||
 | 
					            $group = Group::fromArray($this, $g);
 | 
				
			||||||
 | 
					            return $group->getUniqueName() === $uniqueName;
 | 
				
			||||||
 | 
					        }]);
 | 
				
			||||||
 | 
					        if ($a !== null) {
 | 
				
			||||||
 | 
					            return Group::fromArray($this, $a);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -400,7 +400,7 @@ class TestMgr
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get test results by game ID.
 | 
					    // Get test results by game ID.
 | 
				
			||||||
    function getResultsByGameId(string $gameid, string $filter, string $orderby, bool $exclude_challenge_data): array
 | 
					    function getResultsByGameId(string $gameid, string $filter, string $orderby, bool $exclude_challenge_data, array ...$furtherFilters): array
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $qb = $this->db->createQueryBuilder();
 | 
					        $qb = $this->db->createQueryBuilder();
 | 
				
			||||||
        $qb = $qb->where(["gameid", "=", (int)$gameid]);
 | 
					        $qb = $qb->where(["gameid", "=", (int)$gameid]);
 | 
				
			||||||
@ -417,9 +417,19 @@ class TestMgr
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $criteria = ExpressionBuilder::buildQuery($filter);
 | 
					            $criteria = ExpressionBuilder::buildQuery($filter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $qb->where($criteria);
 | 
					            $qb->where($criteria);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // add further filters
 | 
				
			||||||
 | 
					        if (count($furtherFilters) > 0) {
 | 
				
			||||||
 | 
					            foreach ($furtherFilters as $ff) {
 | 
				
			||||||
 | 
					                if ($ff !== []) {
 | 
				
			||||||
 | 
					                    $qb->where($ff);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // ordering
 | 
					        // ordering
 | 
				
			||||||
        if (trim($orderby) !== "") {
 | 
					        if (trim($orderby) !== "") {
 | 
				
			||||||
            $ordering = ExpressionBuilder::buildOrdering($orderby);
 | 
					            $ordering = ExpressionBuilder::buildOrdering($orderby);
 | 
				
			||||||
 | 
				
			|||||||
@ -481,12 +481,35 @@ function get_results_by_gameid(ReqHandler &$rh, array $params): array
 | 
				
			|||||||
    $gameid = trim($params["gameid"]);
 | 
					    $gameid = trim($params["gameid"]);
 | 
				
			||||||
    $filter = trim($params["filter"] ?? "");
 | 
					    $filter = trim($params["filter"] ?? "");
 | 
				
			||||||
    $ordering = trim($params["orderby"] ?? "");
 | 
					    $ordering = trim($params["orderby"] ?? "");
 | 
				
			||||||
 | 
					    $groups = explode_list(trim($params["groups"] ?? ""));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $game = $gameMgr->getGame($gameid);
 | 
					    $game = $gameMgr->getGame($gameid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $result = [];
 | 
					    $result = [];
 | 
				
			||||||
    if (($game !== null) && ($game->isUserContributorOrOwner($user->getNickname()) || $user->hasQuizmasterPrivilege())) {
 | 
					    if (($game !== null) && ($game->isUserContributorOrOwner($user->getNickname()) || $user->hasQuizmasterPrivilege())) {
 | 
				
			||||||
        $game_results = $testMgr->getResultsByGameId($gameid, $filter, $ordering, true);
 | 
					        $group_filter = [];
 | 
				
			||||||
 | 
					        if ($groups !== []) {
 | 
				
			||||||
 | 
					            global $groupMgr;
 | 
				
			||||||
 | 
					            $n = 0;
 | 
				
			||||||
 | 
					            foreach ($groups as $groupname) {
 | 
				
			||||||
 | 
					                if ($n > 0) { // place OR between each group criterion
 | 
				
			||||||
 | 
					                    $group_filter[] = "OR";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                $group = $groupMgr->getGroupByUniqueName($groupname);
 | 
				
			||||||
 | 
					                if ($group !== null) {
 | 
				
			||||||
 | 
					                    $nicknames = $group->getMembers();
 | 
				
			||||||
 | 
					                    $group_filter[] = ["nickname", "IN", $nicknames];
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                $n++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // prepend filter criteria with AND
 | 
				
			||||||
 | 
					//            if (count($group_filter) > 0) {
 | 
				
			||||||
 | 
					//                $group_filter = ["AND", $group_filter];
 | 
				
			||||||
 | 
					//            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $game_results = $testMgr->getResultsByGameId($gameid, $filter, $ordering, true, $group_filter);
 | 
				
			||||||
        $result = $game_results;
 | 
					        $result = $game_results;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -35,6 +35,7 @@ function fetch_results() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let filterF = document.getElementById("filter");
 | 
					    let filterF = document.getElementById("filter");
 | 
				
			||||||
    let orderbyF = document.getElementById("orderby");
 | 
					    let orderbyF = document.getElementById("orderby");
 | 
				
			||||||
 | 
					    let groupsF = document.getElementById("groups");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let filter = autoconvert_datetime(filterF.value.trim());
 | 
					    let filter = autoconvert_datetime(filterF.value.trim());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -44,7 +45,8 @@ function fetch_results() {
 | 
				
			|||||||
        action: "get_results_by_gameid",
 | 
					        action: "get_results_by_gameid",
 | 
				
			||||||
        gameid: GAMEID,
 | 
					        gameid: GAMEID,
 | 
				
			||||||
        filter: filter.trim(),
 | 
					        filter: filter.trim(),
 | 
				
			||||||
        orderby: orderbyF.value.trim()
 | 
					        orderby: orderbyF.value.trim(),
 | 
				
			||||||
 | 
					        groups: groupsF.value.trim()
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    request(req).then(resp => {
 | 
					    request(req).then(resp => {
 | 
				
			||||||
 | 
				
			|||||||
@ -48,7 +48,8 @@ if (!$gameMgr->getGame($game_id)->isUserContributorOrOwner($user_data["nickname"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<section style="margin-bottom: 0.3em">
 | 
					<section style="margin-bottom: 0.3em">
 | 
				
			||||||
    <input type="text" placeholder="Szűrőfeltétel" id="filter" style="font-family: 'Monaco', monospace; width: 50em;">
 | 
					    <input type="text" placeholder="Szűrőfeltétel" id="filter" style="font-family: 'Monaco', monospace; width: 50em;">
 | 
				
			||||||
    <input type="text" placeholder="Rendezés" id="orderby" style="font-family: 'Monaco', monospace; width: 50em;">
 | 
					    <input type="text" placeholder="Csoportok" id="groups" style="font-family: 'Monaco', monospace; width: 30em;">
 | 
				
			||||||
 | 
					    <input type="text" placeholder="Rendezés" id="orderby" style="font-family: 'Monaco', monospace; width: 30em;">
 | 
				
			||||||
    <input type="button" value="Szűrés" onclick="fetch_results()">
 | 
					    <input type="button" value="Szűrés" onclick="fetch_results()">
 | 
				
			||||||
    <input type="button" value="Jelentés előállítása" onclick="generate_report()">
 | 
					    <input type="button" value="Jelentés előállítása" onclick="generate_report()">
 | 
				
			||||||
    <input type="button" value="Kijelöltek törlése" onclick="delete_tests()">
 | 
					    <input type="button" value="Kijelöltek törlése" onclick="delete_tests()">
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user