diff --git a/amd/build/jmodule.min.js b/amd/build/jmodule.min.js index 19d5a90d4e8206c0b2e7e7c196f3cb20e9a2009a..aa1cf37c7f0f67f465ff36548fcd00a89cd82fb2 100644 --- a/amd/build/jmodule.min.js +++ b/amd/build/jmodule.min.js @@ -1,2 +1,2 @@ /*! hshcourselist 2018-08-29 */ -define(["jquery"],function(a){function b(b,c,d,e,f,g,h,i,j){c&&(a("#hshcourseprogress").show(),a.ajax({type:"GET",url:j+"/blocks/hshcourselist/hshcourselist.php",data:"course="+b+"&instanceid="+e+"&sesskey="+f+"&contextid="+g+"&idSearching="+h+"&orderbysemester="+i,dataType:"json",success:function(b){var c=JSON.stringify(b),e=JSON.parse(c),f=a("<ul class='list-group' id='hshcourselistul'></ul>");e.length>0&&a.each(e,function(b,c){switch(d){case"0":displaystr=c.shortname;break;case"1":displaystr=c.fullname;break;case"2":displaystr=c.shortname+": "+c.fullname;break;default:displaystr=c.fullname}a('<li class="list-group-item hshcoursesearchlistitem " value="'+c.id+'"><a href="'+j+"/course/view.php?id="+c.id+'">'+displaystr+"</a> </li>").appendTo(f)}),a("#hshcourselistul").replaceWith(f),a("#hshcourseprogress").hide()},error:function(){console.error("error"),"abort"!==o.statusText&&(a("#hshcourseprogress").hide(),void 0!==o.statusText&&console.error("ABORT + STATUS : "+o.statusText))}}))}return{init:function(c,d){var e,c=c,f=c.instanceid,g=c.sesskey,h=c.displaymode,i=c.contextid,j=!1,k=!1,l=c.orderbysemester;a("#hshcourseprogress").hide(),a(".idSarchingLabel").hide(),a("#orderbysemestercheckbox_id").on("change",function(){l=document.getElementById("orderbysemestercheckbox_id").checked,j=!0,e=document.getElementById("hshcourselistsearch").value,"#"===e.slice(0,1)?(a(".idSarchingLabel").show(),k=!0,e=e.slice(1)):(a(".idSarchingLabel").hide(),k=!1),(1==k||e.length>=3)&&b(e,j,h,f,g,i,k,l,d)}),a("#hshcourselistsearch").on("keyup",function(c){var m=c.keyCode;l=document.getElementById("orderbysemestercheckbox_id").checked,40!==m&&38!==m&&13!==m&&(j=!0,e=document.getElementById("hshcourselistsearch").value,"#"===e.slice(0,1)?(a(".idSarchingLabel").show(),k=!0,e=e.slice(1)):(a(".idSarchingLabel").hide(),k=!1),(1==k||e.length>=3)&&b(e,j,h,f,g,i,k,l,d))}),a("#hshcourseform").on("submit",function(a){a.preventDefault,j=!0,k=!1,l=document.getElementById("orderbysemestercheckbox_id").checked,e=document.getElementById("hshcourselistsearch").value,"#"===e.slice(0,1)?(k=!0,e=e.slice(1)):k=!1,(1==k||e.length>=3)&&b(e,j,h,f,g,i,k,l,d)})}}}); \ No newline at end of file +define(["jquery"],function(a){function b(b,c,d,e,f,g,h,i,j){c&&(a("#hshcourseprogress").show(),a.ajax({type:"GET",url:j+"/blocks/hshcourselist/hshcourselist.php",data:"course="+b+"&instanceid="+e+"&sesskey="+f+"&contextid="+g+"&idSearching="+h+"&orderbysemester="+i,dataType:"json",success:function(b){var c=JSON.stringify(b),e=JSON.parse(c),f=a("<ul class='list-group' id='hshcourselistul'></ul>");e.length>0&&a.each(e,function(b,c){switch(d){case"0":displaystr=c.shortname;break;case"1":displaystr=c.fullname;break;case"2":displaystr=c.shortname+": "+c.fullname;break;default:displaystr=c.fullname}a('<li class="list-group-item hshcoursesearchlistitem " value="'+c.id+'"><a href="'+j+"/course/view.php?id="+c.id+'">'+displaystr+"</a> </li>").appendTo(f)}),a("#hshcourselistul").replaceWith(f),a("#hshcourseprogress").hide()},error:function(){console.error("error"),"abort"!==o.statusText&&(a("#hshcourseprogress").hide(),void 0!==o.statusText&&console.error("ABORT + STATUS : "+o.statusText))}}))}return{init:function(c,d){var e,c=c,f=c.instanceid,g=c.sesskey,h=c.displaymode,i=c.contextid,j=!1,k=!1,l=!1,m=c.orderbysemester;a("#hshcourseprogress").hide(),a(".idSarchingLabel").hide(),a("#orderbysemestercheckbox_id").on("change",function(){m=document.getElementById("orderbysemestercheckbox_id").checked,j=!0,e=document.getElementById("hshcourselistsearch").value,"#"===e.slice(0,1)?(a(".idSarchingLabel").show(),k=!0,e=e.slice(1)):"%"===e.slice(0,1)?l=!0:(a(".idSarchingLabel").hide(),k=!1),(1==l||1==k||e.length>=3)&&b(e,j,h,f,g,i,k,m,d)}),a("#hshcourselistsearch").on("keyup",function(c){var n=c.keyCode;m=document.getElementById("orderbysemestercheckbox_id").checked,40!==n&&38!==n&&13!==n&&(j=!0,e=document.getElementById("hshcourselistsearch").value,"#"===e.slice(0,1)?(a(".idSarchingLabel").show(),k=!0,e=e.slice(1)):"%"===e.slice(0,1)?l=!0:(a(".idSarchingLabel").hide(),k=!1),(1==l||1==k||e.length>=3)&&b(e,j,h,f,g,i,k,m,d))}),a("#hshcourseform").on("submit",function(a){a.preventDefault,j=!0,k=!1,l=!1,m=document.getElementById("orderbysemestercheckbox_id").checked,e=document.getElementById("hshcourselistsearch").value,"#"===e.slice(0,1)?(k=!0,e=e.slice(1)):"%"===e.slice(0,1)?l=!0:k=!1,(1==l||1==k||e.length>=3)&&b(e,j,h,f,g,i,k,m,d)})}}}); \ No newline at end of file diff --git a/amd/build/listselect.min.js b/amd/build/listselect.min.js new file mode 100644 index 0000000000000000000000000000000000000000..eae097d7c4d40b75a7ae09ae7a966f97923d2d0b --- /dev/null +++ b/amd/build/listselect.min.js @@ -0,0 +1,2 @@ +/*! hshcourselist 2018-08-29 */ +define(["jquery"],function(a){function b(b,c){var d=c+"/course/view.php?id="+b.val();a("#hshcourseform").attr("action",d)}function c(a){a.removeClass("active"),a.removeClass("activeCourseSearch")}function d(a){a.addClass("active"),a.addClass("activeCourseSearch")}function e(a){var b=window.innerHeight,c=a.getBoundingClientRect(),d=c.bottom,e=c.top;d>b&&a.scrollIntoView({block:"end",behavior:"smooth"}),e<0&&a.scrollIntoView({block:"start",behavior:"smooth"})}return{init:function(f){a("input").keydown(function(g){var h,i=a(".hshcoursesearchlistitem"),j=g.keyCode,k=i.filter(".activeCourseSearch");40!==j&&38!==j&&13!==j||(c(i),38===j?(h=!k.length||k.is(":first-child")?i.last():k.prev(),b(h,f)):40===j?(h=!k.length||k.is(":last-child")?i.eq(0):k.next(),b(h,f)):13===j&&(h=k,isNaN(h.val())&&(h=i.eq(0)),b(h,f)),d(h),e(h[0]))})}}}); \ No newline at end of file diff --git a/amd/src/jmodule.js b/amd/src/jmodule.js index 9aaa0584cdd30a0479e83fac92faacbb82b36f9e..b1c7c87d6cad54700484c8a4a8f94eec2bec6bba 100644 --- a/amd/src/jmodule.js +++ b/amd/src/jmodule.js @@ -63,6 +63,7 @@ define(['jquery'], function ($) { var contextid = jsdataobject.contextid; var reloadList = false; var idSearching = false; + var wildcardSearching = false; var searchstring; var orderbysemester = jsdataobject.orderbysemester; var displaystr; @@ -78,11 +79,13 @@ define(['jquery'], function ($) { $(".idSarchingLabel").show(); idSearching = true; searchstring = searchstring.slice(1); + } else if (searchstring.slice(0, 1) === '%') { + wildcardSearching = true; } else { $(".idSarchingLabel").hide(); idSearching = false; } - if (idSearching == true || searchstring.length >= 3) { + if (wildcardSearching == true || idSearching == true || searchstring.length >= 3) { search(searchstring, reloadList, displaymode, instanceid, sesskey, contextid, idSearching, orderbysemester, wwwroot); } else { // Search start after 3 chars or searching by id @@ -99,11 +102,13 @@ define(['jquery'], function ($) { $(".idSarchingLabel").show(); idSearching = true; searchstring = searchstring.slice(1); + } else if (searchstring.slice(0, 1) === '%') { + wildcardSearching = true; } else { $(".idSarchingLabel").hide(); idSearching = false; } - if (idSearching == true || searchstring.length >= 3) { + if (wildcardSearching == true || idSearching == true || searchstring.length >= 3) { search(searchstring, reloadList, displaymode, instanceid, sesskey, contextid, idSearching, orderbysemester, wwwroot); } else { // Search start after 3 chars or searching by id @@ -114,15 +119,18 @@ define(['jquery'], function ($) { e.preventDefault; reloadList = true; idSearching = false; + wildcardSearching = false; orderbysemester = document.getElementById('orderbysemestercheckbox_id').checked; searchstring = document.getElementById('hshcourselistsearch').value; if (searchstring.slice(0, 1) === '#') { idSearching = true; searchstring = searchstring.slice(1); + } else if (searchstring.slice(0, 1) === '%') { + wildcardSearching = true; } else { idSearching = false; } - if (idSearching == true || searchstring.length >= 3) { + if (wildcardSearching == true || idSearching == true || searchstring.length >= 3) { search(searchstring, reloadList, displaymode, instanceid, sesskey, contextid, idSearching, orderbysemester, wwwroot); } else { // Search start after 3 chars or searching by id diff --git a/amd/src/listselect.js b/amd/src/listselect.js new file mode 100644 index 0000000000000000000000000000000000000000..278e85d5cccd6f32fb0807ce3ed3875e6c5ab970 --- /dev/null +++ b/amd/src/listselect.js @@ -0,0 +1,74 @@ +define(['jquery'], function ($) { + function changeActionString(current, wwwroot) { + var actionString = wwwroot + '/course/view.php?id=' + current.val(); + $('#hshcourseform').attr('action', actionString); + } + + function setInactive(target) { + target.removeClass('active'); + target.removeClass('activeCourseSearch'); + } + + function setActive(target) { + target.addClass('active'); + target.addClass('activeCourseSearch'); + } + + function scrollIntoViewIfNeeded(element) { + var windowSize = window.innerHeight; + var elementPosition = element.getBoundingClientRect(); + var elementBottom = elementPosition.bottom; + var elementTop = elementPosition.top; + + if (elementBottom > windowSize) { + // Scroll an den unteren Rand des Bildes + element.scrollIntoView({ block: "end", behavior: "smooth" }); + } + if (elementTop < 0) { + // Scroll an den oberen Rand des Bildes + element.scrollIntoView({ block: "start", behavior: "smooth" }); + } + } + + return { + init: function (wwwroot) { + $('input').keydown(function (e) { + var $listItems = $('.hshcoursesearchlistitem'); + var key = e.keyCode; + var $selected = $listItems.filter('.activeCourseSearch'); + var $current; + + if (key !== 40 && key !== 38 && key !== 13) { + return; + } + + setInactive($listItems); + + if (key === 38) { // KEY UP + if (!$selected.length || $selected.is(':first-child')) { + $current = $listItems.last(); + } else { + $current = $selected.prev(); + } + changeActionString($current, wwwroot); + } else if (key === 40) { // KEY DOWN + if (!$selected.length || $selected.is(':last-child')) { + $current = $listItems.eq(0); + } else { + $current = $selected.next(); + } + changeActionString($current, wwwroot); + } else if (key === 13) { // KEY ENTER + $current = $selected; + if (isNaN($current.val())) { + $current = $listItems.eq(0); + } + changeActionString($current, wwwroot); + } + + setActive($current); + scrollIntoViewIfNeeded($current[0]); + }); + }, + } +}); diff --git a/block_hshcourselist.php b/block_hshcourselist.php index 34664b51632e197b16cc6c9dc4458fac35fe4de3..2921f7c1a3964653f7e78321216d1b9dae5c0afe 100644 --- a/block_hshcourselist.php +++ b/block_hshcourselist.php @@ -27,7 +27,7 @@ class block_hshcourselist extends block_base { global $CFG, $DB, $OUTPUT; $this->page->requires->js('/blocks/hshcourselist/javascript/jquery-3.2.0.min.js'); - $this->page->requires->js('/blocks/hshcourselist/javascript/listselect.js'); + $this->page->requires->js_call_amd('block_hshcourselist/listselect', 'init', array($CFG->wwwroot)); $this->page->requires->css('/blocks/hshcourselist/style.css'); if ($this->content !== null) { @@ -163,11 +163,6 @@ class block_hshcourselist extends block_base { $jsdata = array( 'instanceid' => $this->instance->id, 'sesskey' => sesskey(), - /* - Notice: Trying to get property of non-object in C:\Dev\xampp\htdocs\moodle\blocks\hshcourselist\block_hshcourselist.php on line 117 (122) - - Notice: Trying to get property of non-object in C:\Dev\xampp\htdocs\moodle\blocks\hshcourselist\block_hshcourselist.php on line 118 (123) - */ 'displaymode' => $displaymode, 'orderbysemester' => $orderbysemester, 'contextid' => $this->page->context->id diff --git a/version.php b/version.php index f8614d122bfda3eacacf8ab18890ea9f5ddf726a..31744bba1b5e74e26de9d8acabd612cb0f3684e6 100644 --- a/version.php +++ b/version.php @@ -1,4 +1,4 @@ <?php $plugin->component = 'block_hshcourselist'; -$plugin->version = 2018082803; // YYYYMMDDHH +$plugin->version = 2018082900; // YYYYMMDDHH $plugin->requires = 2016112900; // YYYYMMDDHH