2023-05-17 21:19:14 +02:00
< ? php
2023-08-24 23:02:41 +02:00
// This file is part of the Studyplan plugin for Moodle
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <https://www.gnu.org/licenses/>.
/**
*
* @ package local_treestudyplan
* @ copyright 2023 P . M . Kuipers
* @ license https :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2023-05-17 21:19:14 +02:00
require_once ( " ../../config.php " );
require_once ( $CFG -> libdir . '/weblib.php' );
use \local_treestudyplan\courseservice ;
$systemcontext = context_system :: instance ();
2023-08-24 23:02:41 +02:00
$PAGE -> set_url ( " /local/treestudyplan/edit-plan.php " , array ());
2023-05-17 21:19:14 +02:00
require_login ();
2023-08-24 23:02:41 +02:00
// Figure out the context (category or system, based on either category or context parameter).
$categoryid = optional_param ( 'categoryid' , 0 , PARAM_INT ); // Category id.
$contextid = optional_param ( 'contextid' , 0 , PARAM_INT ); // Context id.
if ( $categoryid > 0 ) {
2023-05-17 21:19:14 +02:00
$studyplancontext = context_coursecat :: instance ( $categoryid );
2023-08-24 23:09:20 +02:00
} else if ( $contextid > 0 ) {
2023-05-17 21:19:14 +02:00
$studyplancontext = context :: instance_by_id ( $contextid );
2023-08-24 23:02:41 +02:00
if ( in_array ( $studyplancontext -> contextlevel , [ CONTEXT_SYSTEM , CONTEXT_COURSECAT ]))
2023-05-17 21:19:14 +02:00
{
$categoryid = $studyplancontext -> instanceid ;
}
2023-08-24 23:02:41 +02:00
else
2023-05-17 21:19:14 +02:00
{
$studyplancontext = $systemcontext ;
}
2023-08-25 09:33:42 +02:00
} else {
2023-08-24 23:02:41 +02:00
// If no context is selected, find the first available one.
2023-08-25 09:33:42 +02:00
$availablecontexts = courseservice :: list_accessible_categories_with_usage ( " edit " );
2023-08-24 23:02:41 +02:00
$contextid = 1 ; // fallback to system context.
2023-08-25 09:33:42 +02:00
foreach ( $availablecontexts as $ctx ) {
2023-08-24 23:02:41 +02:00
if ( $ctx -> count > 0 ) {
2023-08-17 23:29:32 +02:00
$contextid = $ctx -> ctxid ;
break ;
}
}
2023-08-24 23:02:41 +02:00
// reload page with selected category.
$url = new \moodle_url ( '/local/treestudyplan/edit-plan.php' , [ " contextid " => $contextid ]);
2023-08-17 23:29:32 +02:00
header ( 'Location: ' . $url -> out ( false ), true , 302 );
exit ;
2023-05-17 21:19:14 +02:00
}
2023-08-24 23:02:41 +02:00
require_capability ( 'local/treestudyplan:editstudyplan' , $studyplancontext );
$contextname = $studyplancontext -> get_context_name ( false , false );
2023-05-17 21:19:14 +02:00
$PAGE -> set_pagelayout ( 'coursecategory' );
$PAGE -> set_context ( $studyplancontext );
2023-08-24 23:02:41 +02:00
$PAGE -> set_title ( get_string ( 'cfg_plans' , 'local_treestudyplan' ) . " - " . $contextname );
2023-05-17 21:19:14 +02:00
$PAGE -> set_heading ( $contextname );
2023-08-24 23:02:41 +02:00
if ( $studyplancontext -> id > 1 ) {
2023-05-17 21:19:14 +02:00
navigation_node :: override_active_url ( new moodle_url ( '/course/index.php' , [ 'categoryid' => $categoryid ]));
2023-08-24 23:02:41 +02:00
$PAGE -> navbar -> add ( get_string ( 'cfg_plans' , 'local_treestudyplan' ));
2023-05-17 21:19:14 +02:00
}
2023-08-24 23:02:41 +02:00
// Load javascripts and specific css.
2023-08-19 17:54:40 +02:00
$PAGE -> requires -> css ( new moodle_url ( $CFG -> wwwroot . '/local/treestudyplan/css/bootstrap-vue/bootstrap-vue.css' ));
2023-05-17 21:19:14 +02:00
$PAGE -> requires -> css ( new moodle_url ( $CFG -> wwwroot . '/local/treestudyplan/css/devstyles.css' ));
2023-08-24 23:02:41 +02:00
$PAGE -> requires -> js_call_amd ( 'local_treestudyplan/page-edit-plan' , 'init' , [ $studyplancontext -> id , $categoryid ]);
2023-05-17 21:19:14 +02:00
$catlist = courseservice :: list_accessible_categories_with_usage ( " edit " );
2023-08-24 23:02:41 +02:00
//Local translate function.
function t ( $str , $param = null , $plugin = 'local_treestudyplan' ) {
print get_string ( $str , $plugin , $param );
2023-05-17 21:19:14 +02:00
}
print $OUTPUT -> header ();
?>
< div id = 'root' >
< div class = 'vue-loader' v - show = 'false' >
< div class = " spinner-border text-primary " role = " status " >
< span class = " sr-only " > Loading ...</ span >
</ div >
</ div >
< div v - cloak >
2023-08-24 23:02:41 +02:00
< div v - if = '!activestudyplan && usedcontexts' class = 'ml-3 mb-3' >
2023-05-17 21:19:14 +02:00
< b - form - select text = '<?php print($contextname);?>' : value = " contextid " >
< b - form - select - option v - for = 'ctx in usedcontexts' : key = 'ctx.id' : value = " ctx.context_id " @ click = 'switchContext(ctx)'
: active = " ctx.context_id == contextid " : class = " (ctx.studyplancount > 0)?'font-weight-bold':'' "
2023-08-24 23:02:41 +02:00
>< span v - for = " (p, i) in ctx.category.path " >< span v - if = " i>0 " > / </ span > {{ p }} </ span > < span > ({{ ctx . studyplancount }}) </ b - form - select - option >
2023-05-17 21:19:14 +02:00
</ b - form - select >
</ div >
< h3 v - else >< ? php print $contextname ; ?> </h3>
< div class = " m-buttonbar " style = " margin-bottom: 1em; " >
< a href = '#' v - if = 'activestudyplan' @ click . prevent = 'closeStudyplan' >< i style = 'font-size: 150%;' class = 'fa fa-chevron-left' ></ i > < ? php t ( 'back' ); ?> </a>
< span v - if = 'activestudyplan' >< ? php t ( " studyplan_select " ); ?> </span>
2023-08-23 23:14:50 +02:00
< b - form - select v - if = 'activestudyplan' lazy : text = 'dropdown_title' v - model = 'activestudyplan.id' >
2023-08-24 23:02:41 +02:00
< b - form - select - option v - for = '(studyplan, planindex) in studyplans' : value = " studyplan.id " : key = 'studyplan.id' @ click = 'selectStudyplan(studyplan)' > {{ studyplan . name }} </ b - form - select - option >
2023-08-22 16:47:37 +02:00
</ b - form - select >& nbsp ;
2023-05-17 21:19:14 +02:00
< t - studyplan - edit
@ creating = " "
@ created = " onStudyPlanCreated "
2023-08-23 23:14:50 +02:00
v - if = '!activestudyplan && !loadingstudyplan'
2023-05-17 21:19:14 +02:00
mode = " create "
v - model = " create.studyplan "
type = " button "
variant = " primary "
2023-08-07 17:03:49 +02:00
: contextid = 'contextid'
2023-05-17 21:19:14 +02:00
>< i class = 'fa fa-plus' ></ i > < ? php t ( " studyplan_add " ); ?> </t-studyplan-edit>
2023-08-23 23:14:50 +02:00
< b - button v - if = '!activestudyplan && !loadingstudyplan' variant = 'danger' href = '#' role = 'presentation' @ click = " import_studyplan " >< i class = 'fa fa-upload' ></ i > < ? php t ( " advanced_import_from_file " ); ?> </b-button>
2023-05-17 21:19:14 +02:00
< b - button v - if = 'activestudyplan' variant = 'primary' v - b - toggle . toolbox - sidebar >< ? php t ( 'opentoolbox' ) ?> </b-button>
</ div >
< div class = 't-studyplan-container' >
< t - studyplan v - if = 'activestudyplan' v - model = 'activestudyplan' @ moved = " movedStudyplan " ></ t - studyplan >
< div v - else - if = 'loadingstudyplan' class = " spinner-border text-primary " role = " status " >
< span class = " sr-only " > Loading ...</ span >
</ div >
< div v - else class = 't-studyplan-notselected' >
< p >< ? php t ( " studyplan_noneselected " ); ?> </p>
< b - card - group deck >
2023-08-24 23:02:41 +02:00
< s - studyplan - card
v - for = '(studyplan, planindex) in studyplans'
: key = 'studyplan.id'
2023-05-17 21:19:14 +02:00
v - model = 'studyplans[planindex]'
open
@ open = 'selectStudyplan(studyplan)'
>
< template #title>
< span class = 's-studyplan-card-title-buttons' >
< a href = '#' @ click . prevent = " export_plan(studyplan) " >< i class = 'fa fa-download' ></ i ></ a >
2023-08-17 23:29:32 +02:00
< t - studyplan - edit v - model = " studyplans[planindex] " @ moved = " movedStudyplan " ></ t - studyplan - edit >
2023-05-17 21:19:14 +02:00
< t - studyplan - associate v - model = " studyplans[planindex] " ></ t - studyplan - associate >
</ span >
</ template >
</ s - studyplan - card >
</ b - card - group >
</ div >
</ div >
< b - sidebar
id = " toolbox-sidebar "
: right = 'toolbox.right'
shadow
title = '<?php t("toolbox")?>'
>
< div class = 't-toolbox-preface' >
< b - form - checkbox v - model = " toolbox.right " switch >< ? php t ( " toolbar-right " ); ?> </b-form-checkbox>
</ div >
2023-08-24 23:02:41 +02:00
< b - tabs content - class = 'mt-3' >
2023-05-17 21:19:14 +02:00
< b - tab title = " <?php t('courses')?> " >
< t - coursecat - list v - model = " courses " ></ t - coursecat - list >
</ b - tab >
< b - tab title = " <?php t('toolbox')?> " >
< ul class = " t-toolbox " >
< li >< drag
2023-08-04 11:54:16 +02:00
: type = " filterComponentType "
2023-05-17 21:19:14 +02:00
: data = " { type: 'junction'} "
@ cut = " "
>< t - item - junction ></ t - item - junction >< ? php t ( " tool-junction " ) ?>
< template v - slot : drag - image = " { data} " >< t - item - junction ></ t - item - junction ></ template >
</ drag ></ li >
< li >< drag
2023-08-04 11:54:16 +02:00
: type = " filterComponentType "
2023-05-17 21:19:14 +02:00
: data = " { type: 'finish'} "
@ cut = " "
>< t - item - finish ></ t - item - finish >< ? php t ( " tool-finish " ) ?>
< template v - slot : drag - image = " { data} " >< t - item - finish ></ t - item - finish ></ template >
</ drag ></ li >
< li >< drag
2023-08-04 11:54:16 +02:00
: type = " filterComponentType "
2023-05-17 21:19:14 +02:00
: data = " { type: 'start'} "
@ cut = " "
>< t - item - start ></ t - item - start >< ? php t ( " tool-start " ) ?>
< template v - slot : drag - image = " { data} " >< t - item - start ></ t - item - start ></ template >
</ drag ></ li >
</ ul >
</ b - tab >
< b - tab title = " <?php t('badges')?> " >
< ul class = " t-badges " >
< li v - for = " b in badges " >< img : src = " b.imageurl " : alt = " b.name " >< drag
class = " t-badge-drag "
2023-08-04 11:54:16 +02:00
: type = " filterComponentType "
2023-05-17 21:19:14 +02:00
: data = " { type: 'badge', badge: b} "
@ cut = " "
> {{ b . name }}
< template v - slot : drag - image = " { data} " >< img : src = " b.imageurl " : alt = " b.name " ></ template >
</ drag ></ li >
</ ul >
</ b - tab >
</ b - tabs >
</ b - sidebar >
</ div >
</ div >
< ? php
print $OUTPUT -> footer ();