Reworked sidebar

This commit is contained in:
PMKuipers 2024-04-21 23:08:03 +02:00
parent 886a11d99e
commit 12efb061f1
25 changed files with 487 additions and 39 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

3
amd/build/util/psidebar-vue.min.js vendored Normal file
View File

@ -0,0 +1,3 @@
define("local_treestudyplan/util/psidebar-vue",["exports","./css-calc"],(function(_exports,_cssCalc){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;var _default={install(Vue){Vue.component("p-sidebar",{props:{value:{type:Boolean,default:!0},right:{type:Boolean,default:!1},shadow:{type:Boolean,default:!1},target:{type:String,default:"body"},offsetRef:{type:String,default:""}},data:()=>({wrapper:null,contentwrapper:null,resizeobserver:null}),computed:{},methods:{initWrappers(target){this.wrapper=document.querySelector("#p-sidebar-wrapper"),this.wrapper||(this.wrapper=document.createElement("div"),this.wrapper.setAttribute("id","p-sidebar-wrapper")),this.contentwrapper=document.querySelector("#p-sidebar-contentwrapper"),this.contentwrapper||(this.contentwrapper=document.createElement("div"),this.contentwrapper.setAttribute("id","p-sidebar-contentwrapper"),this.wrapper.appendChild(this.contentwrapper));let targetEl=document.querySelector(target);for(console.info(`Targeting '${target}' to `,targetEl),targetEl&&"HTML"!=targetEl.nodeType||(targetEl=document.querySelector("body"));targetEl.childNodes.length>0;)this.contentwrapper.appendChild(targetEl.childNodes[0]);targetEl.appendChild(this.wrapper)},rePosition(right){const el=this.$refs.container;right?this.wrapper.insertBefore(el,this.contentwrapper.nextSibling):this.wrapper.insertBefore(el,this.contentwrapper)},setOffset(reference){const ref=reference?document.querySelector(reference):null;console.info(`Setting offset from '${reference}'`,ref);let offsetTop=ref?ref.offsetTop:0;offsetTop+=0!=offsetTop?"px":"";const el=this.$refs.container;el.style.height=`calc( 100vh - ${offsetTop})`,el.style.marginTop=offsetTop}},watch:{right(newVal){this.rePosition(newVal)},offsetRef(reference){this.setOffset(reference)}},mounted(){const el=this.$refs.container;this.initWrappers(this.target),this.setOffset(this.offsetRef),this.rePosition(this.right,this.besides),this.resizeObserver=new ResizeObserver((()=>{let wx=0-el.getBoundingClientRect().width;wx+=0!=wx?"px":"",el.style.setProperty("--p-sidebar-hideoffset",wx)})),this.resizeObserver.observe(el)},unmounted(){this.resizeObserver&&this.resizeObserver.disconnect()},template:"\n <div>\n <div ref='container' \n :class=\"'p-sidebar ' + (right?'p-sidebar-right ':'') + (shadow?'p-sidebar-shadow ':'') + (value?'shown ':'hidden ')\"\n ><slot></slot></div>\n </div>\n "})}};return _exports.default=_default,_exports.default}));
//# sourceMappingURL=psidebar-vue.min.js.map

File diff suppressed because one or more lines are too long

3
amd/build/util/settings.min.js vendored Normal file
View File

@ -0,0 +1,3 @@
define("local_treestudyplan/util/settings",["exports","core/ajax","core/notification"],(function(_exports,_ajax,_notification){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.settings=function(key){const settings=loadsettings();return key in settings?settings[key]:null},_notification=(obj=_notification)&&obj.__esModule?obj:{default:obj};let settingcache=null;function loadsettings(){return settingcache||(0,_ajax.call)([{methodname:"local_treestudyplan_getsettings",args:{}}])[0].then((function(response){settingcache=response})).catch(_notification.default.exception),settingcache}loadsettings()}));
//# sourceMappingURL=settings.min.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"settings.min.js","sources":["../../src/util/settings.js"],"sourcesContent":["/*eslint no-var: \"error\" */\n/*eslint-env es6*/\n\nimport {call} from 'core/ajax';\nimport notification from 'core/notification';\n\n// Prepare default value.\nlet settingcache = null;\n\n/**\n * Check if premium status is enabled.\n * @param {String} key\n * @returns {}\n */\nexport function settings ( key ){\n const settings = loadsettings();\n if ( key in settings ) {\n return settings[key];\n } else {\n return null;\n }\n}\n\n/**\n * Get settings from server or cache\n * @returns {Object} The settings object\n */\nfunction loadsettings() {\n if (!settingcache) {\n // Retrieve setting cache if needed.\n call([{\n methodname: 'local_treestudyplan_getsettings',\n args: {}\n }])[0].then(function(response){\n settingcache = response;\n }).catch(notification.exception);\n }\n return settingcache;\n}\n\n// Preload premium status.\nloadsettings();"],"names":["key","settings","loadsettings","settingcache","methodname","args","then","response","catch","notification","exception"],"mappings":"0NAc2BA,WACjBC,SAAWC,sBACZF,OAAOC,SACDA,SAASD,KAET,8EAZXG,aAAe,cAoBVD,sBACAC,6BAEI,CAAC,CACFC,WAAY,kCACZC,KAAM,MACN,GAAGC,MAAK,SAASC,UACjBJ,aAAeI,YAChBC,MAAMC,sBAAaC,WAEnBP,aAIXD"}

