Compare commits
237 Commits
build-2023
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
5e3d610451 | ||
|
6b707cc595 | ||
|
108a612e8c | ||
|
9988ed1a3d | ||
|
8c1be03e5d | ||
|
95fabecc60 | ||
|
9737398629 | ||
|
bc774533f4 | ||
|
6518e00a31 | ||
|
d5b8d8993a | ||
|
1eb862a3ea | ||
|
b0a61d018c | ||
|
a00af55f66 | ||
|
b5e8033680 | ||
|
65c9537bd3 | ||
|
9c89038baa | ||
|
de57dc063c | ||
|
1e4f399baf | ||
|
743cb82cc9 | ||
|
fd9d50873e | ||
|
13523670cb | ||
|
a9595974bb | ||
|
b1c6ddd665 | ||
|
073e8e0b28 | ||
|
8299d4c9d1 | ||
|
53be9d3cce | ||
|
0f8d6d8a59 | ||
|
fbe34189f6 | ||
|
30fb9dd149 | ||
|
c2c5383e10 | ||
|
3bef1118b2 | ||
|
1b89bb87a6 | ||
|
ae8f2b6841 | ||
|
31c4e758ea | ||
|
8adaf04cd3 | ||
|
4cc04371a0 | ||
|
675455630d | ||
|
9b4ead935e | ||
|
e6307a9308 | ||
|
aaa8c79df4 | ||
|
ba9d58c01d | ||
|
6b9826934f | ||
|
b60e5065f0 | ||
|
46f8575291 | ||
|
5c1f21cee0 | ||
|
e999fdb125 | ||
|
dbb1386b7d | ||
|
2268aba9d5 | ||
|
520034bb5f | ||
|
64c821bbe9 | ||
|
e72be595aa | ||
|
4c669ff08c | ||
|
ebdb39c5ca | ||
|
3d53966b5a | ||
|
8b5cad01f8 | ||
|
742f9ef772 | ||
|
3d48f290d6 | ||
|
de8e8199ca | ||
|
ee0a9c3d3a | ||
|
4fd1e3a547 | ||
|
c88f132201 | ||
|
582db40016 | ||
|
09c6e4b029 | ||
|
3dd1682f5a | ||
|
ebc3632788 | ||
|
5dc94a7525 | ||
|
ff9044ae9a | ||
|
3ba4d4d4c5 | ||
|
5bd10de529 | ||
|
39d184c2e9 | ||
|
50110a3e0f | ||
|
9caf652ff5 | ||
|
bcb288bac8 | ||
|
9a1b32855f | ||
|
c938b994a1 | ||
|
97ce14fe20 | ||
|
be0141eb7b | ||
|
12efb061f1 | ||
|
886a11d99e | ||
|
82838c57c5 | ||
|
2369610903 | ||
|
88744c2b66 | ||
|
d225d82038 | ||
|
0163471a92 | ||
|
383c07becd | ||
|
310f042772 | ||
|
3002a866bb | ||
|
747e1decd1 | ||
|
f2fac43139 | ||
|
7dbcb437c3 | ||
|
6bb13de5cf | ||
|
500555e785 | ||
|
25a5ff8398 | ||
|
c480c20098 | ||
|
a57ee3d884 | ||
|
35afe06a91 | ||
|
d713e24e32 | ||
|
079e2f77cc | ||
|
8938facdef | ||
|
f20a724c52 | ||
|
d07e6170f3 | ||
|
8382c4a117 | ||
|
61256207be | ||
|
7ea7576ac8 | ||
|
1fe4db6328 | ||
|
9619fd17de | ||
|
247562ecdd | ||
|
0efde4a773 | ||
|
8f2673c4a4 | ||
|
6b616c0a6a | ||
|
b3af1fa8c4 | ||
|
f8b18d4d6e | ||
|
ed353540f0 | ||
|
4bb98b73eb | ||
|
a663a038c7 | ||
|
8f6d48b981 | ||
|
e1c6d07b2c | ||
|
1f16c0b1ee | ||
|
9f69b7bc15 | ||
|
0e4cf45a80 | ||
|
3cf6459ce8 | ||
|
dadbd6331f | ||
|
a717acf4e4 | ||
|
e42323a2e4 | ||
|
32a09a7c44 | ||
|
626e2c9aac | ||
|
0ec51885a0 | ||
|
dfc9f86d1d | ||
|
8aed72af70 | ||
|
29f11982ff | ||
|
737da8c051 | ||
|
29c8dd9aa4 | ||
|
5a88761f22 | ||
|
9fe71f1800 | ||
|
2967f4a5bb | ||
|
fd1ab079a1 | ||
|
546bff0659 | ||
|
d9bcb71a46 | ||
|
17febe83be | ||
|
414c900b34 | ||
|
88321ec703 | ||
|
6587200239 | ||
|
7b980405f3 | ||
|
b8c0f910c1 | ||
|
32bab2de5e | ||
|
4ca2c875ef | ||
|
ad02879928 | ||
|
a704436564 | ||
|
de97031326 | ||
|
0de002bf3a | ||
|
11c5b0fa8a | ||
|
43c0af4730 | ||
|
f6b53a1623 | ||
|
b8a3394fe4 | ||
|
f3bf55598d | ||
|
bfcd41dd81 | ||
|
5544d57f6b | ||
|
c4966de6fd | ||
|
0c459b9a8b | ||
|
e092758ff1 | ||
|
97552704ce | ||
|
41eee1a7aa | ||
|
c9d9703a04 | ||
|
5ca74f8b1a | ||
|
96caeb895a | ||
|
456e9b503e | ||
|
82e92eed45 | ||
|
932587d2af | ||
|
54a8823bbd | ||
|
4a97078405 | ||
|
a208d0023a | ||
|
fe8d8d0a0f | ||
|
942c02ac40 | ||
|
c3278f687c | ||
|
a60c259408 | ||
|
702435566d | ||
|
93e174967f | ||
|
24370631ab | ||
|
dd7fa5f620 | ||
|
3fcf0095ea | ||
|
8af1152ae2 | ||
|
b44e7f2a9f | ||
|
2622b102bf | ||
|
1975952c8f | ||
|
c6882b916a | ||
|
0dda0c6a45 | ||
|
602bb6e0b3 | ||
|
abb74795ca | ||
|
5439f30464 | ||
|
77d7d74c2f | ||
|
324567a2ca | ||
|
3c7369ce6b | ||
|
f0847a0f14 | ||
|
1c19a92772 | ||
|
d4e4a8fca9 | ||
|
49fa4b2ed3 | ||
|
2a642f33c8 | ||
|
bcc3cb5a2c | ||
|
147f218916 | ||
|
405d76367c | ||
|
e50fca0204 | ||
|
db493e8029 | ||
|
4a358728e5 | ||
|
9fee6fb8b5 | ||
|
17d159ac6a | ||
|
9f8a87ac83 | ||
|
5eacc6f68c | ||
|
fd2ed7ac8d | ||
|
83aed030fb | ||
|
53a233fe09 | ||
|
a4f25f8519 | ||
|
da86134165 | ||
|
08787a5e40 | ||
|
7e905545d8 | ||
|
f191416f74 | ||
|
c67c40d74d | ||
|
11ed955fd7 | ||
|
e3254a45c0 | ||
|
efd2eaa451 | ||
|
ef29eb6209 | ||
|
641356be31 | ||
|
7431943747 | ||
|
db8b9c9a02 | ||
|
d432f77494 | ||
|
207c638a66 | ||
|
917304e830 | ||
|
2ef8b65421 | ||
|
cc9f279756 | ||
|
9c576a4dcc | ||
|
39e1e14dcd | ||
|
3614fa852f | ||
|
37596d3eee | ||
|
6f71cfd4b3 | ||
|
4708860f9f | ||
|
213ad3703e | ||
|
ee7e3ba61e | ||
|
cd9f82f95c |
10
.vscode/settings.json
vendored
10
.vscode/settings.json
vendored
|
@ -2,5 +2,13 @@
|
|||
"intelephense.environment.includePaths": [
|
||||
"/srv/moodle4/moodle"
|
||||
],
|
||||
"intelephense.diagnostics.undefinedProperties": false
|
||||
"intelephense.diagnostics.undefinedProperties": false,
|
||||
"spellright.language": [
|
||||
"en"
|
||||
],
|
||||
"spellright.documentTypes": [
|
||||
"markdown",
|
||||
"latex",
|
||||
"plaintext"
|
||||
]
|
||||
}
|
50
Gruntfile.js
50
Gruntfile.js
|
@ -1,3 +1,4 @@
|
|||
/* eslint no-console: "off" */
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
|
@ -16,13 +17,16 @@
|
|||
/* eslint-env node */
|
||||
|
||||
/**
|
||||
* Grunt configuration for local_treestudyplan
|
||||
* Grunt configuration for local_treestudyplan.
|
||||
* Note that currently on the 4.1 developement environment, the method described
|
||||
* on https://moodledev.io/general/development/tools/nodejs#using-grunt-in-additional-plugins
|
||||
* is not working as expected. Once development environment is changed to 4.3 or 4.4 I will
|
||||
* try this again.
|
||||
*
|
||||
* @copyright 2023 P.M. Kuipers
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Grunt configuration.
|
||||
*
|
||||
|
@ -34,48 +38,48 @@ module.exports = function(grunt) {
|
|||
const sass = require('sass');
|
||||
|
||||
// Import grunt configuration for moodle base
|
||||
process.chdir("../.."); // change dir to moodle base
|
||||
process.chdir("../.."); // Change dir to moodle base
|
||||
require(path.resolve(`./Gruntfile.js`))(grunt); // Run Gruntfile module from moodle base
|
||||
|
||||
grunt.registerTask('scssplugin','Compile scss/*.sccs into styles.css and css/devstyles.css', () => {
|
||||
|
||||
grunt.registerTask('scssplugin', 'Compile scss/styles.sccs into styles.css and css/devstyles.css', () => {
|
||||
|
||||
const devoutput = 'css/devstyles.css';
|
||||
const prodoutput = 'styles.css';
|
||||
|
||||
// Get full path of compenent and scss folder
|
||||
const componentPath = path.join(grunt.moodleEnv.gruntFilePath,grunt.moodleEnv.componentDirectory);
|
||||
const scssPath = path.join(componentPath, 'scss','styles.scss');
|
||||
const componentPath = path.join(grunt.moodleEnv.gruntFilePath, grunt.moodleEnv.componentDirectory);
|
||||
const scssPath = path.join(componentPath, 'scss', 'styles.scss');
|
||||
console.log(`Compiling ${scssPath} including any imported files therein`);
|
||||
|
||||
process.chdir(path.join(componentPath, 'scss'));
|
||||
const result = sass.compile(scssPath);
|
||||
if ( result ) {
|
||||
if (result) {
|
||||
console.info("got result");
|
||||
|
||||
// Some regex processing to match moodle stylelint styles
|
||||
|
||||
// change tab indent to 4 instead of 2
|
||||
let css = result.css.replace(/^ ([^ ])/gm ," $1");
|
||||
// Change tab indent to 4 instead of 2
|
||||
let css = result.css.replace(/^ {2}([^ ])/gm, " $1");
|
||||
|
||||
// insert a newline after every comma in a css selector
|
||||
// Insert a newline after every comma in a css selector
|
||||
// (only combined selectors will get that long)
|
||||
css = css.replace(/^[^ ].*[\{,]$/gm , (m) => { // Find CSS selector lines
|
||||
return m.replace(/, /g,",\n"); // replace comma followed by space with comma newline
|
||||
css = css.replace(/^[^ ].*[{,]$/gm, (m) => { // Find CSS selector lines
|
||||
return m.replace(/, /g, ",\n"); // Replace comma followed by space with comma newline
|
||||
});
|
||||
|
||||
// replace hex color codes with lowercase (convenience function since I don't really care for the hex codes lowercase only rule)
|
||||
// Replace hex color codes with lowercase.
|
||||
const hexCodeToLower = (match, m1, m2) => {
|
||||
return '#'+m1.toLowerCase()+m2;
|
||||
}
|
||||
css = css.replace(/#([A-F0-9a-f]{3})([^A-F0-9a-f]?)/gm , hexCodeToLower); // 3 digit color codes
|
||||
css = css.replace(/#([A-F0-9a-f]{6})([^A-F0-9a-f]?)/gm , hexCodeToLower); // 6 digit color codes
|
||||
css = css.replace(/#([A-F0-9a-f]{8})([^A-F0-9a-f]?)/gm , hexCodeToLower); // 8 digit color codes (with alpha)
|
||||
return '#' + m1.toLowerCase() + m2;
|
||||
};
|
||||
css = css.replace(/#([A-F0-9a-f]{3})([^A-F0-9a-f]?)/gm, hexCodeToLower); // 3 digit color codes
|
||||
css = css.replace(/#([A-F0-9a-f]{6})([^A-F0-9a-f]?)/gm, hexCodeToLower); // 6 digit color codes
|
||||
css = css.replace(/#([A-F0-9a-f]{8})([^A-F0-9a-f]?)/gm, hexCodeToLower); // 8 digit color codes (with alpha)
|
||||
|
||||
// All other errors should really be fixed in the scss files :)
|
||||
|
||||
[devoutput,prodoutput].forEach((output) => {
|
||||
[devoutput, prodoutput].forEach((output) => {
|
||||
console.info(`Storing ${output}`);
|
||||
grunt.file.write(path.join(componentPath, output),css);
|
||||
grunt.file.write(path.join(componentPath, output), css);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -92,8 +96,8 @@ module.exports = function(grunt) {
|
|||
});
|
||||
|
||||
// Remove gherkinlint from the startup list, since it exits with an error because of errors in moodle's own code
|
||||
grunt.moodleEnv.startupTasks.splice(grunt.moodleEnv.startupTasks.indexOf("gherkinlint"),1);
|
||||
|
||||
grunt.moodleEnv.startupTasks.splice(grunt.moodleEnv.startupTasks.indexOf("gherkinlint"), 1);
|
||||
|
||||
// Add the 'scssplugin' task as a startup task.
|
||||
grunt.moodleEnv.startupTasks.push('scssplugin');
|
||||
|
||||
|
|
18
README.md
18
README.md
|
@ -1,20 +1,20 @@
|
|||
# Moodle studyplan plugin
|
||||
|
||||
Plugin to organize a curriculum into an easy to read graphical respresentation of courses and student progress therein.
|
||||
Plugin to organize a curriculum into an easy to read graphical representation of courses and student progress therein.
|
||||
|
||||
The studyplan plugin extends Moodle with the ability to show students and teachers an overview of their curriculum and results therein.
|
||||
By showing students an easy to read graphical overview of their progress over multiple courses, students are more in control of their own
|
||||
learning process than by just listing results alone
|
||||
|
||||
## Installing
|
||||
Install the plugin by adding the zip file manually to the installed plugins in your moodle version
|
||||
Install the plugin by adding the zip file manually to the installed plugins in your Moodle version
|
||||
|
||||
## Configuration post install
|
||||
|
||||
### Dynamic Navigation links
|
||||
The studyplan plugin will automatically add links to the flat navigation bat used in Moodle 3.11 and below
|
||||
However, Moodle 4.0-4.2 use a new "primary navigation" bar, and does not yet support customizing the primary navigation bar (it is a planned feature though)
|
||||
|
||||
|
||||
Use the following workaround:
|
||||
You can add custom primary menu items in **Site administration** -> **Appearance** -> **Theme settings**
|
||||
That page contains an item called Custom menu items". Add the following into that area to custimize it
|
||||
|
@ -37,13 +37,13 @@ The recommended roles below give an example of that.
|
|||
|
||||
#### Recommended roles
|
||||
It is recommended to create the following new roles:
|
||||
- **Studyplan Manager** (*studyplanmanager*)
|
||||
Context types: *System*, *Category*
|
||||
- **Studyplan Manager** (*studyplanmanager*)
|
||||
Context types: *System*, *Category*
|
||||
*Capabilities*
|
||||
- **Manage studyplans** (*local/treestudyplan:editstudyplan*)
|
||||
- **Studyplan Viewer** (*studyplanviewer*)
|
||||
Context types: *System*, *Category*
|
||||
*Capabilities*
|
||||
- **Studyplan Viewer** (*studyplanviewer*)
|
||||
Context types: *System*, *Category*
|
||||
*Capabilities*
|
||||
- **View study plan of others** (*local/treestudyplan:viewuserreports*)
|
||||
|
||||
Then assign the role **studyplanmanager** in a specific category context, or the system context to all users who should be able to create and edit studyplans in that specific context
|
||||
|
@ -54,7 +54,7 @@ After installing the plugin you can find the main configuration in **Site admini
|
|||
|
||||
## Documentation / User manual
|
||||
After installing the plugin, the detailed user manual can be found under **Site administration** -> **Courses** -> **Studyplans** -> **Studyplan plugin documentation**
|
||||
Alternatively, you can unpack this ZIP file and open the **doc/index.html** file.
|
||||
Alternatively, you can unpack this ZIP file and open the **doc/index.html** file.
|
||||
(Note that viewing the html files directly will not five the optimal experience, since fontawesome tags and bootstrap styles will not be properly rendered)
|
||||
|
||||
## Development
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
amd/build/bootstrap-vue/bootstrap-vue.min.js
vendored
4
amd/build/bootstrap-vue/bootstrap-vue.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/bootstrap-vue/vue-functional-data-merge",["exports"],(function(_exports){function _slicedToArray(arr,i){return function(arr){if(Array.isArray(arr))return arr}(arr)||function(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null==_i)return;var _s,_e,_arr=[],_n=!0,_d=!1;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||_unsupportedIterableToArray(arr,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _unsupportedIterableToArray(o,minLen){if(o){if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(o):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.mergeData=function(){var prop,mergeTarget={},i=arguments.length;for(;i--;)for(var _i2=0,_Object$keys=Object.keys(arguments[i]);_i2<_Object$keys.length;_i2++)if(prop=_Object$keys[_i2],null!=arguments[i][prop]){switch(prop){case"class":var classes=[],value=mergeTarget.class;Array.isArray(value)&&(classes=value),mergeTarget.class=classes.concat(arguments[i].class);continue;case"style":var styles=[],_value=mergeTarget.style;Array.isArray(_value)&&(styles=_value);var thisStyle=[];Array.isArray(arguments[i].style)?thisStyle=arguments[i].style:thisStyle.push(arguments[i].style);for(var j=0;j<thisStyle.length;j++){var s=thisStyle[j];"string"==typeof s&&(thisStyle[j]=parseStyle(s))}mergeTarget[prop]=styles.concat(thisStyle);continue;case"id":case"key":case"ref":case"keepAlive":mergeTarget[prop]||(mergeTarget[prop]=arguments[i][prop]);continue}if(prop.startsWith("on")&&"on"!==prop){if(mergeTarget[prop]&&!Array.isArray(mergeTarget[prop])){mergeTarget[prop]=[mergeTarget[prop],arguments[i][prop]];continue}var targetValue=mergeTarget[prop],thisValue=arguments[i][prop];if(Array.isArray(targetValue)){Array.isArray(thisValue)?targetValue.push.apply(targetValue,function(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}(arr=thisValue)||function(iter){if("undefined"!=typeof Symbol&&null!=iter[Symbol.iterator]||null!=iter["@@iterator"])return Array.from(iter)}(arr)||_unsupportedIterableToArray(arr)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()):targetValue.push(thisValue);continue}}mergeTarget[prop]=arguments[i][prop]}var arr;return mergeTarget};var pattern={kebab:/-(\w)/g,styleProp:/:(.*)/,styleList:/;(?![^(]*\))/g};function camelReplace(_substr,match){return match.toUpperCase()}function parseStyle(style){var _step,str,styleMap={},_iterator=function(o,allowArrayLike){var it="undefined"!=typeof Symbol&&o[Symbol.iterator]||o["@@iterator"];if(!it){if(Array.isArray(o)||(it=_unsupportedIterableToArray(o))||allowArrayLike&&o&&"number"==typeof o.length){it&&(o=it);var i=0,F=function(){};return{s:F,n:function(){return i>=o.length?{done:!0}:{done:!1,value:o[i++]}},e:function(_e2){throw _e2},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var err,normalCompletion=!0,didErr=!1;return{s:function(){it=it.call(o)},n:function(){var step=it.next();return normalCompletion=step.done,step},e:function(_e3){didErr=!0,err=_e3},f:function(){try{normalCompletion||null==it.return||it.return()}finally{if(didErr)throw err}}}}(style.split(pattern.styleList));try{for(_iterator.s();!(_step=_iterator.n()).done;){var _s$split2=_slicedToArray(_step.value.split(pattern.styleProp),2),key=_s$split2[0],val=_s$split2[1];(key=key.trim())&&(val=val.trim(),styleMap[(str=key,str.replace(pattern.kebab,camelReplace))]=val)}}catch(err){_iterator.e(err)}finally{_iterator.f()}return styleMap}}));
|
||||
define("local_treestudyplan/bootstrap-vue/vue-functional-data-merge",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.mergeData=function(){let prop,mergeTarget={},i=arguments.length;for(;i--;)for(prop of Object.keys(arguments[i]))if(null!=arguments[i][prop]){switch(prop){case"class":{let classes=[];{let value=mergeTarget.class;Array.isArray(value)&&(classes=value)}mergeTarget.class=classes.concat(arguments[i].class);continue}case"style":{let styles=[];{let value=mergeTarget.style;Array.isArray(value)&&(styles=value)}let thisStyle=[];Array.isArray(arguments[i].style)?thisStyle=arguments[i].style:thisStyle.push(arguments[i].style);for(let j=0;j<thisStyle.length;j++){let s=thisStyle[j];"string"==typeof s&&(thisStyle[j]=parseStyle(s))}mergeTarget[prop]=styles.concat(thisStyle);continue}case"id":case"key":case"ref":case"keepAlive":mergeTarget[prop]||(mergeTarget[prop]=arguments[i][prop]);continue}if(prop.startsWith("on")&&"on"!==prop){if(mergeTarget[prop]&&!Array.isArray(mergeTarget[prop])){mergeTarget[prop]=[mergeTarget[prop],arguments[i][prop]];continue}let targetValue=mergeTarget[prop],thisValue=arguments[i][prop];if(Array.isArray(targetValue)){Array.isArray(thisValue)?targetValue.push(...thisValue):targetValue.push(thisValue);continue}}mergeTarget[prop]=arguments[i][prop]}return mergeTarget};const pattern={kebab:/-(\w)/g,styleProp:/:(.*)/,styleList:/;(?![^(]*\))/g};function camelReplace(_substr,match){return match.toUpperCase()}function parseStyle(style){let styleMap={};for(let s of style.split(pattern.styleList)){let[key,val]=s.split(pattern.styleProp);key=key.trim(),key&&(val=val.trim(),styleMap[(str=key,str.replace(pattern.kebab,camelReplace))]=val)}var str;return styleMap}}));
|
||||
|
||||
//# sourceMappingURL=vue-functional-data-merge.min.js.map
|
File diff suppressed because one or more lines are too long
2
amd/build/cfg-grades.min.js
vendored
2
amd/build/cfg-grades.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/cfg-grades",["exports","core/str","core/ajax","./debugger","./string-helper"],(function(_exports,_str,_ajax,_debugger,_stringHelper){var obj;function _createForOfIteratorHelper(o,allowArrayLike){var it="undefined"!=typeof Symbol&&o[Symbol.iterator]||o["@@iterator"];if(!it){if(Array.isArray(o)||(it=function(o,minLen){if(!o)return;if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);"Object"===n&&o.constructor&&(n=o.constructor.name);if("Map"===n||"Set"===n)return Array.from(o);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}(o))||allowArrayLike&&o&&"number"==typeof o.length){it&&(o=it);var i=0,F=function(){};return{s:F,n:function(){return i>=o.length?{done:!0}:{done:!1,value:o[i++]}},e:function(_e){throw _e},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var err,normalCompletion=!0,didErr=!1;return{s:function(){it=it.call(o)},n:function(){var step=it.next();return normalCompletion=step.done,step},e:function(_e2){didErr=!0,err=_e2},f:function(){try{normalCompletion||null==it.return||it.return()}finally{if(didErr)throw err}}}}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(){var _step,intRx=/\d/,integerChange=function(event){event.key.length>1||intRx.test(event.key)||event.preventDefault()},_iterator=_createForOfIteratorHelper(document.querySelectorAll('input[type="number"][step="1"][min="0"]'));try{for(_iterator.s();!(_step=_iterator.n()).done;){_step.value.addEventListener("keydown",integerChange)}}catch(err){_iterator.e(err)}finally{_iterator.f()}var _step2,decimal=/^[0-9]*?\.[0-9]*?$/,_intRx=/\d/,floatChange=function(event){event.key.length>1||"."===event.key&&!event.currentTarget.value.match(decimal)||_intRx.test(event.key)||event.preventDefault()},_iterator2=_createForOfIteratorHelper(document.querySelectorAll('input[type="number"][min="0"]:not([step])'));try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){_step2.value.addEventListener("keydown",floatChange)}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}var _step3,_iterator3=_createForOfIteratorHelper(document.querySelectorAll('input[type="text"].float'));try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){_step3.value.addEventListener("keydown",floatChange)}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}};new(_debugger=(obj=_debugger)&&obj.__esModule?obj:{default:obj}).default("treestudyplan-config-grades")}));
|
||||
define("local_treestudyplan/cfg-grades",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(){{const intRx=/\d/,integerChange=event=>{event.key.length>1||intRx.test(event.key)||event.preventDefault()};for(let input of document.querySelectorAll('input[type="number"][step="1"][min="0"]'))input.addEventListener("keydown",integerChange)}{const decimal=/^[0-9]*?\.[0-9]*?$/,intRx=/\d/,floatChange=event=>{event.key.length>1||"."===event.key&&!event.currentTarget.value.match(decimal)||intRx.test(event.key)||event.preventDefault()};for(let input of document.querySelectorAll('input[type="number"][min="0"]:not([step])'))input.addEventListener("keydown",floatChange);for(let input of document.querySelectorAll('input[type="text"].float'))input.addEventListener("keydown",floatChange)}}}));
|
||||
|
||||
//# sourceMappingURL=cfg-grades.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"cfg-grades.min.js","sources":["../src/cfg-grades.js"],"sourcesContent":["/*eslint no-var: \"error\" */\n/*eslint no-unused-vars: \"off\" */\n/*eslint linebreak-style: \"off\" */\n/*eslint no-trailing-spaces: \"off\" */\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\nimport {get_string,get_strings} from 'core/str';\nimport {call} from 'core/ajax';\nimport Debugger from './debugger';\n\nimport {load_strings} from './string-helper';\n\nlet debug = new Debugger(\"treestudyplan-config-grades\");\n\n/*\nlet strings = load_strings({\n studyplan: {\n studyplan_select_placeholder: 'studyplan_select_placeholder',\n },\n});\n*/\n\n/**\n * Initialize grade cfg page\n */\nexport function init() {\n { const\n intRx = /\\d/,\n integerChange = (event) => {\n if ( (event.key.length > 1) || intRx.test(event.key)\n ) { \n return; \n }\n event.preventDefault();\n };\n \n for (let input of document.querySelectorAll( 'input[type=\"number\"][step=\"1\"][min=\"0\"]' )){\n input.addEventListener(\"keydown\", integerChange);\n } \n \n }\n\n { const\n decimal= /^[0-9]*?\\.[0-9]*?$/,\n intRx = /\\d/,\n floatChange = (event) => {\n if ( (event.key.length > 1) || ( (event.key === \".\") && (!event.currentTarget.value.match(decimal)) )\n || intRx.test(event.key)\n ) { \n return; \n }\n event.preventDefault();\n };\n \n for (let input of document.querySelectorAll( 'input[type=\"number\"][min=\"0\"]:not([step])' )){\n input.addEventListener(\"keydown\", floatChange);\n } \n for (let input of document.querySelectorAll( 'input[type=\"text\"].float' )){\n input.addEventListener(\"keydown\", floatChange);\n } \n \n }\n\n\n}\n\n"],"names":["intRx","integerChange","event","key","length","test","preventDefault","document","querySelectorAll","addEventListener","decimal","floatChange","currentTarget","value","match"],"mappings":"kgDA6BQA,MAAQ,KACRC,cAAgB,SAACC,OACTA,MAAMC,IAAIC,OAAS,GAAMJ,MAAMK,KAAKH,MAAMC,MAIhDD,MAAMI,uDAGQC,SAASC,iBAAkB,+FAA4C,aACjFC,iBAAiB,UAAWR,6EAMlCS,QAAS,qBACTV,OAAQ,KACRW,YAAc,SAACT,OACPA,MAAMC,IAAIC,OAAS,GAAuB,MAAdF,MAAMC,MAAkBD,MAAMU,cAAcC,MAAMC,MAAMJ,UACjFV,OAAMK,KAAKH,MAAMC,MAI1BD,MAAMI,wDAGQC,SAASC,iBAAkB,oGAA8C,cACnFC,iBAAiB,UAAWE,mHAElBJ,SAASC,iBAAkB,mFAA6B,cAClEC,iBAAiB,UAAWE,oEA9C9B,yEAAa"}
|
||||
{"version":3,"file":"cfg-grades.min.js","sources":["../src/cfg-grades.js"],"sourcesContent":["/* eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\n/**\n * Initialize grade cfg page\n */\nexport function init() {\n { const\n intRx = /\\d/,\n integerChange = (event) => {\n if ((event.key.length > 1) || intRx.test(event.key)\n ) {\n return;\n }\n event.preventDefault();\n };\n\n for (let input of document.querySelectorAll('input[type=\"number\"][step=\"1\"][min=\"0\"]')) {\n input.addEventListener(\"keydown\", integerChange);\n }\n\n }\n\n { const\n decimal = /^[0-9]*?\\.[0-9]*?$/,\n intRx = /\\d/,\n floatChange = (event) => {\n if ((event.key.length > 1) || ((event.key === \".\") && (!event.currentTarget.value.match(decimal)))\n || intRx.test(event.key)\n ) {\n return;\n }\n event.preventDefault();\n };\n\n for (let input of document.querySelectorAll('input[type=\"number\"][min=\"0\"]:not([step])')) {\n input.addEventListener(\"keydown\", floatChange);\n }\n for (let input of document.querySelectorAll('input[type=\"text\"].float')) {\n input.addEventListener(\"keydown\", floatChange);\n }\n\n }\n\n\n}\n\n"],"names":["intRx","integerChange","event","key","length","test","preventDefault","input","document","querySelectorAll","addEventListener","decimal","floatChange","currentTarget","value","match"],"mappings":"gKASQA,MAAQ,KACRC,cAAiBC,QACVA,MAAMC,IAAIC,OAAS,GAAMJ,MAAMK,KAAKH,MAAMC,MAI/CD,MAAMI,sBAGL,IAAIC,SAASC,SAASC,iBAAiB,2CAC1CF,MAAMG,iBAAiB,UAAWT,sBAMlCU,QAAU,qBACVX,MAAQ,KACRY,YAAeV,QACRA,MAAMC,IAAIC,OAAS,GAAsB,MAAdF,MAAMC,MAAkBD,MAAMW,cAAcC,MAAMC,MAAMJ,UAC/EX,MAAMK,KAAKH,MAAMC,MAI1BD,MAAMI,sBAGL,IAAIC,SAASC,SAASC,iBAAiB,6CAC1CF,MAAMG,iBAAiB,UAAWE,iBAE/B,IAAIL,SAASC,SAASC,iBAAiB,4BAC1CF,MAAMG,iBAAiB,UAAWE"}
|
2
amd/build/downloader.min.js
vendored
2
amd/build/downloader.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/downloader",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.download=function(filename,text,type){null==type&&(type="text/plain");var pom=document.createElement("a");if(pom.setAttribute("href","data:"+type+";charset=utf-8,"+encodeURIComponent(text)),pom.setAttribute("download",filename),document.createEvent){var event=document.createEvent("MouseEvents");event.initEvent("click",!0,!0),pom.dispatchEvent(event)}else pom.click()},_exports.upload=function(onready,accept){var input=document.createElement("input");input.type="file",Array.isArray(accept)?accept.count>0&&(input.accept=accept.join(", ")):void 0!==accept&&(input.accept=accept);if(input.onchange=function(){var files=Array.from(input.files);if(files.length>0){var file=files[0],reader=new FileReader;reader.onload=function(e){var contents=e.target.result;onready instanceof Function&&onready(file,contents)},reader.readAsText(file)}},document.createEvent){var event=document.createEvent("MouseEvents");event.initEvent("click",!0,!0),input.dispatchEvent(event)}else input.click()}}));
|
||||
define("local_treestudyplan/downloader",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.download=function(filename,text,type){null==type&&(type="text/plain");var pom=document.createElement("a");if(pom.setAttribute("href","data:"+type+";charset=utf-8,"+encodeURIComponent(text)),pom.setAttribute("download",filename),document.createEvent){var event=document.createEvent("MouseEvents");event.initEvent("click",!0,!0),pom.dispatchEvent(event)}else pom.click()},_exports.upload=function(onready,accept){let input=document.createElement("input");input.type="file",Array.isArray(accept)?accept.count>0&&(input.accept=accept.join(", ")):void 0!==accept&&(input.accept=accept);if(input.onchange=()=>{let files=Array.from(input.files);if(files.length>0){let file=files[0];var reader=new FileReader;reader.onload=function(e){var contents=e.target.result;onready instanceof Function&&onready(file,contents)},reader.readAsText(file)}},document.createEvent){var event=document.createEvent("MouseEvents");event.initEvent("click",!0,!0),input.dispatchEvent(event)}else input.click()}}));
|
||||
|
||||
//# sourceMappingURL=downloader.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"downloader.min.js","sources":["../src/downloader.js"],"sourcesContent":["/*eslint no-console: \"off\"*/\n\n/**\n * Save a piece of text to file as if it was downloaded\n * @param {string} filename\n * @param {string} text\n * @param {string} type\n */\nexport function download(filename, text, type) {\n if(undefined == type) { type = \"text/plain\"; }\n var pom = document.createElement('a');\n pom.setAttribute('href', 'data:'+type+';charset=utf-8,' + encodeURIComponent(text));\n pom.setAttribute('download', filename);\n\n if (document.createEvent) {\n var event = document.createEvent('MouseEvents');\n event.initEvent('click', true, true);\n pom.dispatchEvent(event);\n }\n else {\n pom.click();\n }\n}\n\n/**\n * This callback type is called `requestCallback` and is displayed as a global symbol.\n *\n * @callback fileOpenedCallback\n * @param {File} file File name\n * @param {string} content File Contents\n */\n\n/**\n * Open a file from disk and read its contents\n * @param {fileOpenedCallback} onready Callback to run when file is opened\n * @param {Array} accept Array of mime types that the file dialog will accept\n */\nexport function upload(onready,accept) {\n let input = document.createElement('input');\n input.type = 'file';\n if(Array.isArray(accept)){\n if(accept.count > 0){\n input.accept = accept.join(\", \");\n }\n } else if (undefined !== accept){\n input.accept = accept;\n }\n input.onchange = () => {\n let files = Array.from(input.files);\n if(files.length > 0){\n let file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var contents = e.target.result;\n if(onready instanceof Function){\n onready(file,contents);\n }\n };\n reader.readAsText(file);\n }\n };\n\n if (document.createEvent) {\n var event = document.createEvent('MouseEvents');\n event.initEvent('click', true, true);\n input.dispatchEvent(event);\n }\n else {\n input.click();\n }\n}"],"names":["filename","text","type","undefined","pom","document","createElement","setAttribute","encodeURIComponent","createEvent","event","initEvent","dispatchEvent","click","onready","accept","input","Array","isArray","count","join","onchange","files","from","length","file","reader","FileReader","onload","e","contents","target","result","Function","readAsText"],"mappings":"2JAQyBA,SAAUC,KAAMC,MAClCC,MAAaD,OAAQA,KAAO,kBAC3BE,IAAMC,SAASC,cAAc,QACjCF,IAAIG,aAAa,OAAQ,QAAQL,KAAK,kBAAoBM,mBAAmBP,OAC7EG,IAAIG,aAAa,WAAYP,UAEzBK,SAASI,YAAa,KAClBC,MAAQL,SAASI,YAAY,eACjCC,MAAMC,UAAU,SAAS,GAAM,GAC/BP,IAAIQ,cAAcF,YAGlBN,IAAIS,kCAiBWC,QAAQC,YACvBC,MAAQX,SAASC,cAAc,SACnCU,MAAMd,KAAO,OACVe,MAAMC,QAAQH,QACVA,OAAOI,MAAQ,IACdH,MAAMD,OAASA,OAAOK,KAAK,YAExBjB,IAAcY,SACrBC,MAAMD,OAASA,WAEnBC,MAAMK,SAAW,eACLC,MAAUL,MAAMM,KAAKP,MAAMM,UAC5BA,MAAME,OAAS,EAAE,KACZC,KAAOH,MAAM,GACbI,OAAS,IAAIC,WACjBD,OAAOE,OAAS,SAASC,OACjBC,SAAWD,EAAEE,OAAOC,OACrBlB,mBAAmBmB,UAClBnB,QAAQW,KAAKK,WAGrBJ,OAAOQ,WAAWT,QAI1BpB,SAASI,YAAa,KAClBC,MAAQL,SAASI,YAAY,eACjCC,MAAMC,UAAU,SAAS,GAAM,GAC/BK,MAAMJ,cAAcF,YAGpBM,MAAMH"}
|
||||
{"version":3,"file":"downloader.min.js","sources":["../src/downloader.js"],"sourcesContent":["/**\n * Save a piece of text to file as if it was downloaded\n * @param {string} filename\n * @param {string} text\n * @param {string} type\n */\nexport function download(filename, text, type) {\n if (undefined == type) {\n type = \"text/plain\";\n }\n var pom = document.createElement('a');\n pom.setAttribute('href', 'data:' + type + ';charset=utf-8,' + encodeURIComponent(text));\n pom.setAttribute('download', filename);\n\n if (document.createEvent) {\n var event = document.createEvent('MouseEvents');\n event.initEvent('click', true, true);\n pom.dispatchEvent(event);\n } else {\n pom.click();\n }\n}\n\n/**\n * This callback type is called `requestCallback` and is displayed as a global symbol.\n *\n * @callback fileOpenedCallback\n * @param {File} file File name\n * @param {string} content File Contents\n */\n\n/**\n * Open a file from disk and read its contents\n * @param {fileOpenedCallback} onready Callback to run when file is opened\n * @param {Array} accept Array of mime types that the file dialog will accept\n */\nexport function upload(onready, accept) {\n let input = document.createElement('input');\n input.type = 'file';\n if (Array.isArray(accept)) {\n if (accept.count > 0) {\n input.accept = accept.join(\", \");\n }\n } else if (undefined !== accept) {\n input.accept = accept;\n }\n input.onchange = () => {\n let files = Array.from(input.files);\n if (files.length > 0) {\n let file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var contents = e.target.result;\n if (onready instanceof Function) {\n onready(file, contents);\n }\n };\n reader.readAsText(file);\n }\n };\n\n if (document.createEvent) {\n var event = document.createEvent('MouseEvents');\n event.initEvent('click', true, true);\n input.dispatchEvent(event);\n } else {\n input.click();\n }\n}"],"names":["filename","text","type","undefined","pom","document","createElement","setAttribute","encodeURIComponent","createEvent","event","initEvent","dispatchEvent","click","onready","accept","input","Array","isArray","count","join","onchange","files","from","length","file","reader","FileReader","onload","e","contents","target","result","Function","readAsText"],"mappings":"2JAMyBA,SAAUC,KAAMC,MACjCC,MAAaD,OACbA,KAAO,kBAEPE,IAAMC,SAASC,cAAc,QACjCF,IAAIG,aAAa,OAAQ,QAAUL,KAAO,kBAAoBM,mBAAmBP,OACjFG,IAAIG,aAAa,WAAYP,UAEzBK,SAASI,YAAa,KAClBC,MAAQL,SAASI,YAAY,eACjCC,MAAMC,UAAU,SAAS,GAAM,GAC/BP,IAAIQ,cAAcF,YAElBN,IAAIS,kCAiBWC,QAASC,YACxBC,MAAQX,SAASC,cAAc,SACnCU,MAAMd,KAAO,OACTe,MAAMC,QAAQH,QACVA,OAAOI,MAAQ,IACfH,MAAMD,OAASA,OAAOK,KAAK,YAExBjB,IAAcY,SACrBC,MAAMD,OAASA,WAEnBC,MAAMK,SAAW,SACLC,MAAQL,MAAMM,KAAKP,MAAMM,UACzBA,MAAME,OAAS,EAAG,KACdC,KAAOH,MAAM,OACbI,OAAS,IAAIC,WACjBD,OAAOE,OAAS,SAASC,OACjBC,SAAWD,EAAEE,OAAOC,OACpBlB,mBAAmBmB,UACnBnB,QAAQW,KAAMK,WAGtBJ,OAAOQ,WAAWT,QAI1BpB,SAASI,YAAa,KAClBC,MAAQL,SAASI,YAAY,eACjCC,MAAMC,UAAU,SAAS,GAAM,GAC/BK,MAAMJ,cAAcF,YAEpBM,MAAMH"}
|
2
amd/build/modedit-modal.min.js
vendored
2
amd/build/modedit-modal.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/modedit-modal",["exports","core/fragment","./util/string-helper","core/ajax","core/notification","core/templates"],(function(_exports,_fragment,_stringHelper,_ajax,_notification,_templates){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_notification=(obj=_notification)&&obj.__esModule?obj:{default:obj};var _default={install:function(Vue){var strings=(0,_stringHelper.load_strings)({editmod:{save$core:"save$core",cancel$core:"cancel$core"}});Vue.component("s-edit-mod",{props:{cmid:{type:Number},coursectxid:{type:Number},title:{type:String,default:""},genericonly:{type:Boolean,default:!1}},data:function(){return{content:"",text:strings.editmod}},computed:{},methods:{openForm:function(){this.$refs.editormodal.show()},onShown:function(){var self=this,params={cmid:this.cmid};console.info("Loading form"),(0,_fragment.loadFragment)("local_treestudyplan","mod_edit_form",this.coursectxid,params).then((function(html,js){(0,_templates.replaceNodeContents)(self.$refs.content,html,js)})).catch(_notification.default.exception)},onSave:function(){var self=this,form=this.$refs.content.getElementsByTagName("form")[0];form.dispatchEvent(new Event("save-form-state"));var formdata=new FormData(form),data=new URLSearchParams(formdata).toString();(0,_ajax.call)([{methodname:"local_treestudyplan_submit_cm_editform",args:{cmid:this.cmid,formdata:data}}])[0].done((function(){self.$emit("saved",formdata)})).fail(_notification.default.exception)}},template:'\n <span class=\'s-edit-mod\'><a href=\'#\' @click.prevent="openForm"><slot><i class="fa fa-cog"></i></slot></a>\n <b-modal \n ref="editormodal"\n scrollable\n centered\n size="xl"\n id="\'modal-cm-\'+cmid"\n @shown="onShown"\n @ok="onSave"\n :title="title"\n :ok-title="text.save$core"\n ><div :class="\'s-edit-mod-form \'+ (genericonly?\'genericonly\':\'\')" ref="content"\n ><div class="d-flex justify-content-center mb-3"><b-spinner variant="primary"></b-spinner></div\n ></div\n ></b-modal>\n </span>\n '})}};return _exports.default=_default,_exports.default}));
|
||||
define("local_treestudyplan/modedit-modal",["exports","core/fragment","./util/string-helper","core/ajax","core/notification","core/templates"],(function(_exports,_fragment,_stringHelper,_ajax,_notification,_templates){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_notification=(obj=_notification)&&obj.__esModule?obj:{default:obj};var _default={install(Vue){let strings=(0,_stringHelper.loadStrings)({editmod:{save$core:"save$core",cancel$core:"cancel$core"}});Vue.component("s-edit-mod",{props:{cmid:{type:Number},coursectxid:{type:Number},title:{type:String,default:""},genericonly:{type:Boolean,default:!1}},data:()=>({content:"",text:strings.editmod}),computed:{},methods:{openForm(){this.$refs.editormodal.show()},onShown(){const self=this;let params={cmid:this.cmid};(0,_fragment.loadFragment)("local_treestudyplan","mod_edit_form",this.coursectxid,params).then(((html,js)=>((0,_templates.replaceNodeContents)(self.$refs.content,html,js),null))).catch(_notification.default.exception)},onSave(){const self=this;let form=this.$refs.content.getElementsByTagName("form")[0];form.dispatchEvent(new Event("save-form-state"));const formdata=new FormData(form),data=new URLSearchParams(formdata).toString();(0,_ajax.call)([{methodname:"local_treestudyplan_submit_cm_editform",args:{cmid:this.cmid,formdata:data}}])[0].then((()=>(self.$emit("saved",formdata),null))).catch(_notification.default.exception)}},template:'\n <span class=\'s-edit-mod\'><a href=\'#\' @click.prevent="openForm"><slot><i class="fa fa-cog"></i></slot></a>\n <b-modal\n ref="editormodal"\n scrollable\n centered\n size="xl"\n id="\'modal-cm-\'+cmid"\n @shown="onShown"\n @ok="onSave"\n :title="title"\n :ok-title="text.save$core"\n ><div :class="\'s-edit-mod-form \'+ (genericonly?\'genericonly\':\'\')" ref="content"\n ><div class="d-flex justify-content-center mb-3"><b-spinner variant="primary"></b-spinner></div\n ></div\n ></b-modal>\n </span>\n '})}};return _exports.default=_default,_exports.default}));
|
||||
|
||||
//# sourceMappingURL=modedit-modal.min.js.map
|
File diff suppressed because one or more lines are too long
3
amd/build/page-coach.min.js
vendored
Normal file
3
amd/build/page-coach.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
amd/build/page-coach.min.js.map
Normal file
1
amd/build/page-coach.min.js.map
Normal file
File diff suppressed because one or more lines are too long
2
amd/build/page-edit-plan.min.js
vendored
2
amd/build/page-edit-plan.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/page-invitemanager.min.js
vendored
2
amd/build/page-invitemanager.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/page-invitemanager",["jquery","core/str","core/ajax","core/modal_factory","core/modal_events","local_treestudyplan/handlers","local_treestudyplan/debugger"],(function($,str,ajax,ModalFactory,ModalEvents,handlers,Debugger){var debug=new Debugger("treestudyplan");return{init:function(){$(".path-local-treestudyplan a.m-action-confirm").on("click",(function(e){e.preventDefault();var $link=$(e.currentTarget),href=$link.attr("data-actionhref"),text=$link.attr("data-confirmtext"),oktext=$link.attr("data-confirmbtn");debug.info("Ok",oktext),null==oktext&&(oktext=str.get_string("ok"));var title=$link.attr("data-confirmtitle");debug.info("Title",title),null==title&&(title=str.get_string("confirm")),debug.info("Link, href, text",$link,href,text),ModalFactory.create({type:ModalFactory.types.SAVE_CANCEL,title:title,body:text}).then((function(modal){modal.setSaveButtonText(oktext),modal.getRoot().on(ModalEvents.save,(function(){window.location=href})),$(modal.modal).css("max-width","345px"),modal.show()}))}))}}}));
|
||||
define("local_treestudyplan/page-invitemanager",["exports","./util/debugger","core/str","core/modal_factory","core/modal_events"],(function(_exports,_debugger,_str,_modal_factory,_modal_events){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(){getstrFunc([{key:"ok",component:"core"},{key:"confirm",component:"core"}]).then((s=>{const strOk=s[0],strConfirm=s[1];document.querySelectorAll(".path-local-treestudyplan a.m-action-confirm").forEach((el=>{el.addEventListener("click",(e=>{e.preventDefault();const link=e.currentTarget;let href=link.getAttribute("data-actionhref"),text=link.getAttribute("data-confirmtext"),oktext=link.getAttribute("data-confirmbtn");null==oktext&&(oktext=strOk);let title=link.getAttribute("data-confirmtitle");null==title&&(title=strConfirm),_modal_factory.default.create({type:_modal_factory.default.types.SAVE_CANCEL,title:title,body:text}).then((modal=>(modal.setSaveButtonText(oktext),modal.getRoot().on(_modal_events.default.save,(()=>{window.location=href})),modal.modal[0].style["max-width"]="345px",modal.show(),modal))).catch((x=>{debug.warn(x)}))}))}))})).catch((x=>{debug.warn(x)}))},_debugger=_interopRequireDefault(_debugger),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events);const getstrFunc=void 0!==_str.getStrings?_str.getStrings:_str.get_strings;let debug=new _debugger.default("treestudyplan-invitemanager")}));
|
||||
|
||||
//# sourceMappingURL=page-invitemanager.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"page-invitemanager.min.js","sources":["../src/page-invitemanager.js"],"sourcesContent":["/*eslint no-var: \"error\" */\n/*eslint no-unused-vars: \"off\" */\n/*eslint linebreak-style: \"off\" */\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\ndefine(['jquery', 'core/str', 'core/ajax', 'core/modal_factory', 'core/modal_events',\n 'local_treestudyplan/handlers', 'local_treestudyplan/debugger'],\nfunction ($, str, ajax, ModalFactory, ModalEvents,\n handlers, Debugger) {\n let debug = new Debugger(\"treestudyplan\");\n\n let self = {\n init: function init() {\n $('.path-local-treestudyplan a.m-action-confirm').on('click', function (e) {\n e.preventDefault();\n let $link = $(e.currentTarget);\n let href = $link.attr('data-actionhref');\n let text = $link.attr('data-confirmtext');\n let oktext = $link.attr('data-confirmbtn');\n debug.info(\"Ok\", oktext);\n if (undefined == oktext) { oktext = str.get_string('ok'); }\n let title = $link.attr('data-confirmtitle');\n debug.info(\"Title\", title);\n if (undefined == title) { title = str.get_string('confirm'); }\n\n debug.info(\"Link, href, text\", $link, href, text);\n\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: title,\n body: text,\n }).then(function (modal) {\n modal.setSaveButtonText(oktext);\n\n let root = modal.getRoot();\n root.on(ModalEvents.save, function () {\n window.location = href;\n });\n\n $(modal.modal).css(\"max-width\", \"345px\");\n modal.show();\n });\n });\n },\n\n\n };\n return self;\n});"],"names":["define","$","str","ajax","ModalFactory","ModalEvents","handlers","Debugger","debug","init","on","e","preventDefault","$link","currentTarget","href","attr","text","oktext","info","undefined","get_string","title","create","type","types","SAVE_CANCEL","body","then","modal","setSaveButtonText","getRoot","save","window","location","css","show"],"mappings":"AAOAA,gDAAO,CAAC,SAAU,WAAY,YAAa,qBAAsB,oBACzD,+BAAgC,iCACxC,SAAUC,EAAGC,IAAKC,KAAMC,aAAcC,YAC5BC,SAAUC,cACZC,MAAQ,IAAID,SAAS,uBAEd,CACPE,KAAM,WACFR,EAAE,gDAAgDS,GAAG,SAAS,SAAUC,GACpEA,EAAEC,qBACEC,MAAQZ,EAAEU,EAAEG,eACZC,KAAOF,MAAMG,KAAK,mBAClBC,KAAOJ,MAAMG,KAAK,oBAClBE,OAASL,MAAMG,KAAK,mBACxBR,MAAMW,KAAK,KAAMD,QACbE,MAAaF,SAAUA,OAAShB,IAAImB,WAAW,WAC/CC,MAAQT,MAAMG,KAAK,qBACvBR,MAAMW,KAAK,QAASG,OAChBF,MAAaE,QAASA,MAAQpB,IAAImB,WAAW,YAEjDb,MAAMW,KAAK,mBAAoBN,MAAOE,KAAME,MAE5Cb,aAAamB,OAAO,CAChBC,KAAMpB,aAAaqB,MAAMC,YACzBJ,MAAOA,MACPK,KAAMV,OACPW,MAAK,SAAUC,OACdA,MAAMC,kBAAkBZ,QAEbW,MAAME,UACZrB,GAAGL,YAAY2B,MAAM,WACtBC,OAAOC,SAAWnB,QAGtBd,EAAE4B,MAAMA,OAAOM,IAAI,YAAa,SAChCN,MAAMO,cAQzB"}
|
||||
{"version":3,"file":"page-invitemanager.min.js","sources":["../src/page-invitemanager.js"],"sourcesContent":["/* eslint no-var: \"error\" */\n/* eslint no-unused-vars: \"off\" */\n/* eslint linebreak-style: \"off\" */\n/* eslint promise/no-nesting: \"off\" */\n/* eslint-env es6*/\n/* eslint camelcase: \"off\" */\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\nimport Debugger from './util/debugger';\nimport {get_strings} from 'core/str';\nimport {getStrings} from 'core/str';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\n\n/* Determine the proper getstrings function to use (MDL4.3+ recommends use of getStrings, which is jquery independent) */\nconst getstrFunc = (getStrings !== undefined) ? getStrings : get_strings;\n\nlet debug = new Debugger(\"treestudyplan-invitemanager\");\n\n /**\n * Init function for page-invitemanager\n */\nexport function init() {\n getstrFunc([\n {key: 'ok', component: 'core'},\n {key: 'confirm', component: 'core'},\n ]).then((s) => {\n const strOk = s[0];\n const strConfirm = s[1];\n\n const els = document.querySelectorAll('.path-local-treestudyplan a.m-action-confirm');\n els.forEach((el) => {\n el.addEventListener('click', (e) => {\n e.preventDefault();\n const link = e.currentTarget;\n let href = link.getAttribute('data-actionhref');\n let text = link.getAttribute('data-confirmtext');\n let oktext = link.getAttribute('data-confirmbtn');\n if (undefined == oktext) {\n oktext = strOk;\n }\n let title = link.getAttribute('data-confirmtitle');\n if (undefined == title) {\n title = strConfirm;\n }\n\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: title,\n body: text,\n }).then((modal) => {\n modal.setSaveButtonText(oktext);\n\n let root = modal.getRoot();\n root.on(ModalEvents.save, () => {\n window.location = href;\n });\n modal.modal[0].style[\"max-width\"] = \"345px\";\n modal.show();\n return modal;\n }).catch((x) => {\n debug.warn(x);\n });\n });\n });\n return;\n }).catch((x) => {\n debug.warn(x);\n });\n}\n"],"names":["getstrFunc","key","component","then","s","strOk","strConfirm","document","querySelectorAll","forEach","el","addEventListener","e","preventDefault","link","currentTarget","href","getAttribute","text","oktext","undefined","title","create","type","ModalFactory","types","SAVE_CANCEL","body","modal","setSaveButtonText","getRoot","on","ModalEvents","save","window","location","style","show","catch","x","debug","warn","getStrings","get_strings","Debugger"],"mappings":"qWAwBIA,WAAW,CACP,CAACC,IAAK,KAAMC,UAAW,QACvB,CAACD,IAAK,UAAWC,UAAW,UAC7BC,MAAMC,UACCC,MAAQD,EAAE,GACVE,WAAaF,EAAE,GAETG,SAASC,iBAAiB,gDAClCC,SAASC,KACTA,GAAGC,iBAAiB,SAAUC,IAC1BA,EAAEC,uBACIC,KAAOF,EAAEG,kBACXC,KAAOF,KAAKG,aAAa,mBACzBC,KAAOJ,KAAKG,aAAa,oBACzBE,OAASL,KAAKG,aAAa,mBAC3BG,MAAaD,SACbA,OAASd,WAETgB,MAAQP,KAAKG,aAAa,qBAC1BG,MAAaC,QACbA,MAAQf,mCAGCgB,OAAO,CAChBC,KAAMC,uBAAaC,MAAMC,YACzBL,MAAOA,MACPM,KAAMT,OACPf,MAAMyB,QACLA,MAAMC,kBAAkBV,QAEbS,MAAME,UACZC,GAAGC,sBAAYC,MAAM,KACtBC,OAAOC,SAAWnB,IAAlB,IAEJY,MAAMA,MAAM,GAAGQ,MAAM,aAAe,QACpCR,MAAMS,OACCT,SACRU,OAAOC,IACNC,MAAMC,KAAKF,eAKxBD,OAAOC,IACNC,MAAMC,KAAKF,mKApDbvC,gBAA6BoB,IAAfsB,gBAA4BA,gBAAaC,qBAEzDH,MAAQ,IAAII,kBAAS"}
|
2
amd/build/page-myreport.min.js
vendored
2
amd/build/page-myreport.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/page-myreport",["exports","core/ajax","core/notification","./vue/vue","./report-viewer-components","./treestudyplan-components","./util/debugger","./studyplan-processor","./portal-vue/portal-vue.esm","./bootstrap-vue/bootstrap-vue.esm"],(function(_exports,_ajax,_notification,_vue,_reportViewerComponents,_treestudyplanComponents,_debugger,_studyplanProcessor,_portalVue,_bootstrapVue){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(){var type=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"myreport",arg=arguments.length>1?arguments[1]:void 0,app=new _vue.default({el:"#root",data:{studyplans:[]},mounted:function(){var call_method,call_args;"invited"==type?(call_method="local_treestudyplan_get_invited_studyplan",call_args={invitekey:arg}):"other"==type?(call_method="local_treestudyplan_get_user_studyplans",call_args={userid:arg}):"teaching"==type?(call_method="local_treestudyplan_get_teaching_studyplans",call_args={}):(call_method="local_treestudyplan_get_own_studyplan",call_args={}),(0,_ajax.call)([{methodname:call_method,args:call_args}])[0].done((function(response){debug.info("Studyplans:",response);var timingval={future:0,present:1,past:2};response.sort((function(a,b){var timinga=_treestudyplanComponents.default.studyplanTiming(a),timingb=_treestudyplanComponents.default.studyplanTiming(b),t=timingval[timinga]-timingval[timingb];return 0==t&&0==(t=new Date(b.startdate).getTime()-new Date(a.startdate).getTime())&&(t=a.name.localeCompare(b.name)),t})),app.studyplans=(0,_studyplanProcessor.ProcessStudyplans)(response)})).fail(_notification.default.exception)},methods:{}})},_notification=_interopRequireDefault(_notification),_vue=_interopRequireDefault(_vue),_reportViewerComponents=_interopRequireDefault(_reportViewerComponents),_treestudyplanComponents=_interopRequireDefault(_treestudyplanComponents),_debugger=_interopRequireDefault(_debugger),_portalVue=_interopRequireDefault(_portalVue),_bootstrapVue=_interopRequireDefault(_bootstrapVue),_vue.default.use(_reportViewerComponents.default),_vue.default.use(_portalVue.default),_vue.default.use(_bootstrapVue.default);var debug=new _debugger.default("treestudyplan-report")}));
|
||||
define("local_treestudyplan/page-myreport",["exports","./vue/vue","./report-viewer-components","./portal-vue/portal-vue.esm","./bootstrap-vue/bootstrap-vue"],(function(_exports,_vue,_reportViewerComponents,_portalVue,_bootstrapVue){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(){let type=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"own",arg1=arguments.length>1?arguments[1]:void 0;new _vue.default({el:"#root",data:{studyplans:[],type:type,invitekey:"invited"==type?arg1:null,userid:"other"==type?arg1:null},methods:{}})},_vue=_interopRequireDefault(_vue),_reportViewerComponents=_interopRequireDefault(_reportViewerComponents),_portalVue=_interopRequireDefault(_portalVue),_bootstrapVue=_interopRequireDefault(_bootstrapVue),_vue.default.use(_reportViewerComponents.default),_vue.default.use(_portalVue.default),_vue.default.use(_bootstrapVue.default)}));
|
||||
|
||||
//# sourceMappingURL=page-myreport.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"page-myreport.min.js","sources":["../src/page-myreport.js"],"sourcesContent":["/*eslint no-var: \"error\" */\n/*eslint no-unused-vars: \"off\" */\n/*eslint linebreak-style: \"off\" */\n/*eslint no-trailing-spaces: \"off\" */\n/*eslint no-console: \"off\" */\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\nimport {call} from 'core/ajax';\nimport notification from 'core/notification';\n\nimport Vue from './vue/vue';\n\nimport RVComponents from './report-viewer-components';\nVue.use(RVComponents);\n\nimport TSComponents from './treestudyplan-components';\nimport Debugger from './util/debugger';\n\nimport {ProcessStudyplans} from './studyplan-processor';\n\n\nimport PortalVue from './portal-vue/portal-vue.esm';\nVue.use(PortalVue);\nimport BootstrapVue from './bootstrap-vue/bootstrap-vue.esm';\nVue.use(BootstrapVue);\n\nlet debug = new Debugger(\"treestudyplan-report\");\n\n/**\n * Initialize the Page\n * @param {string} type Type of page to show\n * @param {Object} arg Arguments passed\n */\n export function init(type=\"myreport\",arg) {\n let app = new Vue({\n el: '#root',\n data: {\n \"studyplans\": [],\n },\n mounted() {\n let call_method;\n let call_args;\n if(type == \"invited\"){\n call_method = 'local_treestudyplan_get_invited_studyplan';\n call_args = {\"invitekey\": arg};\n }\n else if(type == \"other\"){\n call_method = 'local_treestudyplan_get_user_studyplans';\n call_args = {\"userid\": arg};\n }\n else if(type == \"teaching\"){\n call_method = 'local_treestudyplan_get_teaching_studyplans';\n call_args = {};\n }\n else{\n call_method = 'local_treestudyplan_get_own_studyplan';\n call_args = {};\n }\n call([{\n methodname: call_method,\n args: call_args\n }])[0].done(function(response){\n debug.info(\"Studyplans:\",response);\n const timingval = { future: 0, present: 1, past: 2, };\n response.sort((a,b) => {\n const timinga = TSComponents.studyplanTiming(a);\n const timingb = TSComponents.studyplanTiming(b);\n\n let t = timingval[timinga] - timingval[timingb];\n if(t == 0){\n // sort by start date if timing is equal\n t = new Date(b.startdate).getTime() - new Date(a.startdate).getTime();\n \n if (t == 0) {\n // sort by name if timing is equal\n t = a.name.localeCompare(b.name);\n }\n }\n return t;\n });\n app.studyplans = ProcessStudyplans(response);\n }).fail(notification.exception); \n \n },\n\n methods: {\n \n },\n });\n\n}\n\n"],"names":["type","arg","app","Vue","el","data","mounted","call_method","call_args","methodname","args","done","response","debug","info","timingval","future","present","past","sort","a","b","timinga","TSComponents","studyplanTiming","timingb","t","Date","startdate","getTime","name","localeCompare","studyplans","fail","notification","exception","methods","use","RVComponents","PortalVue","BootstrapVue","Debugger"],"mappings":"qkBAmCsBA,4DAAK,WAAWC,2CAC9BC,IAAM,IAAIC,aAAI,CACdC,GAAI,QACJC,KAAM,YACY,IAElBC,uBACQC,YACAC,UACO,WAARR,MACCO,YAAc,4CACdC,UAAY,WAAcP,MAEd,SAARD,MACJO,YAAc,0CACdC,UAAY,QAAWP,MAEX,YAARD,MACJO,YAAc,8CACdC,UAAY,KAGZD,YAAc,wCACdC,UAAY,mBAEX,CAAC,CACFC,WAAYF,YACZG,KAAMF,aACN,GAAGG,MAAK,SAASC,UACjBC,MAAMC,KAAK,cAAcF,cACnBG,UAAY,CAAEC,OAAQ,EAAGC,QAAS,EAAGC,KAAM,GACjDN,SAASO,MAAK,SAACC,EAAEC,OACPC,QAAUC,iCAAaC,gBAAgBJ,GACvCK,QAAUF,iCAAaC,gBAAgBH,GAEzCK,EAAIX,UAAUO,SAAWP,UAAUU,gBAC/B,GAALC,GAIU,IAFTA,EAAI,IAAIC,KAAKN,EAAEO,WAAWC,UAAY,IAAIF,KAAKP,EAAEQ,WAAWC,aAIxDH,EAAIN,EAAEU,KAAKC,cAAcV,EAAES,OAG5BJ,KAEXxB,IAAI8B,YAAa,yCAAkBpB,aACpCqB,KAAKC,sBAAaC,YAIzBC,QAAS,yYAxEbC,IAAIC,8CASJD,IAAIE,iCAEJF,IAAIG,2BAEJ3B,MAAQ,IAAI4B,kBAAS"}
|
||||
{"version":3,"file":"page-myreport.min.js","sources":["../src/page-myreport.js"],"sourcesContent":["/* eslint no-unused-vars: \"off\" */\n/* eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\nimport Vue from './vue/vue';\n\nimport RVComponents from './report-viewer-components';\nVue.use(RVComponents);\n\nimport PortalVue from './portal-vue/portal-vue.esm';\nVue.use(PortalVue);\nimport BootstrapVue from './bootstrap-vue/bootstrap-vue';\nVue.use(BootstrapVue);\n\n/**\n * Initialize the Page\n * @param {string} type Type of page to show\n * @param {Object} arg1 Argument1 as passed\n */\n export function init(type = \"own\", arg1) {\n let app = new Vue({\n el: '#root',\n data: {\n \"studyplans\": [],\n \"type\": type,\n \"invitekey\": (type == \"invited\") ? arg1 : null,\n \"userid\": (type == \"other\") ? arg1 : null,\n },\n methods: {\n\n },\n });\n\n}\n\n"],"names":["type","arg1","Vue","el","data","methods","use","RVComponents","PortalVue","BootstrapVue"],"mappings":"+YAoBsBA,4DAAO,MAAOC,4CACtB,IAAIC,aAAI,CACdC,GAAI,QACJC,KAAM,YACY,QACNJ,eACc,WAARA,KAAqBC,KAAO,YACvB,SAARD,KAAmBC,KAAO,MAEzCI,QAAS,+NArBbC,IAAIC,8CAGJD,IAAIE,iCAEJF,IAAIG"}
|
3
amd/build/page-result-overview.min.js
vendored
Normal file
3
amd/build/page-result-overview.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/page-result-overview",["exports","core/ajax","core/notification","./vue/vue","./util/debugger","./util/string-helper","./studyplan-report-components","./report-viewer-components","./modedit-modal","./portal-vue/portal-vue.esm","./bootstrap-vue/bootstrap-vue"],(function(_exports,_ajax,_notification,_vue,_debugger,_stringHelper,_studyplanReportComponents,_reportViewerComponents,_modeditModal,_portalVue,_bootstrapVue){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(studyplanid,pageid,firstperiod,lastperiod){if(void 0===pageid||!Number.isInteger(Number(pageid))||void 0===studyplanid||!Number.isInteger(Number(studyplanid)))return void debug.error("Error: studyplan id and page id not provided as integer numbers to script.",studyplanid,pageid,firstperiod,lastperiod);studyplanid=Number(studyplanid),pageid=Number(pageid);new _vue.default({el:"#root",data:{structure:null,studyplan:null,page:null,text:strings.studyplanReport},created(){this.loadStructure(pageid,firstperiod,lastperiod)},computed:{},methods:{loadStructure(pageid,firstperiod,lastperiod){const self=this;this.structure=null,(0,_ajax.call)([{methodname:"local_treestudyplan_get_report_structure",args:{pageid:pageid,firstperiod:firstperiod,lastperiod:lastperiod}}])[0].then((response=>{self.structure=response,self.studyplan=response.studyplan,self.page=response.page})).catch(_notification.default.exception)},selectedPage(e){debug.info("SelectedPage",e);const pageid=e.target.value;this.loadStructure(pageid)},selectedFirstPeriod(e){debug.info("selectedFirstPeriod",e);let f=e.target.value,l=this.structure.lastperiod;l<f&&(l=f),this.loadStructure(this.page.id,f,l)},selectedLastPeriod(e){debug.info("selectedLastPeriod",e);let f=this.structure.firstperiod,l=e.target.value;l<f&&(l=f),this.loadStructure(this.page.id,f,l)}}})},_notification=_interopRequireDefault(_notification),_vue=_interopRequireDefault(_vue),_debugger=_interopRequireDefault(_debugger),_studyplanReportComponents=_interopRequireDefault(_studyplanReportComponents),_reportViewerComponents=_interopRequireDefault(_reportViewerComponents),_modeditModal=_interopRequireDefault(_modeditModal),_portalVue=_interopRequireDefault(_portalVue),_bootstrapVue=_interopRequireDefault(_bootstrapVue),_vue.default.use(_studyplanReportComponents.default),_vue.default.use(_reportViewerComponents.default),_vue.default.use(_modeditModal.default),_vue.default.use(_portalVue.default),_vue.default.use(_bootstrapVue.default);let debug=new _debugger.default("treestudyplanviewer"),strings=(0,_stringHelper.loadStrings)({studyplanReport:{studyplan:"studyplan",page:"studyplanpage",periods:"periods",period:"period",loading:"loading@core",all:"all@core",from:"from@core",to:"to@core"}})}));
|
||||
|
||||
//# sourceMappingURL=page-result-overview.min.js.map
|
1
amd/build/page-result-overview.min.js.map
Normal file
1
amd/build/page-result-overview.min.js.map
Normal file
File diff suppressed because one or more lines are too long
2
amd/build/page-view-plan.min.js
vendored
2
amd/build/page-view-plan.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/portal-vue/portal-vue.esm.min.js
vendored
2
amd/build/portal-vue/portal-vue.esm.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/primary-nav-tools.min.js
vendored
2
amd/build/primary-nav-tools.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/primary-nav-tools",["exports","./util/debugger"],(function(_exports,_debugger){var obj;function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.hide_primary=function(hrefs){var element=document.createElement("style");document.head.appendChild(element);var sheet=element.sheet;("string"==typeof hrefs||hrefs instanceof String)&&(hrefs=[hrefs]);if("object"===_typeof(hrefs)&&Array.isArray(hrefs))for(var ix in hrefs){var href=hrefs[ix];debug.info("Hiding",href);var style='\n .primary-navigation li.nav-item > a[href*="'.concat(href,'"] {\n display: none;\n }\n ');debug.info("Adding style",style),sheet.insertRule(style,sheet.cssRules.length)}debug.info("stylesheet",sheet)};var debug=new(_debugger=(obj=_debugger)&&obj.__esModule?obj:{default:obj}).default("primary-nav-tools")}));
|
||||
define("local_treestudyplan/primary-nav-tools",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.hidePrimary=function(hrefs){("string"==typeof hrefs||hrefs instanceof String)&&(hrefs=[hrefs]);if("object"==typeof hrefs&&Array.isArray(hrefs)){let css="";for(const ix in hrefs){const href=hrefs[ix];css+=`\n .primary-navigation a[href*="${href}"],\n #usernavigation a[href*="${href}"],\n .drawer-primary a[href*="${href}"] {\n display: none !important;\n }\n `}const element=document.createElement("style");element.setAttribute("type","text/css"),"textContent"in element?element.textContent=css:element.styleSheet.cssText=css,document.head.appendChild(element)}}}));
|
||||
|
||||
//# sourceMappingURL=primary-nav-tools.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"primary-nav-tools.min.js","sources":["../src/primary-nav-tools.js"],"sourcesContent":["/*eslint no-var: \"error\" */\n/*eslint no-unused-vars: \"off\" */\n/*eslint linebreak-style: \"off\" */\n/*eslint no-trailing-spaces: \"off\" */\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\nimport Debugger from './util/debugger';\nlet debug = new Debugger(\"primary-nav-tools\");\n\n/**\n * Hide a primary navigation item by href\n * @param {string|Array} hrefs The link that should be hidden\n */\nexport function hide_primary(hrefs) {\n let element = document.createElement('style');\n document.head.appendChild(element);\n let sheet = element.sheet;\n\n if(typeof hrefs === 'string' || hrefs instanceof String){\n hrefs = [hrefs];\n }\n\n if(typeof hrefs === 'object' && Array.isArray(hrefs)){\n for(const ix in hrefs){\n const href = hrefs[ix];\n debug.info(\"Hiding\",href);\n let style = `\n .primary-navigation li.nav-item > a[href*=\"${href}\"] {\n display: none;\n }\n `;\n debug.info(\"Adding style\",style);\n\n sheet.insertRule(style, sheet.cssRules.length);\n }\n }\n debug.info(\"stylesheet\",sheet);\n}\n"],"names":["hrefs","element","document","createElement","head","appendChild","sheet","String","_typeof","Array","isArray","ix","href","debug","info","style","insertRule","cssRules","length"],"mappings":"odAc6BA,WACrBC,QAAUC,SAASC,cAAc,SACrCD,SAASE,KAAKC,YAAYJ,aACtBK,MAAQL,QAAQK,OAEA,iBAAVN,OAAsBA,iBAAiBO,UAC7CP,MAAQ,CAACA,WAGO,WAAjBQ,QAAOR,QAAsBS,MAAMC,QAAQV,WACtC,IAAMW,MAAMX,MAAM,KACZY,KAAOZ,MAAMW,IACnBE,MAAMC,KAAK,SAASF,UAChBG,6EAC6CH,kFAIjDC,MAAMC,KAAK,eAAeC,OAE1BT,MAAMU,WAAWD,MAAOT,MAAMW,SAASC,QAG/CL,MAAMC,KAAK,aAAaR,YA7BxBO,MAAQ,yEAAa"}
|
||||
{"version":3,"file":"primary-nav-tools.min.js","sources":["../src/primary-nav-tools.js"],"sourcesContent":["/* eslint-env es6*/\n/* eslint no-console: \"off\"*/\n\n/**\n * Hide a primary navigation item by href\n * @param {string|Array} hrefs The link that should be hidden\n */\nexport function hidePrimary(hrefs) {\n if (typeof hrefs === 'string' || hrefs instanceof String) {\n hrefs = [hrefs];\n }\n\n if (typeof hrefs === 'object' && Array.isArray(hrefs)) {\n let css = '';\n for (const ix in hrefs) {\n const href = hrefs[ix];\n css += `\n .primary-navigation a[href*=\"${href}\"],\n #usernavigation a[href*=\"${href}\"],\n .drawer-primary a[href*=\"${href}\"] {\n display: none !important;\n }\n `;\n }\n\n\n const element = document.createElement('style');\n element.setAttribute('type', 'text/css');\n\n if ('textContent' in element) {\n element.textContent = css;\n } else {\n element.styleSheet.cssText = css;\n }\n\n document.head.appendChild(element);\n\n }\n}\n"],"names":["hrefs","String","Array","isArray","css","ix","href","element","document","createElement","setAttribute","textContent","styleSheet","cssText","head","appendChild"],"mappings":"qKAO4BA,QACH,iBAAVA,OAAsBA,iBAAiBC,UAC9CD,MAAQ,CAACA,WAGQ,iBAAVA,OAAsBE,MAAMC,QAAQH,OAAQ,KAC/CI,IAAM,OACL,MAAMC,MAAML,MAAO,OACdM,KAAON,MAAMK,IACnBD,KAAQ,kDAC2BE,qDACJA,qDACAA,iGAO7BC,QAAUC,SAASC,cAAc,SACvCF,QAAQG,aAAa,OAAQ,YAEzB,gBAAiBH,QACjBA,QAAQI,YAAcP,IAEtBG,QAAQK,WAAWC,QAAUT,IAGjCI,SAASM,KAAKC,YAAYR"}
|
2
amd/build/report-viewer-components.min.js
vendored
2
amd/build/report-viewer-components.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/simpleline/css-calc.min.js
vendored
2
amd/build/simpleline/css-calc.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/simpleline/css-calc",["exports"],(function(_exports){function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);enumerableOnly&&(symbols=symbols.filter((function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable}))),keys.push.apply(keys,symbols)}return keys}function _objectSpread(target){for(var i=1;i<arguments.length;i++){var source=null!=arguments[i]?arguments[i]:{};i%2?ownKeys(Object(source),!0).forEach((function(key){_defineProperty(target,key,source[key])})):Object.getOwnPropertyDescriptors?Object.defineProperties(target,Object.getOwnPropertyDescriptors(source)):ownKeys(Object(source)).forEach((function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))}))}return target}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.Units=_exports.UnitRegexpStr=_exports.UnitRegexpGM=_exports.UnitRegexp=_exports.Relative=_exports.Absolute=void 0,_exports.calc=calc,_exports.calcCtx=calcCtx,_exports.convert=convert,_exports.convertAllInStr=convertAllInStr;var Absolute={px:1,cm:96/2.54,mm:96/25.4,Q:96/101.6,in:96,pc:16,pt:96/72};_exports.Absolute=Absolute;var Relative={vh:function(){var count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.viewportHeight:window.innerHeight)/100*count},vw:function(){var count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.viewportWidth:window.innerWidth)/100*count},vmin:function(){var count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?Math.min(ctx.viewportWidth,ctx.viewportHeight):Math.min(window.innerWidth,window.innerHeight))/100*count},vmax:function(){var count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?Math.max(ctx.viewportWidth,ctx.viewportHeight):Math.max(window.innerWidth,window.innerHeight))/100*count},rem:function(){var count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize))*count},"%w":function(){var count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.width:document.body.clientWidth)/100*count},"%h":function(){var count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.height:document.body.clientHeight)/100*count}};_exports.Relative=Relative;var Units=_objectSpread(_objectSpread({},Relative),Absolute);_exports.Units=Units;var UnitRegexpStr="(?:\\s|^)(\\d*(?:\\.\\d+)?)(".concat(Object.keys(Units).join("|"),")(?:\\s|$|\\n)");_exports.UnitRegexpStr=UnitRegexpStr;var UnitRegexp=new RegExp(UnitRegexpStr);_exports.UnitRegexp=UnitRegexp;var UnitRegexpGM=new RegExp(UnitRegexpStr,"gm");function convert(count,fromUnits,toUnits){var ctx=arguments.length>3&&void 0!==arguments[3]?arguments[3]:calcCtx(),baseUnit=Units[fromUnits],basePx="function"==typeof baseUnit?baseUnit(count,ctx):baseUnit*count,dstUnit=Units[toUnits];return basePx/("function"==typeof dstUnit?dstUnit(1,ctx):dstUnit)}function convertAllInStr(expr,toUnits){var ctx=arguments.length>2&&void 0!==arguments[2]?arguments[2]:calcCtx();return expr.replace(UnitRegexpGM,(function(substr,count,unit){return convert(parseFloat(count),unit,toUnits,ctx).toString()}))}function calcCtx(el){if(el){var rect=el.getBoundingClientRect();return{width:rect.width,height:rect.height,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize)}}return{width:document.body.clientWidth,height:document.body.clientHeight,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize)}}function calc(expression,el_ctx,ctx){return void 0===el_ctx?ctx=calcCtx():el_ctx instanceof HTMLElement?ctx||(ctx=calcCtx(el_ctx)):ctx=el_ctx,eval(convertAllInStr(expression,"px",ctx))}_exports.UnitRegexpGM=UnitRegexpGM}));
|
||||
define("local_treestudyplan/simpleline/css-calc",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.Units=_exports.UnitRegexpStr=_exports.UnitRegexpGM=_exports.UnitRegexp=_exports.Relative=_exports.Absolute=void 0,_exports.calc=calc,_exports.calcCtx=calcCtx,_exports.convert=convert,_exports.convertAllInStr=convertAllInStr;const Absolute={px:1,cm:96/2.54,mm:96/25.4,Q:96/101.6,in:96,pc:16,pt:96/72};_exports.Absolute=Absolute;const Relative={vh:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.viewportHeight:window.innerHeight)/100*count},vw:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.viewportWidth:window.innerWidth)/100*count},vmin:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?Math.min(ctx.viewportWidth,ctx.viewportHeight):Math.min(window.innerWidth,window.innerHeight))/100*count},vmax:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?Math.max(ctx.viewportWidth,ctx.viewportHeight):Math.max(window.innerWidth,window.innerHeight))/100*count},rem:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize))*count},"%w":function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.width:document.body.clientWidth)/100*count},"%h":function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.height:document.body.clientHeight)/100*count}};_exports.Relative=Relative;const Units={...Relative,...Absolute};_exports.Units=Units;const UnitRegexpStr=`(?:\\s|^)(\\d*(?:\\.\\d+)?)(${Object.keys(Units).join("|")})(?:\\s|$|\\n)`;_exports.UnitRegexpStr=UnitRegexpStr;const UnitRegexp=new RegExp(UnitRegexpStr);_exports.UnitRegexp=UnitRegexp;const UnitRegexpGM=new RegExp(UnitRegexpStr,"gm");function convert(count,fromUnits,toUnits){let ctx=arguments.length>3&&void 0!==arguments[3]?arguments[3]:calcCtx();const baseUnit=Units[fromUnits],basePx="function"==typeof baseUnit?baseUnit(count,ctx):baseUnit*count,dstUnit=Units[toUnits];return basePx/("function"==typeof dstUnit?dstUnit(1,ctx):dstUnit)}function convertAllInStr(expr,toUnits){let ctx=arguments.length>2&&void 0!==arguments[2]?arguments[2]:calcCtx();return expr.replace(UnitRegexpGM,((substr,count,unit)=>convert(parseFloat(count),unit,toUnits,ctx).toString()))}function calcCtx(el){if(el){const rect=el.getBoundingClientRect();return{width:rect.width,height:rect.height,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize)}}return{width:document.body.clientWidth,height:document.body.clientHeight,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize)}}function calc(expression,el_ctx,ctx){return void 0===el_ctx?ctx=calcCtx():el_ctx instanceof HTMLElement?ctx||(ctx=calcCtx(el_ctx)):ctx=el_ctx,eval(convertAllInStr(expression,"px",ctx))}_exports.UnitRegexpGM=UnitRegexpGM}));
|
||||
|
||||
//# sourceMappingURL=css-calc.min.js.map
|
File diff suppressed because one or more lines are too long
2
amd/build/simpleline/simpleline.min.js
vendored
2
amd/build/simpleline/simpleline.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/studyplan-editor-components.min.js
vendored
2
amd/build/studyplan-editor-components.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/studyplan-processor.min.js
vendored
2
amd/build/studyplan-processor.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/studyplan-processor",["exports"],(function(_exports){function ProcessStudyplan(studyplan){var connections={};for(var ip in studyplan.pages){var page=studyplan.pages[ip];for(var il in page.studylines){var line=page.studylines[il];for(var is in line.slots){var slot=line.slots[is];if(void 0!==slot.courses)for(var ic in slot.courses){var itm=slot.courses[ic];for(var idx in itm.connections.in){var conn=itm.connections.in[idx];conn.id in connections?itm.connections[idx]=connections[conn.id]:connections[conn.id]=conn}for(var _idx in itm.connections.out){var _conn=itm.connections.out[_idx];_conn.id in connections?itm.connections[_idx]=connections[_conn.id]:connections[_conn.id]=_conn}}if(void 0!==slot.filters)for(var ix in slot.filters){var _itm=slot.filters[ix];for(var _idx2 in _itm.connections.in){var _conn2=_itm.connections.in[_idx2];_conn2.id in connections?_itm.connections[_idx2]=connections[_conn2.id]:connections[_conn2.id]=_conn2}for(var _idx3 in _itm.connections.out){var _conn3=_itm.connections.out[_idx3];_conn3.id in connections?_itm.connections[_idx3]=connections[_conn3.id]:connections[_conn3.id]=_conn3}}}}}return studyplan}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.ProcessStudyplan=ProcessStudyplan,_exports.ProcessStudyplans=function(studyplans){for(var isx in studyplans){ProcessStudyplan(studyplans[isx])}return studyplans},_exports.objCopy=function(target,source,fields){for(var ix in fields){var field=fields[ix];target[field]=source[field]}},_exports.transportItem=function(target,source,identifier,param){param||(param="value");var item,itemindex;for(var ix in source)if(source[ix][param]==identifier){item=source[ix],itemindex=ix;break}item&&(target.push(item),source.splice(itemindex,1))}}));
|
||||
define("local_treestudyplan/studyplan-processor",["exports"],(function(_exports){function processStudyplan(studyplan){for(const ip in studyplan.pages){processStudyplanPage(studyplan.pages[ip])}return studyplan}function processStudyplanPage(page){let connections={};for(const il in page.studylines){const line=page.studylines[il];for(const is in line.slots){const slot=line.slots[is];if(void 0!==slot.courses)for(const ic in slot.courses){const itm=slot.courses[ic];for(const idx in itm.connections.in){const conn=itm.connections.in[idx];conn.id in connections?itm.connections[idx]=connections[conn.id]:connections[conn.id]=conn}for(const idx in itm.connections.out){const conn=itm.connections.out[idx];conn.id in connections?itm.connections[idx]=connections[conn.id]:connections[conn.id]=conn}}if(void 0!==slot.filters)for(const ix in slot.filters){const itm=slot.filters[ix];for(const idx in itm.connections.in){const conn=itm.connections.in[idx];conn.id in connections?itm.connections[idx]=connections[conn.id]:connections[conn.id]=conn}for(const idx in itm.connections.out){const conn=itm.connections.out[idx];conn.id in connections?itm.connections[idx]=connections[conn.id]:connections[conn.id]=conn}}}}return page}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.objCopy=function(target,source,fields){null==fields&&(fields=Object.getOwnPropertyNames(source));for(const ix in fields){const field=fields[ix];target[field]=source[field]}return target},_exports.processStudyplan=processStudyplan,_exports.processStudyplanPage=processStudyplanPage,_exports.processStudyplans=function(studyplans){for(const isx in studyplans){processStudyplan(studyplans[isx])}return studyplans},_exports.transportItem=function(target,source,identifier,param){param||(param="value");let item,itemindex;for(const ix in source)if(source[ix][param]==identifier){item=source[ix],itemindex=ix;break}item&&(target.push(item),source.splice(itemindex,1))}}));
|
||||
|
||||
//# sourceMappingURL=studyplan-processor.min.js.map
|
File diff suppressed because one or more lines are too long
3
amd/build/studyplan-report-components.min.js
vendored
Normal file
3
amd/build/studyplan-report-components.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
amd/build/studyplan-report-components.min.js.map
Normal file
1
amd/build/studyplan-report-components.min.js.map
Normal file
File diff suppressed because one or more lines are too long
3
amd/build/svgarc/svgarc.min.js
vendored
3
amd/build/svgarc/svgarc.min.js
vendored
|
@ -1,3 +0,0 @@
|
|||
define("local_treestudyplan/svgarc/svgarc",["exports"],(function(_exports){function _slicedToArray(arr,i){return function(arr){if(Array.isArray(arr))return arr}(arr)||function(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null==_i)return;var _s,_e,_arr=[],_n=!0,_d=!1;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function(o,minLen){if(!o)return;if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);"Object"===n&&o.constructor&&(n=o.constructor.name);if("Map"===n||"Set"===n)return Array.from(o);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}(arr,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.svgarcpath=_exports.svgarc=void 0;var cos=Math.cos,sin=Math.sin,π=Math.PI,f_matrix_times=function(_ref,_ref2){var _ref3=_slicedToArray(_ref,2),_ref3$=_slicedToArray(_ref3[0],2),a=_ref3$[0],b=_ref3$[1],_ref3$2=_slicedToArray(_ref3[1],2),c=_ref3$2[0],d=_ref3$2[1],_ref4=_slicedToArray(_ref2,2),x=_ref4[0],y=_ref4[1];return[a*x+b*y,c*x+d*y]},f_vec_add=function(_ref5,_ref6){var _ref7=_slicedToArray(_ref5,2),a1=_ref7[0],a2=_ref7[1],_ref8=_slicedToArray(_ref6,2);return[a1+_ref8[0],a2+_ref8[1]]},svgarcpath=function(_ref9,_ref10,_ref11,φ){var _ref12=_slicedToArray(_ref9,2),cx=_ref12[0],cy=_ref12[1],_ref13=_slicedToArray(_ref10,2),rx=_ref13[0],ry=_ref13[1],_ref14=_slicedToArray(_ref11,2),t1=_ref14[0],Δ=_ref14[1];Δ%=2*π;var x,rotMatrix=[[cos(x=φ),-sin(x)],[sin(x),cos(x)]],_f_vec_add2=_slicedToArray(f_vec_add(f_matrix_times(rotMatrix,[rx*cos(t1),ry*sin(t1)]),[cx,cy]),2),sX=_f_vec_add2[0],sY=_f_vec_add2[1],_f_vec_add4=_slicedToArray(f_vec_add(f_matrix_times(rotMatrix,[rx*cos(t1+Δ),ry*sin(t1+Δ)]),[cx,cy]),2),eX=_f_vec_add4[0],eY=_f_vec_add4[1];return"M "+sX+" "+sY+" A "+[rx,ry,φ/(2*π)*360,Δ>π?1:0,Δ>0?1:0,eX,eY].join(" ")};_exports.svgarcpath=svgarcpath;_exports.svgarc=function(_ref15,_ref16,_ref17,φ){var _ref18=_slicedToArray(_ref15,2),cx=_ref18[0],cy=_ref18[1],_ref19=_slicedToArray(_ref16,2),rx=_ref19[0],ry=_ref19[1],_ref20=_slicedToArray(_ref17,2),t1=_ref20[0],Δ=_ref20[1],path_2wk2r=document.createElementNS("http://www.w3.org/2000/svg","path"),d=svgarcpath([cx,cy],[rx,ry],[t1,Δ],φ);return path_2wk2r.setAttribute("d",d),path_2wk2r}}));
|
||||
|
||||
//# sourceMappingURL=svgarc.min.js.map
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"svgarc.min.js","sources":["../../src/svgarc/svgarc.js"],"sourcesContent":["/*\nCopyright © 2020 Xah Lee, © 2023 P.M Kuipers\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the “Software”),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\nURL: SVG Circle Arc http://xahlee.info/js/svg_circle_arc.html\n*/\n\nconst cos = Math.cos;\nconst sin = Math.sin;\nconst π = Math.PI;\n\nconst f_matrix_times = (( [[a,b], [c,d]], [x,y]) => [ a * x + b * y, c * x + d * y]);\nconst f_rotate_matrix = (x => [[cos(x),-sin(x)], [sin(x), cos(x)]]);\nconst f_vec_add = (([a1, a2], [b1, b2]) => [a1 + b1, a2 + b2]);\n\n// function modified by pmkuipers for text params\n/**\n * Create svg path text for an arc\n * @param {*} center [cx,cy] center of ellipse\n * @param {*} radius [rx,ry] major minor radius\n * @param {*} angle [t1, Δ] start angle, in radian, angle to sweep, in radian. positive.\n * @param {*} φ rotation on the whole, in radian\n * @returns a SVG path element that represent a ellipse. Text describing the arc path in an svg path element\n */\nconst svgarcpath = (([cx,cy],[rx,ry], [t1, Δ], φ ) => {\n Δ = Δ % (2*π);\n const rotMatrix = f_rotate_matrix (φ);\n const [sX, sY] = ( f_vec_add ( f_matrix_times ( rotMatrix, [rx * cos(t1), ry * sin(t1)] ), [cx,cy] ) );\n const [eX, eY] = ( f_vec_add ( f_matrix_times ( rotMatrix, [rx * cos(t1+Δ), ry * sin(t1+Δ)] ), [cx,cy] ) );\n const fA = ( ( Δ > π ) ? 1 : 0 );\n const fS = ( ( Δ > 0 ) ? 1 : 0 );\n return \"M \" + sX + \" \" + sY + \" A \" + [ rx , ry , φ / (2*π) *360, fA, fS, eX, eY ].join(\" \");\n});\n\n/**\n * Create an svg arc element\n * @param {*} center [cx,cy] center of ellipse\n * @param {*} radius [rx,ry] major minor radius\n * @param {*} angle [t1, Δ] start angle, in radian, angle to sweep, in radian. positive.\n * @param {*} φ rotation on the whole, in radian\n * @returns a SVG path element that represent a ellipse.\n */\nconst svgarc = (([cx,cy],[rx,ry], [t1, Δ], φ ) => {\n const path_2wk2r = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const d = svgarcpath([cx,cy],[rx,ry], [t1, Δ], φ );\n path_2wk2r.setAttribute(\"d\", d);\n return path_2wk2r;\n});\n\nexport {svgarc, svgarcpath};"],"names":["cos","Math","sin","π","PI","f_matrix_times","a","b","c","d","x","y","f_vec_add","a1","a2","svgarcpath","φ","cx","cy","rx","ry","t1","Δ","rotMatrix","sX","sY","eX","eY","join","path_2wk2r","document","createElementNS","setAttribute"],"mappings":"uyCAoBMA,IAAMC,KAAKD,IACXE,IAAMD,KAAKC,IACXC,EAAIF,KAAKG,GAETC,eAAkB,wFAAIC,YAAEC,+CAAKC,aAAEC,2CAAMC,WAAEC,iBAAO,CAAEL,EAAII,EAAIH,EAAII,EAAGH,EAAIE,EAAID,EAAIE,IAE3EC,UAAa,wDAAEC,YAAIC,gDAAkB,CAACD,YAASC,cAW/CC,WAAc,6BAA2BC,sCAAzBC,aAAGC,6CAAKC,aAAGC,6CAAMC,aAAIC,YACvCA,GAAS,EAAEnB,MAbUO,EAcfa,UAdoB,CAAC,CAACvB,IAAPU,EAccM,IAdCd,IAAIQ,IAAK,CAACR,IAAIQ,GAAIV,IAAIU,gCAevCE,UAAYP,eAAiBkB,UAAW,CAACJ,GAAKnB,IAAIqB,IAAKD,GAAKlB,IAAImB,MAAQ,CAACJ,GAAGC,QAAxFM,kBAAIC,6CACQb,UAAYP,eAAiBkB,UAAW,CAACJ,GAAKnB,IAAIqB,GAAGC,GAAIF,GAAKlB,IAAImB,GAAGC,KAAO,CAACL,GAAGC,QAA5FQ,kBAAIC,wBAGJ,KAAOH,GAAK,IAAMC,GAAK,MAAQ,CAAEN,GAAKC,GAAKJ,GAAK,EAAEb,GAAI,IAF7CmB,EAAInB,EAAM,EAAI,EACdmB,EAAI,EAAM,EAAI,EAC4CI,GAAIC,IAAKC,KAAK,qDAW5E,8BAA2BZ,uCAAzBC,aAAGC,6CAAKC,aAAGC,6CAAMC,aAAIC,YAC7BO,WAAaC,SAASC,gBAAgB,6BAA8B,QACpEtB,EAAIM,WAAW,CAACE,GAAGC,IAAI,CAACC,GAAGC,IAAK,CAACC,GAAIC,GAAIN,UAC/Ca,WAAWG,aAAa,IAAKvB,GACtBoB"}
|
2
amd/build/treestudyplan-components.min.js
vendored
2
amd/build/treestudyplan-components.min.js
vendored
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/browserbuttonevents.min.js
vendored
Normal file
3
amd/build/util/browserbuttonevents.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/browserbuttonevents",["exports","./debugger"],(function(_exports,_debugger){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.addBrowserButtonEvent=function(backwardCB){let forwardCB=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,reloadCB=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;debug.log("Registering navigation events",backwardCB,forwardCB,reloadCB);addEventListener("popstate",(e=>{const positionLastShown=Number(sessionStorage.getItem("positionLastShown"));let position=history.state;null===position&&(position=positionLastShown+1,history.replaceState(position,"")),sessionStorage.setItem("positionLastShown",String(position));const direction=Math.sign(position-positionLastShown);debug.log("Travel direction is "+direction),-1==direction&&backwardCB&&backwardCB(),1==direction&&forwardCB&&forwardCB(),0==direction&&reloadCB&&reloadCB()}))};const debug=new(_debugger=(obj=_debugger)&&obj.__esModule?obj:{default:obj}).default("browserbuttonevents")}));
|
||||
|
||||
//# sourceMappingURL=browserbuttonevents.min.js.map
|
1
amd/build/util/browserbuttonevents.min.js.map
Normal file
1
amd/build/util/browserbuttonevents.min.js.map
Normal file
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"browserbuttonevents.min.js","sources":["../../src/util/browserbuttonevents.js"],"sourcesContent":["/* eslint no-var: \"error\" */\n/* eslint no-unused-vars: \"off\" */\n/* eslint linebreak-style: \"off\" */\n/* eslint no-trailing-spaces: \"off\" */\n/* eslint capitalized-comments: \"off\" */\n/* eslint-env es6 */\n\nimport Debugger from './debugger';\nconst debug = new Debugger(\"browserbuttonevents\");\n\n/**\n * \n * @param {function} backwardCB \n * @param {function} forwardCB \n * @param {function} reloadCB \n */\nexport function addBrowserButtonEvent(backwardCB, forwardCB = null, reloadCB = null) {\n debug.log(\"Registering navigation events\", backwardCB, forwardCB, reloadCB);\n const reorient = (e) => { // After travelling in the history stack\n const positionLastShown = Number( // If none, then zero\n sessionStorage.getItem('positionLastShown'));\n // debug.log(\"Popstate event\",e,positionLastShown,history);\n let position = history.state; // Absolute position in stack\n if (position === null) { // Meaning a new entry on the stack\n position = positionLastShown + 1; // Top of stack\n \n // (1) Stamp the entry with its own position in the stack\n history.replaceState(position, /* no title */''); \n }\n \n // (2) Keep track of the last position shown\n sessionStorage.setItem('positionLastShown', String(position));\n \n // (3) Discover the direction of travel by comparing the two\n const direction = Math.sign(position - positionLastShown);\n debug.log('Travel direction is ' + direction); \n // One of backward (-1), reload (0) and forward (1)\n if (direction == -1 && backwardCB) {\n backwardCB();\n }\n if (direction == 1 && forwardCB) {\n forwardCB();\n }\n if (direction == 0 && reloadCB) {\n reloadCB();\n }\n };\n // addEventListener( 'pageshow', reorient );\n addEventListener('popstate', reorient); // Travel in same page\n}"],"names":["backwardCB","forwardCB","reloadCB","debug","log","addEventListener","e","positionLastShown","Number","sessionStorage","getItem","position","history","state","replaceState","setItem","String","direction","Math","sign"],"mappings":"qNAgBsCA,gBAAYC,iEAAY,KAAMC,gEAAW,KAC3EC,MAAMC,IAAI,gCAAiCJ,WAAYC,UAAWC,UA+BlEG,iBAAiB,YA9BCC,UACRC,kBAAoBC,OACxBC,eAAeC,QAAQ,0BAErBC,SAAWC,QAAQC,MACN,OAAbF,WACAA,SAAWJ,kBAAoB,EAG/BK,QAAQE,aAAaH,SAAwB,KAIjDF,eAAeM,QAAQ,oBAAqBC,OAAOL,iBAG7CM,UAAYC,KAAKC,KAAKR,SAAWJ,mBACvCJ,MAAMC,IAAI,uBAAyBa,YAEjB,GAAdA,WAAmBjB,YACnBA,aAEa,GAAbiB,WAAkBhB,WAClBA,YAEa,GAAbgB,WAAkBf,UAClBA,qBApCNC,MAAQ,yEAAa"}
|
3
amd/build/util/css-calc.min.js
vendored
Normal file
3
amd/build/util/css-calc.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/css-calc",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.Units=_exports.UnitRegexpStr=_exports.UnitRegexpGM=_exports.UnitRegexp=_exports.Relative=_exports.Absolute=void 0,_exports.calc=calc,_exports.calcCtx=calcCtx,_exports.convert=convert,_exports.convertAllInStr=convertAllInStr;const Absolute={px:1,cm:96/2.54,mm:96/25.4,Q:96/101.6,in:96,pc:16,pt:96/72};_exports.Absolute=Absolute;const Relative={vh:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.viewportHeight:window.innerHeight)/100*count},vw:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.viewportWidth:window.innerWidth)/100*count},vmin:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?Math.min(ctx.viewportWidth,ctx.viewportHeight):Math.min(window.innerWidth,window.innerHeight))/100*count},vmax:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?Math.max(ctx.viewportWidth,ctx.viewportHeight):Math.max(window.innerWidth,window.innerHeight))/100*count},rem:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize))*count},"%w":function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.width:document.body.clientWidth)/100*count},"%h":function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,ctx=arguments.length>1?arguments[1]:void 0;return(ctx?ctx.height:document.body.clientHeight)/100*count}};_exports.Relative=Relative;const Units={...Relative,...Absolute};_exports.Units=Units;const UnitRegexpStr=`(?:\\s|^)(\\d*(?:\\.\\d+)?)(${Object.keys(Units).join("|")})(?:\\s|$|\\n)`;_exports.UnitRegexpStr=UnitRegexpStr;const UnitRegexp=new RegExp(UnitRegexpStr);_exports.UnitRegexp=UnitRegexp;const UnitRegexpGM=new RegExp(UnitRegexpStr,"gm");function convert(count,fromUnits,toUnits){let ctx=arguments.length>3&&void 0!==arguments[3]?arguments[3]:calcCtx();const baseUnit=Units[fromUnits],basePx="function"==typeof baseUnit?baseUnit(count,ctx):baseUnit*count,dstUnit=Units[toUnits];return basePx/("function"==typeof dstUnit?dstUnit(1,ctx):dstUnit)}function convertAllInStr(expr,toUnits){let ctx=arguments.length>2&&void 0!==arguments[2]?arguments[2]:calcCtx();return expr.replace(UnitRegexpGM,((substr,count,unit)=>convert(parseFloat(count),unit,toUnits,ctx).toString()))}function calcCtx(el){if(el){const rect=el.getBoundingClientRect();return{width:rect.width,height:rect.height,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize)}}return{width:document.body.clientWidth,height:document.body.clientHeight,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,htmlFontSize:parseFloat(window.getComputedStyle(document.querySelector("html")).fontSize)}}function calc(expression,el_ctx,ctx){return void 0===el_ctx?ctx=calcCtx():el_ctx instanceof HTMLElement?ctx||(ctx=calcCtx(el_ctx)):ctx=el_ctx,eval(convertAllInStr(expression,"px",ctx))}_exports.UnitRegexpGM=UnitRegexpGM}));
|
||||
|
||||
//# sourceMappingURL=css-calc.min.js.map
|
1
amd/build/util/css-calc.min.js.map
Normal file
1
amd/build/util/css-calc.min.js.map
Normal file
File diff suppressed because one or more lines are too long
3
amd/build/util/date-helper.min.js
vendored
Normal file
3
amd/build/util/date-helper.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/date-helper",["exports"],(function(_exports){function formatDate(d,short){d instanceof Date||("number"==typeof d&&(d*=1e3),d=new Date(d));let monthformat="short";return!0===short?monthformat="numeric":!1===short&&(monthformat="long"),d.toLocaleDateString(document.documentElement.lang,{year:"numeric",month:monthformat,day:"numeric"})}function studyplanDates(plan){let earliestStart=null,latestEnd=null,openEnded=!1;for(const ix in plan.pages){const page=plan.pages[ix],s=new Date(page.startdate);if(page.enddate||(openEnded=!0),(!earliestStart||s<earliestStart)&&(earliestStart=s),page.enddate){const e=new Date(page.enddate);(!latestEnd||e>latestEnd)&&(latestEnd=e)}}return{start:earliestStart,end:openEnded?null:latestEnd}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.addDays=function(datestr,days){const date=new Date(datestr);return function(date){const d=new Date(date);let month=""+(d.getMonth()+1),day=""+d.getDate();const year=d.getFullYear();month.length<2&&(month="0"+month);day.length<2&&(day="0"+day);return[year,month,day].join("-")}(new Date(date.getTime()+864e5*days))},_exports.datespaninfo=function(first,last){first instanceof Date||(first=new Date(first));last instanceof Date||(last=new Date(last));first.setHours(0),first.setMinutes(0),first.setSeconds(0),first.setMilliseconds(0),last.setHours(23),last.setMinutes(59),last.setSeconds(59),last.setMilliseconds(999);const dayspan=Math.round((last-first+1)/864e5),years=Math.floor(dayspan/365),ydaysleft=dayspan%365,weeks=Math.floor(ydaysleft/7);return{first:first,last:last,totaldays:dayspan,years:years,weeks:weeks,days:ydaysleft%7,formatted:{first:formatDate(first),last:formatDate(last)}}},_exports.formatDate=formatDate,_exports.formatDatetime=function(d,short){d instanceof Date||("number"==typeof d&&(d*=1e3),d=new Date(d));let monthformat="short";!0===short?monthformat="numeric":!1===short&&(monthformat="long");return d.toLocaleDateString(document.documentElement.lang,{year:"numeric",month:monthformat,day:"numeric"})+" "+d.toLocaleTimeString(document.documentElement.lang,{timeStyle:"short"})},_exports.studyplanDates=studyplanDates,_exports.studyplanPageTiming=function(page){const now=(new Date).getTime();if(page.timeless)return"present";const start=new Date(page.startdate),end=page.enddate?new Date(page.enddate):null;return start<now?end&&now>end?"past":"present":"future"},_exports.studyplanTiming=function(plan){const now=(new Date).getTime();if(!plan.pages&&0==plan.pages.length||plan.pages[0]&&plan.pages[0].timeless)return"present";const dates=studyplanDates(plan);return dates.start<now?dates.end&&now>dates.end?"past":"present":"future"}}));
|
||||
|
||||
//# sourceMappingURL=date-helper.min.js.map
|
1
amd/build/util/date-helper.min.js.map
Normal file
1
amd/build/util/date-helper.min.js.map
Normal file
File diff suppressed because one or more lines are too long
2
amd/build/util/debounce.min.js
vendored
2
amd/build/util/debounce.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/util/debounce",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.debounce=function(func,wait,immediate){var timeout;return function(){var context=this,args=arguments,callNow=immediate&&!timeout;clearTimeout(timeout),timeout=setTimeout((function(){timeout=null,immediate||func.apply(context,args)}),wait),callNow&&func.apply(context,args)}}}));
|
||||
define("local_treestudyplan/util/debounce",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.debounce=function(func,wait,immediate){let timeout;return function(){let context=this,args=arguments,callNow=immediate&&!timeout;clearTimeout(timeout),timeout=setTimeout((function(){timeout=null,immediate||func.apply(context,args)}),wait),callNow&&func.apply(context,args)}}}));
|
||||
|
||||
//# sourceMappingURL=debounce.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"debounce.min.js","sources":["../../src/util/debounce.js"],"sourcesContent":["/*eslint no-var: \"error\"*/\n/*eslint no-console: \"off\"*/\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\n/**\n * Limits consecutive function calls.\n * @param {function} func The function to wrap.\n * @param {int} wait The time limit between function calls.\n * @param {bool} immediate perform the actual function call first rather than after the timout passed.\n * @returns {function} a new function that wraps the debounce.\n */\nfunction debounce(func, wait, immediate) {\n let timeout;\n return function() {\n let context = this, args = arguments;\n let later = function() {\n timeout = null;\n if (!immediate){ func.apply(context, args); }\n };\n let callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow){ func.apply(context, args); }\n };\n}\n\nexport {debounce};"],"names":["func","wait","immediate","timeout","context","this","args","arguments","callNow","clearTimeout","setTimeout","apply"],"mappings":"8JAakBA,KAAMC,KAAMC,eACtBC,eACG,eACCC,QAAUC,KAAMC,KAAOC,UAKvBC,QAAUN,YAAcC,QAC5BM,aAAaN,SACbA,QAAUO,YANE,WACRP,QAAU,KACLD,WAAYF,KAAKW,MAAMP,QAASE,QAIbL,MACxBO,SAAUR,KAAKW,MAAMP,QAASE"}
|
||||
{"version":3,"file":"debounce.min.js","sources":["../../src/util/debounce.js"],"sourcesContent":["/* eslint no-var: \"error\"*/\n/* eslint no-console: \"off\"*/\n/* eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\n\n/**\n * Limits consecutive function calls.\n * @param {function} func The function to wrap.\n * @param {int} wait The time limit between function calls.\n * @param {bool} immediate perform the actual function call first rather than after the timout passed.\n * @returns {function} a new function that wraps the debounce.\n */\nfunction debounce(func, wait, immediate) {\n let timeout;\n return function() {\n let context = this;\n let args = arguments;\n let later = function() {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n let callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n}\n\nexport {debounce};"],"names":["func","wait","immediate","timeout","context","this","args","arguments","callNow","clearTimeout","setTimeout","apply"],"mappings":"8JAakBA,KAAMC,KAAMC,eACtBC,eACG,eACCC,QAAUC,KACVC,KAAOC,UAOPC,QAAUN,YAAcC,QAC5BM,aAAaN,SACbA,QAAUO,YARE,WACRP,QAAU,KACLD,WACDF,KAAKW,MAAMP,QAASE,QAKAL,MACxBO,SACAR,KAAKW,MAAMP,QAASE"}
|
2
amd/build/util/debugger.min.js
vendored
2
amd/build/util/debugger.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/util/debugger",["exports","core/config"],(function(_exports,_config){var obj;return Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=function(handle){var output_enabled=_config.default.developerdebug;output_enabled?console.warn("In development environment. Debugger output enabled for ".concat(handle)):console.warn("In production environment. Debugger output disabled for ".concat(handle));return{write:function(){if(output_enabled){var args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.info.apply(console,args)}},info:function(){if(output_enabled){var args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.info.apply(console,args)}},warn:function(){if(output_enabled){var args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.warn.apply(console,args)}},error:function(){if(output_enabled){var args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.error.apply(console,args)}},enable:function(){output_enabled=!0},disable:function(){output_enabled=!1}}},_config=(obj=_config)&&obj.__esModule?obj:{default:obj},_exports.default}));
|
||||
define("local_treestudyplan/util/debugger",["exports","core/config"],(function(_exports,_config){var obj;return Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=function(handle){let outputEnabled=_config.default.developerdebug;outputEnabled?console.warn(`In development environment. Debugger output enabled for ${handle}`):console.warn(`In production environment. Debugger output disabled for ${handle}`);return{write(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.info.apply(console,args)}},log(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.log.apply(console,args)}},info(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.info.apply(console,args)}},warn(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.warn.apply(console,args)}},error(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.error.apply(console,args)}},time(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.time.apply(console,args)}},timeEnd(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.timeEnd.apply(console,args)}},timeLog(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.timeLog.apply(console,args)}},timeStamp(){if(outputEnabled){let args=Array.prototype.slice.call(arguments);args.unshift(handle+": "),console.timeStamp.apply(console,args)}},enable(){outputEnabled=!0},disable(){outputEnabled=!1}}},_config=(obj=_config)&&obj.__esModule?obj:{default:obj},_exports.default}));
|
||||
|
||||
//# sourceMappingURL=debugger.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"debugger.min.js","sources":["../../src/util/debugger.js"],"sourcesContent":["/*eslint no-var: \"error\"*/\n/*eslint no-console: \"off\"*/\n/*eslint-env es6*/\n\nimport Config from \"core/config\";\n\n/**\n * Start a new debugger\n * @param {*} handle The string to attach to all messages from this debugger\n * @returns Debugger object\n */\nexport default function (handle) {\n let output_enabled = Config.developerdebug;\n if(output_enabled){\n console.warn(`In development environment. Debugger output enabled for ${handle}`);\n } else {\n console.warn(`In production environment. Debugger output disabled for ${handle}`);\n }\n\n return {\n write: function debugger_write() {\n if (output_enabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.info.apply(console, args);\n }\n },\n info: function debugger_info() {\n if (output_enabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.info.apply(console, args);\n }\n },\n warn: function debugger_warn() {\n if (output_enabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.warn.apply(console, args);\n }\n },\n error: function debugger_error() {\n if (output_enabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.error.apply(console, args);\n }\n },\n enable: function debugger_enable() {\n output_enabled = true;\n },\n\n disable: function debugger_disable() {\n output_enabled = false;\n }\n };\n\n}\n"],"names":["handle","output_enabled","Config","developerdebug","console","warn","write","args","Array","prototype","slice","call","arguments","unshift","info","apply","error","enable","disable"],"mappings":"kMAWyBA,YACjBC,eAAiBC,gBAAOC,eACzBF,eACCG,QAAQC,uEAAgEL,SAExEI,QAAQC,uEAAgEL,eAGrE,CACHM,MAAO,cACCL,eAAgB,KACZM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQU,KAAKC,MAAMX,QAASG,QAGpCO,KAAM,cACEb,eAAgB,KACZM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQU,KAAKC,MAAMX,QAASG,QAGpCF,KAAM,cACEJ,eAAgB,KACZM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQC,KAAKU,MAAMX,QAASG,QAGpCS,MAAO,cACCf,eAAgB,KACZM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQY,MAAMD,MAAMX,QAASG,QAGrCU,OAAQ,WACJhB,gBAAiB,GAGrBiB,QAAS,WACLjB,gBAAiB"}
|
||||
{"version":3,"file":"debugger.min.js","sources":["../../src/util/debugger.js"],"sourcesContent":["/* eslint no-var: \"error\"*/\n/* eslint no-console: \"off\"*/\n/* eslint-env es6*/\n\nimport Config from \"core/config\";\n\n/**\n * Start a new debugger\n * @param {*} handle The string to attach to all messages from this debugger\n * @returns {object} Debugger object\n */\nexport default function(handle) {\n let outputEnabled = Config.developerdebug;\n if (outputEnabled) {\n console.warn(`In development environment. Debugger output enabled for ${handle}`);\n } else {\n console.warn(`In production environment. Debugger output disabled for ${handle}`);\n }\n\n return {\n write() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.info.apply(console, args);\n }\n },\n log() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.log.apply(console, args);\n }\n },\n info() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.info.apply(console, args);\n }\n },\n warn() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.warn.apply(console, args);\n }\n },\n error() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.error.apply(console, args);\n }\n },\n time() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.time.apply(console, args);\n }\n },\n timeEnd() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.timeEnd.apply(console, args);\n }\n },\n timeLog() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.timeLog.apply(console, args);\n }\n },\n timeStamp() {\n if (outputEnabled) {\n let args = Array.prototype.slice.call(arguments);\n args.unshift(handle + \": \");\n console.timeStamp.apply(console, args);\n }\n },\n enable() {\n outputEnabled = true;\n },\n disable() {\n outputEnabled = false;\n }\n };\n\n}\n"],"names":["handle","outputEnabled","Config","developerdebug","console","warn","write","args","Array","prototype","slice","call","arguments","unshift","info","apply","log","error","time","timeEnd","timeLog","timeStamp","enable","disable"],"mappings":"kMAWwBA,YAChBC,cAAgBC,gBAAOC,eACvBF,cACAG,QAAQC,KAAM,2DAA0DL,UAExEI,QAAQC,KAAM,2DAA0DL,gBAGrE,CACHM,WACQL,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQU,KAAKC,MAAMX,QAASG,QAGpCS,SACQf,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQY,IAAID,MAAMX,QAASG,QAGnCO,UACQb,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQU,KAAKC,MAAMX,QAASG,QAGpCF,UACQJ,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQC,KAAKU,MAAMX,QAASG,QAGpCU,WACQhB,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQa,MAAMF,MAAMX,QAASG,QAGrCW,UACQjB,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQc,KAAKH,MAAMX,QAASG,QAGpCY,aACQlB,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQe,QAAQJ,MAAMX,QAASG,QAGvCa,aACQnB,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQgB,QAAQL,MAAMX,QAASG,QAGvCc,eACQpB,cAAe,KACXM,KAAOC,MAAMC,UAAUC,MAAMC,KAAKC,WACtCL,KAAKM,QAAQb,OAAS,MACtBI,QAAQiB,UAAUN,MAAMX,QAASG,QAGzCe,SACIrB,eAAgB,GAEpBsB,UACItB,eAAgB"}
|
3
amd/build/util/fittext-vue.min.js
vendored
Normal file
3
amd/build/util/fittext-vue.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/fittext-vue",["exports","./css-calc","./fitty"],(function(_exports,_cssCalc,_fitty){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_fitty=(obj=_fitty)&&obj.__esModule?obj:{default:obj};var _default={install(Vue){Vue.component("fittext",{props:{maxsize:{type:String,default:"512px"},minsize:{type:String,default:"10px"},vertical:Boolean,singleline:Boolean,dynamic:Boolean},data:()=>({resizeObserver:null,mutationObserver:null}),computed:{rootStyle(){return this.vertical?"height: 100%;":"width: 100%;"}},methods:{},mounted(){(0,_fitty.default)(this.$refs.text,{minSize:(0,_cssCalc.calc)(this.minsize),maxSize:(0,_cssCalc.calc)(this.maxsize),vertical:this.vertical,multiline:!this.singleline})},unmounted(){this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect()},template:"\n <div class='q-fittext' ref='container' :style=\"rootStyle + ';min-height:0;min-width:0;'\">\n <span :style=\"'display:block; white-space:'+ ((singleline)?'nowrap':'normal')+';' + rootStyle\" class='q-fittext-text' ref='text'><slot></slot>\n </span\n ></div>\n "})}};return _exports.default=_default,_exports.default}));
|
||||
|
||||
//# sourceMappingURL=fittext-vue.min.js.map
|
1
amd/build/util/fittext-vue.min.js.map
Normal file
1
amd/build/util/fittext-vue.min.js.map
Normal file
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"fittext-vue.min.js","sources":["../../src/util/fittext-vue.js"],"sourcesContent":["/* eslint no-unused-vars: warn */\n/* eslint max-len: [\"error\", { \"code\": 160 }] */\n/* eslint capitalized-comments: \"off\" */\n/* eslint-env es6*/\n\nimport {calc} from \"./css-calc\";\nimport fitty from \"./fitty\";\n\nexport default {\n install(Vue/* ,options */) {\n Vue.component('fittext', {\n props: {\n maxsize: {\n type: String,\n 'default': \"512px\",\n },\n minsize: {\n type: String,\n 'default': \"10px\",\n },\n vertical: Boolean,\n singleline: Boolean,\n dynamic: Boolean,\n },\n data() {\n return {\n resizeObserver: null,\n mutationObserver: null,\n };\n },\n computed: {\n rootStyle() {\n if (this.vertical) {\n return `height: 100%;`;\n } else {\n return `width: 100%;`;\n }\n }\n },\n methods: {\n },\n mounted() {\n const self = this;\n // If the content could change after initial presentation,\n // Use the fitty method. It is slightly worse on multiline horizontal text,\n // but better supports content that can change later on.\n fitty(self.$refs.text,\n {\n minSize: calc(self.minsize),\n maxSize: calc(self.maxsize),\n vertical: self.vertical,\n multiline: !self.singleline,\n });\n },\n unmounted() {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n },\n template: `\n <div class='q-fittext' ref='container' :style=\"rootStyle + ';min-height:0;min-width:0;'\">\n <span :style=\"'display:block; white-space:'+ ((singleline)?'nowrap':'normal')+';' + rootStyle\" class='q-fittext-text' ref='text'><slot></slot>\n </span\n ></div>\n `,\n });\n },\n};"],"names":["install","Vue","component","props","maxsize","type","String","minsize","vertical","Boolean","singleline","dynamic","data","resizeObserver","mutationObserver","computed","rootStyle","this","methods","mounted","$refs","text","minSize","maxSize","multiline","unmounted","disconnect","template"],"mappings":"gRAQe,CACXA,QAAQC,KACJA,IAAIC,UAAU,UAAW,CACzBC,MAAO,CACHC,QAAS,CACLC,KAAMC,eACK,SAEfC,QAAS,CACLF,KAAMC,eACK,QAEfE,SAAUC,QACVC,WAAYD,QACZE,QAASF,SAEbG,KAAI,KACO,CACHC,eAAgB,KAChBC,iBAAkB,OAG1BC,SAAU,CACNC,mBACQC,KAAKT,SACG,gBAEA,iBAIpBU,QAAS,GAETC,6BACiBF,KAIFG,MAAMC,KACb,CACAC,SAAS,iBANAL,KAMUV,SACnBgB,SAAS,iBAPAN,KAOUb,SACnBI,SARSS,KAQMT,SACfgB,WATSP,KASQP,cAGzBe,YACQR,KAAKH,uBACAA,iBAAiBY,aAEtBT,KAAKJ,qBACAA,eAAea,cAG5BC,SAAW"}
|
3
amd/build/util/fitty.min.js
vendored
Normal file
3
amd/build/util/fitty.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/fitty",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;var _default=(w=>{if(!w)return;const DrawState={IDLE:0,DIRTY_CONTENT:1,DIRTY_LAYOUT:2,DIRTY:3};let fitties=[],redrawFrame=null;const requestRedraw="requestAnimationFrame"in w?function(){let options=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{sync:!1};w.cancelAnimationFrame(redrawFrame);const redrawFn=()=>redraw(fitties.filter((f=>f.dirty&&f.active)));if(options.sync)return redrawFn();redrawFrame=w.requestAnimationFrame(redrawFn)}:()=>{},redrawAll=type=>options=>{fitties.forEach((f=>f.dirty=type)),requestRedraw(options)},redraw=fitties=>{fitties.filter((f=>!f.styleComputed)).forEach((f=>{f.styleComputed=computeStyle(f)})),fitties.filter(shouldPreStyle).forEach(applyStyle);const fittiesToRedraw=fitties.filter(shouldRedraw);fittiesToRedraw.forEach(calculateStyles),fittiesToRedraw.forEach((f=>{applyStyle(f),markAsClean(f)})),fittiesToRedraw.forEach(dispatchFitEvent)},markAsClean=f=>f.dirty=DrawState.IDLE,calculateStyles=f=>{f.vertical?(f.availableHeight=f.element.parentNode.clientHeight,f.currentHeight=f.element.scrollHeight,f.previousFontSize=f.currentFontSize,f.currentFontSize=Math.min(Math.max(f.minSize,f.availableHeight/f.currentHeight*f.previousFontSize),f.maxSize)):(f.availableWidth=f.element.parentNode.clientWidth,f.currentWidth=f.element.scrollWidth,f.previousFontSize=f.currentFontSize,f.currentFontSize=Math.min(Math.max(f.minSize,f.availableWidth/f.currentWidth*f.previousFontSize),f.maxSize)),f.whiteSpace=f.multiLine&&f.currentFontSize===f.minSize?"normal":"nowrap"},shouldRedraw=f=>f.vertical?f.dirty!==DrawState.DIRTY_LAYOUT||f.dirty===DrawState.DIRTY_LAYOUT&&f.element.parentNode.clientHeight!==f.availableHeight:f.dirty!==DrawState.DIRTY_LAYOUT||f.dirty===DrawState.DIRTY_LAYOUT&&f.element.parentNode.clientWidth!==f.availableWidth,computeStyle=f=>{const style=w.getComputedStyle(f.element,null);return f.currentFontSize=parseFloat(style.getPropertyValue("font-size")),f.display=style.getPropertyValue("display"),f.whiteSpace=style.getPropertyValue("white-space"),!0},shouldPreStyle=f=>{let preStyle=!1;return!f.preStyleTestCompleted&&(/inline-/.test(f.display)||(preStyle=!0,f.display="inline-block"),"nowrap"!==f.whiteSpace&&(preStyle=!0,f.whiteSpace="nowrap"),f.preStyleTestCompleted=!0,preStyle)},applyStyle=f=>{f.element.style.whiteSpace=f.whiteSpace,f.element.style.display=f.display,f.element.style.fontSize=f.currentFontSize+"px"},dispatchFitEvent=f=>{f.element.dispatchEvent(new CustomEvent("fit",{detail:{oldValue:f.previousFontSize,newValue:f.currentFontSize,scaleFactor:f.currentFontSize/f.previousFontSize}}))},fit=(f,type)=>options=>{f.dirty=type,f.active&&requestRedraw(options)},init=f=>{f.originalStyle={whiteSpace:f.element.style.whiteSpace,display:f.element.style.display,fontSize:f.element.style.fontSize},observeMutations(f),f.newbie=!0,f.dirty=!0,fitties.push(f)},destroy=f=>()=>{fitties=fitties.filter((_=>_.element!==f.element)),f.observeMutations&&f.observer.disconnect(),f.element.style.whiteSpace=f.originalStyle.whiteSpace,f.element.style.display=f.originalStyle.display,f.element.style.fontSize=f.originalStyle.fontSize},subscribe=f=>()=>{f.active||(f.active=!0,requestRedraw())},unsubscribe=f=>()=>f.active=!1,observeMutations=f=>{f.observeMutations&&(f.observer=new MutationObserver(fit(f,DrawState.DIRTY_CONTENT)),f.observer.observe(f.element,f.observeMutations))},defaultOptions={minSize:16,maxSize:512,multiLine:!0,vertical:!1,observeMutations:"MutationObserver"in w&&{subtree:!0,childList:!0,characterData:!0}};function fittyCreate(elements,options){const fittyOptions=Object.assign({},defaultOptions,options),publicFitties=elements.map((element=>{const f=Object.assign({},fittyOptions,{element:element,active:!0});return init(f),{element:element,fit:fit(f,DrawState.DIRTY),unfreeze:subscribe(f),freeze:unsubscribe(f),unsubscribe:destroy(f)}}));return requestRedraw(),publicFitties}function fitty(target){let options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"string"==typeof target?fittyCreate((nl=document.querySelectorAll(target),[].slice.call(nl)),options):fittyCreate([target],options)[0];var nl}let resizeDebounce=null;const onWindowResized=()=>{w.clearTimeout(resizeDebounce),resizeDebounce=w.setTimeout(redrawAll(DrawState.DIRTY_LAYOUT),fitty.observeWindowDelay)},events=["resize","orientationchange"];return Object.defineProperty(fitty,"observeWindow",{set:enabled=>{const method=(enabled?"add":"remove")+"EventListener";events.forEach((e=>{w[method](e,onWindowResized)}))}}),fitty.observeWindow=!0,fitty.observeWindowDelay=100,fitty.fitAll=redrawAll(DrawState.DIRTY),fitty})("undefined"==typeof window?null:window);return _exports.default=_default,_exports.default}));
|
||||
|
||||
//# sourceMappingURL=fitty.min.js.map
|
1
amd/build/util/fitty.min.js.map
Normal file
1
amd/build/util/fitty.min.js.map
Normal file
File diff suppressed because one or more lines are too long
3
amd/build/util/formfields.min.js
vendored
Normal file
3
amd/build/util/formfields.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/formfields",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.textInteger=function(id){let unsigned=arguments.length>1&&void 0!==arguments[1]&&arguments[1],nonzero=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const element=document.getElementById(id);element&&element.addEventListener("input",(()=>{var val=element.value;return""!=val?!(isNaN(val)&&(unsigned||"-"!=val)||unsigned&&val<0||nonzero&&0==val)||(unsigned?(element.value=val.replace(/[^0-9]/g,""),nonzero&&0==val&&(element.value="")):element.value=val.replace(/[^0-9-]/g,"").replace(/(.{1})(-)/g,"$1"),!1):null}))}}));
|
||||
|
||||
//# sourceMappingURL=formfields.min.js.map
|
1
amd/build/util/formfields.min.js.map
Normal file
1
amd/build/util/formfields.min.js.map
Normal file
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"formfields.min.js","sources":["../../src/util/formfields.js"],"sourcesContent":["/**\n * Convert a text field into an integer only text field\n * @param {string} id The Id of the form field\n * @param {bool} unsigned Allow only unsigned values\n * @param {bool} nonzero Do not allow zero values\n */\nexport function textInteger(id, unsigned = false, nonzero = false) {\n const element = document.getElementById(id);\n\n if (element) {\n element.addEventListener(\"input\", () => {\n var val = element.value;\n if (val != '') {\n if ((isNaN(val) && !(!unsigned && val == '-')) || (unsigned && val < 0) || (nonzero && val == 0)) {\n // Set input value empty\n if (unsigned) {\n element.value = val.replace(/[^0-9]/g, '');\n if (nonzero && val == 0) {\n element.value = '';\n }\n } else {\n element.value = val.replace(/[^0-9-]/g, '').replace(/(.{1})(-)/g, '$1');\n }\n return false;\n } else {\n return true;\n }\n }\n return null;\n });\n }\n}"],"names":["id","unsigned","nonzero","element","document","getElementById","addEventListener","val","value","isNaN","replace"],"mappings":"mKAM4BA,QAAIC,iEAAkBC,sEACxCC,QAAUC,SAASC,eAAeL,IAEpCG,SACAA,QAAQG,iBAAiB,SAAS,SAC1BC,IAAMJ,QAAQK,YACP,IAAPD,MACKE,MAAMF,OAAWN,UAAmB,KAAPM,MAAiBN,UAAYM,IAAM,GAAOL,SAAkB,GAAPK,OAE/EN,UACAE,QAAQK,MAAQD,IAAIG,QAAQ,UAAW,IACnCR,SAAkB,GAAPK,MACXJ,QAAQK,MAAQ,KAGpBL,QAAQK,MAAQD,IAAIG,QAAQ,WAAY,IAAIA,QAAQ,aAAc,OAE/D,GAKR,IAAP"}
|
3
amd/build/util/mform-helper.min.js
vendored
Normal file
3
amd/build/util/mform-helper.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/mform-helper",["exports","core/ajax","core/fragment","core/templates","core/notification","./string-helper","./debugger"],(function(_exports,_ajax,_fragment,_templates,_notification,_stringHelper,_debugger){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_notification=_interopRequireDefault(_notification),_debugger=_interopRequireDefault(_debugger);var _default={install(Vue){let debug=new _debugger.default("treestudyplan-mform-helper"),strings=(0,_stringHelper.loadStrings)({editmod:{save$core:"save$core",cancel$core:"cancel$core"}});Vue.component("mform",{props:{name:{type:String},params:{type:Object},title:{type:String,default:""},variant:{type:String,default:"primary"},type:{type:String,default:"link"}},data:()=>({content:"",loading:!0,uuid:void 0!==crypto.randomUUID?crypto.randomUUID():"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(c=>(c^crypto.getRandomValues(new Uint8Array(1))[0]&15>>c/4).toString(16))),text:strings,submitok:!1,observer:null,inputs:[]}),computed:{},methods:{openForm(){this.$refs.editormodal.show()},onShown(){const self=this;debug.info(`Loading form "${self.name}" with params`,self.params),self.loading=!1,(0,_ajax.call)([{methodname:"local_treestudyplan_get_mform",args:{formname:self.name,params:JSON.stringify(self.params)}}])[0].then((data=>{const html=data.html;self.loading=!1;const js=(0,_fragment.processCollectedJavascript)(data.javascript);(0,_templates.replaceNodeContents)(self.$refs.content,html,js),self.initListenChanges()})).catch(_notification.default.exception)},onSave(){const self=this;let form=this.$refs.content.getElementsByTagName("form")[0];form.dispatchEvent(new Event("save-form-state"));const formdata=new FormData(form),data=new URLSearchParams(formdata).toString();this.checkSave()&&(0,_ajax.call)([{methodname:"local_treestudyplan_submit_mform",args:{formname:self.name,params:JSON.stringify(self.params),formdata:data}}])[0].then((response=>{const updatedplan=JSON.parse(response.data);self.$emit("saved",updatedplan,formdata)})).catch(_notification.default.exception)},checkSave(){let canSave=!0;return this.inputs.forEach((el=>{el.focus(),el.blur(),el.classList.contains("is-invalid")&&(canSave=!1)}),this),this.submitok=canSave,canSave},initListenChanges(){const content=this.$refs.content;this.inputs=content.querySelectorAll("input.form-control"),setTimeout(this.checkSave,100),this.observer&&this.observer.disconnect(),this.observer=new MutationObserver((mutationList=>{for(const mix in mutationList){const mutation=mutationList[mix];"attributes"===mutation.type&&"class"===mutation.attributeName&&this.checkSave()}})),this.inputs.forEach((el=>{this.observer.observe(el,{attributes:!0})}),this)}},unmount(){this.observer&&this.observer.disconnect()},template:'\n <span class=\'mform-container\'>\n <b-button :variant="variant" v-if=\'type == "button"\' @click.prevent=\'openForm\'\n ><slot><i class=\'fa fa-gear\'></i></slot></b-button>\n <a variant="variant" v-else href=\'#\' @click.prevent=\'openForm\'\n ><slot><i class=\'fa fa-gear\'></i></slot></a>\n <b-modal\n ref="editormodal"\n scrollable\n centered\n size="xl"\n id="\'modal-\'+uuid"\n @shown="onShown"\n @ok="onSave"\n :ok-disabled="!submitok"\n :title="title"\n :ok-title="text.save$core"\n ><div :class="\'s-mform-content\'" ref="content"\n ><div class="d-flex justify-content-center mb-3"\n ><b-spinner variant="primary"></b-spinner\n ></div\n ></div\n ></b-modal>\n </span>\n '})}};return _exports.default=_default,_exports.default}));
|
||||
|
||||
//# sourceMappingURL=mform-helper.min.js.map
|
1
amd/build/util/mform-helper.min.js.map
Normal file
1
amd/build/util/mform-helper.min.js.map
Normal file
File diff suppressed because one or more lines are too long
3
amd/build/util/psidebar-vue.min.js
vendored
Normal file
3
amd/build/util/psidebar-vue.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
define("local_treestudyplan/util/psidebar-vue",["exports","../portal-vue/portal-vue.esm","./debugger"],(function(_exports,_portalVue,_debugger){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_portalVue=_interopRequireDefault(_portalVue);let wrapper,contentwrapper,resizeObserver,debug=new((_debugger=_interopRequireDefault(_debugger)).default)("p-sidebar");function createPortalTarget(target,offsetref){let initializeWrapperContent=!1;if(debug.info("Creating portal target"),wrapper=document.querySelector("#p-sidebar-wrapper"),wrapper||(initializeWrapperContent=!0,wrapper=document.createElement("div"),wrapper.setAttribute("id","p-sidebar-wrapper")),contentwrapper=document.querySelector("#p-sidebar-contentwrapper"),contentwrapper||(initializeWrapperContent=!0,contentwrapper=document.createElement("div"),contentwrapper.setAttribute("id","p-sidebar-contentwrapper"),wrapper.appendChild(contentwrapper)),initializeWrapperContent){let targetEl=document.querySelector(target);for(targetEl&&"HTML"!=targetEl.nodeType||(targetEl=document.querySelector("body")),console.info(`Targeting '${target}' to `,targetEl);targetEl.childNodes.length>0;)contentwrapper.appendChild(targetEl.childNodes[0]);targetEl.appendChild(wrapper)}rePosition(!1),setOffset(offsetref)}function rePosition(right){let el=document.querySelector("#p-sidebar-mount");el||(el=document.createElement("div"),el.setAttribute("id","p-sidebar-mount"),resizeObserver=new ResizeObserver((()=>{let wx=0-el.getBoundingClientRect().width;wx+=0!=wx?"px":"",el.style.setProperty("--p-sidebar-hideoffset",wx)})),resizeObserver.observe(el)),right?wrapper.insertBefore(el,contentwrapper.nextSibling):wrapper.insertBefore(el,contentwrapper)}function setOffset(reference){const ref=reference?document.querySelector(reference):null;if(ref){let offsetTop=ref?ref.offsetTop:0;offsetTop+=0!=offsetTop?"px":"";const el=document.querySelector("#p-sidebar-mount");el&&(el.style.height=`calc( 100vh - ${offsetTop})`,el.style.marginTop=offsetTop)}}var _default={install(Vue){Vue.use(_portalVue.default),"ready"===document.readyState||"complete"===document.readyState?(debug.info("Page already loaded"),createPortalTarget()):window.addEventListener("load",(()=>{debug.info("Page not yet loaded"),createPortalTarget()})),Vue.component("p-easeinout",{template:'\n <transition name="p-easeinout"\n ><slot></slot>\n </transition>'}),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:{},watch:{right(newVal){rePosition(newVal)},offsetRef(reference){setOffset(reference,this.$refs.portal)}},mounted(){debug.info("OffsetRef",this.offsetRef),setOffset(this.offsetRef),debug.info("Right",this.right),rePosition(this.right)},template:"\n <div\n ><mounting-portal ref='portal'\n mount-to=\"#p-sidebar-mount\"\n class=\"(right?'p-sidebar-right ':'')\"\n append\n transition=\"p-easeinout\"\n ><div ref='container' v-if=\"value\"\n :class=\"'p-sidebar ' + (right?'p-sidebar-right ':'') + (shadow?'p-sidebar-shadow ':'')\"\n ><slot></slot></div\n ></mounting-portal>\n </div>\n "})}};return _exports.default=_default,_exports.default}));
|
||||
|
||||
//# sourceMappingURL=psidebar-vue.min.js.map
|
1
amd/build/util/psidebar-vue.min.js.map
Normal file
1
amd/build/util/psidebar-vue.min.js.map
Normal file
File diff suppressed because one or more lines are too long
3
amd/build/util/settings.min.js
vendored
Normal file
3
amd/build/util/settings.min.js
vendored
Normal 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((response=>{settingcache=response})).catch(_notification.default.exception),settingcache}loadsettings()}));
|
||||
|
||||
//# sourceMappingURL=settings.min.js.map
|
1
amd/build/util/settings.min.js.map
Normal file
1
amd/build/util/settings.min.js.map
Normal 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 * Retrieve settings.\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((response) => {\n settingcache = response;\n return;\n }).catch(notification.exception);\n }\n return settingcache;\n}\n\n// Preload settings.\nloadsettings();"],"names":["key","settings","loadsettings","settingcache","methodname","args","then","response","catch","notification","exception"],"mappings":"0NAcyBA,WACfC,SAAWC,sBACbF,OAAOC,SACAA,SAASD,KAET,8EAZXG,aAAe,cAoBVD,sBACAC,6BAEI,CAAC,CACFC,WAAY,kCACZC,KAAM,MACN,GAAGC,MAAMC,WACTJ,aAAeI,YAEhBC,MAAMC,sBAAaC,WAEnBP,aAIXD"}
|
2
amd/build/util/string-helper.min.js
vendored
2
amd/build/util/string-helper.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/util/string-helper",["exports","core/str"],(function(_exports,_str){function format_date(d,short){d instanceof Date||(d=new Date(d));var monthformat="short";return short&&(monthformat="numeric"),d.toLocaleDateString(document.documentElement.lang,{year:"numeric",month:monthformat,day:"numeric"})}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.datespaninfo=function(first,last){first instanceof Date||(first=new Date(first));last instanceof Date||(last=new Date(last));first.setHours(0),first.setMinutes(0),first.setSeconds(0),first.setMilliseconds(0),last.setHours(23),last.setMinutes(59),last.setSeconds(59),last.setMilliseconds(999);var dayspan=Math.round((last-first+1)/864e5),years=Math.floor(dayspan/365),ydaysleft=dayspan%365,weeks=Math.floor(ydaysleft/7);return{first:first,last:last,totaldays:dayspan,years:years,weeks:weeks,days:ydaysleft%7,formatted:{first:format_date(first),last:format_date(last)}}},_exports.format_date=format_date,_exports.load_stringkeys=function(string_keys){var _loop2=function(idx){var stringkeys=[];for(var i in string_keys[idx]){var parts=string_keys[idx][i].textkey.split("$"),identifier=parts[0],component=parts.length>1?parts[1]:"local_treestudyplan";stringkeys.push({key:identifier,component:component})}(0,_str.get_strings)(stringkeys).then((function(strings){for(var _i in strings){var s=strings[_i];string_keys[idx][_i].text=s}}))};for(var idx in string_keys)_loop2(idx);return string_keys},_exports.load_strings=function(strings){var _loop=function(idx){var stringkeys=[];for(var handle in strings[idx]){var parts=strings[idx][handle].split("$"),identifier=parts[0],component=parts.length>1?parts[1]:"local_treestudyplan";stringkeys.push({key:identifier,component:component})}(0,_str.get_strings)(stringkeys).then((function(str){var i=0;for(var _key in strings[idx])strings[idx][_key]=str[i],i++}))};for(var idx in strings)_loop(idx);return strings}}));
|
||||
define("local_treestudyplan/util/string-helper",["exports","core/str","./debugger"],(function(_exports,_str,_debugger){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.loadStringKeys=function(string_keys,plugin){void 0===plugin&&(plugin="local_treestudyplan");for(let idx in string_keys){let stringkeys=[];for(const i in string_keys[idx]){let parts=string_keys[idx][i].textkey.split("$"),identifier=parts[0],component=parts.length>1?parts[1]:plugin;stringkeys.push({key:identifier,component:component})}getstrFunc(stringkeys).then((function(strings){for(const i in strings){const s=strings[i];string_keys[idx][i].text=s}})).catch((x=>{debug.warn(x)}))}return string_keys},_exports.loadStrings=function(strings,plugin){void 0===plugin&&(plugin="local_treestudyplan");for(let idx in strings){let stringkeys=[];for(const handle in strings[idx]){let parts=strings[idx][handle].split(/[$@]/),identifier=parts[0],component=parts.length>1?parts[1]:plugin;stringkeys.push({key:identifier,component:component})}getstrFunc(stringkeys).then((function(str){let i=0;for(const handle in strings[idx])strings[idx][handle]=str[i],i++})).catch((x=>{debug.warn(x)}))}return strings},_exports.strformat=function(str,values){return str.replace(/\{(\w+)\}/g,((m,m1)=>m1&&values.hasOwnProperty(m1)?values[m1]:m))};let debug=new(_debugger=(obj=_debugger)&&obj.__esModule?obj:{default:obj}).default("string-helper");const getstrFunc=void 0!==_str.getStrings?_str.getStrings:_str.get_strings}));
|
||||
|
||||
//# sourceMappingURL=string-helper.min.js.map
|
File diff suppressed because one or more lines are too long
2
amd/build/util/svgarc.min.js
vendored
2
amd/build/util/svgarc.min.js
vendored
|
@ -1,3 +1,3 @@
|
|||
define("local_treestudyplan/util/svgarc",["exports"],(function(_exports){function _slicedToArray(arr,i){return function(arr){if(Array.isArray(arr))return arr}(arr)||function(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null==_i)return;var _s,_e,_arr=[],_n=!0,_d=!1;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function(o,minLen){if(!o)return;if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);"Object"===n&&o.constructor&&(n=o.constructor.name);if("Map"===n||"Set"===n)return Array.from(o);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}(arr,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.svgarcpath=_exports.svgarc=void 0;var cos=Math.cos,sin=Math.sin,π=Math.PI,f_matrix_times=function(_ref,_ref2){var _ref3=_slicedToArray(_ref,2),_ref3$=_slicedToArray(_ref3[0],2),a=_ref3$[0],b=_ref3$[1],_ref3$2=_slicedToArray(_ref3[1],2),c=_ref3$2[0],d=_ref3$2[1],_ref4=_slicedToArray(_ref2,2),x=_ref4[0],y=_ref4[1];return[a*x+b*y,c*x+d*y]},f_vec_add=function(_ref5,_ref6){var _ref7=_slicedToArray(_ref5,2),a1=_ref7[0],a2=_ref7[1],_ref8=_slicedToArray(_ref6,2);return[a1+_ref8[0],a2+_ref8[1]]},svgarcpath=function(_ref9,_ref10,_ref11,φ){var _ref12=_slicedToArray(_ref9,2),cx=_ref12[0],cy=_ref12[1],_ref13=_slicedToArray(_ref10,2),rx=_ref13[0],ry=_ref13[1],_ref14=_slicedToArray(_ref11,2),t1=_ref14[0],Δ=_ref14[1];Δ%=2*π;var x,rotMatrix=[[cos(x=φ),-sin(x)],[sin(x),cos(x)]],_f_vec_add2=_slicedToArray(f_vec_add(f_matrix_times(rotMatrix,[rx*cos(t1),ry*sin(t1)]),[cx,cy]),2),sX=_f_vec_add2[0],sY=_f_vec_add2[1],_f_vec_add4=_slicedToArray(f_vec_add(f_matrix_times(rotMatrix,[rx*cos(t1+Δ),ry*sin(t1+Δ)]),[cx,cy]),2),eX=_f_vec_add4[0],eY=_f_vec_add4[1];return"M "+sX+" "+sY+" A "+[rx,ry,φ/(2*π)*360,Δ>π?1:0,Δ>0?1:0,eX,eY].join(" ")};_exports.svgarcpath=svgarcpath;_exports.svgarc=function(_ref15,_ref16,_ref17,φ){var _ref18=_slicedToArray(_ref15,2),cx=_ref18[0],cy=_ref18[1],_ref19=_slicedToArray(_ref16,2),rx=_ref19[0],ry=_ref19[1],_ref20=_slicedToArray(_ref17,2),t1=_ref20[0],Δ=_ref20[1],path_2wk2r=document.createElementNS("http://www.w3.org/2000/svg","path"),d=svgarcpath([cx,cy],[rx,ry],[t1,Δ],φ);return path_2wk2r.setAttribute("d",d),path_2wk2r}}));
|
||||
define("local_treestudyplan/util/svgarc",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.svgarcpath=_exports.svgarc=void 0;const cos=Math.cos,sin=Math.sin,π=Math.PI,fMatrixTimes=(_ref,_ref2)=>{let[[a,b],[c,d]]=_ref,[x,y]=_ref2;return[a*x+b*y,c*x+d*y]},fVecAdd=(_ref3,_ref4)=>{let[a1,a2]=_ref3,[b1,b2]=_ref4;return[a1+b1,a2+b2]},svgarcpath=(_ref5,_ref6,_ref7,φ)=>{let[cx,cy]=_ref5,[rx,ry]=_ref6,[t1,Δ]=_ref7;Δ%=2*π;const rotMatrix=[[cos(x=φ),-sin(x)],[sin(x),cos(x)]];var x;const[sX,sY]=fVecAdd(fMatrixTimes(rotMatrix,[rx*cos(t1),ry*sin(t1)]),[cx,cy]),[eX,eY]=fVecAdd(fMatrixTimes(rotMatrix,[rx*cos(t1+Δ),ry*sin(t1+Δ)]),[cx,cy]),fA=Δ>π?1:0,fS=Δ>0?1:0;return isNaN(eY)||isNaN(eX)?"":"M "+sX+" "+sY+" A "+[rx,ry,φ/(2*π)*360,fA,fS,eX,eY].join(" ")};_exports.svgarcpath=svgarcpath;_exports.svgarc=(_ref8,_ref9,_ref10,φ)=>{let[cx,cy]=_ref8,[rx,ry]=_ref9,[t1,Δ]=_ref10;const path2wk2r=document.createElementNS("http://www.w3.org/2000/svg","path"),d=svgarcpath([cx,cy],[rx,ry],[t1,Δ],φ);return path2wk2r.setAttribute("d",d),path2wk2r}}));
|
||||
|
||||
//# sourceMappingURL=svgarc.min.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"svgarc.min.js","sources":["../../src/util/svgarc.js"],"sourcesContent":["/*\nCopyright © 2020 Xah Lee, © 2023 P.M Kuipers\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the “Software”),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\nURL: SVG Circle Arc http://xahlee.info/js/svg_circle_arc.html\n*/\n\nconst cos = Math.cos;\nconst sin = Math.sin;\nconst π = Math.PI;\n\nconst f_matrix_times = (( [[a,b], [c,d]], [x,y]) => [ a * x + b * y, c * x + d * y]);\nconst f_rotate_matrix = (x => [[cos(x),-sin(x)], [sin(x), cos(x)]]);\nconst f_vec_add = (([a1, a2], [b1, b2]) => [a1 + b1, a2 + b2]);\n\n// function modified by pmkuipers for text params\n/**\n * Create svg path text for an arc\n * @param {*} center [cx,cy] center of ellipse\n * @param {*} radius [rx,ry] major minor radius\n * @param {*} angle [t1, Δ] start angle, in radian, angle to sweep, in radian. positive.\n * @param {*} φ rotation on the whole, in radian\n * @returns a SVG path element that represent a ellipse. Text describing the arc path in an svg path element\n */\nconst svgarcpath = (([cx,cy],[rx,ry], [t1, Δ], φ ) => {\n Δ = Δ % (2*π);\n const rotMatrix = f_rotate_matrix (φ);\n const [sX, sY] = ( f_vec_add ( f_matrix_times ( rotMatrix, [rx * cos(t1), ry * sin(t1)] ), [cx,cy] ) );\n const [eX, eY] = ( f_vec_add ( f_matrix_times ( rotMatrix, [rx * cos(t1+Δ), ry * sin(t1+Δ)] ), [cx,cy] ) );\n const fA = ( ( Δ > π ) ? 1 : 0 );\n const fS = ( ( Δ > 0 ) ? 1 : 0 );\n return \"M \" + sX + \" \" + sY + \" A \" + [ rx , ry , φ / (2*π) *360, fA, fS, eX, eY ].join(\" \");\n});\n\n/**\n * Create an svg arc element\n * @param {*} center [cx,cy] center of ellipse\n * @param {*} radius [rx,ry] major minor radius\n * @param {*} angle [t1, Δ] start angle, in radian, angle to sweep, in radian. positive.\n * @param {*} φ rotation on the whole, in radian\n * @returns a SVG path element that represent a ellipse.\n */\nconst svgarc = (([cx,cy],[rx,ry], [t1, Δ], φ ) => {\n const path_2wk2r = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const d = svgarcpath([cx,cy],[rx,ry], [t1, Δ], φ );\n path_2wk2r.setAttribute(\"d\", d);\n return path_2wk2r;\n});\n\nexport {svgarc, svgarcpath};"],"names":["cos","Math","sin","π","PI","f_matrix_times","a","b","c","d","x","y","f_vec_add","a1","a2","svgarcpath","φ","cx","cy","rx","ry","t1","Δ","rotMatrix","sX","sY","eX","eY","join","path_2wk2r","document","createElementNS","setAttribute"],"mappings":"qyCAoBMA,IAAMC,KAAKD,IACXE,IAAMD,KAAKC,IACXC,EAAIF,KAAKG,GAETC,eAAkB,wFAAIC,YAAEC,+CAAKC,aAAEC,2CAAMC,WAAEC,iBAAO,CAAEL,EAAII,EAAIH,EAAII,EAAGH,EAAIE,EAAID,EAAIE,IAE3EC,UAAa,wDAAEC,YAAIC,gDAAkB,CAACD,YAASC,cAW/CC,WAAc,6BAA2BC,sCAAzBC,aAAGC,6CAAKC,aAAGC,6CAAMC,aAAIC,YACvCA,GAAS,EAAEnB,MAbUO,EAcfa,UAdoB,CAAC,CAACvB,IAAPU,EAccM,IAdCd,IAAIQ,IAAK,CAACR,IAAIQ,GAAIV,IAAIU,gCAevCE,UAAYP,eAAiBkB,UAAW,CAACJ,GAAKnB,IAAIqB,IAAKD,GAAKlB,IAAImB,MAAQ,CAACJ,GAAGC,QAAxFM,kBAAIC,6CACQb,UAAYP,eAAiBkB,UAAW,CAACJ,GAAKnB,IAAIqB,GAAGC,GAAIF,GAAKlB,IAAImB,GAAGC,KAAO,CAACL,GAAGC,QAA5FQ,kBAAIC,wBAGJ,KAAOH,GAAK,IAAMC,GAAK,MAAQ,CAAEN,GAAKC,GAAKJ,GAAK,EAAEb,GAAI,IAF7CmB,EAAInB,EAAM,EAAI,EACdmB,EAAI,EAAM,EAAI,EAC4CI,GAAIC,IAAKC,KAAK,qDAW5E,8BAA2BZ,uCAAzBC,aAAGC,6CAAKC,aAAGC,6CAAMC,aAAIC,YAC7BO,WAAaC,SAASC,gBAAgB,6BAA8B,QACpEtB,EAAIM,WAAW,CAACE,GAAGC,IAAI,CAACC,GAAGC,IAAK,CAACC,GAAIC,GAAIN,UAC/Ca,WAAWG,aAAa,IAAKvB,GACtBoB"}
|
||||
{"version":3,"file":"svgarc.min.js","sources":["../../src/util/svgarc.js"],"sourcesContent":["/*\nCopyright © 2020 Xah Lee, © 2023 P.M Kuipers\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the “Software”),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\nURL: SVG Circle Arc http://xahlee.info/js/svg_circle_arc.html\n*/\n\nconst cos = Math.cos;\nconst sin = Math.sin;\nconst π = Math.PI;\n\nconst fMatrixTimes = (([[a, b], [c, d]], [x, y]) => [a * x + b * y, c * x + d * y]);\nconst fRotateMatrix = (x => [[cos(x), -sin(x)], [sin(x), cos(x)]]);\nconst fVecAdd = (([a1, a2], [b1, b2]) => [a1 + b1, a2 + b2]);\n\n// Function modified by pmkuipers for text params\n/**\n * Create svg path text for an arc\n * @param {*} center [cx,cy] center of ellipse\n * @param {*} radius [rx,ry] major minor radius\n * @param {*} angle [t1, Δ] start angle, in radian, angle to sweep, in radian. positive.\n * @param {*} φ rotation on the whole, in radian\n * @returns {string} a SVG path description that represent a ellipse. Text describing the arc path in an svg path element\n */\nconst svgarcpath = (([cx, cy], [rx, ry], [t1, Δ], φ) => {\n Δ = Δ % (2 * π);\n const rotMatrix = fRotateMatrix(φ);\n const [sX, sY] = (fVecAdd(fMatrixTimes(rotMatrix, [rx * cos(t1), ry * sin(t1)]), [cx, cy]));\n const [eX, eY] = (fVecAdd(fMatrixTimes(rotMatrix, [rx * cos(t1 + Δ), ry * sin(t1 + Δ)]), [cx, cy]));\n const fA = ((Δ > π) ? 1 : 0);\n const fS = ((Δ > 0) ? 1 : 0);\n if (isNaN(eY) || isNaN(eX)) {\n return \"\";\n } else {\n return \"M \" + sX + \" \" + sY + \" A \" + [rx, ry, φ / (2 * π) * 360, fA, fS, eX, eY].join(\" \");\n }\n});\n\n/**\n * Create an svg arc element\n * @param {*} center [cx,cy] center of ellipse\n * @param {*} radius [rx,ry] major minor radius\n * @param {*} angle [t1, Δ] start angle, in radian, angle to sweep, in radian. positive.\n * @param {*} φ rotation on the whole, in radian\n * @returns {string} a SVG path element that represent a ellipse.\n */\nconst svgarc = (([cx, cy], [rx, ry], [t1, Δ], φ) => {\n const path2wk2r = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const d = svgarcpath([cx, cy], [rx, ry], [t1, Δ], φ);\n path2wk2r.setAttribute(\"d\", d);\n return path2wk2r;\n});\n\nexport {svgarc, svgarcpath};"],"names":["cos","Math","sin","π","PI","fMatrixTimes","a","b","c","d","x","y","fVecAdd","a1","a2","b1","b2","svgarcpath","φ","cx","cy","rx","ry","t1","Δ","rotMatrix","sX","sY","eX","eY","fA","fS","isNaN","join","path2wk2r","document","createElementNS","setAttribute"],"mappings":"kLAoBMA,IAAMC,KAAKD,IACXE,IAAMD,KAAKC,IACXC,EAAIF,KAAKG,GAETC,aAAgB,oBAAGC,EAAGC,IAAKC,EAAGC,UAAMC,EAAGC,eAAO,CAACL,EAAII,EAAIH,EAAII,EAAGH,EAAIE,EAAID,EAAIE,EAA1D,EAEhBC,QAAW,oBAAEC,GAAIC,WAAMC,GAAIC,gBAAQ,CAACH,GAAKE,GAAID,GAAKE,GAAvC,EAWXC,WAAc,mBAA8BC,SAA5BC,GAAIC,WAAMC,GAAIC,WAAMC,GAAIC,SAC1CA,GAAS,EAAIrB,QACPsB,UAdkB,CAAC,CAACzB,IAAPU,EAcaQ,IAdGhB,IAAIQ,IAAK,CAACR,IAAIQ,GAAIV,IAAIU,KAAtCA,YAeZgB,GAAIC,IAAOf,QAAQP,aAAaoB,UAAW,CAACJ,GAAKrB,IAAIuB,IAAKD,GAAKpB,IAAIqB,MAAO,CAACJ,GAAIC,MAC/EQ,GAAIC,IAAOjB,QAAQP,aAAaoB,UAAW,CAACJ,GAAKrB,IAAIuB,GAAKC,GAAIF,GAAKpB,IAAIqB,GAAKC,KAAM,CAACL,GAAIC,KACxFU,GAAON,EAAIrB,EAAK,EAAI,EACpB4B,GAAOP,EAAI,EAAK,EAAI,SACtBQ,MAAMH,KAAOG,MAAMJ,IACZ,GAEA,KAAOF,GAAK,IAAMC,GAAK,MAAQ,CAACN,GAAIC,GAAIJ,GAAK,EAAIf,GAAK,IAAK2B,GAAIC,GAAIH,GAAIC,IAAII,KAAK,qDAY/E,oBAA8Bf,SAA5BC,GAAIC,WAAMC,GAAIC,WAAMC,GAAIC,gBAChCU,UAAYC,SAASC,gBAAgB,6BAA8B,QACnE3B,EAAIQ,WAAW,CAACE,GAAIC,IAAK,CAACC,GAAIC,IAAK,CAACC,GAAIC,GAAIN,UAClDgB,UAAUG,aAAa,IAAK5B,GACrByB,SAAP"}
|
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
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/vue-easy-dnd/vue-easy-dnd.min.js
vendored
3
amd/build/vue-easy-dnd/vue-easy-dnd.min.js
vendored
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
2
amd/build/vue/dev/vue.min.js
vendored
2
amd/build/vue/dev/vue.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/vue/prod/vue.min.js
vendored
2
amd/build/vue/prod/vue.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
amd/build/vue/vue.min.js
vendored
2
amd/build/vue/vue.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
amd/src/bootstrap-vue/bootstrap-vue.js
vendored
1
amd/src/bootstrap-vue/bootstrap-vue.js
vendored
|
@ -1,3 +1,4 @@
|
|||
/* eslint-disable */
|
||||
/*!
|
||||
* BootstrapVue 2.23.1
|
||||
*
|
||||
|
|
|
@ -9,11 +9,11 @@ That's why the plain bootstrap.js file is used
|
|||
2. Copy node_modules/bootstrap-vue/dist/bootstrap-vue.js to amd/src/bootstrap-vue
|
||||
Copy node_modules/bootstrap-vue/dist/bootstrap-vue.min.css to css/bootstrap-vue
|
||||
|
||||
3. Change require("vue"...) and define("vue"...) in the lines 10 - 16 to
|
||||
3. Change require("vue"...) and define("vue"...) in the lines 10 - 16 to
|
||||
require("../vue/vue"...) and define("../vue/vue"...)
|
||||
|
||||
|
||||
4. add /* eslint-disable */ to top of bootstrap-vue.esm.js
|
||||
4. add /* eslint-disable */ to top of bootstrap-vue.js
|
||||
|
||||
--------- vue-functional-data-merge.js ----------
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/* eslint-disable */
|
||||
/*
|
||||
/*
|
||||
Compiled from ts into js by PMKuipers @ 2023) from source
|
||||
at https://github.com/alexsasharegan/vue-functional-data-merge
|
||||
at https://github.com/alexsasharegan/vue-functional-data-merge
|
||||
Below is copy of licens in original project
|
||||
*/
|
||||
/*
|
||||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 Alex Regan
|
||||
|
|
|
@ -1,66 +1,46 @@
|
|||
/*eslint no-var: "error" */
|
||||
/*eslint no-unused-vars: "off" */
|
||||
/*eslint linebreak-style: "off" */
|
||||
/*eslint no-trailing-spaces: "off" */
|
||||
/*eslint-env es6*/
|
||||
/* eslint-env es6*/
|
||||
// Put this file in path/to/plugin/amd/src
|
||||
// You can call it anything you like
|
||||
|
||||
import {get_string,get_strings} from 'core/str';
|
||||
import {call} from 'core/ajax';
|
||||
import Debugger from './debugger';
|
||||
|
||||
import {load_strings} from './string-helper';
|
||||
|
||||
let debug = new Debugger("treestudyplan-config-grades");
|
||||
|
||||
/*
|
||||
let strings = load_strings({
|
||||
studyplan: {
|
||||
studyplan_select_placeholder: 'studyplan_select_placeholder',
|
||||
},
|
||||
});
|
||||
*/
|
||||
|
||||
/**
|
||||
* Initialize grade cfg page
|
||||
*/
|
||||
export function init() {
|
||||
{ const
|
||||
{ const
|
||||
intRx = /\d/,
|
||||
integerChange = (event) => {
|
||||
if ( (event.key.length > 1) || intRx.test(event.key)
|
||||
) {
|
||||
return;
|
||||
if ((event.key.length > 1) || intRx.test(event.key)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
};
|
||||
|
||||
for (let input of document.querySelectorAll( 'input[type="number"][step="1"][min="0"]' )){
|
||||
|
||||
for (let input of document.querySelectorAll('input[type="number"][step="1"][min="0"]')) {
|
||||
input.addEventListener("keydown", integerChange);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
{ const
|
||||
decimal= /^[0-9]*?\.[0-9]*?$/,
|
||||
{ const
|
||||
decimal = /^[0-9]*?\.[0-9]*?$/,
|
||||
intRx = /\d/,
|
||||
floatChange = (event) => {
|
||||
if ( (event.key.length > 1) || ( (event.key === ".") && (!event.currentTarget.value.match(decimal)) )
|
||||
if ((event.key.length > 1) || ((event.key === ".") && (!event.currentTarget.value.match(decimal)))
|
||||
|| intRx.test(event.key)
|
||||
) {
|
||||
return;
|
||||
) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
};
|
||||
|
||||
for (let input of document.querySelectorAll( 'input[type="number"][min="0"]:not([step])' )){
|
||||
|
||||
for (let input of document.querySelectorAll('input[type="number"][min="0"]:not([step])')) {
|
||||
input.addEventListener("keydown", floatChange);
|
||||
}
|
||||
for (let input of document.querySelectorAll( 'input[type="text"].float' )){
|
||||
}
|
||||
for (let input of document.querySelectorAll('input[type="text"].float')) {
|
||||
input.addEventListener("keydown", floatChange);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
/*eslint no-console: "off"*/
|
||||
|
||||
/**
|
||||
* Save a piece of text to file as if it was downloaded
|
||||
* @param {string} filename
|
||||
|
@ -7,17 +5,18 @@
|
|||
* @param {string} type
|
||||
*/
|
||||
export function download(filename, text, type) {
|
||||
if(undefined == type) { type = "text/plain"; }
|
||||
if (undefined == type) {
|
||||
type = "text/plain";
|
||||
}
|
||||
var pom = document.createElement('a');
|
||||
pom.setAttribute('href', 'data:'+type+';charset=utf-8,' + encodeURIComponent(text));
|
||||
pom.setAttribute('href', 'data:' + type + ';charset=utf-8,' + encodeURIComponent(text));
|
||||
pom.setAttribute('download', filename);
|
||||
|
||||
if (document.createEvent) {
|
||||
var event = document.createEvent('MouseEvents');
|
||||
event.initEvent('click', true, true);
|
||||
pom.dispatchEvent(event);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
pom.click();
|
||||
}
|
||||
}
|
||||
|
@ -35,25 +34,25 @@ export function download(filename, text, type) {
|
|||
* @param {fileOpenedCallback} onready Callback to run when file is opened
|
||||
* @param {Array} accept Array of mime types that the file dialog will accept
|
||||
*/
|
||||
export function upload(onready,accept) {
|
||||
export function upload(onready, accept) {
|
||||
let input = document.createElement('input');
|
||||
input.type = 'file';
|
||||
if(Array.isArray(accept)){
|
||||
if(accept.count > 0){
|
||||
if (Array.isArray(accept)) {
|
||||
if (accept.count > 0) {
|
||||
input.accept = accept.join(", ");
|
||||
}
|
||||
} else if (undefined !== accept){
|
||||
} else if (undefined !== accept) {
|
||||
input.accept = accept;
|
||||
}
|
||||
input.onchange = () => {
|
||||
let files = Array.from(input.files);
|
||||
if(files.length > 0){
|
||||
let files = Array.from(input.files);
|
||||
if (files.length > 0) {
|
||||
let file = files[0];
|
||||
var reader = new FileReader();
|
||||
reader.onload = function(e) {
|
||||
var contents = e.target.result;
|
||||
if(onready instanceof Function){
|
||||
onready(file,contents);
|
||||
if (onready instanceof Function) {
|
||||
onready(file, contents);
|
||||
}
|
||||
};
|
||||
reader.readAsText(file);
|
||||
|
@ -64,8 +63,7 @@ export function upload(onready,accept) {
|
|||
var event = document.createEvent('MouseEvents');
|
||||
event.initEvent('click', true, true);
|
||||
input.dispatchEvent(event);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
input.click();
|
||||
}
|
||||
}
|
|
@ -1,21 +1,34 @@
|
|||
/*eslint no-var: "error"*/
|
||||
/*eslint no-console: "off"*/
|
||||
/*eslint-disable no-trailing-spaces */
|
||||
/*eslint-env es6*/
|
||||
// Put this file in path/to/plugin/amd/src
|
||||
/* eslint no-var: "error" */
|
||||
/* eslint capitalized-comments: "off" */
|
||||
/* eslint-env es6 */
|
||||
|
||||
import {loadFragment} from 'core/fragment';
|
||||
import {load_strings} from './util/string-helper';
|
||||
import {loadStrings} from './util/string-helper';
|
||||
import {call} from 'core/ajax';
|
||||
import notification from 'core/notification';
|
||||
import {replaceNodeContents} from 'core/templates';
|
||||
//import {markFormSubmitted} from 'core_form/changechecker'; // Moodle 4.00+ only
|
||||
//import {notifyFormSubmittedByJavascript} from 'core_form/events'; // Moodle 4.00+ only
|
||||
// import {markFormSubmitted} from 'core_form/changechecker'; // Moodle 4.00+ only
|
||||
// import {notifyFormSubmittedByJavascript} from 'core_form/events'; // Moodle 4.00+ only
|
||||
|
||||
/* Moodle 3.11 safe import for when needed
|
||||
let markFormSubmitted = () => {};
|
||||
let notifyFormSubmittedByJavascript = () => {};
|
||||
|
||||
import('core_form/changechecker').then((ns) => {
|
||||
debug.info(ns);
|
||||
if(ns.markFormSubmitted) {
|
||||
markFormSubmitted = ns.markFormSubmitted;
|
||||
}
|
||||
if(ns.notifyFormSubmittedByJavascript) {
|
||||
notifyFormSubmittedByJavascript = ns.notifyFormSubmittedByJavascript;
|
||||
}
|
||||
}).catch(()=>{});
|
||||
*/
|
||||
|
||||
export default {
|
||||
install(Vue/*,options*/){
|
||||
install(Vue/* ,options */) {
|
||||
|
||||
let strings = load_strings({
|
||||
let strings = loadStrings({
|
||||
editmod: {
|
||||
save$core: "save$core",
|
||||
cancel$core: "cancel$core",
|
||||
|
@ -27,16 +40,16 @@ export default {
|
|||
cmid: {
|
||||
type: Number,
|
||||
},
|
||||
coursectxid:{
|
||||
coursectxid: {
|
||||
type: Number,
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: "",
|
||||
'default': "",
|
||||
},
|
||||
genericonly: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
'default': false,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
@ -48,23 +61,23 @@ export default {
|
|||
computed: {
|
||||
},
|
||||
methods: {
|
||||
openForm(){
|
||||
openForm() {
|
||||
const self = this;
|
||||
self.$refs["editormodal"].show();
|
||||
self.$refs.editormodal.show();
|
||||
},
|
||||
onShown(){
|
||||
onShown() {
|
||||
const self = this;
|
||||
let params = {cmid: this.cmid};
|
||||
console.info("Loading form");
|
||||
loadFragment('local_treestudyplan', 'mod_edit_form', this.coursectxid, params).then((html,js) =>{
|
||||
replaceNodeContents(self.$refs["content"], html, js);
|
||||
loadFragment('local_treestudyplan', 'mod_edit_form', this.coursectxid, params).then((html, js) => {
|
||||
replaceNodeContents(self.$refs.content, html, js);
|
||||
return null;
|
||||
}).catch(notification.exception);
|
||||
|
||||
|
||||
},
|
||||
onSave(){
|
||||
onSave() {
|
||||
const self = this;
|
||||
let form = this.$refs["content"].getElementsByTagName("form")[0];
|
||||
|
||||
let form = this.$refs.content.getElementsByTagName("form")[0];
|
||||
|
||||
// markFormSubmitted(form); // Moodle 4.00+ only
|
||||
// We call this, so other modules can update the form with the latest state.
|
||||
form.dispatchEvent(new Event("save-form-state"));
|
||||
|
@ -72,23 +85,23 @@ export default {
|
|||
// notifyFormSubmittedByJavascript(form); // Moodle 4.00+ only
|
||||
|
||||
const formdata = new FormData(form);
|
||||
const data =new URLSearchParams(formdata).toString();
|
||||
//const formdata = new FormData(form);
|
||||
//const data = {};
|
||||
//formdata.forEach((value, key) => (data[key] = value));
|
||||
const data = new URLSearchParams(formdata).toString();
|
||||
// const formdata = new FormData(form);
|
||||
// const data = {};
|
||||
// formdata.forEach((value, key) => (data[key] = value));
|
||||
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_submit_cm_editform',
|
||||
args: {cmid: this.cmid, formdata: data}
|
||||
}])[0].done(()=>{
|
||||
self.$emit("saved",formdata);
|
||||
}).fail(notification.exception);
|
||||
|
||||
}])[0].then(() => {
|
||||
self.$emit("saved", formdata);
|
||||
return null;
|
||||
}).catch(notification.exception);
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<span class='s-edit-mod'><a href='#' @click.prevent="openForm"><slot><i class="fa fa-cog"></i></slot></a>
|
||||
<b-modal
|
||||
<b-modal
|
||||
ref="editormodal"
|
||||
scrollable
|
||||
centered
|
||||
|
|
261
amd/src/page-coach.js
Normal file
261
amd/src/page-coach.js
Normal file
|
@ -0,0 +1,261 @@
|
|||
/* eslint no-var: "error" */
|
||||
/* eslint no-unused-vars: "off" */
|
||||
/* eslint linebreak-style: "off" */
|
||||
/* eslint no-trailing-spaces: "off" */
|
||||
/* eslint promise/no-nesting: "off" */
|
||||
/* eslint max-depth: ["error", 6]*/
|
||||
/* eslint-env es6*/
|
||||
// Put this file in path/to/plugin/amd/src
|
||||
// You can call it anything you like
|
||||
|
||||
import {call} from 'core/ajax';
|
||||
import notification from 'core/notification';
|
||||
|
||||
import Vue from './vue/vue';
|
||||
|
||||
import Debugger from './util/debugger';
|
||||
import {loadStrings} from './util/string-helper';
|
||||
import {processStudyplan} from './studyplan-processor';
|
||||
import {studyplanTiming} from './util/date-helper';
|
||||
import {addBrowserButtonEvent} from './util/browserbuttonevents';
|
||||
|
||||
import EditorComponents from './studyplan-editor-components';
|
||||
Vue.use(EditorComponents);
|
||||
|
||||
import TSComponents from './treestudyplan-components';
|
||||
Vue.use(TSComponents);
|
||||
|
||||
import RVComponents from './report-viewer-components';
|
||||
Vue.use(RVComponents);
|
||||
|
||||
import ModalComponents from './modedit-modal';
|
||||
Vue.use(ModalComponents);
|
||||
|
||||
import PortalVue from './portal-vue/portal-vue.esm';
|
||||
Vue.use(PortalVue);
|
||||
import BootstrapVue from './bootstrap-vue/bootstrap-vue';
|
||||
Vue.use(BootstrapVue);
|
||||
|
||||
|
||||
let debug = new Debugger("treestudyplancoach");
|
||||
|
||||
let strings = loadStrings({
|
||||
coach: {
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Initialize the Page
|
||||
*/
|
||||
export function init() {
|
||||
let app = new Vue({
|
||||
el: '#root',
|
||||
data: {
|
||||
selected: {
|
||||
planid: 0,
|
||||
studentid: 0,
|
||||
},
|
||||
displayedstudyplan: null,
|
||||
activestudyplan: null,
|
||||
associatedstudents: [],
|
||||
selectedstudent: null,
|
||||
studentstudyplan: null,
|
||||
loadingstudyplan: false,
|
||||
studyplans: [],
|
||||
text: strings.coach,
|
||||
toolbox: {
|
||||
right: true,
|
||||
},
|
||||
usedcontexts: [],
|
||||
editmode: false,
|
||||
},
|
||||
async mounted() {
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_list_coaching_studyplans',
|
||||
args: {}
|
||||
}])[0].then(function(response) {
|
||||
const timingval = {present: 0, past: 1, future: 2};
|
||||
response.sort((a, b) => {
|
||||
const timinga = studyplanTiming(a);
|
||||
const timingb = studyplanTiming(b);
|
||||
|
||||
const t = timingval[timinga] - timingval[timingb];
|
||||
if (t == 0) {
|
||||
// Sort by name if timing is equal
|
||||
return a.name.localeCompare(b.name);
|
||||
} else {
|
||||
return t;
|
||||
}
|
||||
});
|
||||
app.studyplans = response;
|
||||
// Load studyplan from hash if applicable
|
||||
const hash = window.location.hash.replace('#', '');
|
||||
const parts = hash.split("-");
|
||||
|
||||
if (!!parts && parts.length > 0 && parts[0] != '') {
|
||||
for (let idx in app.studyplans) {
|
||||
if (app.studyplans[idx].id == parts[0]) {
|
||||
app.selectStudyplan(app.studyplans[idx], parts[1], false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}).catch(notification.exception);
|
||||
addBrowserButtonEvent(this.navChanged, this.navChanged);
|
||||
},
|
||||
computed: {
|
||||
studentcount() {
|
||||
let count = 0;
|
||||
for (const group of app.associatedstudents) {
|
||||
count += group.users.length;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
navChanged() {
|
||||
const hash = window.location.hash.replace('#', '');
|
||||
const parts = hash.split("-");
|
||||
debug.log("Navigation changed", hash, parts);
|
||||
|
||||
if (!!parts && parts.length > 0) {
|
||||
const planid = Number(parts[0]);
|
||||
const studentid = (parts.length > 1) ? Number(parts[1]) : 0;
|
||||
|
||||
debug.log("Selected ids", planid, studentid, this.selected.planid, this.selected.studentid);
|
||||
if (planid == 0) {
|
||||
if (planid != this.selected.planid) {
|
||||
this.closeStudyplan(false);
|
||||
}
|
||||
} else if (this.selected.planid != planid || (studentid == 0 && this.selected.studentid != 0)) {
|
||||
debug.info("Requested plan changed - loading studyplan");
|
||||
for (let idx in app.studyplans) {
|
||||
const plan = this.studyplans[idx];
|
||||
if (Number(plan.id) == planid) {
|
||||
this.selectStudyplan(plan, studentid, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (this.selected.studentid != studentid) {
|
||||
for (const group of app.associatedstudents) {
|
||||
for (const student of group.users) {
|
||||
if (Number(student.id) == studentid) {
|
||||
app.showStudentView(student, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
closeStudyplan(updatehash = true) {
|
||||
app.selected.planid = 0;
|
||||
app.selected.studentid = 0;
|
||||
app.activestudyplan = null;
|
||||
app.associatedstudents = [];
|
||||
app.studentstudyplan = [];
|
||||
app.displayedstudyplan = null;
|
||||
if (updatehash) {
|
||||
window.location.hash = '';
|
||||
}
|
||||
},
|
||||
|
||||
selectStudyplan(studyplan, studentid, updatehash = true) {
|
||||
app.selected.planid = Number(studyplan.id);
|
||||
app.selected.studentid = studentid ? Number(studentid) : 0;
|
||||
// Fetch studyplan
|
||||
const self = this;
|
||||
self.loadingstudyplan = true;
|
||||
self.associatedstudents = [];
|
||||
self.selectedstudent = null;
|
||||
self.studentstudyplan = null;
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_get_studyplan_map',
|
||||
args: {id: studyplan.id}
|
||||
}])[0].then((response) => {
|
||||
self.activestudyplan = processStudyplan(response, true);
|
||||
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_all_associated_grouped',
|
||||
args: {'studyplan_id': studyplan.id}
|
||||
}])[0].then(function(response) {
|
||||
self.associatedstudents = response;
|
||||
let foundstudent = false;
|
||||
if (studentid) {
|
||||
for (const group of self.associatedstudents) {
|
||||
for (const student of group.users) {
|
||||
if (student.id == studentid) {
|
||||
foundstudent = true;
|
||||
self.showStudentView(student);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!foundstudent) {
|
||||
// Select first student available.
|
||||
for (const group of self.associatedstudents) {
|
||||
for (const student of group.users) {
|
||||
foundstudent = true;
|
||||
self.showStudentView(student);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!foundstudent) {
|
||||
// Update hash with just the studyplan if no student was available for display
|
||||
app.selected.studentid = 0;
|
||||
if (updatehash) {
|
||||
window.location.hash = app.activestudyplan.id;
|
||||
}
|
||||
self.displayedstudyplan = self.activestudyplan;
|
||||
self.loadingstudyplan = false;
|
||||
}
|
||||
return;
|
||||
}).catch(notification.exception);
|
||||
return;
|
||||
}).catch(function(error) {
|
||||
notification.exception(error);
|
||||
app.loadingstudyplan = false;
|
||||
});
|
||||
},
|
||||
showStudentView(student, updatehash = true) {
|
||||
app.selected.studentid = student ? Number(student.id) : 0;
|
||||
if (student) {
|
||||
app.selectedstudent = student;
|
||||
app.studentstudyplan = null;
|
||||
app.loadingstudyplan = true;
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_get_user_studyplan',
|
||||
args: {userid: student.id, studyplanid: app.activestudyplan.id}
|
||||
}])[0].then((response) => {
|
||||
app.studentstudyplan = processStudyplan(response, false);
|
||||
app.displayedstudyplan = app.studentstudyplan;
|
||||
app.loadingstudyplan = false;
|
||||
if (updatehash) {
|
||||
window.location.hash = app.activestudyplan.id + "-" + student.id;
|
||||
}
|
||||
return;
|
||||
}).catch(function(error) {
|
||||
notification.exception(error);
|
||||
app.loadingstudyplan = false;
|
||||
});
|
||||
} else {
|
||||
this.showOverview(updatehash);
|
||||
}
|
||||
},
|
||||
showOverview(updatehash = true) {
|
||||
debug.info("Switch to overview", updatehash);
|
||||
app.selected.studentid = 0;
|
||||
app.selectedstudent = null;
|
||||
app.studentstudyplan = null;
|
||||
app.displayedstudyplan = app.activestudyplan;
|
||||
if (updatehash) {
|
||||
window.location.hash = app.activestudyplan.id;
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
});
|
||||
}
|
|
@ -1,17 +1,18 @@
|
|||
/*eslint no-var: "error" */
|
||||
/*eslint no-unused-vars: "off" */
|
||||
/*eslint linebreak-style: "off" */
|
||||
/*eslint no-trailing-spaces: "off" */
|
||||
/*eslint-env es6*/
|
||||
/* eslint no-var: "error" */
|
||||
/* eslint no-unused-vars: "off" */
|
||||
/* eslint linebreak-style: "off" */
|
||||
/* eslint no-trailing-spaces: "off" */
|
||||
/* eslint no-empty-function: "off" */
|
||||
/* eslint-env es6*/
|
||||
// Put this file in path/to/plugin/amd/src
|
||||
// You can call it anything you like
|
||||
|
||||
import {get_string,get_strings} from 'core/str';
|
||||
import {call} from 'core/ajax';
|
||||
import notification from 'core/notification';
|
||||
|
||||
import Vue from './vue/vue';
|
||||
// Commented out: import {resetAllFormDirtyStates} from 'core_form/changechecker'; // Moodle 4.00+ only
|
||||
|
||||
import Vue from './vue/vue';
|
||||
|
||||
import EditorComponents from './studyplan-editor-components';
|
||||
Vue.use(EditorComponents);
|
||||
|
@ -22,26 +23,38 @@ Vue.use(TSComponents);
|
|||
import ModalComponents from './modedit-modal';
|
||||
Vue.use(ModalComponents);
|
||||
import Debugger from './util/debugger';
|
||||
import {addBrowserButtonEvent} from './util/browserbuttonevents';
|
||||
|
||||
import {load_strings} from './util/string-helper';
|
||||
import {ProcessStudyplan} from './studyplan-processor';
|
||||
import {download,upload} from './downloader';
|
||||
import {loadStrings} from './util/string-helper';
|
||||
import {processStudyplan} from './studyplan-processor';
|
||||
import {download, upload} from './downloader';
|
||||
import {studyplanTiming} from './util/date-helper';
|
||||
import mFormComponents from "./util/mform-helper";
|
||||
Vue.use(mFormComponents);
|
||||
|
||||
import PortalVue from './portal-vue/portal-vue.esm';
|
||||
Vue.use(PortalVue);
|
||||
import BootstrapVue from './bootstrap-vue/bootstrap-vue';
|
||||
Vue.use(BootstrapVue);
|
||||
|
||||
import {Drag, Drop, DropList} from './vue-easy-dnd/vue-easy-dnd.esm';
|
||||
Vue.component('drag',Drag);
|
||||
Vue.component('drop',Drop);
|
||||
Vue.component('drop-list',DropList);
|
||||
|
||||
const debug = new Debugger("treestudyplan");
|
||||
|
||||
let strings = load_strings({
|
||||
let resetAllFormDirtyStates = () => { };
|
||||
import('core_form/changechecker').then((ns) => {
|
||||
debug.info(ns);
|
||||
if (ns.resetAllFormDirtyStates) {
|
||||
resetAllFormDirtyStates = ns.resetAllFormDirtyStates;
|
||||
}
|
||||
return;
|
||||
}).catch(()=>{});
|
||||
|
||||
let strings = loadStrings({
|
||||
studyplan: {
|
||||
studyplan_select_placeholder: 'studyplan_select_placeholder',
|
||||
'studyplan_select_placeholder': 'studyplan_select_placeholder',
|
||||
'advanced_import_from_file': 'advanced_import_from_file',
|
||||
'advanced_create_from_template': 'advanced_create_from_template',
|
||||
'studyplan_add': "studyplan_add",
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -49,15 +62,30 @@ let strings = load_strings({
|
|||
* Initialize the Page
|
||||
* @param {int} contextid The context we should attempt to work in (1:1 related to the category)
|
||||
* @param {int} categoryid The category we shoud attempt to work in (1:1 related to the context)
|
||||
* @param {object} options Options to be passed to this script
|
||||
*/
|
||||
export function init(contextid,categoryid) {
|
||||
export function init(contextid, categoryid, options) {
|
||||
// Make sure the id's are numeric and integer
|
||||
if(undefined === contextid || !Number.isInteger(Number(contextid)) || contextid < 1 ){ contextid = 1;}
|
||||
else { contextid = Number(contextid);} // ensure a numeric value instead of string
|
||||
if(undefined === categoryid || !Number.isInteger(Number(categoryid))){ categoryid = 0;}
|
||||
else { categoryid = Number(categoryid);} // ensure a numeric value instead of string
|
||||
if (undefined === contextid || !Number.isInteger(Number(contextid)) || contextid < 1) {
|
||||
contextid = 1;
|
||||
} else {
|
||||
contextid = Number(contextid); // Ensure a numeric value instead of string
|
||||
}
|
||||
if (undefined === categoryid || !Number.isInteger(Number(categoryid))) {
|
||||
categoryid = 0;
|
||||
} else {
|
||||
categoryid = Number(categoryid); // Ensure a numeric value instead of string
|
||||
}
|
||||
|
||||
const in_systemcontext = (contextid <= 1);
|
||||
debug.info("options", options);
|
||||
if (options !== null && typeof options === 'object' && !Array.isArray(options)) {
|
||||
if (!options.defaultAggregation) {
|
||||
options.defaultAggregation = "core";
|
||||
}
|
||||
|
||||
} else {
|
||||
options = {defaultAggregation: "core"};
|
||||
}
|
||||
|
||||
// Setup the initial Vue app for this page
|
||||
let app = new Vue({
|
||||
|
@ -69,198 +97,205 @@ export function init(contextid,categoryid) {
|
|||
shortname: '',
|
||||
description: '',
|
||||
idnumber: '',
|
||||
slots : 4,
|
||||
slots: 4,
|
||||
startdate: '2020-08-01',
|
||||
enddate: '',
|
||||
context: contextid,
|
||||
aggregation: 'bistate',
|
||||
aggregation_config: '',
|
||||
aggregation: options.defaultAggregation,
|
||||
'aggregation_config': '',
|
||||
}
|
||||
},
|
||||
toolbox: {
|
||||
right: true,
|
||||
},
|
||||
|
||||
activestudyplan: null,
|
||||
activepage: null,
|
||||
loadingstudyplan: false,
|
||||
studyplans: [],
|
||||
frameworks: [],
|
||||
badges: [],
|
||||
courses: [],
|
||||
templatecount: 0,
|
||||
|
||||
text: strings.studyplan,
|
||||
usedcontexts: [],
|
||||
},
|
||||
created() {
|
||||
this.$root.$on('studyplanRemoved',(studyplan)=>{
|
||||
|
||||
if(app.activestudyplan == studyplan){
|
||||
this.$root.$on('studyplanRemoved', (studyplan)=>{
|
||||
|
||||
if (app.activestudyplan == studyplan) {
|
||||
app.activestudyplan = null;
|
||||
}
|
||||
|
||||
// remove studyplan from index list
|
||||
// Remove studyplan from index list
|
||||
let index = null;
|
||||
for(let idx in app.studyplans){
|
||||
if(app.studyplans[idx].id == studyplan.id){
|
||||
for (let idx in app.studyplans) {
|
||||
if (app.studyplans[idx].id == studyplan.id) {
|
||||
index = idx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(index){
|
||||
if (index) {
|
||||
app.studyplans.splice(index, 1);
|
||||
}
|
||||
|
||||
});
|
||||
},
|
||||
mounted() {
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_list_studyplans',
|
||||
args: { context_id: contextid}
|
||||
}])[0].done(function(response){
|
||||
const timingval = { future: 0, present: 1, past: 2, };
|
||||
response.sort((a,b) => {
|
||||
const timinga = TSComponents.studyplanTiming(a);
|
||||
const timingb = TSComponents.studyplanTiming(b);
|
||||
|
||||
let t = timingval[timinga] - timingval[timingb];
|
||||
if(t == 0){
|
||||
// sort by start date if timing is equal
|
||||
t = new Date(b.startdate).getTime() - new Date(a.startdate).getTime();
|
||||
|
||||
if (t == 0) {
|
||||
// sort by name if timing is equal
|
||||
t = a.name.localeCompare(b.name);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
});
|
||||
app.studyplans = response;
|
||||
|
||||
// load studyplan from hash if applicable
|
||||
const hash = location.hash.replace('#','');
|
||||
if(hash){
|
||||
for(let idx in app.studyplans){
|
||||
if(app.studyplans[idx].id == hash){
|
||||
app.selectStudyplan(app.studyplans[idx]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}).fail(notification.exception);
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_list_badges',
|
||||
args: {}
|
||||
}])[0].done(function(response){
|
||||
app.badges = response;
|
||||
}).fail(notification.exception);
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_map_categories',
|
||||
args: {root_id: categoryid}
|
||||
}])[0].done(function(response){
|
||||
app.courses = response;
|
||||
}).fail(notification.exception);
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_list_used_categories',
|
||||
args: { operation: 'edit'}
|
||||
}])[0].done(function(response){
|
||||
app.usedcontexts = response;
|
||||
}).fail(notification.exception);
|
||||
this.initialize();
|
||||
addBrowserButtonEvent(this.backPressed);
|
||||
},
|
||||
beforeunmount() {
|
||||
|
||||
},
|
||||
computed: {
|
||||
dropdown_title(){
|
||||
if(this.activestudyplan && this.activestudyplan.name){
|
||||
dropdownTitle() {
|
||||
if (this.activestudyplan && this.activestudyplan.name) {
|
||||
return this.activestudyplan.name;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
return this.text.studyplan_select_placeholder;
|
||||
}
|
||||
},
|
||||
contextid(){
|
||||
contextid() {
|
||||
return contextid;
|
||||
},
|
||||
filterComponentType(){
|
||||
return {
|
||||
item: false,
|
||||
component: true,
|
||||
span: 1,
|
||||
type: 'filter',
|
||||
};
|
||||
},
|
||||
|
||||
},
|
||||
methods: {
|
||||
backPressed() {
|
||||
debug.log("Back button pressed");
|
||||
if (app.activestudyplan) {
|
||||
debug.log("Closing studyplan");
|
||||
this.closeStudyplan();
|
||||
}
|
||||
},
|
||||
initialize() {
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_list_studyplans',
|
||||
args: {'context_id': contextid}
|
||||
}])[0].then(function(response) {
|
||||
const timingval = {future: 0, present: 1, past: 2};
|
||||
response.sort((a, b) => {
|
||||
const timinga = studyplanTiming(a);
|
||||
const timingb = studyplanTiming(b);
|
||||
|
||||
let t = timingval[timinga] - timingval[timingb];
|
||||
if (t == 0) {
|
||||
// Sort by start date if timing is equal
|
||||
t = new Date(b.startdate).getTime() - new Date(a.startdate).getTime();
|
||||
|
||||
if (t == 0) {
|
||||
// Sort by name if timing is equal
|
||||
t = a.name.localeCompare(b.name);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
});
|
||||
app.studyplans = response;
|
||||
|
||||
// Load studyplan from hash if applicable
|
||||
const hash = location.hash.replace('#', '');
|
||||
if (hash) {
|
||||
const id = hash;
|
||||
for (const p of app.studyplans) {
|
||||
if (p.id == id) {
|
||||
app.selectStudyplan(id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}).catch(notification.exception);
|
||||
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_list_available_categories',
|
||||
args: {operation: 'edit', 'refcontext_id': contextid}
|
||||
}])[0].then(function(response) {
|
||||
app.usedcontexts = response;
|
||||
return;
|
||||
}).catch(notification.exception);
|
||||
|
||||
this.refreshTemplateCount();
|
||||
},
|
||||
refreshTemplateCount() {
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_count_templates',
|
||||
args: { }
|
||||
}])[0].then(function(response) {
|
||||
app.templatecount = response;
|
||||
return;
|
||||
}).catch(notification.exception);
|
||||
},
|
||||
closeStudyplan() {
|
||||
app.activestudyplan = null;
|
||||
location.hash = '';
|
||||
},
|
||||
movedStudyplan(plan,from,to) {
|
||||
// reload the page in the new context (needed, since a number of links are not reactive in the page)
|
||||
window.location.hash = '';
|
||||
},
|
||||
movedStudyplan(plan, from, to) {
|
||||
// Reload the page in the new context (needed, since a number of links are not reactive in the page)
|
||||
const params = new URLSearchParams(location.search);
|
||||
params.delete('categoryid');
|
||||
params.set("contextid", to);
|
||||
window.location.search = params.toString();
|
||||
setTimeout(() => {
|
||||
// Reload page in a timeout to give other form javasccript the change to remove the beforeunload handler.
|
||||
window.location.search = params.toString();
|
||||
}, 50);
|
||||
},
|
||||
onStudyPlanCreated(newstudyplan){
|
||||
app.studyplans.push(newstudyplan);
|
||||
app.selectStudyplan(newstudyplan);
|
||||
|
||||
onStudyPlanCreated(newstudyplan) {
|
||||
if (newstudyplan.context_id != contextid) {
|
||||
// Study plan has changed context id - reload page into new context id and show the plan
|
||||
const params = new URLSearchParams(location.search);
|
||||
params.delete('categoryid');
|
||||
params.set("contextid", newstudyplan.context_id);
|
||||
// Make sure the form is no longer dirty before reloading the page - avoid beforeunload handler triggering.
|
||||
resetAllFormDirtyStates();
|
||||
window.location = window.location.pathname + "?" + params.toString() + "#" + newstudyplan.id;
|
||||
} else {
|
||||
app.studyplans.push(newstudyplan);
|
||||
app.selectStudyplan(newstudyplan.id);
|
||||
}
|
||||
},
|
||||
switchContext(ctx){
|
||||
switchContext(ctxid) {
|
||||
const params = new URLSearchParams(location.search);
|
||||
params.set('categoryid', ctx.id);
|
||||
window.location.search = params.toString();
|
||||
|
||||
params.delete('categoryid');
|
||||
params.set('contextid', ctxid);
|
||||
setTimeout(() => {
|
||||
// Reload page in a timeout to give other form javasccript the change to remove the beforeunload handler.
|
||||
window.location.href = window.location.pathname + "?" + params.toString();
|
||||
}, 50);
|
||||
},
|
||||
selectStudyplan(studyplan){
|
||||
// fetch studyplan
|
||||
selectStudyplan(studyplanid) {
|
||||
// Fetch studyplan
|
||||
app.loadingstudyplan = true;
|
||||
app.activestudyplan = null;
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_get_studyplan_map',
|
||||
args: { id: studyplan.id}
|
||||
}])[0].done(function(response){
|
||||
app.activestudyplan = ProcessStudyplan(response,true);
|
||||
args: {id: studyplanid}
|
||||
}])[0].then(function(response) {
|
||||
app.activestudyplan = processStudyplan(response);
|
||||
debug.info('studyplan processed');
|
||||
app.loadingstudyplan = false;
|
||||
location.hash = app.activestudyplan.id;
|
||||
}).fail(function(error){
|
||||
window.location.hash = app.activestudyplan.id;
|
||||
return;
|
||||
}).catch(function(error) {
|
||||
notification.exception(error);
|
||||
app.loadingstudyplan = false;
|
||||
});
|
||||
},
|
||||
import_studyplan(){
|
||||
upload((filename,content)=>{
|
||||
importStudyplan() {
|
||||
const self = this;
|
||||
upload((filename, content)=>{
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_import_plan',
|
||||
args: {
|
||||
content: content,
|
||||
format: "application/json",
|
||||
context_id: contextid,
|
||||
'context_id': contextid,
|
||||
},
|
||||
}])[0].done(function(response){
|
||||
if(response.success){
|
||||
location.reload();
|
||||
}])[0].then(function(response) {
|
||||
if (response.success) {
|
||||
self.initialize();
|
||||
} else {
|
||||
debug.error("Import failed: ",response.msg);
|
||||
debug.error("Import failed: ", response.msg);
|
||||
}
|
||||
|
||||
}).fail(notification.exception);
|
||||
return;
|
||||
}).catch(notification.exception);
|
||||
}, "application/json");
|
||||
},
|
||||
export_plan(plan,format){
|
||||
let self = this;
|
||||
if(format == undefined || !["json","csv"].includes(format)){
|
||||
format = "json";
|
||||
}
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_export_plan',
|
||||
args: {
|
||||
studyplan_id: plan.id,
|
||||
format: format
|
||||
},
|
||||
}])[0].done(function(response){
|
||||
|
||||
download(plan.shortname+".json",response.content,response.format);
|
||||
}).fail(notification.exception);
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,51 +1,71 @@
|
|||
/*eslint no-var: "error" */
|
||||
/*eslint no-unused-vars: "off" */
|
||||
/*eslint linebreak-style: "off" */
|
||||
/*eslint-env es6*/
|
||||
/* eslint no-var: "error" */
|
||||
/* eslint no-unused-vars: "off" */
|
||||
/* eslint linebreak-style: "off" */
|
||||
/* eslint promise/no-nesting: "off" */
|
||||
/* eslint-env es6*/
|
||||
/* eslint camelcase: "off" */
|
||||
// Put this file in path/to/plugin/amd/src
|
||||
// You can call it anything you like
|
||||
|
||||
define(['jquery', 'core/str', 'core/ajax', 'core/modal_factory', 'core/modal_events',
|
||||
'local_treestudyplan/handlers', 'local_treestudyplan/debugger'],
|
||||
function ($, str, ajax, ModalFactory, ModalEvents,
|
||||
handlers, Debugger) {
|
||||
let debug = new Debugger("treestudyplan");
|
||||
import Debugger from './util/debugger';
|
||||
import {get_strings} from 'core/str';
|
||||
import {getStrings} from 'core/str';
|
||||
import ModalFactory from 'core/modal_factory';
|
||||
import ModalEvents from 'core/modal_events';
|
||||
|
||||
let self = {
|
||||
init: function init() {
|
||||
$('.path-local-treestudyplan a.m-action-confirm').on('click', function (e) {
|
||||
/* Determine the proper getstrings function to use (MDL4.3+ recommends use of getStrings, which is jquery independent) */
|
||||
const getstrFunc = (getStrings !== undefined) ? getStrings : get_strings;
|
||||
|
||||
let debug = new Debugger("treestudyplan-invitemanager");
|
||||
|
||||
/**
|
||||
* Init function for page-invitemanager
|
||||
*/
|
||||
export function init() {
|
||||
getstrFunc([
|
||||
{key: 'ok', component: 'core'},
|
||||
{key: 'confirm', component: 'core'},
|
||||
]).then((s) => {
|
||||
const strOk = s[0];
|
||||
const strConfirm = s[1];
|
||||
|
||||
const els = document.querySelectorAll('.path-local-treestudyplan a.m-action-confirm');
|
||||
els.forEach((el) => {
|
||||
el.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
let $link = $(e.currentTarget);
|
||||
let href = $link.attr('data-actionhref');
|
||||
let text = $link.attr('data-confirmtext');
|
||||
let oktext = $link.attr('data-confirmbtn');
|
||||
debug.info("Ok", oktext);
|
||||
if (undefined == oktext) { oktext = str.get_string('ok'); }
|
||||
let title = $link.attr('data-confirmtitle');
|
||||
debug.info("Title", title);
|
||||
if (undefined == title) { title = str.get_string('confirm'); }
|
||||
|
||||
debug.info("Link, href, text", $link, href, text);
|
||||
const link = e.currentTarget;
|
||||
let href = link.getAttribute('data-actionhref');
|
||||
let text = link.getAttribute('data-confirmtext');
|
||||
let oktext = link.getAttribute('data-confirmbtn');
|
||||
if (undefined == oktext) {
|
||||
oktext = strOk;
|
||||
}
|
||||
let title = link.getAttribute('data-confirmtitle');
|
||||
if (undefined == title) {
|
||||
title = strConfirm;
|
||||
}
|
||||
|
||||
ModalFactory.create({
|
||||
type: ModalFactory.types.SAVE_CANCEL,
|
||||
title: title,
|
||||
body: text,
|
||||
}).then(function (modal) {
|
||||
}).then((modal) => {
|
||||
modal.setSaveButtonText(oktext);
|
||||
|
||||
let root = modal.getRoot();
|
||||
root.on(ModalEvents.save, function () {
|
||||
root.on(ModalEvents.save, () => {
|
||||
window.location = href;
|
||||
});
|
||||
|
||||
$(modal.modal).css("max-width", "345px");
|
||||
modal.modal[0].style["max-width"] = "345px";
|
||||
modal.show();
|
||||
return modal;
|
||||
}).catch((x) => {
|
||||
debug.warn(x);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
};
|
||||
return self;
|
||||
});
|
||||
});
|
||||
return;
|
||||
}).catch((x) => {
|
||||
debug.warn(x);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,92 +1,34 @@
|
|||
/*eslint no-var: "error" */
|
||||
/*eslint no-unused-vars: "off" */
|
||||
/*eslint linebreak-style: "off" */
|
||||
/*eslint no-trailing-spaces: "off" */
|
||||
/*eslint no-console: "off" */
|
||||
/*eslint-env es6*/
|
||||
/* eslint no-unused-vars: "off" */
|
||||
/* eslint-env es6*/
|
||||
// Put this file in path/to/plugin/amd/src
|
||||
// You can call it anything you like
|
||||
|
||||
import {call} from 'core/ajax';
|
||||
import notification from 'core/notification';
|
||||
|
||||
import Vue from './vue/vue';
|
||||
|
||||
import RVComponents from './report-viewer-components';
|
||||
Vue.use(RVComponents);
|
||||
|
||||
import TSComponents from './treestudyplan-components';
|
||||
import Debugger from './util/debugger';
|
||||
|
||||
import {ProcessStudyplans} from './studyplan-processor';
|
||||
|
||||
|
||||
import PortalVue from './portal-vue/portal-vue.esm';
|
||||
Vue.use(PortalVue);
|
||||
import BootstrapVue from './bootstrap-vue/bootstrap-vue.esm';
|
||||
import BootstrapVue from './bootstrap-vue/bootstrap-vue';
|
||||
Vue.use(BootstrapVue);
|
||||
|
||||
let debug = new Debugger("treestudyplan-report");
|
||||
|
||||
/**
|
||||
* Initialize the Page
|
||||
* @param {string} type Type of page to show
|
||||
* @param {Object} arg Arguments passed
|
||||
* @param {Object} arg1 Argument1 as passed
|
||||
*/
|
||||
export function init(type="myreport",arg) {
|
||||
export function init(type = "own", arg1) {
|
||||
let app = new Vue({
|
||||
el: '#root',
|
||||
data: {
|
||||
"studyplans": [],
|
||||
"type": type,
|
||||
"invitekey": (type == "invited") ? arg1 : null,
|
||||
"userid": (type == "other") ? arg1 : null,
|
||||
},
|
||||
mounted() {
|
||||
let call_method;
|
||||
let call_args;
|
||||
if(type == "invited"){
|
||||
call_method = 'local_treestudyplan_get_invited_studyplan';
|
||||
call_args = {"invitekey": arg};
|
||||
}
|
||||
else if(type == "other"){
|
||||
call_method = 'local_treestudyplan_get_user_studyplans';
|
||||
call_args = {"userid": arg};
|
||||
}
|
||||
else if(type == "teaching"){
|
||||
call_method = 'local_treestudyplan_get_teaching_studyplans';
|
||||
call_args = {};
|
||||
}
|
||||
else{
|
||||
call_method = 'local_treestudyplan_get_own_studyplan';
|
||||
call_args = {};
|
||||
}
|
||||
call([{
|
||||
methodname: call_method,
|
||||
args: call_args
|
||||
}])[0].done(function(response){
|
||||
debug.info("Studyplans:",response);
|
||||
const timingval = { future: 0, present: 1, past: 2, };
|
||||
response.sort((a,b) => {
|
||||
const timinga = TSComponents.studyplanTiming(a);
|
||||
const timingb = TSComponents.studyplanTiming(b);
|
||||
|
||||
let t = timingval[timinga] - timingval[timingb];
|
||||
if(t == 0){
|
||||
// sort by start date if timing is equal
|
||||
t = new Date(b.startdate).getTime() - new Date(a.startdate).getTime();
|
||||
|
||||
if (t == 0) {
|
||||
// sort by name if timing is equal
|
||||
t = a.name.localeCompare(b.name);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
});
|
||||
app.studyplans = ProcessStudyplans(response);
|
||||
}).fail(notification.exception);
|
||||
|
||||
},
|
||||
|
||||
methods: {
|
||||
|
||||
|
||||
},
|
||||
});
|
||||
|
||||
|
|
121
amd/src/page-result-overview.js
Normal file
121
amd/src/page-result-overview.js
Normal file
|
@ -0,0 +1,121 @@
|
|||
/* eslint no-var: "error" */
|
||||
/* eslint no-unused-vars: "off" */
|
||||
/* eslint linebreak-style: "off" */
|
||||
/* eslint no-trailing-spaces: "off" */
|
||||
/* eslint-env es6*/
|
||||
|
||||
import {call} from 'core/ajax';
|
||||
import notification from 'core/notification';
|
||||
|
||||
import Vue from './vue/vue';
|
||||
|
||||
import Debugger from './util/debugger';
|
||||
import {loadStrings} from './util/string-helper';
|
||||
|
||||
import SRComponents from './studyplan-report-components';
|
||||
Vue.use(SRComponents);
|
||||
import RVComponents from './report-viewer-components';
|
||||
Vue.use(RVComponents);
|
||||
|
||||
import ModalComponents from './modedit-modal';
|
||||
Vue.use(ModalComponents);
|
||||
|
||||
import PortalVue from './portal-vue/portal-vue.esm';
|
||||
Vue.use(PortalVue);
|
||||
import BootstrapVue from './bootstrap-vue/bootstrap-vue';
|
||||
Vue.use(BootstrapVue);
|
||||
|
||||
|
||||
let debug = new Debugger("treestudyplanviewer");
|
||||
|
||||
let strings = loadStrings({
|
||||
studyplanReport: {
|
||||
studyplan: 'studyplan',
|
||||
page: 'studyplanpage',
|
||||
periods: 'periods',
|
||||
period: 'period',
|
||||
loading: 'loading@core',
|
||||
all: 'all@core',
|
||||
from: 'from@core',
|
||||
to: 'to@core',
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Initialize the Page
|
||||
* @param {Number} studyplanid The id of the studyplan we need to view
|
||||
* @param {Number} pageid The id of the studyplan page we need to view
|
||||
* @param {Number} firstperiod The number of the first period to view
|
||||
* @param {Number} lastperiod The number of the last period to view
|
||||
*/
|
||||
export function init(studyplanid, pageid, firstperiod, lastperiod) {
|
||||
if (undefined === pageid || !Number.isInteger(Number(pageid)) ||
|
||||
undefined === studyplanid || !Number.isInteger(Number(studyplanid))) {
|
||||
debug.error("Error: studyplan id and page id not provided as integer numbers to script.",
|
||||
studyplanid, pageid, firstperiod, lastperiod);
|
||||
return; // Do not continue if plan and page are not proper integers
|
||||
}
|
||||
// Ensure a numeric value instead of string.
|
||||
studyplanid = Number(studyplanid);
|
||||
pageid = Number(pageid);
|
||||
|
||||
// Startup app.
|
||||
const app = new Vue({
|
||||
el: '#root',
|
||||
data: {
|
||||
structure: null,
|
||||
studyplan: null,
|
||||
page: null,
|
||||
text: strings.studyplanReport,
|
||||
},
|
||||
created() {
|
||||
// On creation, load the page as specified
|
||||
this.loadStructure(pageid, firstperiod, lastperiod);
|
||||
},
|
||||
computed: {
|
||||
|
||||
},
|
||||
methods: {
|
||||
loadStructure(pageid, firstperiod, lastperiod) {
|
||||
const self = this;
|
||||
this.structure = null; // Starts loading icon. Hides old data.
|
||||
call([{
|
||||
methodname: 'local_treestudyplan_get_report_structure',
|
||||
args: {pageid: pageid,
|
||||
firstperiod: firstperiod,
|
||||
lastperiod: lastperiod
|
||||
}
|
||||
}])[0].then((response) => {
|
||||
self.structure = response;
|
||||
self.studyplan = response.studyplan;
|
||||
self.page = response.page;
|
||||
return;
|
||||
}).catch(notification.exception);
|
||||
},
|
||||
selectedPage(e) {
|
||||
debug.info("SelectedPage", e);
|
||||
const pageid = e.target.value;
|
||||
this.loadStructure(pageid);
|
||||
},
|
||||
selectedFirstPeriod(e) {
|
||||
debug.info("selectedFirstPeriod", e);
|
||||
let f = e.target.value;
|
||||
let l = this.structure.lastperiod;
|
||||
if (l < f) {
|
||||
l = f;
|
||||
}
|
||||
this.loadStructure(this.page.id, f, l);
|
||||
},
|
||||
selectedLastPeriod(e) {
|
||||
debug.info("selectedLastPeriod", e);
|
||||
let f = this.structure.firstperiod;
|
||||
let l = e.target.value;
|
||||
if (l < f) {
|
||||
l = f;
|
||||
}
|
||||
this.loadStructure(this.page.id, f, l);
|
||||
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user