Skip to content

Commit adc94d7

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 56b2144 + 14a371d commit adc94d7

File tree

11 files changed

+44360
-19196
lines changed

11 files changed

+44360
-19196
lines changed

assets/vue/composables/sidebarMenu.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,31 @@ export function useSidebarMenu() {
257257
}
258258
}
259259

260+
{
261+
const roles = securityStore.user?.roles || []
262+
const isQuestionManager =
263+
securityStore.isAdmin ||
264+
roles.includes("ROLE_QUESTION_MANAGER")
265+
266+
if (isQuestionManager) {
267+
const questionAdminItems = [
268+
{
269+
label: t("Questions"),
270+
url: "/main/admin/questions.php",
271+
icon: "mdi mdi-comment-question-outline",
272+
class: "pl-4",
273+
},
274+
]
275+
276+
items.push({
277+
icon: "mdi mdi-comment-question-outline",
278+
label: t("Question manager"),
279+
items: questionAdminItems,
280+
expanded: isActive({ items: questionAdminItems }),
281+
})
282+
}
283+
}
284+
260285
if (showTabs.value.includes("session_admin") && (securityStore.isAdmin || securityStore.isSessionAdmin)) {
261286
const sessionAdminItems = [
262287
{

public/main/admin/questions.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@
1818

1919
$this_section = SECTION_PLATFORM_ADMIN;
2020

21-
api_protect_admin_script();
21+
$user = api_get_current_user();
22+
23+
if (!api_is_platform_admin() && (!$user || !$user->hasRole('ROLE_QUESTION_MANAGER'))) {
24+
api_not_allowed(true);
25+
return false;
26+
}
27+
28+
api_block_inactive_user();
2229

2330
Session::erase('objExercise');
2431
Session::erase('objQuestion');
@@ -376,9 +383,14 @@
376383
exit;
377384
}
378385

386+
$backUrl = Container::getRouter()->generate('admin');
387+
if ($user->hasRole('ROLE_QUESTION_MANAGER')) {
388+
$backUrl = Container::getRouter()->generate('index');
389+
}
390+
379391
$actionsLeft = Display::url(
380392
Display::return_icon('back.png', get_lang('Administration'), [], ICON_SIZE_MEDIUM),
381-
Container::getRouter()->generate('admin'),
393+
$backUrl,
382394
);
383395

384396
$exportUrl = '/main/admin/questions.php?'.http_build_query(['action' => 'export_pdf', ...$params]);

public/main/exercise/exercise_reminder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
if ($time_control) {
5252
// Get time left for expiring time
53-
$time_left = api_strtotime($clock_expired_time->format('Y-m-d H:i:s'), 'UTC') - time();
53+
$time_left = api_strtotime($clock_expired_time, 'UTC') - time();
5454
$htmlHeadXtra[] = $objExercise->showTimeControlJS($time_left);
5555
}
5656

public/main/exercise/exercise_submit.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,11 +431,11 @@
431431

432432
$clock_expired_time = api_get_utc_datetime($expected_time, false, true);
433433
if ($debug) {
434-
error_log('5.3. $expected_time '.$clock_expired_time);
434+
error_log('5.3. $expected_time '.$clock_expired_time->format('Y-m-d H:i:s'));
435435
}
436436

437437
//Sessions that contain the expired time
438-
$_SESSION['expired_time'][$current_expired_time_key] = $clock_expired_time;
438+
$_SESSION['expired_time'][$current_expired_time_key] = $clock_expired_time->format('Y-m-d H:i:s');
439439
if ($debug) {
440440
error_log(
441441
'5.4. Setting the $_SESSION[expired_time]: '.$_SESSION['expired_time'][$current_expired_time_key]

public/main/exercise/overview.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
$htmlHeadXtra[] = api_get_build_js('legacy_exercise.js');
7070
if ($time_control) {
7171
// Get time left for expiring time
72-
$time_left = api_strtotime($clock_expired_time->format('Y-m-d H:i:s'), 'UTC') - time();
72+
$time_left = api_strtotime($clock_expired_time, 'UTC') - time();
7373
/*$htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/epiclock/stylesheet/jquery.epiclock.css');
7474
$htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/epiclock/renderers/minute/epiclock.minute.css');
7575
$htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.dateformat.min.js');
@@ -145,7 +145,7 @@
145145
);
146146

147147
if ($time_control && !empty($exercise_stat_info['exe_id']) && !empty($clock_expired_time)) {
148-
$time_left_check = api_strtotime($clock_expired_time->format('Y-m-d H:i:s'), 'UTC') - time();
148+
$time_left_check = api_strtotime($clock_expired_time, 'UTC') - time();
149149
if ($time_left_check <= 0) {
150150
$result_url = api_get_path(WEB_CODE_PATH).'exercise/result.php?'
151151
. api_get_cidreq()

public/main/inc/lib/exercise.lib.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2030,8 +2030,12 @@ public static function get_session_time_control_key(
20302030
$lp_id,
20312031
$lp_item_id
20322032
);
2033-
if (isset($_SESSION['expired_time']) && isset($_SESSION['expired_time'][$time_control_key])) {
2034-
$return_value = $_SESSION['expired_time'][$time_control_key];
2033+
if (isset($_SESSION['expired_time']) && isset($_SESSION['expired_time'][$time_control_key])) {
2034+
if ($_SESSION['expired_time'][$time_control_key] instanceof DateTimeInterface) {
2035+
$return_value = $_SESSION['expired_time'][$time_control_key]->format('Y-m-d H:i:s');
2036+
} else {
2037+
$return_value = $_SESSION['expired_time'][$time_control_key];
2038+
}
20352039
}
20362040

20372041
return $return_value;
@@ -5602,12 +5606,12 @@ public static function getOralFeedbackAudio(int $attemptId, int $questionId): st
56025606
return '';
56035607
}
56045608

5605-
$html = '';
5606-
56075609
$assetRepo = Container::getAssetRepository();
5610+
$html = '';
56085611

5612+
// Keep only the latest audio feedback to avoid duplicated players
56095613
foreach ($qAttempt->getAttemptFeedbacks() as $attemptFeedback) {
5610-
$html .= Display::tag(
5614+
$html = Display::tag(
56115615
'audio',
56125616
'',
56135617
[

src/CoreBundle/Enums/ObjectIcon.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,7 @@ enum ObjectIcon: string
156156
case CATALOGUE = 'bookmark-multiple-outline';
157157

158158
case EVENT_REMINDER = 'alarm';
159+
// Question icon
160+
case QUESTION = 'comment-question-outline';
161+
159162
}

0 commit comments

Comments
 (0)