View File

@ -18,10 +18,11 @@ import Config from 'core/config';
import {download,upload} from './downloader'; import {download,upload} from './downloader';
import {ProcessStudyplan, ProcessStudyplanPage} from './studyplan-processor'; import {ProcessStudyplan, ProcessStudyplanPage} from './studyplan-processor';
/*import {eventTypes as editSwEventTypes} from 'core/edit_switch';*/ /*import {eventTypes as editSwEventTypes} from 'core/edit_switch';*/
import { premiumenabled, premiumstatus } from "./util/premium"; import { premiumenabled } from "./util/premium";
import { settings } from "./util/settings";
import TSComponents from './treestudyplan-components'; import TSComponents from './treestudyplan-components';
import mFormComponents from "./util/mform-helper"; import mFormComponents from "./util/mform-helper";
import pSideBarComponents from "./util/psidebar-vue";
import {Drag, Drop, DropList} from './vue-easy-dnd/vue-easy-dnd.esm'; import {Drag, Drop, DropList} from './vue-easy-dnd/vue-easy-dnd.esm';
@ -49,6 +50,7 @@ export default {
Vue.component('drop-list',DropList); Vue.component('drop-list',DropList);
Vue.use(TSComponents); Vue.use(TSComponents);
Vue.use(mFormComponents); Vue.use(mFormComponents);
Vue.use(pSideBarComponents);
let debug = new Debugger("treestudyplan-editor"); let debug = new Debugger("treestudyplan-editor");
/************************************ /************************************
* * * *
@ -1821,7 +1823,6 @@ export default {
:items="page.studylines" :items="page.studylines"
class="t-slot-droplist" class="t-slot-droplist"
:accepts-type="'studyline-'+page.id" :accepts-type="'studyline-'+page.id"
xreorder="$event.apply(page.studylines)"
@reorder="reorderLines($event,page.studylines)" @reorder="reorderLines($event,page.studylines)"
mode="copy" mode="copy"
row row
@ -1876,6 +1877,7 @@ export default {
<!-- add period information --> <!-- add period information -->
<template v-for="(n,index) in (page.periods+1)"> <template v-for="(n,index) in (page.periods+1)">
<s-studyline-header-period <s-studyline-header-period
mode="edit"
:identifier='Number(page.id)' :identifier='Number(page.id)'
v-if="index > 0" v-if="index > 0"
v-model="page.perioddesc[index-1]" v-model="page.perioddesc[index-1]"
@ -2317,6 +2319,9 @@ export default {
}; };
}, },
methods: { methods: {
hivizdrop() {
return settings("hivizdropslots");
},
onDrop(event) { onDrop(event) {
this.hover.component = null; this.hover.component = null;
this.hover.type = null; this.hover.type = null;
@ -2474,7 +2479,7 @@ export default {
></t-item ></t-item
></drag ></drag
><drop v-else ><drop v-else
:class="'t-slot-drop '+type + (layer > 0?' secondary':' primary')" :class="'t-slot-drop '+type + (layer > 0?' secondary':' primary') + (hivizdrop()?' hiviz':'')"
:accepts-type="checkType" :accepts-type="checkType"
@drop="onDrop" @drop="onDrop"
mode="cut" mode="cut"
@ -4142,6 +4147,7 @@ export default {
template: ` template: `
<ul class="t-course-list"> <ul class="t-course-list">
<li class="t-course-list-item" v-for="course in value" :key="course.id"> <li class="t-course-list-item" v-for="course in value" :key="course.id">
<span class='t-course-heading'>
<drag <drag
class="draggable-course" class="draggable-course"
:data="course" :data="course"
@ -4150,6 +4156,7 @@ export default {
> >
<i class="t-course-list-item fa fa-book"></i> {{ course.shortname }} - {{ course.fullname }} <i class="t-course-list-item fa fa-book"></i> {{ course.shortname }} - {{ course.fullname }}
</drag> </drag>
</span>
</li> </li>
</ul> </ul>
`, `,
@ -4176,7 +4183,7 @@ export default {
}, },
data() { data() {
return { return {
toolboxright: true, toolboxright: !(settings("toolboxleft")),
text: strings.toolbox, text: strings.toolbox,
relatedbadges: [], relatedbadges: [],
systembadges: [], systembadges: [],
@ -4319,12 +4326,11 @@ export default {
}, },
template: ` template: `
<div class="t-toolbox"> <div class="t-toolbox">
<b-sidebar <p-sidebar
id="toolbox-sidebar"
:right='toolboxright' :right='toolboxright'
shadow shadow
v-model="value" v-model="value"
no-header offsetRef="#page"
> >
<div class="m-3 border-bottom-1 border-primary"><h3>{{text.toolbox}}</h3></div> <div class="m-3 border-bottom-1 border-primary"><h3>{{text.toolbox}}</h3></div>
<div class='t-toolbox-preface'> <div class='t-toolbox-preface'>
@ -4429,7 +4435,7 @@ export default {
</b-card> </b-card>
</b-tab> </b-tab>
</b-tabs> </b-tabs>
</b-sidebar> </p-sidebar>
</div> </div>
`, `,
}); });

View File

@ -245,6 +245,10 @@ export default {
identifier: { identifier: {
type: Number, // Page reference. type: Number, // Page reference.
default() { return 0;} default() { return 0;}
},
mode: {
type: String,
default: "view",
} }
}, },
mounted() { mounted() {
@ -302,7 +306,7 @@ export default {
class="s-studyline-header-period-datespan small"> class="s-studyline-header-period-datespan small">
<span class="date">{{ startdate }}</span> - <span class="date">{{ enddate }}</span> <span class="date">{{ startdate }}</span> - <span class="date">{{ enddate }}</span>
</p> </p>
<div v-if="current" class='s-studyline-period-highlight'></div> <div v-if="current && mode == 'view'" class='s-studyline-period-highlight'></div>
</div> </div>
`, `,
}); });

View File

@ -0,0 +1,132 @@
/*eslint no-unused-vars: warn */
/*eslint max-len: ["error", { "code": 160 }] */
/*eslint-disable no-trailing-spaces */
/*eslint-disable no-console */
/*eslint-env es6*/
import {calc} from "./css-calc";
export default {
install(Vue/*,options*/){
Vue.component('p-sidebar',{
props: {
value: {
type: Boolean,
default: true,
},
right: {
type: Boolean,
default: false,
},
shadow: {
type: Boolean,
default: false,
},
target: {
type: String,
default: 'body',
},
offsetRef: {
type: String,
default: '',
}
},
data() {
return {
wrapper: null,
contentwrapper: null,
resizeobserver: null,
};
},
computed: {
},
methods: {
initWrappers(target) {
// First check if the sidebar wrapper already exists.
this.wrapper = document.querySelector("#p-sidebar-wrapper");
if (! this.wrapper) {
// Otherwise, create it.
this.wrapper = document.createElement("div");
this.wrapper.setAttribute("id","p-sidebar-wrapper");
}
// First check if the contentwrapper already exists
this.contentwrapper = document.querySelector("#p-sidebar-contentwrapper");
if (!this.contentwrapper) {
// Otherwise, create it.
this.contentwrapper = document.createElement("div");
this.contentwrapper.setAttribute("id","p-sidebar-contentwrapper");
this.wrapper.appendChild(this.contentwrapper);
}
// Find containing target (otherwise use body)
let targetEl = document.querySelector(target);
console.info(`Targeting '${target}' to `,targetEl);
if (!targetEl || targetEl.nodeType == "HTML") {
targetEl = document.querySelector("body");
}
// Move all target content parts to content wrapper....
while (targetEl.childNodes.length >0) {
this.contentwrapper.appendChild(targetEl.childNodes[0]);
}
// Add sidebar wrapper to target Element
targetEl.appendChild(this.wrapper);
},
rePosition(right) {
// Place the container elsewhere in the DOM.
const el = this.$refs.container;
if(right) {
this.wrapper.insertBefore(el,this.contentwrapper.nextSibling);
} else {
this.wrapper.insertBefore(el,this.contentwrapper);
}
},
setOffset(reference) {
const ref = reference?document.querySelector(reference):null;
console.info(`Setting offset from '${reference}'`,ref);
let offsetTop = (ref?ref.offsetTop:0);
offsetTop+=(offsetTop!=0)?"px":"";
const el = this.$refs.container;
el.style.height=`calc( 100vh - ${offsetTop})`;
el.style.marginTop=offsetTop;
}
},
watch: {
right(newVal) {
this.rePosition(newVal);
},
offsetRef(reference) {
this.setOffset(reference);
}
},
mounted() {
const self = this;
const el = self.$refs.container;
this.initWrappers(this.target);
this.setOffset(this.offsetRef);
this.rePosition(this.right,this.besides);
this.resizeObserver = new ResizeObserver(() => {
let wx = 0 - el.getBoundingClientRect().width;
wx += (wx!=0)?"px":"";
el.style.setProperty("--p-sidebar-hideoffset",wx);
});
this.resizeObserver.observe(el);
},
unmounted() {
if(this.resizeObserver) {
this.resizeObserver.disconnect();
}
},
template: `
<div>
<div ref='container'
:class="'p-sidebar ' + (right?'p-sidebar-right ':'') + (shadow?'p-sidebar-shadow ':'') + (value?'shown ':'hidden ')"
><slot></slot></div>
</div>
`,
});
},
};

42
amd/src/util/settings.js Normal file
View File

@ -0,0 +1,42 @@
/*eslint no-var: "error" */
/*eslint-env es6*/
import {call} from 'core/ajax';
import notification from 'core/notification';
// Prepare default value.
let settingcache = null;
/**
* Check if premium status is enabled.
* @param {String} key
* @returns {}
*/
export function settings ( key ){
const settings = loadsettings();
if ( key in settings ) {
return settings[key];
} else {
return null;
}
}
/**
* Get settings from server or cache
* @returns {Object} The settings object
*/
function loadsettings() {
if (!settingcache) {
// Retrieve setting cache if needed.
call([{
methodname: 'local_treestudyplan_getsettings',
args: {}
}])[0].then(function(response){
settingcache = response;
}).catch(notification.exception);
}
return settingcache;
}
// Preload premium status.
loadsettings();

View File

@ -38,7 +38,7 @@ class premium extends \external_api {
// Toggle the variable below to enable support for premium stuff. // Toggle the variable below to enable support for premium stuff.
// If set to false, all premium features will be enabled and no premium settings panel will be visible. // If set to false, all premium features will be enabled and no premium settings panel will be visible.
private static $premium_supported = false; private static $premium_supported = true;
private static $premiumcrt = "-----BEGIN CERTIFICATE----- private static $premiumcrt = "-----BEGIN CERTIFICATE-----
MIIDSzCCAjMCFFlyhmKf1fN7U5lQL/dtlsyP24AQMA0GCSqGSIb3DQEBCwUAMGEx MIIDSzCCAjMCFFlyhmKf1fN7U5lQL/dtlsyP24AQMA0GCSqGSIb3DQEBCwUAMGEx

View File

@ -2222,6 +2222,7 @@ class studyplanservice extends \external_api {
*/ */
public static function count_templates() { public static function count_templates() {
\external_api::validate_context(\context_system::instance()); \external_api::validate_context(\context_system::instance());
require_login(null,false,null);
return studyplan::count_template(); return studyplan::count_template();
} }
} }

View File

@ -142,7 +142,9 @@ class utilityservice extends \external_api {
* Return value description for webservice function submit_cm_editform * Return value description for webservice function submit_cm_editform
*/ */
public static function submit_mform_returns() : \external_description { public static function submit_mform_returns() : \external_description {
return success::structure(); return new \external_multiple_structure(new \external_single_structure([
"id" => new \external_value(PARAM_INT, 'id of studyline'),
]));
} }
/** /**
@ -167,5 +169,37 @@ class utilityservice extends \external_api {
} }
/**
* Parameter description for webservice function submit_cm_editform
*/
public static function getsettings_parameters() : \external_function_parameters {
return new \external_function_parameters( [
] );
}
/**
* Return value description for webservice function submit_cm_editform
*/
public static function getsettings_returns() : \external_description {
return new \external_single_structure([
"hivizdropslots" => new \external_value(PARAM_BOOL, 'High visibility drop slots for items'),
"toolboxleft" => new \external_value(PARAM_BOOL, 'Start toolbox default on left side'),
]);
}
/**
* Submit specified form data into form
* @return array Success/fail structure
*/
public static function getsettings() {
\external_api::validate_context(\context_system::instance());
require_login(null,false,null);
return [
"hivizdropslots" => get_config("local_treestudyplan","hivizdropslots"),
"toolboxleft" => get_config("local_treestudyplan","toolboxleft")
];
}
} }

View File

@ -318,17 +318,25 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.features-treestudyplan li.t-coursecat-list-item i.t-caret { .features-treestudyplan li.t-coursecat-list-item i.t-caret {
width: 9px; width: 9px;
} }
.path-local-treestudyplan li.t-coursecat-list-item, .path-local-treestudyplan .t-coursecat-heading,
.path-local-treestudyplan .t-course-heading,
.features-treestudyplan .t-coursecat-heading,
.features-treestudyplan .t-course-heading {
min-width: 180px;
max-width: 240px;
display: inline-block;
}
.path-local-treestudyplan li.t-coursecat-list-item .draggable-course,
.path-local-treestudyplan li.t-course-list-item .draggable-course, .path-local-treestudyplan li.t-course-list-item .draggable-course,
.features-treestudyplan li.t-coursecat-list-item, .features-treestudyplan li.t-coursecat-list-item .draggable-course,
.features-treestudyplan li.t-course-list-item .draggable-course { .features-treestudyplan li.t-course-list-item .draggable-course {
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.path-local-treestudyplan li.t-coursecat-list-item:hover, .path-local-treestudyplan li.t-coursecat-list-item .draggable-course:hover,
.path-local-treestudyplan li.t-course-list-item .draggable-course:hover, .path-local-treestudyplan li.t-course-list-item .draggable-course:hover,
.features-treestudyplan li.t-coursecat-list-item:hover, .features-treestudyplan li.t-coursecat-list-item .draggable-course:hover,
.features-treestudyplan li.t-course-list-item .draggable-course:hover { .features-treestudyplan li.t-course-list-item .draggable-course:hover {
text-overflow: clip; text-overflow: clip;
white-space: normal; white-space: normal;
@ -421,6 +429,7 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.path-local-treestudyplan .s-studyline-period-highlight, .path-local-treestudyplan .s-studyline-period-highlight,
.features-treestudyplan .s-studyline-period-highlight { .features-treestudyplan .s-studyline-period-highlight {
position: absolute; position: absolute;
pointer-events: none;
width: 100%; width: 100%;
height: 50000px; height: 50000px;
opacity: var(--highlight-mix); opacity: var(--highlight-mix);
@ -493,6 +502,11 @@ body.path-local-treestudyplan .editmode-switch-form > * {
align-content: center; align-content: center;
justify-content: center; justify-content: center;
} }
.path-local-treestudyplan .t-slot-drop.hiviz.drop-allowed,
.features-treestudyplan .t-slot-drop.hiviz.drop-allowed {
min-height: 44px;
background-color: yellow;
}
.path-local-treestudyplan .t-slot-drop.competency, .path-local-treestudyplan .t-slot-drop.competency,
.features-treestudyplan .t-slot-drop.competency { .features-treestudyplan .t-slot-drop.competency {
min-width: 100px; min-width: 100px;
@ -509,6 +523,11 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.features-treestudyplan .t-slot-drop.secondary.drop-allowed { .features-treestudyplan .t-slot-drop.secondary.drop-allowed {
min-height: 5px; min-height: 5px;
} }
.path-local-treestudyplan .t-slot-drop.secondary.drop-allowed.hiviz,
.features-treestudyplan .t-slot-drop.secondary.drop-allowed.hiviz {
min-height: 44px;
background-color: yellow;
}
.path-local-treestudyplan .t-item-deletebox, .path-local-treestudyplan .t-item-deletebox,
.features-treestudyplan .t-item-deletebox { .features-treestudyplan .t-item-deletebox {
display: inline-block; display: inline-block;
@ -1818,3 +1837,44 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.features-treestudyplan .collapse.show { .features-treestudyplan .collapse.show {
height: auto; height: auto;
} }
#p-sidebar-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
overflow: hidden;
}
#p-sidebar-wrapper #p-sidebar-contentwrapper {
flex: 1 1 auto;
transition: all 0.3s ease-in-out;
}
#p-sidebar-wrapper .p-sidebar {
position: relative;
top: 0;
min-width: 320px;
width: auto;
max-width: 430px;
height: 100vh;
max-height: 100%;
margin: 0;
outline: 0;
-webkit-transform: translateX(0);
transform: translateX(0);
background-color: var(--light);
display: block;
transition: all 0.3s ease-in-out;
z-index: 100;
--p-sidebar-hideoffset: -320px;
}
#p-sidebar-wrapper .p-sidebar.p-sidebar-shadow {
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
}
#p-sidebar-wrapper .p-sidebar.shown {
display: block;
}
#p-sidebar-wrapper .p-sidebar:not(.p-sidebar-right).hidden {
margin-left: var(--p-sidebar-hideoffset);
}
#p-sidebar-wrapper .p-sidebar.p-sidebar-right.hidden {
margin-right: var(--p-sidebar-hideoffset);
}

View File

@ -823,5 +823,14 @@ $functions = [
'capabilities' => '', 'capabilities' => '',
'loginrequired' => true, 'loginrequired' => true,
], ],
'local_treestudyplan_getsettings' => [ // Web service function name.
'classname' => '\local_treestudyplan\utilityservice', // Class containing the external function.
'methodname' => 'getsettings', // External function name.
'description' => 'Get some studypln related settings',
'type' => 'read', // Database rights of the web service function (read, write).
'ajax' => true,
'capabilities' => '',
'loginrequired' => true,
],
]; ];

View File

@ -125,6 +125,11 @@ $string["settingdesc_courseprogressbar"] = 'Show a progress bar in the course po
$string["setting_infofields_heading"] = 'Extra course information fields'; $string["setting_infofields_heading"] = 'Extra course information fields';
$string["settingdesc_infofields_heading"] = 'Select up to 5 fields or custom fields to add to the course popup'; $string["settingdesc_infofields_heading"] = 'Select up to 5 fields or custom fields to add to the course popup';
$string["setting_hivizdropslots"] = 'High visibility drop fields';
$string["settingdesc_hivizdropslots"] = 'Give the drop fields when editing a study plan extra visibility';
$string["setting_toolboxleft"] = 'Toolbar left side by default';
$string["settingdesc_toolboxleft"] = 'Show the course and component toolbar on the left by default, instead of the right side of the screen';
$string["infofield_position_above"] = 'Above course results'; $string["infofield_position_above"] = 'Above course results';
$string["infofield_position_below"] = 'Below course results'; $string["infofield_position_below"] = 'Below course results';

View File

@ -124,7 +124,13 @@ $string["setting_courseprogressbar"] = 'Toon voortgangsbalk in cursus';
$string["settingdesc_courseprogressbar"] = 'Laat een voortgangsbalk zien in de cursuspopup'; $string["settingdesc_courseprogressbar"] = 'Laat een voortgangsbalk zien in de cursuspopup';
$string["setting_infofields_heading"] = 'Extra cursusinformatie in popup'; $string["setting_infofields_heading"] = 'Extra cursusinformatie in popup';
$string["settingdesc_infofields_heading"] = 'Kies tot 5 extra velden om in het cursuspopupvenster te laten zien'; $string["settingdesc_infofields_heading"] = 'Kies tot 5 extra velden om in het cursuspopupvenster te laten zien.';
$string["setting_hivizdropslots"] = 'Extra zichtbare sleepvelden';
$string["settingdesc_hivizdropslots"] = 'Maak de velden waar cursussen heen gesleept kunnen worden extra goed zichtbaar.';
$string["setting_toolboxleft"] = 'Toolcox standaard links';
$string["settingdesc_toolboxleft"] = 'Toon de toolbox met cursussen en componenten standaard links in plaats van rechts.';
$string["infofield_position_above"] = 'Boven cursusresultaten'; $string["infofield_position_above"] = 'Boven cursusresultaten';
$string["infofield_position_below"] = 'Onder cursusresultaten'; $string["infofield_position_below"] = 'Onder cursusresultaten';

49
scss/psidebar.scss Normal file
View File

@ -0,0 +1,49 @@
#p-sidebar-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
overflow: hidden;
#p-sidebar-contentwrapper {
flex: 1 1 auto;
transition: all 0.3s ease-in-out;
}
.p-sidebar {
position: relative;
top: 0;
min-width: 320px;
width: auto;
max-width: 430px;
height: 100vh;
max-height: 100%;
margin: 0;
outline: 0;
-webkit-transform: translateX(0);
transform: translateX(0);
background-color: var(--light);
display: block;
transition: all 0.3s ease-in-out;
z-index: 100;
--p-sidebar-hideoffset: -320px;
&.p-sidebar-shadow {
box-shadow: 0 .5rem 1rem rgba(0,0,0,.15);
}
&.shown {
display: block;
}
&:not(.p-sidebar-right).hidden {
margin-left: var(--p-sidebar-hideoffset);
}
&.p-sidebar-right.hidden {
margin-right: var(--p-sidebar-hideoffset);
}
}
}

View File

@ -211,8 +211,16 @@
} }
} }
.t-coursecat-heading, .t-course-heading {
min-width: 180px;
max-width: 240px;
display: inline-block;
}
li.t-coursecat-list-item, li.t-course-list-item .draggable-course {
li.t-coursecat-list-item, li.t-course-list-item {
.draggable-course {
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -223,7 +231,7 @@
word-break: break-word; word-break: break-word;
} }
} }
}
i.t-coursecat-list-item { i.t-coursecat-list-item {
color: var(--coursecat-list); color: var(--coursecat-list);
@ -307,6 +315,7 @@
.s-studyline-period-highlight { .s-studyline-period-highlight {
position:absolute; position:absolute;
pointer-events: none;
width: 100%; width: 100%;
height: 50000px; height: 50000px;
@ -376,6 +385,10 @@
flex-direction: column; flex-direction: column;
align-content: center; align-content: center;
justify-content: center; justify-content: center;
&.hiviz.drop-allowed {
min-height: 44px;
background-color: yellow;
}
} }
.t-slot-drop.competency { .t-slot-drop.competency {
@ -392,6 +405,10 @@
.t-slot-drop.secondary.drop-allowed { .t-slot-drop.secondary.drop-allowed {
min-height: 5px; min-height: 5px;
&.hiviz {
min-height: 44px;
background-color: yellow;
}
} }
.t-item-deletebox { .t-item-deletebox {

View File

@ -5,3 +5,4 @@
@import "studyplancard.scss"; @import "studyplancard.scss";
@import "studyplan-report.scss"; @import "studyplan-report.scss";
@import "bootstraptweaking.scss"; @import "bootstraptweaking.scss";
@import "psidebar.scss";

View File

@ -127,6 +127,20 @@ if ($hassiteconfig) {
false, false,
)); ));
//get_config("local_treestudyplan","hivizdropslots")
$page->add(new admin_setting_configcheckbox('local_treestudyplan/hivizdropslots',
get_string('setting_hivizdropslots', 'local_treestudyplan'),
get_string('settingdesc_hivizdropslots', 'local_treestudyplan'),
false,
));
//get_config("local_treestudyplan","toolboxleft")
$page->add(new admin_setting_configcheckbox('local_treestudyplan/toolboxleft',
get_string('setting_toolboxleft', 'local_treestudyplan'),
get_string('settingdesc_toolboxleft', 'local_treestudyplan'),
false,
));
if (premium::enabled()) { if (premium::enabled()) {
//get_config("local_treestudyplan","enablecoach") //get_config("local_treestudyplan","enablecoach")
$page->add(new admin_setting_configcheckbox('local_treestudyplan/enablecoach', $page->add(new admin_setting_configcheckbox('local_treestudyplan/enablecoach',

View File

@ -318,17 +318,25 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.features-treestudyplan li.t-coursecat-list-item i.t-caret { .features-treestudyplan li.t-coursecat-list-item i.t-caret {
width: 9px; width: 9px;
} }
.path-local-treestudyplan li.t-coursecat-list-item, .path-local-treestudyplan .t-coursecat-heading,
.path-local-treestudyplan .t-course-heading,
.features-treestudyplan .t-coursecat-heading,
.features-treestudyplan .t-course-heading {
min-width: 180px;
max-width: 240px;
display: inline-block;
}
.path-local-treestudyplan li.t-coursecat-list-item .draggable-course,
.path-local-treestudyplan li.t-course-list-item .draggable-course, .path-local-treestudyplan li.t-course-list-item .draggable-course,
.features-treestudyplan li.t-coursecat-list-item, .features-treestudyplan li.t-coursecat-list-item .draggable-course,
.features-treestudyplan li.t-course-list-item .draggable-course { .features-treestudyplan li.t-course-list-item .draggable-course {
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.path-local-treestudyplan li.t-coursecat-list-item:hover, .path-local-treestudyplan li.t-coursecat-list-item .draggable-course:hover,
.path-local-treestudyplan li.t-course-list-item .draggable-course:hover, .path-local-treestudyplan li.t-course-list-item .draggable-course:hover,
.features-treestudyplan li.t-coursecat-list-item:hover, .features-treestudyplan li.t-coursecat-list-item .draggable-course:hover,
.features-treestudyplan li.t-course-list-item .draggable-course:hover { .features-treestudyplan li.t-course-list-item .draggable-course:hover {
text-overflow: clip; text-overflow: clip;
white-space: normal; white-space: normal;
@ -421,6 +429,7 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.path-local-treestudyplan .s-studyline-period-highlight, .path-local-treestudyplan .s-studyline-period-highlight,
.features-treestudyplan .s-studyline-period-highlight { .features-treestudyplan .s-studyline-period-highlight {
position: absolute; position: absolute;
pointer-events: none;
width: 100%; width: 100%;
height: 50000px; height: 50000px;
opacity: var(--highlight-mix); opacity: var(--highlight-mix);
@ -493,6 +502,11 @@ body.path-local-treestudyplan .editmode-switch-form > * {
align-content: center; align-content: center;
justify-content: center; justify-content: center;
} }
.path-local-treestudyplan .t-slot-drop.hiviz.drop-allowed,
.features-treestudyplan .t-slot-drop.hiviz.drop-allowed {
min-height: 44px;
background-color: yellow;
}
.path-local-treestudyplan .t-slot-drop.competency, .path-local-treestudyplan .t-slot-drop.competency,
.features-treestudyplan .t-slot-drop.competency { .features-treestudyplan .t-slot-drop.competency {
min-width: 100px; min-width: 100px;
@ -509,6 +523,11 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.features-treestudyplan .t-slot-drop.secondary.drop-allowed { .features-treestudyplan .t-slot-drop.secondary.drop-allowed {
min-height: 5px; min-height: 5px;
} }
.path-local-treestudyplan .t-slot-drop.secondary.drop-allowed.hiviz,
.features-treestudyplan .t-slot-drop.secondary.drop-allowed.hiviz {
min-height: 44px;
background-color: yellow;
}
.path-local-treestudyplan .t-item-deletebox, .path-local-treestudyplan .t-item-deletebox,
.features-treestudyplan .t-item-deletebox { .features-treestudyplan .t-item-deletebox {
display: inline-block; display: inline-block;
@ -1818,3 +1837,44 @@ body.path-local-treestudyplan .editmode-switch-form > * {
.features-treestudyplan .collapse.show { .features-treestudyplan .collapse.show {
height: auto; height: auto;
} }
#p-sidebar-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
overflow: hidden;
}
#p-sidebar-wrapper #p-sidebar-contentwrapper {
flex: 1 1 auto;
transition: all 0.3s ease-in-out;
}
#p-sidebar-wrapper .p-sidebar {
position: relative;
top: 0;
min-width: 320px;
width: auto;
max-width: 430px;
height: 100vh;
max-height: 100%;
margin: 0;
outline: 0;
-webkit-transform: translateX(0);
transform: translateX(0);
background-color: var(--light);
display: block;
transition: all 0.3s ease-in-out;
z-index: 100;
--p-sidebar-hideoffset: -320px;
}
#p-sidebar-wrapper .p-sidebar.p-sidebar-shadow {
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
}
#p-sidebar-wrapper .p-sidebar.shown {
display: block;
}
#p-sidebar-wrapper .p-sidebar:not(.p-sidebar-right).hidden {
margin-left: var(--p-sidebar-hideoffset);
}
#p-sidebar-wrapper .p-sidebar.p-sidebar-right.hidden {
margin-right: var(--p-sidebar-hideoffset);
}

View File

@ -22,7 +22,7 @@
defined('MOODLE_INTERNAL') || die(); defined('MOODLE_INTERNAL') || die();
$plugin->component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494). $plugin->component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494).
$plugin->version = 2024041901; // YYYYMMDDHH (year, month, day, iteration). $plugin->version = 2024041904; // YYYYMMDDHH (year, month, day, iteration).
$plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11). $plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11).
$plugin->release = "1.1.6"; $plugin->release = "1.1.6";