From 68de16b3342ac389eaec27d977fa88300a56d44e Mon Sep 17 00:00:00 2001 From: David Scotson Date: Thu, 6 Mar 2014 12:03:40 +0000 Subject: [PATCH 01/26] MDL-44468 backup: use notification API Replace a hardcoded div.notifyproblem with a API call that, in Standard theme, outputs the same HTML. Also removes the .notifyproblem class from the heading, as that might cause problems for themers who expect it to be used consistently with the API. --- backup/util/ui/renderer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup/util/ui/renderer.php b/backup/util/ui/renderer.php index abe6842a450..5194f6242be 100644 --- a/backup/util/ui/renderer.php +++ b/backup/util/ui/renderer.php @@ -222,8 +222,8 @@ class core_backup_renderer extends plugin_renderer_base { public function backup_details_unknown(moodle_url $nextstageurl) { $html = html_writer::start_tag('div', array('class' => 'unknownformat')); - $html .= $this->output->heading(get_string('errorinvalidformat', 'backup'), 2, 'notifyproblem'); - $html .= html_writer::tag('div', get_string('errorinvalidformatinfo', 'backup'), array('class' => 'notifyproblem')); + $html .= $this->output->heading(get_string('errorinvalidformat', 'backup'), 2); + $html .= $this->output->notification(get_string('errorinvalidformatinfo', 'backup'), 'notifyproblem'); $html .= $this->output->single_button($nextstageurl, get_string('continue'), 'post'); $html .= html_writer::end_tag('div'); From 40a88c19a0348bc76aac23bf696540ac5cd706ba Mon Sep 17 00:00:00 2001 From: David Scotson Date: Thu, 6 Mar 2014 12:11:42 +0000 Subject: [PATCH 02/26] MDL-44468 backup: use html_writer::div call Simplify the renderer code with the new html_writer div function. --- backup/util/ui/renderer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup/util/ui/renderer.php b/backup/util/ui/renderer.php index 5194f6242be..a297c481898 100644 --- a/backup/util/ui/renderer.php +++ b/backup/util/ui/renderer.php @@ -221,11 +221,11 @@ class core_backup_renderer extends plugin_renderer_base { */ public function backup_details_unknown(moodle_url $nextstageurl) { - $html = html_writer::start_tag('div', array('class' => 'unknownformat')); + $html = html_writer::start_div('unknownformat'); $html .= $this->output->heading(get_string('errorinvalidformat', 'backup'), 2); $html .= $this->output->notification(get_string('errorinvalidformatinfo', 'backup'), 'notifyproblem'); $html .= $this->output->single_button($nextstageurl, get_string('continue'), 'post'); - $html .= html_writer::end_tag('div'); + $html .= html_writer::end_div(); return $html; } From 76dcccc1e3928035a1062192b47294335b1fb1c3 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Wed, 9 Apr 2014 15:10:16 +0800 Subject: [PATCH 03/26] MDL-45010 mod_chat: Use H3 instead of H2 in recent activity info --- mod/chat/lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/chat/lib.php b/mod/chat/lib.php index 16f68a3408e..c9bb3089392 100644 --- a/mod/chat/lib.php +++ b/mod/chat/lib.php @@ -327,7 +327,7 @@ function chat_print_recent_activity($course, $viewfullnames, $timestart) { $strftimerecent = get_string('strftimerecent'); if ($past) { - echo $OUTPUT->heading(get_string("pastchats", 'chat').':'); + echo $OUTPUT->heading(get_string("pastchats", 'chat').':', 3); foreach ($past as $cm) { $link = $CFG->wwwroot.'/mod/chat/view.php?id='.$cm->id; @@ -338,7 +338,7 @@ function chat_print_recent_activity($course, $viewfullnames, $timestart) { } if ($current) { - echo $OUTPUT->heading(get_string("currentchats", 'chat').':'); + echo $OUTPUT->heading(get_string("currentchats", 'chat').':', 3); $oldest = floor((time()-$CFG->chat_old_ping)/10)*10; // better db caching From 8bfd7dbe2cf8bb554b10673971f4088020fd83b6 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Wed, 9 Apr 2014 13:22:56 +0800 Subject: [PATCH 04/26] MDL-43626 survey: Addition of additional names to survey. --- mod/survey/lib.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mod/survey/lib.php b/mod/survey/lib.php index f146bf48ef7..c52128b3da8 100644 --- a/mod/survey/lib.php +++ b/mod/survey/lib.php @@ -232,12 +232,13 @@ function survey_print_recent_activity($course, $viewfullnames, $timestart) { $slist = implode(',', $ids); // there should not be hundreds of glossaries in one course, right? + $allusernames = user_picture::fields('u'); $rs = $DB->get_recordset_sql("SELECT sa.userid, sa.survey, MAX(sa.time) AS time, - u.firstname, u.lastname, u.email, u.picture + $allusernames FROM {survey_answers} sa JOIN {user} u ON u.id = sa.userid WHERE sa.survey IN ($slist) AND sa.time > ? - GROUP BY sa.userid, sa.survey, u.firstname, u.lastname, u.email, u.picture + GROUP BY sa.userid, sa.survey, $allusernames ORDER BY time ASC", array($timestart)); if (!$rs->valid()) { $rs->close(); // Not going to iterate (but exit), close rs From 76204f6898a455abbe79cf3c5f8367873eec4823 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Thu, 10 Apr 2014 15:23:05 +0800 Subject: [PATCH 05/26] MDL-45036 blocks: Update to the mentee block sql to incorporate additional name fields. --- blocks/mentees/block_mentees.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blocks/mentees/block_mentees.php b/blocks/mentees/block_mentees.php index 95c30598a8f..d53d96edc95 100644 --- a/blocks/mentees/block_mentees.php +++ b/blocks/mentees/block_mentees.php @@ -28,7 +28,8 @@ class block_mentees extends block_base { $this->content = new stdClass(); // get all the mentees, i.e. users you have a direct assignment to - if ($usercontexts = $DB->get_records_sql("SELECT c.instanceid, c.instanceid, u.firstname, u.lastname + $allusernames = get_all_user_name_fields(true, 'u'); + if ($usercontexts = $DB->get_records_sql("SELECT c.instanceid, c.instanceid, $allusernames FROM {role_assignments} ra, {context} c, {user} u WHERE ra.userid = ? AND ra.contextid = c.id From 6569d675f169be4f199090eafbbf5498d0639788 Mon Sep 17 00:00:00 2001 From: James Pratt Date: Fri, 11 Apr 2014 13:36:15 +0700 Subject: [PATCH 06/26] MDL-44981 quiz statistics report : Differentiating '0' and no response in numeric questions. --- .../classes/statistics/responses/analysis_for_class.php | 2 +- question/type/numerical/question.php | 2 +- question/type/numerical/tests/question_test.php | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/question/classes/statistics/responses/analysis_for_class.php b/question/classes/statistics/responses/analysis_for_class.php index 9c83fa13bc2..57ef4745c7e 100644 --- a/question/classes/statistics/responses/analysis_for_class.php +++ b/question/classes/statistics/responses/analysis_for_class.php @@ -107,7 +107,7 @@ class analysis_for_class { return true; } else if (count($this->actualresponses) == 1) { $onlyactualresponse = reset($this->actualresponses); - return !$onlyactualresponse->response_matches($this->modelresponse); + return (string)$onlyactualresponse != $this->modelresponse; } return false; } diff --git a/question/type/numerical/question.php b/question/type/numerical/question.php index 8df2ce93486..c86f2fffc54 100644 --- a/question/type/numerical/question.php +++ b/question/type/numerical/question.php @@ -249,7 +249,7 @@ class qtype_numerical_question extends question_graded_automatically { } public function classify_response(array $response) { - if (empty($response['answer'])) { + if (!$this->is_gradable_response($response)) { return array($this->id => question_classified_response::no_response()); } diff --git a/question/type/numerical/tests/question_test.php b/question/type/numerical/tests/question_test.php index 84fc7d0d7c4..6769864a71f 100644 --- a/question/type/numerical/tests/question_test.php +++ b/question/type/numerical/tests/question_test.php @@ -211,6 +211,9 @@ class qtype_numerical_question_test extends advanced_testcase { $this->assertEquals(array( new question_classified_response(17, '42', 0.0)), $num->classify_response(array('answer' => '42'))); + $this->assertEquals(array( + new question_classified_response(17, '0', 0.0)), + $num->classify_response(array('answer' => '0'))); $this->assertEquals(array( new question_classified_response(13, '3.14', 1.0)), $num->classify_response(array('answer' => '3.14'))); @@ -230,6 +233,9 @@ class qtype_numerical_question_test extends advanced_testcase { $this->assertEquals(array( new question_classified_response(0, '42', 0.0)), $num->classify_response(array('answer' => '42'))); + $this->assertEquals(array( + new question_classified_response(0, '0', 0.0)), + $num->classify_response(array('answer' => '0'))); $this->assertEquals(array( question_classified_response::no_response()), $num->classify_response(array('answer' => ''))); @@ -292,4 +298,4 @@ class qtype_numerical_question_test extends advanced_testcase { new question_classified_response(13, '1 332', 0.8)), $num->classify_response(array('answer' => '1 332'))); } -} \ No newline at end of file +} From 629e98b575d41e2e124d2799173ed7800e8553b3 Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Mon, 13 Jan 2014 22:03:55 +0100 Subject: [PATCH 07/26] MDL-43673 wiki: verify page tags work as expected This covers MDL-43109, verifying that saved tags are available on re-edition of a page, without any warning/error. Also official tags are verified to be working ok. With support for multiple options added by MDL-43713 and MDL-43738. --- mod/wiki/tests/behat/edit_tags.feature | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 mod/wiki/tests/behat/edit_tags.feature diff --git a/mod/wiki/tests/behat/edit_tags.feature b/mod/wiki/tests/behat/edit_tags.feature new file mode 100644 index 00000000000..a3e3dfd0a73 --- /dev/null +++ b/mod/wiki/tests/behat/edit_tags.feature @@ -0,0 +1,70 @@ +@mod @mod_wiki +Feature: Edited wiki pages handle tags correctly + In order to get wiki pages properly labelled + As a user + I need to introduce the tags while editing + + Background: + Given the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + | student1 | Student | 1 | student1@asd.com | + And the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And I log in as "teacher1" + And I follow "Course 1" + And I turn editing mode on + And I add a "Wiki" to section "1" and I fill the form with: + | Wiki name | Test wiki name | + | Description | Test wiki description | + | First page name | First page | + | Wiki mode | Collaborative wiki | + And I log out + + Scenario: Wiki page edition of custom tags works as expected + Given I log in as "student1" + And I follow "Course 1" + And I follow "Test wiki name" + And I press "Create page" + When I set the following fields to these values: + | HTML format | Student page contents to be tagged | + | Other tags (enter tags separated by commas) | Example, Page, Cool | + And I press "Save" + Then I should see "Example" in the ".wiki-tags" "css_element" + And I should see "Page" in the ".wiki-tags" "css_element" + And I should see "Cool" in the ".wiki-tags" "css_element" + And I follow "Edit" + And the field "Other tags (enter tags separated by commas)" matches value "Example, Page, Cool" + And I press "Cancel" + + Scenario: Wiki page edition of official tags works as expected + Given I log in as "admin" + And I expand "Site administration" node + And I expand "Appearance" node + And I follow "Manage tags" + And I set the field "otagsadd" to "OT1, OT2, OT3" + And I press "Add official tags" + And I log out + And I log in as "student1" + And I follow "Course 1" + And I follow "Test wiki name" + And I press "Create page" + And the "tags[officialtags][]" select box should contain "OT1" + And the "tags[officialtags][]" select box should contain "OT2" + And the "tags[officialtags][]" select box should contain "OT3" + When I set the following fields to these values: + | HTML format | Student page contents to be tagged | + | tags[officialtags][] | OT1, OT3 | + And I press "Save" + Then I should see "OT1" in the ".wiki-tags" "css_element" + And I should see "OT3" in the ".wiki-tags" "css_element" + And I should not see "OT2" in the ".wiki-tags" "css_element" + And I follow "Edit" + And the field "tags[officialtags][]" matches value "OT1, OT3" + And the field "tags[officialtags][]" does not match value "OT2" + And I press "Cancel" From 1f8f7aea0ad7a52a52d9d52cac6bd1d688a71e55 Mon Sep 17 00:00:00 2001 From: Gareth J Barnard Date: Fri, 11 Apr 2014 13:14:40 +0100 Subject: [PATCH 08/26] MDL-45045 block theme: Fake blocks show empty region when editing and clicked. Conflicts: lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js --- lib/blocklib.php | 1 + lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js | 2 +- lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js | 2 +- lib/yui/build/moodle-core-blocks/moodle-core-blocks.js | 2 +- lib/yui/src/blocks/js/manager.js | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/blocklib.php b/lib/blocklib.php index 6e51ba38bac..821d541b66b 100644 --- a/lib/blocklib.php +++ b/lib/blocklib.php @@ -481,6 +481,7 @@ class block_manager { if (!isset($bc->attributes['data-block'])) { $bc->attributes['data-block'] = '_fake'; } + $bc->attributes['class'] .= ' block_fake'; $this->extracontent[$region][] = $bc; } diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js index a1f85d04f1c..ea659ad7590 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js @@ -496,7 +496,7 @@ MANAGER.prototype = { nodes: '.'+CSS.BLOCK, target: true, handles: [SELECTOR.DRAGHANDLE], - invalid: '.block-hider-hide, .block-hider-show, .moveto', + invalid: '.block-hider-hide, .block-hider-show, .moveto, .block_fake', dragConfig: {groups: this.groups} }); dragdelegation.dd.plug(Y.Plugin.DDProxy, { diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js index c4223e019c6..45b2829d030 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js @@ -1,2 +1,2 @@ YUI.add("moodle-core-blocks",function(e,t){var n="/lib/ajax/blocks.php",r={BLOCK:"block",BLOCKREGION:"block-region",BLOCKADMINBLOCK:"block_adminblock",EDITINGMOVE:"editing_move",HEADER:"header",LIGHTBOX:"lightbox",REGIONCONTENT:"region-content",SKIPBLOCK:"skip-block",SKIPBLOCKTO:"skip-block-to",MYINDEX:"page-my-index",REGIONMAIN:"region-main",BLOCKSMOVING:"blocks-moving"},i={DRAGHANDLE:"."+r.HEADER+" .commands .moodle-core-dragdrop-draghandle"},s=function(){s.superclass.constructor.apply(this,arguments)};e.extend(s,M.core.dragdrop,{skipnodetop:null,skipnodebottom:null,dragsourceregion:null,initializer:function(){this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.REGIONCONTENT;var t=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(t.size()>0){var n=t.item(0);n.addClass(r.BLOCKREGION),n.set("id",r.REGIONCONTENT),n.one("div").addClass(r.REGIONCONTENT)}var s=e.Node.all("div."+r.BLOCKREGION);if(s.size()===0)return!1;if(s.size()!==this.get("regions").length){var o=e.Node.create("
").addClass(r.BLOCKREGION),u=e.Node.create("
").addClass(r.REGIONCONTENT);o.appendChild(u);var a=s.filter("#region-pre"),f=s.filter("#region-post");a.size()===0&&f.size()===1?(o.setAttrs({id:"region-pre"}),f.item(0).insert(o,"before"),s.unshift(o)):f.size()===0&&a.size()===1&&(o.setAttrs({id:"region-post"}),a.item(0).insert(o,"after"),s.push(o))}s.each(function(t){new e.DD.Drop({node:t.one("div."+r.REGIONCONTENT),groups:this.groups,padding:"40 240 40 240"});var n=new e.DD.Delegate({container:t,nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}});n.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),n.dd.plug(e.Plugin.DDWinScroll);var s=t.all("."+r.BLOCK);s.each(function(e){var t=e.one("a."+r.EDITINGMOVE);t&&(t.replace(this.get_drag_handle(t.getAttribute("title"),"","iconsmall",!0)),e.one(i.DRAGHANDLE).setStyle("cursor","move"))},this)},this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(t){var n=t.ancestor("div."+r.BLOCKREGION).get("id").replace(/region-/i,"");return e.Array.indexOf(this.get("regions"),n)===-1?(right_to_left()&&(n==="post"?n="pre":n==="pre"&&(n="post")),"side-"+n):n},get_region_id:function(e){return e.get("id").replace(/region-/i,"")},drag_start:function(t){var n=t.target;this.dragsourceregion=n.get("node").ancestor("div."+r.BLOCKREGION),n.get("node").previous()&&n.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=n.get("node").previous()),n.get("node").next()&&n.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=n.get("node").next()),e.one("body").addClass(r.BLOCKSMOVING)},drop_over:function(t){var n=t.drag.get("node"),i=t.drop.get("node");i.hasClass(this.parentnodeclass)&&i.one("."+r.BLOCKADMINBLOCK)&&i.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&i.prepend(n);if(this.dragsourceregion.contains(i))return!1;var s=e.one("body"),o=this.get_region_id(this.dragsourceregion);s.hasClass("side-"+o+"-only")&&s.removeClass("side-"+o+"-only"),o=this.get_region_id(i.ancestor("div."+r.BLOCKREGION)),this.dragsourceregion.all("."+r.BLOCK).size()===0&&this.dragsourceregion.get("id").match(/(region-pre|region-post)/i)&&(s.hasClass("side-"+o+"-only")||s.addClass("side-"+o+"-only"))},drag_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.dragsourceregion=null,e.one("body").removeClass(r.BLOCKSMOVING)},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag,s=i.get("node"),o=t.drop.get("node");s.previous()&&s.previous().hasClass(r.SKIPBLOCK)&&s.insert(s.previous(),"after"),this.skipnodetop&&s.insert(this.skipnodetop,"before"),this.skipnodebottom&&s.insert(this.skipnodebottom,"after");var u=M.util.add_lightbox(e,s),a={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(s),bui_newregion:this.get_block_region(o)};this.get("cmid")&&(a.cmid=this.get("cmid")),s.next("."+this.samenodeclass)&&!s.next("."+this.samenodeclass).hasClass(r.BLOCKADMINBLOCK)&&(a.bui_beforeid=this.get_block_id(s.next("."+this.samenodeclass))),e.io(M.cfg.wwwroot+n,{method:"POST",data:a,on:{start:function(){u.show()},success:function(t,n){window.setTimeout(function(){u.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),u.hide()}},context:this})}},{NAME:"core-blocks-dragdrop",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:null}}}),M.core=M.core||{},M.core.blockdraganddrop=M.core.blockdraganddrop||{},M.core.blockdraganddrop._isusingnewblocksmethod=null,M.core.blockdraganddrop.is_using_blocks_render_method=function(){if(this._isusingnewblocksmethod===null){var t=e.all(".block-region[data-blockregion]").size(),n=e.all(".block-region").size();this._isusingnewblocksmethod=n===t,t>0&&n>0}return this._isusingnewblocksmethod},M.core.blockdraganddrop.init=function(e){this.is_using_blocks_render_method()?new o(e):new s(e)},M.core_blocks=M.core_blocks||{},M.core_blocks.init_dragdrop=function(e){M.core.blockdraganddrop.init(e)};var o=function(){o.superclass.constructor.apply(this,arguments)};o.prototype={skipnodetop:null,skipnodebottom:null,regionobjects:{},initializer:function(){var t=this.get("regions"),n=0,s,o,a,f;this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.BLOCKREGION;var l=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(l.size()>0){var c=l.item(0);c.addClass(r.BLOCKREGION),c.set("id",r.REGIONCONTENT),c.one("div").addClass(r.REGIONCONTENT)}for(n in t)o=t[n],s=new u({manager:this,region:o,node:e.one("#block-region-"+o)}),this.regionobjects[o]=s,a=new e.DD.Drop({node:s.get_droptarget(),groups:this -.groups,padding:"40 240 40 240"}),f=new e.DD.Delegate({container:s.get_droptarget(),nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}}),f.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),f.dd.plug(e.Plugin.DDWinScroll),f.on("drag:mouseDown",this.enable_all_regions,this),s.change_block_move_icons(this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(e){return e.test("[data-blockregion]")||(e=e.ancestor("[data-blockregion]")),e.getData("blockregion")},get_region_object:function(e){return this.regionobjects[this.get_block_region(e)]},enable_all_regions:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].enable()},disable_regions_if_required:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].disable_if_required()},drag_start:function(e){var t=e.target;t.get("node").previous()&&t.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=t.get("node").previous()),t.get("node").next()&&t.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=t.get("node").next())},drop_over:function(e){var t=e.drag.get("node"),n=e.drop.get("node");n.hasClass(r.REGIONCONTENT)&&n.one("."+r.BLOCKADMINBLOCK)&&n.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&n.prepend(t)},drop_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.disable_regions_if_required()},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag.get("node"),s=t.drop.get("node");i.previous()&&i.previous().hasClass(r.SKIPBLOCK)&&i.insert(i.previous(),"after"),this.skipnodetop&&i.insert(this.skipnodetop,"before"),this.skipnodebottom&&i.insert(this.skipnodebottom,"after");var o=M.util.add_lightbox(e,i),u={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(i),bui_newregion:this.get_block_region(s)};this.get("cmid")&&(u.cmid=this.get("cmid")),i.next("."+r.BLOCK)&&!i.next("."+r.BLOCK).hasClass(r.BLOCKADMINBLOCK)&&(u.bui_beforeid=this.get_block_id(i.next("."+r.BLOCK))),e.io(M.cfg.wwwroot+n,{method:"POST",data:u,on:{start:function(){o.show()},success:function(t,n){window.setTimeout(function(){o.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),o.hide()},complete:function(){this.disable_regions_if_required()}},context:this})}},e.extend(o,M.core.dragdrop,o.prototype,{NAME:"core-blocks-dragdrop-manager",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:[]}}});var u=function(){u.superclass.constructor.apply(this,arguments)};u.prototype={initializer:function(){var t=this.get("node");t||(t=this.create_and_add_node());var n=e.one("body"),i=t.all("."+r.BLOCK).size()>0,s=this.get_has_region_class();this.set("hasblocks",i),n.hasClass(s)||n.addClass(s),n.addClass(i?this.get_used_region_class():this.get_empty_region_class()),n.removeClass(i?this.get_empty_region_class():this.get_used_region_class())},create_and_add_node:function(){var t=e.Node.create,n=this.get("region"),i=t('
').addClass(r.BLOCKREGION).setData("blockregion",n),s=this.get("manager").get("regions"),o,u=!1,a=!1,f=!1,l,c;for(o in s)s[o].match(/(pre|left)/)?u=s[o]:s[o].match(/(post|right)/)&&(a=s[o]);return u!==!1&&a!==!1&&(n===u?(c=e.one("#block-region-"+a),c&&(c.insert(i,"before"),f=!0)):(l=e.one("#block-region-"+u),l&&(l.insert(i,"after"),f=!0))),f===!1&&e.one("body").append(i),this.set("node",i),i},change_block_move_icons:function(e){var t,n;this.get("node").all("."+r.BLOCK+" a."+r.EDITINGMOVE).each(function(r){r.setStyle("cursor","move"),t=e.get_drag_handle(r.getAttribute("title"),"","icon",!0),n=t.one("img"),n.addClass("iconsmall"),n.removeClass("icon"),r.replace(t)})},get_has_region_class:function(){return"has-region-"+this.get("region")},get_empty_region_class:function(){return"empty-region-"+this.get("region")},get_used_region_class:function(){return"used-region-"+this.get("region")},get_droptarget:function(){var e=this.get("node");return e.test('[data-droptarget="1"]')?e:e.one('[data-droptarget="1"]')},enable:function(){e.one("body").addClass(this.get_used_region_class()).removeClass(this.get_empty_region_class())},disable_if_required:function(){this.get("node").all("."+r.BLOCK).size()===0&&e.one("body").addClass(this.get_empty_region_class()).removeClass(this.get_used_region_class())}},e.extend(u,e.Base,u.prototype,{NAME:"core-blocks-dragdrop-blockregion",ATTRS:{manager:{writeOnce:"initOnly",validator:function(t){return e.Lang.isObject(t)&&t instanceof o}},region:{writeOnce:"initOnly",validator:function(t){return e.Lang.isString(t)}},node:{validator:function(t){return e.Lang.isObject(t)||e.Lang.isNull(t)}},hasblocks:{value:!1,validator:function(t){return e.Lang.isBoolean(t)}}}})},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification"]}); +.groups,padding:"40 240 40 240"}),f=new e.DD.Delegate({container:s.get_droptarget(),nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto, .block_fake",dragConfig:{groups:this.groups}}),f.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),f.dd.plug(e.Plugin.DDWinScroll),f.on("drag:mouseDown",this.enable_all_regions,this),s.change_block_move_icons(this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(e){return e.test("[data-blockregion]")||(e=e.ancestor("[data-blockregion]")),e.getData("blockregion")},get_region_object:function(e){return this.regionobjects[this.get_block_region(e)]},enable_all_regions:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].enable()},disable_regions_if_required:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].disable_if_required()},drag_start:function(e){var t=e.target;t.get("node").previous()&&t.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=t.get("node").previous()),t.get("node").next()&&t.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=t.get("node").next())},drop_over:function(e){var t=e.drag.get("node"),n=e.drop.get("node");n.hasClass(r.REGIONCONTENT)&&n.one("."+r.BLOCKADMINBLOCK)&&n.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&n.prepend(t)},drop_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.disable_regions_if_required()},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag.get("node"),s=t.drop.get("node");i.previous()&&i.previous().hasClass(r.SKIPBLOCK)&&i.insert(i.previous(),"after"),this.skipnodetop&&i.insert(this.skipnodetop,"before"),this.skipnodebottom&&i.insert(this.skipnodebottom,"after");var o=M.util.add_lightbox(e,i),u={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(i),bui_newregion:this.get_block_region(s)};this.get("cmid")&&(u.cmid=this.get("cmid")),i.next("."+r.BLOCK)&&!i.next("."+r.BLOCK).hasClass(r.BLOCKADMINBLOCK)&&(u.bui_beforeid=this.get_block_id(i.next("."+r.BLOCK))),e.io(M.cfg.wwwroot+n,{method:"POST",data:u,on:{start:function(){o.show()},success:function(t,n){window.setTimeout(function(){o.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),o.hide()},complete:function(){this.disable_regions_if_required()}},context:this})}},e.extend(o,M.core.dragdrop,o.prototype,{NAME:"core-blocks-dragdrop-manager",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:[]}}});var u=function(){u.superclass.constructor.apply(this,arguments)};u.prototype={initializer:function(){var t=this.get("node");t||(t=this.create_and_add_node());var n=e.one("body"),i=t.all("."+r.BLOCK).size()>0,s=this.get_has_region_class();this.set("hasblocks",i),n.hasClass(s)||n.addClass(s),n.addClass(i?this.get_used_region_class():this.get_empty_region_class()),n.removeClass(i?this.get_empty_region_class():this.get_used_region_class())},create_and_add_node:function(){var t=e.Node.create,n=this.get("region"),i=t('
').addClass(r.BLOCKREGION).setData("blockregion",n),s=this.get("manager").get("regions"),o,u=!1,a=!1,f=!1,l,c;for(o in s)s[o].match(/(pre|left)/)?u=s[o]:s[o].match(/(post|right)/)&&(a=s[o]);return u!==!1&&a!==!1&&(n===u?(c=e.one("#block-region-"+a),c&&(c.insert(i,"before"),f=!0)):(l=e.one("#block-region-"+u),l&&(l.insert(i,"after"),f=!0))),f===!1&&e.one("body").append(i),this.set("node",i),i},change_block_move_icons:function(e){var t,n;this.get("node").all("."+r.BLOCK+" a."+r.EDITINGMOVE).each(function(r){r.setStyle("cursor","move"),t=e.get_drag_handle(r.getAttribute("title"),"","icon",!0),n=t.one("img"),n.addClass("iconsmall"),n.removeClass("icon"),r.replace(t)})},get_has_region_class:function(){return"has-region-"+this.get("region")},get_empty_region_class:function(){return"empty-region-"+this.get("region")},get_used_region_class:function(){return"used-region-"+this.get("region")},get_droptarget:function(){var e=this.get("node");return e.test('[data-droptarget="1"]')?e:e.one('[data-droptarget="1"]')},enable:function(){e.one("body").addClass(this.get_used_region_class()).removeClass(this.get_empty_region_class())},disable_if_required:function(){this.get("node").all("."+r.BLOCK).size()===0&&e.one("body").addClass(this.get_empty_region_class()).removeClass(this.get_used_region_class())}},e.extend(u,e.Base,u.prototype,{NAME:"core-blocks-dragdrop-blockregion",ATTRS:{manager:{writeOnce:"initOnly",validator:function(t){return e.Lang.isObject(t)&&t instanceof o}},region:{writeOnce:"initOnly",validator:function(t){return e.Lang.isString(t)}},node:{validator:function(t){return e.Lang.isObject(t)||e.Lang.isNull(t)}},hasblocks:{value:!1,validator:function(t){return e.Lang.isBoolean(t)}}}})},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification"]}); diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js index ea2f504a399..049471ebab5 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js @@ -492,7 +492,7 @@ MANAGER.prototype = { nodes: '.'+CSS.BLOCK, target: true, handles: [SELECTOR.DRAGHANDLE], - invalid: '.block-hider-hide, .block-hider-show, .moveto', + invalid: '.block-hider-hide, .block-hider-show, .moveto, .block_fake', dragConfig: {groups: this.groups} }); dragdelegation.dd.plug(Y.Plugin.DDProxy, { diff --git a/lib/yui/src/blocks/js/manager.js b/lib/yui/src/blocks/js/manager.js index 3179060be4a..705e8a9eeb1 100644 --- a/lib/yui/src/blocks/js/manager.js +++ b/lib/yui/src/blocks/js/manager.js @@ -99,7 +99,7 @@ MANAGER.prototype = { nodes: '.'+CSS.BLOCK, target: true, handles: [SELECTOR.DRAGHANDLE], - invalid: '.block-hider-hide, .block-hider-show, .moveto', + invalid: '.block-hider-hide, .block-hider-show, .moveto, .block_fake', dragConfig: {groups: this.groups} }); dragdelegation.dd.plug(Y.Plugin.DDProxy, { From edb5a212855ad988ce59a868b218a2be82a10f4e Mon Sep 17 00:00:00 2001 From: Sam Hemelryk Date: Fri, 11 Apr 2014 13:38:03 +1200 Subject: [PATCH 09/26] MDL-43145 dock: fixed up region_completely_docked code to ignore empty regions --- lib/blocklib.php | 6 +++++- .../build/moodle-core-blocks/moodle-core-blocks-debug.js | 4 ++-- lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js | 4 ++-- lib/yui/build/moodle-core-blocks/moodle-core-blocks.js | 4 ++-- lib/yui/build/moodle-core-dock/moodle-core-dock-debug.js | 4 +++- lib/yui/build/moodle-core-dock/moodle-core-dock-min.js | 6 +++--- lib/yui/build/moodle-core-dock/moodle-core-dock.js | 4 +++- lib/yui/src/blocks/js/blocks.js | 2 +- lib/yui/src/blocks/js/manager.js | 2 +- lib/yui/src/dock/js/dock.js | 4 +++- 10 files changed, 25 insertions(+), 15 deletions(-) diff --git a/lib/blocklib.php b/lib/blocklib.php index 6e51ba38bac..68783ec6e8b 100644 --- a/lib/blocklib.php +++ b/lib/blocklib.php @@ -518,7 +518,11 @@ class block_manager { $this->check_is_loaded(); $this->ensure_content_created($region, $output); - foreach($this->visibleblockcontent[$region] as $instance) { + if (!$this->region_has_content($region, $output)) { + // If the region has no content then nothing is docked at all of course. + return false; + } + foreach ($this->visibleblockcontent[$region] as $instance) { if (!empty($instance->content) && !get_user_preferences('docked_block_instance_'.$instance->blockinstanceid, 0)) { return false; } diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js index a1f85d04f1c..6af97f938b9 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js @@ -363,7 +363,7 @@ M.core.blockdraganddrop.is_using_blocks_render_method = function() { var goodregions = Y.all('.block-region[data-blockregion]').size(); var allregions = Y.all('.block-region').size(); this._isusingnewblocksmethod = (allregions === goodregions); - if (goodregions > 0 && allregions > 0) { + if (goodregions > 0 && allregions > 0 && goodregions !== allregions) { Y.log('Both core_renderer::blocks and core_renderer::blocks_for_region have been used.', 'warn', 'moodle-core_blocks'); } } @@ -506,7 +506,7 @@ MANAGER.prototype = { dragdelegation.dd.plug(Y.Plugin.DDWinScroll); // On the mouse down event we will enable all block regions so that they can be dragged to. // This is VERY important as without it dnd won't work for empty block regions. - dragdelegation.on('drag:mouseDown', this.enable_all_regions, this); + dragdelegation.on('drag:start', this.enable_all_regions, this); region.change_block_move_icons(this); } diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js index c4223e019c6..463d604afc9 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js @@ -1,2 +1,2 @@ -YUI.add("moodle-core-blocks",function(e,t){var n="/lib/ajax/blocks.php",r={BLOCK:"block",BLOCKREGION:"block-region",BLOCKADMINBLOCK:"block_adminblock",EDITINGMOVE:"editing_move",HEADER:"header",LIGHTBOX:"lightbox",REGIONCONTENT:"region-content",SKIPBLOCK:"skip-block",SKIPBLOCKTO:"skip-block-to",MYINDEX:"page-my-index",REGIONMAIN:"region-main",BLOCKSMOVING:"blocks-moving"},i={DRAGHANDLE:"."+r.HEADER+" .commands .moodle-core-dragdrop-draghandle"},s=function(){s.superclass.constructor.apply(this,arguments)};e.extend(s,M.core.dragdrop,{skipnodetop:null,skipnodebottom:null,dragsourceregion:null,initializer:function(){this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.REGIONCONTENT;var t=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(t.size()>0){var n=t.item(0);n.addClass(r.BLOCKREGION),n.set("id",r.REGIONCONTENT),n.one("div").addClass(r.REGIONCONTENT)}var s=e.Node.all("div."+r.BLOCKREGION);if(s.size()===0)return!1;if(s.size()!==this.get("regions").length){var o=e.Node.create("
").addClass(r.BLOCKREGION),u=e.Node.create("
").addClass(r.REGIONCONTENT);o.appendChild(u);var a=s.filter("#region-pre"),f=s.filter("#region-post");a.size()===0&&f.size()===1?(o.setAttrs({id:"region-pre"}),f.item(0).insert(o,"before"),s.unshift(o)):f.size()===0&&a.size()===1&&(o.setAttrs({id:"region-post"}),a.item(0).insert(o,"after"),s.push(o))}s.each(function(t){new e.DD.Drop({node:t.one("div."+r.REGIONCONTENT),groups:this.groups,padding:"40 240 40 240"});var n=new e.DD.Delegate({container:t,nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}});n.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),n.dd.plug(e.Plugin.DDWinScroll);var s=t.all("."+r.BLOCK);s.each(function(e){var t=e.one("a."+r.EDITINGMOVE);t&&(t.replace(this.get_drag_handle(t.getAttribute("title"),"","iconsmall",!0)),e.one(i.DRAGHANDLE).setStyle("cursor","move"))},this)},this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(t){var n=t.ancestor("div."+r.BLOCKREGION).get("id").replace(/region-/i,"");return e.Array.indexOf(this.get("regions"),n)===-1?(right_to_left()&&(n==="post"?n="pre":n==="pre"&&(n="post")),"side-"+n):n},get_region_id:function(e){return e.get("id").replace(/region-/i,"")},drag_start:function(t){var n=t.target;this.dragsourceregion=n.get("node").ancestor("div."+r.BLOCKREGION),n.get("node").previous()&&n.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=n.get("node").previous()),n.get("node").next()&&n.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=n.get("node").next()),e.one("body").addClass(r.BLOCKSMOVING)},drop_over:function(t){var n=t.drag.get("node"),i=t.drop.get("node");i.hasClass(this.parentnodeclass)&&i.one("."+r.BLOCKADMINBLOCK)&&i.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&i.prepend(n);if(this.dragsourceregion.contains(i))return!1;var s=e.one("body"),o=this.get_region_id(this.dragsourceregion);s.hasClass("side-"+o+"-only")&&s.removeClass("side-"+o+"-only"),o=this.get_region_id(i.ancestor("div."+r.BLOCKREGION)),this.dragsourceregion.all("."+r.BLOCK).size()===0&&this.dragsourceregion.get("id").match(/(region-pre|region-post)/i)&&(s.hasClass("side-"+o+"-only")||s.addClass("side-"+o+"-only"))},drag_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.dragsourceregion=null,e.one("body").removeClass(r.BLOCKSMOVING)},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag,s=i.get("node"),o=t.drop.get("node");s.previous()&&s.previous().hasClass(r.SKIPBLOCK)&&s.insert(s.previous(),"after"),this.skipnodetop&&s.insert(this.skipnodetop,"before"),this.skipnodebottom&&s.insert(this.skipnodebottom,"after");var u=M.util.add_lightbox(e,s),a={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(s),bui_newregion:this.get_block_region(o)};this.get("cmid")&&(a.cmid=this.get("cmid")),s.next("."+this.samenodeclass)&&!s.next("."+this.samenodeclass).hasClass(r.BLOCKADMINBLOCK)&&(a.bui_beforeid=this.get_block_id(s.next("."+this.samenodeclass))),e.io(M.cfg.wwwroot+n,{method:"POST",data:a,on:{start:function(){u.show()},success:function(t,n){window.setTimeout(function(){u.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),u.hide()}},context:this})}},{NAME:"core-blocks-dragdrop",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:null}}}),M.core=M.core||{},M.core.blockdraganddrop=M.core.blockdraganddrop||{},M.core.blockdraganddrop._isusingnewblocksmethod=null,M.core.blockdraganddrop.is_using_blocks_render_method=function(){if(this._isusingnewblocksmethod===null){var t=e.all(".block-region[data-blockregion]").size(),n=e.all(".block-region").size();this._isusingnewblocksmethod=n===t,t>0&&n>0}return this._isusingnewblocksmethod},M.core.blockdraganddrop.init=function(e){this.is_using_blocks_render_method()?new o(e):new s(e)},M.core_blocks=M.core_blocks||{},M.core_blocks.init_dragdrop=function(e){M.core.blockdraganddrop.init(e)};var o=function(){o.superclass.constructor.apply(this,arguments)};o.prototype={skipnodetop:null,skipnodebottom:null,regionobjects:{},initializer:function(){var t=this.get("regions"),n=0,s,o,a,f;this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.BLOCKREGION;var l=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(l.size()>0){var c=l.item(0);c.addClass(r.BLOCKREGION),c.set("id",r.REGIONCONTENT),c.one("div").addClass(r.REGIONCONTENT)}for(n in t)o=t[n],s=new u({manager:this,region:o,node:e.one("#block-region-"+o)}),this.regionobjects[o]=s,a=new e.DD.Drop({node:s.get_droptarget(),groups:this -.groups,padding:"40 240 40 240"}),f=new e.DD.Delegate({container:s.get_droptarget(),nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}}),f.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),f.dd.plug(e.Plugin.DDWinScroll),f.on("drag:mouseDown",this.enable_all_regions,this),s.change_block_move_icons(this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(e){return e.test("[data-blockregion]")||(e=e.ancestor("[data-blockregion]")),e.getData("blockregion")},get_region_object:function(e){return this.regionobjects[this.get_block_region(e)]},enable_all_regions:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].enable()},disable_regions_if_required:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].disable_if_required()},drag_start:function(e){var t=e.target;t.get("node").previous()&&t.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=t.get("node").previous()),t.get("node").next()&&t.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=t.get("node").next())},drop_over:function(e){var t=e.drag.get("node"),n=e.drop.get("node");n.hasClass(r.REGIONCONTENT)&&n.one("."+r.BLOCKADMINBLOCK)&&n.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&n.prepend(t)},drop_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.disable_regions_if_required()},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag.get("node"),s=t.drop.get("node");i.previous()&&i.previous().hasClass(r.SKIPBLOCK)&&i.insert(i.previous(),"after"),this.skipnodetop&&i.insert(this.skipnodetop,"before"),this.skipnodebottom&&i.insert(this.skipnodebottom,"after");var o=M.util.add_lightbox(e,i),u={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(i),bui_newregion:this.get_block_region(s)};this.get("cmid")&&(u.cmid=this.get("cmid")),i.next("."+r.BLOCK)&&!i.next("."+r.BLOCK).hasClass(r.BLOCKADMINBLOCK)&&(u.bui_beforeid=this.get_block_id(i.next("."+r.BLOCK))),e.io(M.cfg.wwwroot+n,{method:"POST",data:u,on:{start:function(){o.show()},success:function(t,n){window.setTimeout(function(){o.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),o.hide()},complete:function(){this.disable_regions_if_required()}},context:this})}},e.extend(o,M.core.dragdrop,o.prototype,{NAME:"core-blocks-dragdrop-manager",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:[]}}});var u=function(){u.superclass.constructor.apply(this,arguments)};u.prototype={initializer:function(){var t=this.get("node");t||(t=this.create_and_add_node());var n=e.one("body"),i=t.all("."+r.BLOCK).size()>0,s=this.get_has_region_class();this.set("hasblocks",i),n.hasClass(s)||n.addClass(s),n.addClass(i?this.get_used_region_class():this.get_empty_region_class()),n.removeClass(i?this.get_empty_region_class():this.get_used_region_class())},create_and_add_node:function(){var t=e.Node.create,n=this.get("region"),i=t('
').addClass(r.BLOCKREGION).setData("blockregion",n),s=this.get("manager").get("regions"),o,u=!1,a=!1,f=!1,l,c;for(o in s)s[o].match(/(pre|left)/)?u=s[o]:s[o].match(/(post|right)/)&&(a=s[o]);return u!==!1&&a!==!1&&(n===u?(c=e.one("#block-region-"+a),c&&(c.insert(i,"before"),f=!0)):(l=e.one("#block-region-"+u),l&&(l.insert(i,"after"),f=!0))),f===!1&&e.one("body").append(i),this.set("node",i),i},change_block_move_icons:function(e){var t,n;this.get("node").all("."+r.BLOCK+" a."+r.EDITINGMOVE).each(function(r){r.setStyle("cursor","move"),t=e.get_drag_handle(r.getAttribute("title"),"","icon",!0),n=t.one("img"),n.addClass("iconsmall"),n.removeClass("icon"),r.replace(t)})},get_has_region_class:function(){return"has-region-"+this.get("region")},get_empty_region_class:function(){return"empty-region-"+this.get("region")},get_used_region_class:function(){return"used-region-"+this.get("region")},get_droptarget:function(){var e=this.get("node");return e.test('[data-droptarget="1"]')?e:e.one('[data-droptarget="1"]')},enable:function(){e.one("body").addClass(this.get_used_region_class()).removeClass(this.get_empty_region_class())},disable_if_required:function(){this.get("node").all("."+r.BLOCK).size()===0&&e.one("body").addClass(this.get_empty_region_class()).removeClass(this.get_used_region_class())}},e.extend(u,e.Base,u.prototype,{NAME:"core-blocks-dragdrop-blockregion",ATTRS:{manager:{writeOnce:"initOnly",validator:function(t){return e.Lang.isObject(t)&&t instanceof o}},region:{writeOnce:"initOnly",validator:function(t){return e.Lang.isString(t)}},node:{validator:function(t){return e.Lang.isObject(t)||e.Lang.isNull(t)}},hasblocks:{value:!1,validator:function(t){return e.Lang.isBoolean(t)}}}})},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification"]}); +YUI.add("moodle-core-blocks",function(e,t){var n="/lib/ajax/blocks.php",r={BLOCK:"block",BLOCKREGION:"block-region",BLOCKADMINBLOCK:"block_adminblock",EDITINGMOVE:"editing_move",HEADER:"header",LIGHTBOX:"lightbox",REGIONCONTENT:"region-content",SKIPBLOCK:"skip-block",SKIPBLOCKTO:"skip-block-to",MYINDEX:"page-my-index",REGIONMAIN:"region-main",BLOCKSMOVING:"blocks-moving"},i={DRAGHANDLE:"."+r.HEADER+" .commands .moodle-core-dragdrop-draghandle"},s=function(){s.superclass.constructor.apply(this,arguments)};e.extend(s,M.core.dragdrop,{skipnodetop:null,skipnodebottom:null,dragsourceregion:null,initializer:function(){this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.REGIONCONTENT;var t=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(t.size()>0){var n=t.item(0);n.addClass(r.BLOCKREGION),n.set("id",r.REGIONCONTENT),n.one("div").addClass(r.REGIONCONTENT)}var s=e.Node.all("div."+r.BLOCKREGION);if(s.size()===0)return!1;if(s.size()!==this.get("regions").length){var o=e.Node.create("
").addClass(r.BLOCKREGION),u=e.Node.create("
").addClass(r.REGIONCONTENT);o.appendChild(u);var a=s.filter("#region-pre"),f=s.filter("#region-post");a.size()===0&&f.size()===1?(o.setAttrs({id:"region-pre"}),f.item(0).insert(o,"before"),s.unshift(o)):f.size()===0&&a.size()===1&&(o.setAttrs({id:"region-post"}),a.item(0).insert(o,"after"),s.push(o))}s.each(function(t){new e.DD.Drop({node:t.one("div."+r.REGIONCONTENT),groups:this.groups,padding:"40 240 40 240"});var n=new e.DD.Delegate({container:t,nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}});n.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),n.dd.plug(e.Plugin.DDWinScroll);var s=t.all("."+r.BLOCK);s.each(function(e){var t=e.one("a."+r.EDITINGMOVE);t&&(t.replace(this.get_drag_handle(t.getAttribute("title"),"","iconsmall",!0)),e.one(i.DRAGHANDLE).setStyle("cursor","move"))},this)},this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(t){var n=t.ancestor("div."+r.BLOCKREGION).get("id").replace(/region-/i,"");return e.Array.indexOf(this.get("regions"),n)===-1?(right_to_left()&&(n==="post"?n="pre":n==="pre"&&(n="post")),"side-"+n):n},get_region_id:function(e){return e.get("id").replace(/region-/i,"")},drag_start:function(t){var n=t.target;this.dragsourceregion=n.get("node").ancestor("div."+r.BLOCKREGION),n.get("node").previous()&&n.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=n.get("node").previous()),n.get("node").next()&&n.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=n.get("node").next()),e.one("body").addClass(r.BLOCKSMOVING)},drop_over:function(t){var n=t.drag.get("node"),i=t.drop.get("node");i.hasClass(this.parentnodeclass)&&i.one("."+r.BLOCKADMINBLOCK)&&i.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&i.prepend(n);if(this.dragsourceregion.contains(i))return!1;var s=e.one("body"),o=this.get_region_id(this.dragsourceregion);s.hasClass("side-"+o+"-only")&&s.removeClass("side-"+o+"-only"),o=this.get_region_id(i.ancestor("div."+r.BLOCKREGION)),this.dragsourceregion.all("."+r.BLOCK).size()===0&&this.dragsourceregion.get("id").match(/(region-pre|region-post)/i)&&(s.hasClass("side-"+o+"-only")||s.addClass("side-"+o+"-only"))},drag_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.dragsourceregion=null,e.one("body").removeClass(r.BLOCKSMOVING)},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag,s=i.get("node"),o=t.drop.get("node");s.previous()&&s.previous().hasClass(r.SKIPBLOCK)&&s.insert(s.previous(),"after"),this.skipnodetop&&s.insert(this.skipnodetop,"before"),this.skipnodebottom&&s.insert(this.skipnodebottom,"after");var u=M.util.add_lightbox(e,s),a={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(s),bui_newregion:this.get_block_region(o)};this.get("cmid")&&(a.cmid=this.get("cmid")),s.next("."+this.samenodeclass)&&!s.next("."+this.samenodeclass).hasClass(r.BLOCKADMINBLOCK)&&(a.bui_beforeid=this.get_block_id(s.next("."+this.samenodeclass))),e.io(M.cfg.wwwroot+n,{method:"POST",data:a,on:{start:function(){u.show()},success:function(t,n){window.setTimeout(function(){u.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),u.hide()}},context:this})}},{NAME:"core-blocks-dragdrop",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:null}}}),M.core=M.core||{},M.core.blockdraganddrop=M.core.blockdraganddrop||{},M.core.blockdraganddrop._isusingnewblocksmethod=null,M.core.blockdraganddrop.is_using_blocks_render_method=function(){if(this._isusingnewblocksmethod===null){var t=e.all(".block-region[data-blockregion]").size(),n=e.all(".block-region").size();this._isusingnewblocksmethod=n===t,t>0&&n>0&&t!==n}return this._isusingnewblocksmethod},M.core.blockdraganddrop.init=function(e){this.is_using_blocks_render_method()?new o(e):new s(e)},M.core_blocks=M.core_blocks||{},M.core_blocks.init_dragdrop=function(e){M.core.blockdraganddrop.init(e)};var o=function(){o.superclass.constructor.apply(this,arguments)};o.prototype={skipnodetop:null,skipnodebottom:null,regionobjects:{},initializer:function(){var t=this.get("regions"),n=0,s,o,a,f;this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.BLOCKREGION;var l=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(l.size()>0){var c=l.item(0);c.addClass(r.BLOCKREGION),c.set("id",r.REGIONCONTENT),c.one("div").addClass(r.REGIONCONTENT)}for(n in t)o=t[n],s=new u({manager:this,region:o,node:e.one("#block-region-"+o)}),this.regionobjects[o]=s,a=new e.DD.Drop({node:s.get_droptarget(),groups +:this.groups,padding:"40 240 40 240"}),f=new e.DD.Delegate({container:s.get_droptarget(),nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}}),f.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),f.dd.plug(e.Plugin.DDWinScroll),f.on("drag:start",this.enable_all_regions,this),s.change_block_move_icons(this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(e){return e.test("[data-blockregion]")||(e=e.ancestor("[data-blockregion]")),e.getData("blockregion")},get_region_object:function(e){return this.regionobjects[this.get_block_region(e)]},enable_all_regions:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].enable()},disable_regions_if_required:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].disable_if_required()},drag_start:function(e){var t=e.target;t.get("node").previous()&&t.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=t.get("node").previous()),t.get("node").next()&&t.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=t.get("node").next())},drop_over:function(e){var t=e.drag.get("node"),n=e.drop.get("node");n.hasClass(r.REGIONCONTENT)&&n.one("."+r.BLOCKADMINBLOCK)&&n.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&n.prepend(t)},drop_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.disable_regions_if_required()},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag.get("node"),s=t.drop.get("node");i.previous()&&i.previous().hasClass(r.SKIPBLOCK)&&i.insert(i.previous(),"after"),this.skipnodetop&&i.insert(this.skipnodetop,"before"),this.skipnodebottom&&i.insert(this.skipnodebottom,"after");var o=M.util.add_lightbox(e,i),u={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(i),bui_newregion:this.get_block_region(s)};this.get("cmid")&&(u.cmid=this.get("cmid")),i.next("."+r.BLOCK)&&!i.next("."+r.BLOCK).hasClass(r.BLOCKADMINBLOCK)&&(u.bui_beforeid=this.get_block_id(i.next("."+r.BLOCK))),e.io(M.cfg.wwwroot+n,{method:"POST",data:u,on:{start:function(){o.show()},success:function(t,n){window.setTimeout(function(){o.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),o.hide()},complete:function(){this.disable_regions_if_required()}},context:this})}},e.extend(o,M.core.dragdrop,o.prototype,{NAME:"core-blocks-dragdrop-manager",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:[]}}});var u=function(){u.superclass.constructor.apply(this,arguments)};u.prototype={initializer:function(){var t=this.get("node");t||(t=this.create_and_add_node());var n=e.one("body"),i=t.all("."+r.BLOCK).size()>0,s=this.get_has_region_class();this.set("hasblocks",i),n.hasClass(s)||n.addClass(s),n.addClass(i?this.get_used_region_class():this.get_empty_region_class()),n.removeClass(i?this.get_empty_region_class():this.get_used_region_class())},create_and_add_node:function(){var t=e.Node.create,n=this.get("region"),i=t('
').addClass(r.BLOCKREGION).setData("blockregion",n),s=this.get("manager").get("regions"),o,u=!1,a=!1,f=!1,l,c;for(o in s)s[o].match(/(pre|left)/)?u=s[o]:s[o].match(/(post|right)/)&&(a=s[o]);return u!==!1&&a!==!1&&(n===u?(c=e.one("#block-region-"+a),c&&(c.insert(i,"before"),f=!0)):(l=e.one("#block-region-"+u),l&&(l.insert(i,"after"),f=!0))),f===!1&&e.one("body").append(i),this.set("node",i),i},change_block_move_icons:function(e){var t,n;this.get("node").all("."+r.BLOCK+" a."+r.EDITINGMOVE).each(function(r){r.setStyle("cursor","move"),t=e.get_drag_handle(r.getAttribute("title"),"","icon",!0),n=t.one("img"),n.addClass("iconsmall"),n.removeClass("icon"),r.replace(t)})},get_has_region_class:function(){return"has-region-"+this.get("region")},get_empty_region_class:function(){return"empty-region-"+this.get("region")},get_used_region_class:function(){return"used-region-"+this.get("region")},get_droptarget:function(){var e=this.get("node");return e.test('[data-droptarget="1"]')?e:e.one('[data-droptarget="1"]')},enable:function(){e.one("body").addClass(this.get_used_region_class()).removeClass(this.get_empty_region_class())},disable_if_required:function(){this.get("node").all("."+r.BLOCK).size()===0&&e.one("body").addClass(this.get_empty_region_class()).removeClass(this.get_used_region_class())}},e.extend(u,e.Base,u.prototype,{NAME:"core-blocks-dragdrop-blockregion",ATTRS:{manager:{writeOnce:"initOnly",validator:function(t){return e.Lang.isObject(t)&&t instanceof o}},region:{writeOnce:"initOnly",validator:function(t){return e.Lang.isString(t)}},node:{validator:function(t){return e.Lang.isObject(t)||e.Lang.isNull(t)}},hasblocks:{value:!1,validator:function(t){return e.Lang.isBoolean(t)}}}})},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification"]}); diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js index ea2f504a399..bfea11aeebd 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js @@ -363,7 +363,7 @@ M.core.blockdraganddrop.is_using_blocks_render_method = function() { var goodregions = Y.all('.block-region[data-blockregion]').size(); var allregions = Y.all('.block-region').size(); this._isusingnewblocksmethod = (allregions === goodregions); - if (goodregions > 0 && allregions > 0) { + if (goodregions > 0 && allregions > 0 && goodregions !== allregions) { } } return this._isusingnewblocksmethod; @@ -502,7 +502,7 @@ MANAGER.prototype = { dragdelegation.dd.plug(Y.Plugin.DDWinScroll); // On the mouse down event we will enable all block regions so that they can be dragged to. // This is VERY important as without it dnd won't work for empty block regions. - dragdelegation.on('drag:mouseDown', this.enable_all_regions, this); + dragdelegation.on('drag:start', this.enable_all_regions, this); region.change_block_move_icons(this); } diff --git a/lib/yui/build/moodle-core-dock/moodle-core-dock-debug.js b/lib/yui/build/moodle-core-dock/moodle-core-dock-debug.js index 1362dc39820..d2a9d4b975d 100644 --- a/lib/yui/build/moodle-core-dock/moodle-core-dock-debug.js +++ b/lib/yui/build/moodle-core-dock/moodle-core-dock-debug.js @@ -766,7 +766,9 @@ DOCK.prototype = { populatedblockregions++; BODY.addClass('used-region-'+regionname); BODY.removeClass('empty-region-'+regionname); - } else { + } else if (region.all('.block_dock_placeholder').size() > 0) { + // There are no blocks in the region but there are placeholders. + // All blocks in this region have been docked. BODY.addClass('empty-region-'+regionname); BODY.removeClass('used-region-'+regionname); } diff --git a/lib/yui/build/moodle-core-dock/moodle-core-dock-min.js b/lib/yui/build/moodle-core-dock/moodle-core-dock-min.js index a1ab1de0f86..3d334c2da91 100644 --- a/lib/yui/build/moodle-core-dock/moodle-core-dock-min.js +++ b/lib/yui/build/moodle-core-dock/moodle-core-dock-min.js @@ -1,4 +1,4 @@ YUI.add("moodle-core-dock",function(e,t){var n="moodle-core-dock",r=e.one(e.config.doc.body),i={dock:"dock",dockspacer:"dockspacer",controls:"controls",body:"has_dock",buttonscontainer:"buttons_container",dockeditem:"dockeditem",dockeditemcontainer:"dockeditem_container",dockedtitle:"dockedtitle",activeitem:"activeitem",contentonly:"content-only",dockonload:"dock_on_load"},s={dockableblock:".block[data-instanceid][data-dockable]",blockmoveto:".block[data-instanceid][data-dockable] .moveto",panelmoveto:"#dockeditempanel .commands a.moveto",dockonload:".block."+i.dockonload,blockregion:"[data-blockregion]"},o,u,a,f,l;M.core=M.core||{},M.core.dock=M.core.dock||{},M.core.dock._dock=null,M.core.dock._dockableblocks={},M.core.dock.init=function(){e.all(s.dockableblock).each(M.core.dock.registerDockableBlock),r.delegate("click",M.core.dock.dockBlock,s.blockmoveto),r.delegate("key",M.core.dock.dockBlock,s.blockmoveto,"enter")},M.core.dock.get=function(){return this._dock===null&&(this._dock=new o),this._dock},M.core.dock.registerDockableBlock=function(e){typeof e=="object"&&typeof e.getData=="function"&&(e=e.getData("instanceid")),M.core.dock._dockableblocks[e]=new f({id:e})},M.core.dock.dockBlock=function(e){typeof e=="object"&&e.target!=="undefined"&&(e=e.target);if(typeof e=="object"){e.test(s.dockableblock)||(e=e.ancestor(s.dockableblock));if(typeof e!="object"||typeof e.getData!="function"||!!e.ancestor("."+i.dock))return;e=e.getData("instanceid")}var t=M.core.dock._dockableblocks[e];t&&t.moveToDock()},M.core.dock.fixTitleOrientation=function(t,n){var i=M.core.dock.get(),s="11px",o="rotate(270deg)",u,a,f,l;t=e.one(t);if(i.get("orientation")!=="vertical")return t.set("innerHTML",n),t;e.UA.ie>0&&e.UA.ie<8&&(M.str.langconfig.thisdirectionvertical="ver");switch(M.str.langconfig.thisdirectionvertical){case"ver":return t.set("innerHTML",n.split("").join("
"));case"ttb":o="rotate(90deg)";break;case"btt":}return e.UA.ie===8?(t.set("innerHTML",n),t.setAttribute("style","writing-mode: tb-rl; filter: flipV flipH;display:inline;"),t.addClass("filterrotate"),t):(u=e.Node.create('

'+n+"

"),r.insert(u,0),a=u.one("span").get("offsetWidth")*1.2,f=u.one("span").get("offsetHeight"),u.remove(),t.set("innerHTML",n),t.addClass("css3transform"),t.setStyles({margin:"0",padding:"0",position:"relative",fontSize:s,width:a,top:a/2}),right_to_left()?t.setStyle("left",a/2-f):t.setStyle("right",a/2-f),t.setStyles({transform:o,"-ms-transform":o,"-moz-transform":o,"-webkit-transform":o,"-o-transform":o}),l=e.Node.create("
"),l.append(t),l.setStyles({height:a+a/4,position:"relative"}),l)},M.core.dock.notifyBlockChange=function(e){if(this._dock!==null){var t=M.core.dock.get(),n=t.getActiveItem();n&&n.get("blockinstanceid")===parseInt(e,10)&&t.resizePanelIfRequired()}},o=function(){o.superclass.constructor.apply(this,arguments)},o.prototype={tabheightmanager:null,preventevent:null,delayedevent:null,dockeditems:[],dockdrawn:!1,count:0,totalcount:0,holdingareanode:null,initializer:function(){this.publish("dock:starting",{prefix:"dock",broadcast:2,emitFacade:!0,fireOnce:!0}),this.publish("dock:initialised",{prefix:"dock",broadcast:2,emitFacade:!0,fireOnce:!0}),this.publish("dock:beforedraw",{prefix:"dock",fireOnce:!0}),this.publish("dock:beforeshow",{prefix:"dock"}),this.publish("dock:shown",{prefix:"dock"}),this.publish("dock:hidden",{prefix:"dock"}),this.publish("dock:itemadded",{prefix:"dock"}),this.publish("dock:itemremoved",{prefix:"dock"}),this.publish("dock:itemschanged",{prefix:"dock"}),this.publish("dock:panelgenerated",{prefix:"dock",fireOnce:!0}),this.publish("dock:panelresizestart",{prefix:"dock"}),this.publish("dock:resizepanelcomplete",{prefix:"dock"}),this._applyThemeCustomisation(),this.fire("dock:starting"),this._ensureDockDrawn(),this.fire("dock:initialised")},_ensureDockDrawn:function(){if(this.dockdrawn===!0)return!0;var t=this._initialiseDockNode(),n={cssselector:"."+i.dockedtitle,delay:0},o={cssselector:"."+i.dockedtitle,delay:.5,iscontained:!0,preventevent:"click",preventdelay:3};return e.UA.ie>0&&e.UA.ie<7&&t.setStyle("height",t.get("winHeight")+"px"),this.fire("dock:beforedraw"),this._initialiseDockControls(),this.tabheightmanager=new a({dock:this}),e.delegate("click",this.handleEvent,this.get("dockNode"),"."+i.dockedtitle,this,n),e.delegate("mouseenter",this.handleEvent,this.get("dockNode"),"."+i.dockedtitle,this,o),this.get("dockNode").on("mouseleave",this.handleEvent,this,{cssselector:"#dock",delay:.5,iscontained:!1}),e.delegate("click",this.handleReturnToBlock,this.get("dockNode"),s.panelmoveto,this),e.delegate("click",this.handleReturnToBlock,this.get("dockNode"),s.panelmoveto,this),e.delegate("dock:actionkey",this.handleDockedItemEvent,this.get("dockNode"),"."+i.dockeditem,this),r.on("click",this.handleEvent,this,{cssselector:"body",delay:0}),this.on("dock:itemschanged",this.resizeBlockSpace,this),this.on("dock:itemschanged",this.checkDockVisibility,this),this.on("dock:itemschanged",this.resetFirstItem,this),this.dockdrawn=!0,!0},handleDockedItemEvent:function(e){if(e.type!=="dock:actionkey")return!1;var t=e.target,n="."+i.dockeditem;t.test(n)||(t=t.ancestor(n));if(!t)return!1;e.halt(),this.dockeditems[t.getAttribute("rel")].toggle(e.action)},_applyThemeCustomisation:function(){if(typeof customise_dock_for_theme=="function"){M.core_dock=this,M.core_dock.cfg={buffer:null,orientation:null,position:null,spacebeforefirstitem:null,removeallicon:null},M.core_dock.css={dock:null,dockspacer:null,controls:null,body:null,buttonscontainer:null,dockeditem:null,dockeditemcontainer:null,dockedtitle:null,activeitem:null};try{customise_dock_for_theme(this)}catch(t){}var n,r,s=!1,o={buffer:"bufferPanel",orientation:"orientation",position:"position",spacebeforefirstitem:"bufferBeforeFirstItem",removeallicon:"undockAllIconUrl"};for(n in M.core_dock.cfg)if(e.Lang.isString(n)&&o[n]){r=M.core_dock.cfg[n];if(r===null)continue;s||(s=!0) -,this.set(o[n],r)}for(n in M.core_dock.css)if(e.Lang.isString(n)){r=M.core_dock.css[n];if(r===null)continue;s||(s=!0),i[n]=r}}},_initialiseDockNode:function(){var t=this.get("dockNode"),n=i.dock+"_"+this.get("position")+"_"+this.get("orientation"),o=e.Node.create("
").setStyles({display:"none"}),u=this.get("buttonsNode"),a=this.get("itemContainerNode");return t||(t=e.one("#"+i.dock)),t||(t=e.Node.create('
'),r.append(t)),t.setAttribute("role","menubar").addClass(n),e.all(s.dockonload).size()===0?t.addClass("nothingdocked"):(n=i.body+"_"+this.get("position")+"_"+this.get("orientation"),r.addClass(i.body).addClass()),u||(u=t.one("."+i.buttonscontainer)),u||(u=e.Node.create('
'),t.append(u)),a||(a=t.one("."+i.dockeditemcontainer)),a||(a=e.Node.create('
'),u.append(a)),r.append(o),this.holdingareanode=o,this.set("dockNode",t),this.set("buttonsNode",u),this.set("itemContainerNode",a),t},_initialiseDockControls:function(){var t=e.Node.create(''+M.util.get_string(');t.setAttribute("src",this.get("undockAllIconUrl")),t.on("removeall|click",this.removeAll,this),t.on("dock:actionkey",this.removeAll,this,{actions:{enter:!0}}),this.get("buttonsNode").append(e.Node.create('
').append(t))},getPanel:function(){var t=this.get("panel");return t||(t=new u({dock:this}),t.on("panel:visiblechange",this.resize,this),e.on("windowresize",this.resize,this),this.set("panel",t),this.fire("dock:panelgenerated")),t},resizePanelIfRequired:function(){this.resize();var e=this.get("panel");e&&e.correctWidth()},handleEvent:function(e,t){var n=this.getActiveItem(),r,i,s=/^dock_item_(\d+)_title$/,o=this;if(t.cssselector==="body")this.get("dockNode").contains(e.target)||n&&n.hide();else{e.target.test(t.cssselector)?r=e.target:r=e.target.ancestor(t.cssselector);if(!r)return!0;if(this.preventevent!==null&&e.type===this.preventevent)return!0;t.preventevent&&(this.preventevent=t.preventevent,t.preventdelay&&setTimeout(function(){o.preventevent=null},t.preventdelay*1e3)),this.delayedevent&&this.delayedevent.timeout&&(clearTimeout(this.delayedevent.timeout),this.delayedevent.event.detach(),this.delayedevent=null);if(t.delay>0)return this.delayEvent(e,t,r);i=r.get("id"),i.match(s)?(n=this.dockeditems[i.replace(s,"$1")],n.active?n.hide():n.show()):n&&n.hide()}return!0},delayEvent:function(e,t,n){var i=this;return i.delayedevent=function(){return{target:n,event:r.on("mousemove",function(e){i.delayedevent.target=e.target}),timeout:null}}(i),i.delayedevent.timeout=setTimeout(function(){i.delayedevent.timeout=null,i.delayedevent.event.detach(),t.iscontained===i.get("dockNode").contains(i.delayedevent.target)&&i.handleEvent(e,{cssselector:t.cssselector,delay:0,iscontained:t.iscontained})},t.delay*1e3),!0},resizeBlockSpace:function(){if(e.all(s.dockonload).size()>0)return;var t=[],n=0,o=!0,u=!1,a;e.all(s.blockregion).each(function(){var e=region.getData("blockregion");region.all(".block").size()>0?(n++,r.addClass("used-region-"+e),r.removeClass("empty-region-"+e)):(r.addClass("empty-region-"+e),r.removeClass("used-region-"+e))}),e.all(".block-region").each(function(e){if(e.test(s.blockregion))return;var r=e.all(".block").size()>0;r&&n++,o=!1,t[e.get("id")]={hasblocks:r,bodyclass:e.get("id").replace(/^region\-/,"side-")+"-only"}}),r.hasClass("blocks-moving")&&(u=!0),n===0&&u===!1?r.addClass(i.contentonly):r.removeClass(i.contentonly);if(!o)if(n===0&&u===!1)for(a in t)t[a].bodyclass&&r.removeClass(t[a].bodyclass);else if(n===1&&u===!1)for(a in t)t[a].bodyclass&&(t[a].hasblocks?r.addClass(t[a].bodyclass):r.removeClass(t[a].bodyclass));else for(a in t)t[a].bodyclass&&r.removeClass(t[a].bodyclass)},add:function(e){e.set("id",this.totalcount),this.count++,this.totalcount++,this.dockeditems[e.get("id")]=e,this.dockeditems[e.get("id")].draw(),this.fire("dock:itemadded",e),this.fire("dock:itemschanged",e)},append:function(e){this.get("itemContainerNode").append(e)},handleReturnToBlock:function(e){e.halt(),this.remove(this.getActiveItem().get("id"))},remove:function(e){return this.dockeditems[e]?(this.dockeditems[e].remove(),delete this.dockeditems[e],this.count--,this.fire("dock:itemremoved",e),this.fire("dock:itemschanged",e),!0):!1},resetFirstItem:function(){this.get("dockNode").all("."+i.dockeditem+".firstdockitem").removeClass("firstdockitem"),this.get("dockNode").one("."+i.dockeditem)&&this.get("dockNode").one("."+i.dockeditem).addClass("firstdockitem")},removeAll:function(){var t;for(t in this.dockeditems)(e.Lang.isNumber(t)||e.Lang.isString(t))&&this.remove(t);return!0},hideActive:function(){var e=this.getActiveItem();e&&e.hide()},checkDockVisibility:function(){var e=i.body+"_"+this.get("position")+"_"+this.get("orientation");this.count?(this.fire("dock:beforeshow"),this.get("dockNode").removeClass("nothingdocked"),r.addClass(i.body).addClass(e),this.fire("dock:shown")):(this.get("dockNode").addClass("nothingdocked"),r.removeClass(i.body).removeClass(),this.fire("dock:hidden"))},resize:function(){var t=this.getPanel(),n=this.getActiveItem(),i,s,o,u,a,f,l,c,h,p;return!t.get("visible")||!n?!0:(this.fire("dock:panelresizestart"),this.get("orientation")==="vertical"&&(i=this.get("bufferPanel"),s=parseInt(r.get("winHeight"),10)-i*2,o=this.get("dockNode").getY(),u=n.get("dockTitleNode").getY()-o-i,a=this.get("itemContainerNode").getY(),f=a-o+this.get("buttonsNode").get("offsetHeight"),l=t.get("bodyNode").get("scrollTop"),t.get("bodyNode").setStyle("height","auto"),t.get("node").removeClass("oversized_content"),c=t.get("node").get("offsetHeight"),e.UA.ie>0&&e.UA.ie<7?t.setTop(n.get("dockTitleNode").getY()):c>s?(t.setTop(i-f),t.get("bodyNode").setStyle("height",s-t.get("headerNode").get("offsetHeight")+"px"),t.get("node").addClass("oversized_content")):c>s-(u-i)?t.setTop(u-f-(c-(s-u))+i):t.setTop(u-f+i),l&&t.get("bodyNode").set("scrollTop",l)),this. -get("position")==="right"?t.get("node").setStyle("left",-t.get("offsetWidth")+"px"):this.get("position")==="top"&&(h=this.get("dockNode").getX(),p=n.get("dockTitleNode").getX()-h,t.get("node").setStyle("left",p+"px")),this.fire("dock:resizepanelcomplete"),!0)},getActiveItem:function(){var e;for(e in this.dockeditems)if(this.dockeditems[e].active)return this.dockeditems[e];return!1},addToHoldingArea:function(e){this.holdingareanode.append(e)}},e.extend(o,e.Base,o.prototype,{NAME:"moodle-core-dock",ATTRS:{dockNode:{writeOnce:!0},panel:{writeOnce:!0},buttonsNode:{writeOnce:!0},itemContainerNode:{writeOnce:!0},bufferPanel:{value:10,validator:e.Lang.isNumber},position:{value:"left",validator:e.Lang.isString},orientation:{value:"vertical",validator:e.Lang.isString,setter:function(e){return e.match(/^vertical$/i)?"vertical":"horizontal"}},bufferBeforeFirstItem:{value:10,validator:e.Lang.isNumber},undockAllIconUrl:{value:M.util.image_url("t/dock_to_block","moodle"),validator:e.Lang.isString}}}),e.augment(o,e.EventTarget),u=function(){u.superclass.constructor.apply(this,arguments)},u.prototype={created:!1,initializer:function(){this.publish("dockpanel:beforeshow",{prefix:"dockpanel"}),this.publish("dockpanel:shown",{prefix:"dockpanel"}),this.publish("dockpanel:beforehide",{prefix:"dockpanel"}),this.publish("dockpanel:hidden",{prefix:"dockpanel"}),this.publish("dockpanel:visiblechange",{prefix:"dockpanel"})},create:function(){if(this.created)return!0;this.created=!0;var t=this.get("dock"),n=t.get("dockNode");this.set("node",e.Node.create('
')),this.set("contentNode",e.Node.create('
')),this.set("headerNode",e.Node.create('
')),this.set("bodyNode",e.Node.create('
')),n.append(this.get("node").append(this.get("contentNode").append(this.get("headerNode")).append(this.get("bodyNode"))))},show:function(){this.create(),this.fire("dockpanel:beforeshow"),this.set("visible",!0),this.get("node").removeClass("dockitempanel_hidden"),this.fire("dockpanel:shown"),this.fire("dockpanel:visiblechange")},hide:function(){this.fire("dockpanel:beforehide"),this.set("visible",!1),this.get("node").addClass("dockitempanel_hidden"),this.fire("dockpanel:hidden"),this.fire("dockpanel:visiblechange")},setHeader:function(t){this.create();var n=this.get("headerNode"),r;n.setContent(t);if(arguments.length>1)for(r=1;r0&&e.UA.ie<7?this.get("node").setY(t):this.get("node").setStyle("top",t.toString()+"px")},correctWidth:function(){var e=this.get("bodyNode"),t=e.get("clientWidth"),n=e.get("scrollWidth"),r=e.get("offsetWidth"),i=t,s=Math.round(e.get("winWidth")*.8);n>t&&(i=t+(n-t)+(r-t)*2+10),i>s&&(i=s),i>r&&this.get("node").setStyle("width",i+"px")}},e.extend(u,e.Base,u.prototype,{NAME:"moodle-core-dock-panel",ATTRS:{dock:{writeOnce:"initOnly"},node:{value:null},contentNode:{value:null},headerNode:{value:null},bodyNode:{value:null},visible:{value:!1}}}),e.augment(u,e.EventTarget),a=function(){a.superclass.constructor.apply(this,arguments)},a.prototype={initializer:function(){var t=this.get("dock");t.on("dock:itemschanged",this.checkSizing,this),e.on("windowresize",this.checkSizing,this)},checkSizing:function(){var t=this.get("dock"),n=t.get("dockNode"),r=t.dockeditems,s=n.get("offsetHeight")-n.one(".controls").get("offsetHeight")-t.get("bufferPanel")*3-r.length*2,o=0,u,a;if(r.length>0){for(u in r)if(e.Lang.isNumber(u)||e.Lang.isString(u))a=e.one(r[u].get("title")).ancestor("."+i.dockedtitle),a&&(this.get("enabled")&&a.setStyle("height","auto"),o+=a.get("offsetHeight")||0);o>s&&this.enable(s)}},enable:function(t){var n=this.get("dock"),r=n.dockeditems,s=n.count,o=0,u=0,a,f,l,c;this.set("enabled",!0);for(a in r)if(e.Lang.isNumber(a)||e.Lang.isString(a)){f=e.one(r[a].get("title")).ancestor("."+i.dockedtitle);if(!f)continue;l=Math.floor((t-u)/(s-o)),c=f.get("offsetHeight"),f.setStyle("overflow","hidden"),c>l?(f.setStyle("height",l+"px"),u+=l):u+=c,o++}}},e.extend(a,e.Base,a.prototype,{NAME:"moodle-core-tabheightmanager",ATTRS:{dock:{writeOnce:"initOnly"},enabled:{value:!1}}}),e.Event.define("dock:actionkey",{_event:e.UA.webkit||e.UA.ie?"keydown":"keypress",_keys:{37:"collapse",39:"expand",32:"toggle",13:"enter"},_keyHandler:function(e,t,n){var r;n.actions?r=n.actions:r={collapse:!0,expand:!0,toggle:!0,enter:!0},this._keys[e.keyCode]&&r[this._keys[e.keyCode]]&&(e.action=this._keys[e.keyCode],t.fire(e))},on:function(e,t,n){t.args===null?t._detacher=e.on(this._event,this._keyHandler,this,n,{actions:!1}):t._detacher=e.on(this._event,this._keyHandler,this,n,t.args[0])},detach:function(e,t){t._detacher.detach()},delegate:function(e,t,n,r){t.args===null?t._delegateDetacher=e.delegate(this._event,this._keyHandler,r,this,n,{actions:!1}):t._delegateDetacher=e.delegate(this._event,this._keyHandler,r,this,n,t.args[0])},detachDelegate:function(e,t){t._delegateDetacher.detach()}}),f=function(){f.superclass.constructor.apply(this,arguments)},f.prototype={contentplaceholder:null,contentskipanchor:null,cachedcontentnode:null,skipsetposition:!0,dockitem:null,initializer:function(){var t=e.one("#inst"+this.get("id")),n;return t?(M.core.dock.ensureMoveToIconExists(t),t.hasClass(i.dockonload)&&(t.removeClass(i.dockonload),n=t.one(".header .title .commands"),n||(n=e.Node.create('
'),t.one(".header .title")&&t.one(".header .title").append(n)),this.moveToDock(null,n)),this.skipsetposition=!1,!0):!1},_getBlockClass:function(t){var n=t.getData("block"),r,i;return e.Lang.isString(n)&&n!==""?n:(r=t.getAttribute("className").toString(),i=/(^| )block_([^ ]+)/.exec(r),i?i[2]:i)},moveToDock:function(t){t&&t.halt(!0);var n=M.core.dock.get(),r=this.get("id"),i=e.one("#inst"+r).one(".content" -),s=right_to_left()?"t/dock_to_block_rtl":"t/dock_to_block",o=location.href.match(/\?/)?"&":"?",u,a,f,c;if(!i)return;this.recordBlockState(),u=this.cachedcontentnode.one(".title h2").cloneNode(!0),a=this.cachedcontentnode.one(".title .commands").cloneNode(!0),f=e.Node.create("").setAttrs({alt:e.Escape.html(M.str.block.undockitem),title:e.Escape.html(M.util.get_string("undockblock","block",u.get("innerHTML"))),src:M.util.image_url(s,"moodle")}),c=e.Node.create('').setAttrs({href:e.config.win.location.href+o+"dock="+r}),c.append(f),a.append(c.append(f)),this.dockitem=new l({block:this,dock:n,blockinstanceid:r,title:u,contents:i,commands:a,blockclass:this._getBlockClass(e.one("#inst"+r))}),n.add(this.dockitem),this.skipsetposition||M.util.set_user_preference("docked_block_instance_"+r,1),this.set("isDocked",!0)},recordBlockState:function(){var t=this.get("id"),n=M.core.dock.get(),r=e.one("#inst"+t),i=r.previous();i.hasClass("skip-block")&&(this.contentskipanchor=i,this.contentskipanchor.hide()),this.cachedcontentnode=r,this.contentplaceholder=e.Node.create('
'),r.replace(this.contentplaceholder),n.addToHoldingArea(r),r=null,this.cachedcontentnode.one(".title .commands")||this.cachedcontentnode.one(".title").append(e.Node.create('
'))},returnToPage:function(){var t=this.get("id"),n;return this.contentskipanchor&&this.contentskipanchor.show(),this.cachedcontentnode.one(".header")?this.cachedcontentnode.one(".header").insert(this.dockitem.get("contents"),"after"):this.cachedcontentnode.insert(this.dockitem.get("contents")),this.contentplaceholder.replace(this.cachedcontentnode),this.cachedcontentnode=e.one("#"+this.cachedcontentnode.get("id")),n=this.dockitem.get("commands"),n&&(n.all(".hidepanelicon").remove(),n.all(".moveto").remove(),n.remove()),this.cachedcontentnode=null,M.util.set_user_preference("docked_block_instance_"+t,0),this.set("isDocked",!1),!0}},e.extend(f,e.Base,f.prototype,{NAME:"moodle-core-dock-block",ATTRS:{id:{writeOnce:"initOnly",setter:function(e){return parseInt(e,10)}},isDocked:{value:!1}}}),l=function(){l.superclass.constructor.apply(this,arguments)},l.prototype={active:!1,initializer:function(){var t=this.get("title"),n,r;this.publish("dockeditem:drawstart",{prefix:"dockeditem"}),this.publish("dockeditem:drawcomplete",{prefix:"dockeditem"}),this.publish("dockeditem:showstart",{prefix:"dockeditem"}),this.publish("dockeditem:showcomplete",{prefix:"dockeditem"}),this.publish("dockeditem:hidestart",{prefix:"dockeditem"}),this.publish("dockeditem:hidecomplete",{prefix:"dockeditem"}),this.publish("dockeditem:itemremoved",{prefix:"dockeditem"}),t&&(r=t.get("nodeName"),n=t.cloneNode(!0),t=e.Node.create("<"+r+">"),t=M.core.dock.fixTitleOrientation(t,n.get("text")),this.set("title",t),this.set("titlestring",n))},draw:function(){var t=e.Node.create,n=this.get("dock"),r=n.count,s,o,u,a,f=this.get("id");return this.fire("dockeditem:drawstart"),s=t(''),s.append(this.get("title")),o=t('
'),r===1&&o.addClass("firstdockitem"),o.append(s),n.append(o),a=t(''+M.str.block.hidepanel+''),a.setAttribute("src",M.util.image_url("t/dockclose","moodle")),u=t('').append(a),u.on("forceclose|click",this.hide,this),u.on("dock:actionkey",this.hide,this,{actions:{enter:!0,toggle:!0}}),this.get("commands").append(u),this.set("dockTitleNode",s),this.set("dockItemNode",o),this.fire("dockeditem:drawcomplete"),!0},show:function(){var t=this.get("dock"),n=t.getPanel(),r=this.get("dockTitleNode");return t.hideActive(),this.fire("dockeditem:showstart"),n.setHeader(this.get("titlestring"),this.get("commands")),n.setBody(e.Node.create('
').append(this.get("contents"))),n.show(),n.correctWidth(),this.active=!0,r.addClass(i.activeitem),r.set("aria-expanded","true"),this.fire("dockeditem:showcomplete"),t.resize(),!0},hide:function(){this.fire("dockeditem:hidestart"),this.active&&(this.active=!1,this.get("dock").getPanel().hide()),this.get("dockTitleNode").removeClass(i.activeitem).set("aria-expanded","false"),this.fire("dockeditem:hidecomplete")},toggle:function(e){var t=this.get("dockTitleNode");t.hasClass(i.activeitem)&&e!=="expand"?this.hide():!t.hasClass(i.activeitem)&&e!=="collapse"&&this.show()},remove:function(){this.hide(),this.get("block").returnToPage(),this.get("dockItemNode").remove(),this.fire("dockeditem:itemremoved")},_getLogDescription:function(){return this.get("titlestring").get("innerHTML")+" ("+this.get("blockinstanceid")+")"}},e.extend(l,e.Base,l.prototype,{NAME:"moodle-core-dock-dockeditem",ATTRS:{block:{writeOnce:"initOnly"},dock:{writeOnce:"initOnly"},id:{},blockinstanceid:{writeOnce:"initOnly",setter:function(e){return parseInt(e,10)}},title:{value:null},titlestring:{value:null},contents:{writeOnce:"initOnly"},commands:{writeOnce:"initOnly"},blockclass:{writeOnce:"initOnly"},dockTitleNode:{value:null},dockItemNode:{value:null},dockcontainerNode:{value:null}}}),e.augment(l,e.EventTarget)},"@VERSION@",{requires:["base","node","event-custom","event-mouseenter","event-resize","escape","moodle-core-dock-loader"]}); +,this.set(o[n],r)}for(n in M.core_dock.css)if(e.Lang.isString(n)){r=M.core_dock.css[n];if(r===null)continue;s||(s=!0),i[n]=r}}},_initialiseDockNode:function(){var t=this.get("dockNode"),n=i.dock+"_"+this.get("position")+"_"+this.get("orientation"),o=e.Node.create("
").setStyles({display:"none"}),u=this.get("buttonsNode"),a=this.get("itemContainerNode");return t||(t=e.one("#"+i.dock)),t||(t=e.Node.create('
'),r.append(t)),t.setAttribute("role","menubar").addClass(n),e.all(s.dockonload).size()===0?t.addClass("nothingdocked"):(n=i.body+"_"+this.get("position")+"_"+this.get("orientation"),r.addClass(i.body).addClass()),u||(u=t.one("."+i.buttonscontainer)),u||(u=e.Node.create('
'),t.append(u)),a||(a=t.one("."+i.dockeditemcontainer)),a||(a=e.Node.create('
'),u.append(a)),r.append(o),this.holdingareanode=o,this.set("dockNode",t),this.set("buttonsNode",u),this.set("itemContainerNode",a),t},_initialiseDockControls:function(){var t=e.Node.create(''+M.util.get_string(');t.setAttribute("src",this.get("undockAllIconUrl")),t.on("removeall|click",this.removeAll,this),t.on("dock:actionkey",this.removeAll,this,{actions:{enter:!0}}),this.get("buttonsNode").append(e.Node.create('
').append(t))},getPanel:function(){var t=this.get("panel");return t||(t=new u({dock:this}),t.on("panel:visiblechange",this.resize,this),e.on("windowresize",this.resize,this),this.set("panel",t),this.fire("dock:panelgenerated")),t},resizePanelIfRequired:function(){this.resize();var e=this.get("panel");e&&e.correctWidth()},handleEvent:function(e,t){var n=this.getActiveItem(),r,i,s=/^dock_item_(\d+)_title$/,o=this;if(t.cssselector==="body")this.get("dockNode").contains(e.target)||n&&n.hide();else{e.target.test(t.cssselector)?r=e.target:r=e.target.ancestor(t.cssselector);if(!r)return!0;if(this.preventevent!==null&&e.type===this.preventevent)return!0;t.preventevent&&(this.preventevent=t.preventevent,t.preventdelay&&setTimeout(function(){o.preventevent=null},t.preventdelay*1e3)),this.delayedevent&&this.delayedevent.timeout&&(clearTimeout(this.delayedevent.timeout),this.delayedevent.event.detach(),this.delayedevent=null);if(t.delay>0)return this.delayEvent(e,t,r);i=r.get("id"),i.match(s)?(n=this.dockeditems[i.replace(s,"$1")],n.active?n.hide():n.show()):n&&n.hide()}return!0},delayEvent:function(e,t,n){var i=this;return i.delayedevent=function(){return{target:n,event:r.on("mousemove",function(e){i.delayedevent.target=e.target}),timeout:null}}(i),i.delayedevent.timeout=setTimeout(function(){i.delayedevent.timeout=null,i.delayedevent.event.detach(),t.iscontained===i.get("dockNode").contains(i.delayedevent.target)&&i.handleEvent(e,{cssselector:t.cssselector,delay:0,iscontained:t.iscontained})},t.delay*1e3),!0},resizeBlockSpace:function(){if(e.all(s.dockonload).size()>0)return;var t=[],n=0,o=!0,u=!1,a;e.all(s.blockregion).each(function(){var e=region.getData("blockregion");region.all(".block").size()>0?(n++,r.addClass("used-region-"+e),r.removeClass("empty-region-"+e)):region.all(".block_dock_placeholder").size()>0&&(r.addClass("empty-region-"+e),r.removeClass("used-region-"+e))}),e.all(".block-region").each(function(e){if(e.test(s.blockregion))return;var r=e.all(".block").size()>0;r&&n++,o=!1,t[e.get("id")]={hasblocks:r,bodyclass:e.get("id").replace(/^region\-/,"side-")+"-only"}}),r.hasClass("blocks-moving")&&(u=!0),n===0&&u===!1?r.addClass(i.contentonly):r.removeClass(i.contentonly);if(!o)if(n===0&&u===!1)for(a in t)t[a].bodyclass&&r.removeClass(t[a].bodyclass);else if(n===1&&u===!1)for(a in t)t[a].bodyclass&&(t[a].hasblocks?r.addClass(t[a].bodyclass):r.removeClass(t[a].bodyclass));else for(a in t)t[a].bodyclass&&r.removeClass(t[a].bodyclass)},add:function(e){e.set("id",this.totalcount),this.count++,this.totalcount++,this.dockeditems[e.get("id")]=e,this.dockeditems[e.get("id")].draw(),this.fire("dock:itemadded",e),this.fire("dock:itemschanged",e)},append:function(e){this.get("itemContainerNode").append(e)},handleReturnToBlock:function(e){e.halt(),this.remove(this.getActiveItem().get("id"))},remove:function(e){return this.dockeditems[e]?(this.dockeditems[e].remove(),delete this.dockeditems[e],this.count--,this.fire("dock:itemremoved",e),this.fire("dock:itemschanged",e),!0):!1},resetFirstItem:function(){this.get("dockNode").all("."+i.dockeditem+".firstdockitem").removeClass("firstdockitem"),this.get("dockNode").one("."+i.dockeditem)&&this.get("dockNode").one("."+i.dockeditem).addClass("firstdockitem")},removeAll:function(){var t;for(t in this.dockeditems)(e.Lang.isNumber(t)||e.Lang.isString(t))&&this.remove(t);return!0},hideActive:function(){var e=this.getActiveItem();e&&e.hide()},checkDockVisibility:function(){var e=i.body+"_"+this.get("position")+"_"+this.get("orientation");this.count?(this.fire("dock:beforeshow"),this.get("dockNode").removeClass("nothingdocked"),r.addClass(i.body).addClass(e),this.fire("dock:shown")):(this.get("dockNode").addClass("nothingdocked"),r.removeClass(i.body).removeClass(),this.fire("dock:hidden"))},resize:function(){var t=this.getPanel(),n=this.getActiveItem(),i,s,o,u,a,f,l,c,h,p;return!t.get("visible")||!n?!0:(this.fire("dock:panelresizestart"),this.get("orientation")==="vertical"&&(i=this.get("bufferPanel"),s=parseInt(r.get("winHeight"),10)-i*2,o=this.get("dockNode").getY(),u=n.get("dockTitleNode").getY()-o-i,a=this.get("itemContainerNode").getY(),f=a-o+this.get("buttonsNode").get("offsetHeight"),l=t.get("bodyNode").get("scrollTop"),t.get("bodyNode").setStyle("height","auto"),t.get("node").removeClass("oversized_content"),c=t.get("node").get("offsetHeight"),e.UA.ie>0&&e.UA.ie<7?t.setTop(n.get("dockTitleNode").getY()):c>s?(t.setTop(i-f),t.get("bodyNode").setStyle("height",s-t.get("headerNode").get("offsetHeight")+"px"),t.get("node").addClass("oversized_content")):c>s-(u-i)?t.setTop(u-f-(c-(s-u))+i):t.setTop(u-f+i +),l&&t.get("bodyNode").set("scrollTop",l)),this.get("position")==="right"?t.get("node").setStyle("left",-t.get("offsetWidth")+"px"):this.get("position")==="top"&&(h=this.get("dockNode").getX(),p=n.get("dockTitleNode").getX()-h,t.get("node").setStyle("left",p+"px")),this.fire("dock:resizepanelcomplete"),!0)},getActiveItem:function(){var e;for(e in this.dockeditems)if(this.dockeditems[e].active)return this.dockeditems[e];return!1},addToHoldingArea:function(e){this.holdingareanode.append(e)}},e.extend(o,e.Base,o.prototype,{NAME:"moodle-core-dock",ATTRS:{dockNode:{writeOnce:!0},panel:{writeOnce:!0},buttonsNode:{writeOnce:!0},itemContainerNode:{writeOnce:!0},bufferPanel:{value:10,validator:e.Lang.isNumber},position:{value:"left",validator:e.Lang.isString},orientation:{value:"vertical",validator:e.Lang.isString,setter:function(e){return e.match(/^vertical$/i)?"vertical":"horizontal"}},bufferBeforeFirstItem:{value:10,validator:e.Lang.isNumber},undockAllIconUrl:{value:M.util.image_url("t/dock_to_block","moodle"),validator:e.Lang.isString}}}),e.augment(o,e.EventTarget),u=function(){u.superclass.constructor.apply(this,arguments)},u.prototype={created:!1,initializer:function(){this.publish("dockpanel:beforeshow",{prefix:"dockpanel"}),this.publish("dockpanel:shown",{prefix:"dockpanel"}),this.publish("dockpanel:beforehide",{prefix:"dockpanel"}),this.publish("dockpanel:hidden",{prefix:"dockpanel"}),this.publish("dockpanel:visiblechange",{prefix:"dockpanel"})},create:function(){if(this.created)return!0;this.created=!0;var t=this.get("dock"),n=t.get("dockNode");this.set("node",e.Node.create('
')),this.set("contentNode",e.Node.create('
')),this.set("headerNode",e.Node.create('
')),this.set("bodyNode",e.Node.create('
')),n.append(this.get("node").append(this.get("contentNode").append(this.get("headerNode")).append(this.get("bodyNode"))))},show:function(){this.create(),this.fire("dockpanel:beforeshow"),this.set("visible",!0),this.get("node").removeClass("dockitempanel_hidden"),this.fire("dockpanel:shown"),this.fire("dockpanel:visiblechange")},hide:function(){this.fire("dockpanel:beforehide"),this.set("visible",!1),this.get("node").addClass("dockitempanel_hidden"),this.fire("dockpanel:hidden"),this.fire("dockpanel:visiblechange")},setHeader:function(t){this.create();var n=this.get("headerNode"),r;n.setContent(t);if(arguments.length>1)for(r=1;r0&&e.UA.ie<7?this.get("node").setY(t):this.get("node").setStyle("top",t.toString()+"px")},correctWidth:function(){var e=this.get("bodyNode"),t=e.get("clientWidth"),n=e.get("scrollWidth"),r=e.get("offsetWidth"),i=t,s=Math.round(e.get("winWidth")*.8);n>t&&(i=t+(n-t)+(r-t)*2+10),i>s&&(i=s),i>r&&this.get("node").setStyle("width",i+"px")}},e.extend(u,e.Base,u.prototype,{NAME:"moodle-core-dock-panel",ATTRS:{dock:{writeOnce:"initOnly"},node:{value:null},contentNode:{value:null},headerNode:{value:null},bodyNode:{value:null},visible:{value:!1}}}),e.augment(u,e.EventTarget),a=function(){a.superclass.constructor.apply(this,arguments)},a.prototype={initializer:function(){var t=this.get("dock");t.on("dock:itemschanged",this.checkSizing,this),e.on("windowresize",this.checkSizing,this)},checkSizing:function(){var t=this.get("dock"),n=t.get("dockNode"),r=t.dockeditems,s=n.get("offsetHeight")-n.one(".controls").get("offsetHeight")-t.get("bufferPanel")*3-r.length*2,o=0,u,a;if(r.length>0){for(u in r)if(e.Lang.isNumber(u)||e.Lang.isString(u))a=e.one(r[u].get("title")).ancestor("."+i.dockedtitle),a&&(this.get("enabled")&&a.setStyle("height","auto"),o+=a.get("offsetHeight")||0);o>s&&this.enable(s)}},enable:function(t){var n=this.get("dock"),r=n.dockeditems,s=n.count,o=0,u=0,a,f,l,c;this.set("enabled",!0);for(a in r)if(e.Lang.isNumber(a)||e.Lang.isString(a)){f=e.one(r[a].get("title")).ancestor("."+i.dockedtitle);if(!f)continue;l=Math.floor((t-u)/(s-o)),c=f.get("offsetHeight"),f.setStyle("overflow","hidden"),c>l?(f.setStyle("height",l+"px"),u+=l):u+=c,o++}}},e.extend(a,e.Base,a.prototype,{NAME:"moodle-core-tabheightmanager",ATTRS:{dock:{writeOnce:"initOnly"},enabled:{value:!1}}}),e.Event.define("dock:actionkey",{_event:e.UA.webkit||e.UA.ie?"keydown":"keypress",_keys:{37:"collapse",39:"expand",32:"toggle",13:"enter"},_keyHandler:function(e,t,n){var r;n.actions?r=n.actions:r={collapse:!0,expand:!0,toggle:!0,enter:!0},this._keys[e.keyCode]&&r[this._keys[e.keyCode]]&&(e.action=this._keys[e.keyCode],t.fire(e))},on:function(e,t,n){t.args===null?t._detacher=e.on(this._event,this._keyHandler,this,n,{actions:!1}):t._detacher=e.on(this._event,this._keyHandler,this,n,t.args[0])},detach:function(e,t){t._detacher.detach()},delegate:function(e,t,n,r){t.args===null?t._delegateDetacher=e.delegate(this._event,this._keyHandler,r,this,n,{actions:!1}):t._delegateDetacher=e.delegate(this._event,this._keyHandler,r,this,n,t.args[0])},detachDelegate:function(e,t){t._delegateDetacher.detach()}}),f=function(){f.superclass.constructor.apply(this,arguments)},f.prototype={contentplaceholder:null,contentskipanchor:null,cachedcontentnode:null,skipsetposition:!0,dockitem:null,initializer:function(){var t=e.one("#inst"+this.get("id")),n;return t?(M.core.dock.ensureMoveToIconExists(t),t.hasClass(i.dockonload)&&(t.removeClass(i.dockonload),n=t.one(".header .title .commands"),n||(n=e.Node.create('
'),t.one(".header .title")&&t.one(".header .title").append(n)),this.moveToDock(null,n)),this.skipsetposition=!1,!0):!1},_getBlockClass:function(t){var n=t.getData("block"),r,i;return e.Lang.isString(n)&&n!==""?n:(r=t.getAttribute("className").toString(),i=/(^| )block_([^ ]+)/.exec(r),i?i[2]:i)},moveToDock:function(t){t&&t.halt(!0);var n=M.core.dock.get(), +r=this.get("id"),i=e.one("#inst"+r).one(".content"),s=right_to_left()?"t/dock_to_block_rtl":"t/dock_to_block",o=location.href.match(/\?/)?"&":"?",u,a,f,c;if(!i)return;this.recordBlockState(),u=this.cachedcontentnode.one(".title h2").cloneNode(!0),a=this.cachedcontentnode.one(".title .commands").cloneNode(!0),f=e.Node.create("").setAttrs({alt:e.Escape.html(M.str.block.undockitem),title:e.Escape.html(M.util.get_string("undockblock","block",u.get("innerHTML"))),src:M.util.image_url(s,"moodle")}),c=e.Node.create('').setAttrs({href:e.config.win.location.href+o+"dock="+r}),c.append(f),a.append(c.append(f)),this.dockitem=new l({block:this,dock:n,blockinstanceid:r,title:u,contents:i,commands:a,blockclass:this._getBlockClass(e.one("#inst"+r))}),n.add(this.dockitem),this.skipsetposition||M.util.set_user_preference("docked_block_instance_"+r,1),this.set("isDocked",!0)},recordBlockState:function(){var t=this.get("id"),n=M.core.dock.get(),r=e.one("#inst"+t),i=r.previous();i.hasClass("skip-block")&&(this.contentskipanchor=i,this.contentskipanchor.hide()),this.cachedcontentnode=r,this.contentplaceholder=e.Node.create('
'),r.replace(this.contentplaceholder),n.addToHoldingArea(r),r=null,this.cachedcontentnode.one(".title .commands")||this.cachedcontentnode.one(".title").append(e.Node.create('
'))},returnToPage:function(){var t=this.get("id"),n;return this.contentskipanchor&&this.contentskipanchor.show(),this.cachedcontentnode.one(".header")?this.cachedcontentnode.one(".header").insert(this.dockitem.get("contents"),"after"):this.cachedcontentnode.insert(this.dockitem.get("contents")),this.contentplaceholder.replace(this.cachedcontentnode),this.cachedcontentnode=e.one("#"+this.cachedcontentnode.get("id")),n=this.dockitem.get("commands"),n&&(n.all(".hidepanelicon").remove(),n.all(".moveto").remove(),n.remove()),this.cachedcontentnode=null,M.util.set_user_preference("docked_block_instance_"+t,0),this.set("isDocked",!1),!0}},e.extend(f,e.Base,f.prototype,{NAME:"moodle-core-dock-block",ATTRS:{id:{writeOnce:"initOnly",setter:function(e){return parseInt(e,10)}},isDocked:{value:!1}}}),l=function(){l.superclass.constructor.apply(this,arguments)},l.prototype={active:!1,initializer:function(){var t=this.get("title"),n,r;this.publish("dockeditem:drawstart",{prefix:"dockeditem"}),this.publish("dockeditem:drawcomplete",{prefix:"dockeditem"}),this.publish("dockeditem:showstart",{prefix:"dockeditem"}),this.publish("dockeditem:showcomplete",{prefix:"dockeditem"}),this.publish("dockeditem:hidestart",{prefix:"dockeditem"}),this.publish("dockeditem:hidecomplete",{prefix:"dockeditem"}),this.publish("dockeditem:itemremoved",{prefix:"dockeditem"}),t&&(r=t.get("nodeName"),n=t.cloneNode(!0),t=e.Node.create("<"+r+">"),t=M.core.dock.fixTitleOrientation(t,n.get("text")),this.set("title",t),this.set("titlestring",n))},draw:function(){var t=e.Node.create,n=this.get("dock"),r=n.count,s,o,u,a,f=this.get("id");return this.fire("dockeditem:drawstart"),s=t(''),s.append(this.get("title")),o=t('
'),r===1&&o.addClass("firstdockitem"),o.append(s),n.append(o),a=t(''+M.str.block.hidepanel+''),a.setAttribute("src",M.util.image_url("t/dockclose","moodle")),u=t('').append(a),u.on("forceclose|click",this.hide,this),u.on("dock:actionkey",this.hide,this,{actions:{enter:!0,toggle:!0}}),this.get("commands").append(u),this.set("dockTitleNode",s),this.set("dockItemNode",o),this.fire("dockeditem:drawcomplete"),!0},show:function(){var t=this.get("dock"),n=t.getPanel(),r=this.get("dockTitleNode");return t.hideActive(),this.fire("dockeditem:showstart"),n.setHeader(this.get("titlestring"),this.get("commands")),n.setBody(e.Node.create('
').append(this.get("contents"))),n.show(),n.correctWidth(),this.active=!0,r.addClass(i.activeitem),r.set("aria-expanded","true"),this.fire("dockeditem:showcomplete"),t.resize(),!0},hide:function(){this.fire("dockeditem:hidestart"),this.active&&(this.active=!1,this.get("dock").getPanel().hide()),this.get("dockTitleNode").removeClass(i.activeitem).set("aria-expanded","false"),this.fire("dockeditem:hidecomplete")},toggle:function(e){var t=this.get("dockTitleNode");t.hasClass(i.activeitem)&&e!=="expand"?this.hide():!t.hasClass(i.activeitem)&&e!=="collapse"&&this.show()},remove:function(){this.hide(),this.get("block").returnToPage(),this.get("dockItemNode").remove(),this.fire("dockeditem:itemremoved")},_getLogDescription:function(){return this.get("titlestring").get("innerHTML")+" ("+this.get("blockinstanceid")+")"}},e.extend(l,e.Base,l.prototype,{NAME:"moodle-core-dock-dockeditem",ATTRS:{block:{writeOnce:"initOnly"},dock:{writeOnce:"initOnly"},id:{},blockinstanceid:{writeOnce:"initOnly",setter:function(e){return parseInt(e,10)}},title:{value:null},titlestring:{value:null},contents:{writeOnce:"initOnly"},commands:{writeOnce:"initOnly"},blockclass:{writeOnce:"initOnly"},dockTitleNode:{value:null},dockItemNode:{value:null},dockcontainerNode:{value:null}}}),e.augment(l,e.EventTarget)},"@VERSION@",{requires:["base","node","event-custom","event-mouseenter","event-resize","escape","moodle-core-dock-loader"]}); diff --git a/lib/yui/build/moodle-core-dock/moodle-core-dock.js b/lib/yui/build/moodle-core-dock/moodle-core-dock.js index f2c325a0e40..2e77b48ea56 100644 --- a/lib/yui/build/moodle-core-dock/moodle-core-dock.js +++ b/lib/yui/build/moodle-core-dock/moodle-core-dock.js @@ -759,7 +759,9 @@ DOCK.prototype = { populatedblockregions++; BODY.addClass('used-region-'+regionname); BODY.removeClass('empty-region-'+regionname); - } else { + } else if (region.all('.block_dock_placeholder').size() > 0) { + // There are no blocks in the region but there are placeholders. + // All blocks in this region have been docked. BODY.addClass('empty-region-'+regionname); BODY.removeClass('used-region-'+regionname); } diff --git a/lib/yui/src/blocks/js/blocks.js b/lib/yui/src/blocks/js/blocks.js index a3510532c65..6679e48aa38 100644 --- a/lib/yui/src/blocks/js/blocks.js +++ b/lib/yui/src/blocks/js/blocks.js @@ -361,7 +361,7 @@ M.core.blockdraganddrop.is_using_blocks_render_method = function() { var goodregions = Y.all('.block-region[data-blockregion]').size(); var allregions = Y.all('.block-region').size(); this._isusingnewblocksmethod = (allregions === goodregions); - if (goodregions > 0 && allregions > 0) { + if (goodregions > 0 && allregions > 0 && goodregions !== allregions) { Y.log('Both core_renderer::blocks and core_renderer::blocks_for_region have been used.', 'warn', 'moodle-core_blocks'); } } diff --git a/lib/yui/src/blocks/js/manager.js b/lib/yui/src/blocks/js/manager.js index 3179060be4a..ab924ea336e 100644 --- a/lib/yui/src/blocks/js/manager.js +++ b/lib/yui/src/blocks/js/manager.js @@ -109,7 +109,7 @@ MANAGER.prototype = { dragdelegation.dd.plug(Y.Plugin.DDWinScroll); // On the mouse down event we will enable all block regions so that they can be dragged to. // This is VERY important as without it dnd won't work for empty block regions. - dragdelegation.on('drag:mouseDown', this.enable_all_regions, this); + dragdelegation.on('drag:start', this.enable_all_regions, this); region.change_block_move_icons(this); } diff --git a/lib/yui/src/dock/js/dock.js b/lib/yui/src/dock/js/dock.js index f73ddeae5c0..5d97f2df1b9 100644 --- a/lib/yui/src/dock/js/dock.js +++ b/lib/yui/src/dock/js/dock.js @@ -764,7 +764,9 @@ DOCK.prototype = { populatedblockregions++; BODY.addClass('used-region-'+regionname); BODY.removeClass('empty-region-'+regionname); - } else { + } else if (region.all('.block_dock_placeholder').size() > 0) { + // There are no blocks in the region but there are placeholders. + // All blocks in this region have been docked. BODY.addClass('empty-region-'+regionname); BODY.removeClass('used-region-'+regionname); } From b3cf6fa12a4683d2e3a937cb508b9c67ddfcbf8b Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Fri, 11 Apr 2014 10:40:09 +0800 Subject: [PATCH 10/26] MDL-43145 dock: Enable regions before the drag operation starts --- .../moodle-core-blocks-debug.js | 25 ++++++++++++++----- .../moodle-core-blocks-min.js | 4 +-- .../moodle-core-blocks/moodle-core-blocks.js | 25 ++++++++++++++----- lib/yui/src/blocks/js/manager.js | 25 ++++++++++++++----- 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js index 6af97f938b9..831607f8a0c 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-debug.js @@ -455,7 +455,6 @@ MANAGER.prototype = { i = 0, region, regionname, - droptarget, dragdelegation; // Evil required by M.core.dragdrop. @@ -484,7 +483,7 @@ MANAGER.prototype = { // Setting blockregion as droptarget (the case when it is empty) // The region-post (the right one) // is very narrow, so add extra padding on the left to drop block on it. - droptarget = new Y.DD.Drop({ + new Y.DD.Drop({ node: region.get_droptarget(), groups: this.groups, padding: '40 240 40 240' @@ -504,9 +503,10 @@ MANAGER.prototype = { moveOnEnd: false }); dragdelegation.dd.plug(Y.Plugin.DDWinScroll); - // On the mouse down event we will enable all block regions so that they can be dragged to. - // This is VERY important as without it dnd won't work for empty block regions. - dragdelegation.on('drag:start', this.enable_all_regions, this); + + // On the DD Manager start operation, we enable all block regions so that they can be drop targets. This + // must be done *before* drag:start but after dragging has been initialised. + Y.DD.DDM.on('ddm:start', this.enable_all_regions, this); region.change_block_move_icons(this); } @@ -548,12 +548,25 @@ MANAGER.prototype = { /** * Enables all fo the regions so that they are all visible while dragging is occuring. + * * @method enable_all_regions * @returns {undefined} */ enable_all_regions : function() { - var i = 0; + var groups = Y.DD.DDM.activeDrag.get('groups'); + + // As we're called by Y.DD.DDM, we can't be certain that the call + // relates specifically to a block drag/drop operation. Test + // whether the relevant group applies here. + if (!groups || Y.Array.indexOf(groups, 'block') === -1) { + return; + } + + var i; for (i in this.regionobjects) { + if (!this.regionobjects.hasOwnProperty(i)) { + continue; + } this.regionobjects[i].enable(); } }, diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js index 463d604afc9..441ffde68d7 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks-min.js @@ -1,2 +1,2 @@ -YUI.add("moodle-core-blocks",function(e,t){var n="/lib/ajax/blocks.php",r={BLOCK:"block",BLOCKREGION:"block-region",BLOCKADMINBLOCK:"block_adminblock",EDITINGMOVE:"editing_move",HEADER:"header",LIGHTBOX:"lightbox",REGIONCONTENT:"region-content",SKIPBLOCK:"skip-block",SKIPBLOCKTO:"skip-block-to",MYINDEX:"page-my-index",REGIONMAIN:"region-main",BLOCKSMOVING:"blocks-moving"},i={DRAGHANDLE:"."+r.HEADER+" .commands .moodle-core-dragdrop-draghandle"},s=function(){s.superclass.constructor.apply(this,arguments)};e.extend(s,M.core.dragdrop,{skipnodetop:null,skipnodebottom:null,dragsourceregion:null,initializer:function(){this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.REGIONCONTENT;var t=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(t.size()>0){var n=t.item(0);n.addClass(r.BLOCKREGION),n.set("id",r.REGIONCONTENT),n.one("div").addClass(r.REGIONCONTENT)}var s=e.Node.all("div."+r.BLOCKREGION);if(s.size()===0)return!1;if(s.size()!==this.get("regions").length){var o=e.Node.create("
").addClass(r.BLOCKREGION),u=e.Node.create("
").addClass(r.REGIONCONTENT);o.appendChild(u);var a=s.filter("#region-pre"),f=s.filter("#region-post");a.size()===0&&f.size()===1?(o.setAttrs({id:"region-pre"}),f.item(0).insert(o,"before"),s.unshift(o)):f.size()===0&&a.size()===1&&(o.setAttrs({id:"region-post"}),a.item(0).insert(o,"after"),s.push(o))}s.each(function(t){new e.DD.Drop({node:t.one("div."+r.REGIONCONTENT),groups:this.groups,padding:"40 240 40 240"});var n=new e.DD.Delegate({container:t,nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}});n.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),n.dd.plug(e.Plugin.DDWinScroll);var s=t.all("."+r.BLOCK);s.each(function(e){var t=e.one("a."+r.EDITINGMOVE);t&&(t.replace(this.get_drag_handle(t.getAttribute("title"),"","iconsmall",!0)),e.one(i.DRAGHANDLE).setStyle("cursor","move"))},this)},this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(t){var n=t.ancestor("div."+r.BLOCKREGION).get("id").replace(/region-/i,"");return e.Array.indexOf(this.get("regions"),n)===-1?(right_to_left()&&(n==="post"?n="pre":n==="pre"&&(n="post")),"side-"+n):n},get_region_id:function(e){return e.get("id").replace(/region-/i,"")},drag_start:function(t){var n=t.target;this.dragsourceregion=n.get("node").ancestor("div."+r.BLOCKREGION),n.get("node").previous()&&n.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=n.get("node").previous()),n.get("node").next()&&n.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=n.get("node").next()),e.one("body").addClass(r.BLOCKSMOVING)},drop_over:function(t){var n=t.drag.get("node"),i=t.drop.get("node");i.hasClass(this.parentnodeclass)&&i.one("."+r.BLOCKADMINBLOCK)&&i.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&i.prepend(n);if(this.dragsourceregion.contains(i))return!1;var s=e.one("body"),o=this.get_region_id(this.dragsourceregion);s.hasClass("side-"+o+"-only")&&s.removeClass("side-"+o+"-only"),o=this.get_region_id(i.ancestor("div."+r.BLOCKREGION)),this.dragsourceregion.all("."+r.BLOCK).size()===0&&this.dragsourceregion.get("id").match(/(region-pre|region-post)/i)&&(s.hasClass("side-"+o+"-only")||s.addClass("side-"+o+"-only"))},drag_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.dragsourceregion=null,e.one("body").removeClass(r.BLOCKSMOVING)},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag,s=i.get("node"),o=t.drop.get("node");s.previous()&&s.previous().hasClass(r.SKIPBLOCK)&&s.insert(s.previous(),"after"),this.skipnodetop&&s.insert(this.skipnodetop,"before"),this.skipnodebottom&&s.insert(this.skipnodebottom,"after");var u=M.util.add_lightbox(e,s),a={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(s),bui_newregion:this.get_block_region(o)};this.get("cmid")&&(a.cmid=this.get("cmid")),s.next("."+this.samenodeclass)&&!s.next("."+this.samenodeclass).hasClass(r.BLOCKADMINBLOCK)&&(a.bui_beforeid=this.get_block_id(s.next("."+this.samenodeclass))),e.io(M.cfg.wwwroot+n,{method:"POST",data:a,on:{start:function(){u.show()},success:function(t,n){window.setTimeout(function(){u.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),u.hide()}},context:this})}},{NAME:"core-blocks-dragdrop",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:null}}}),M.core=M.core||{},M.core.blockdraganddrop=M.core.blockdraganddrop||{},M.core.blockdraganddrop._isusingnewblocksmethod=null,M.core.blockdraganddrop.is_using_blocks_render_method=function(){if(this._isusingnewblocksmethod===null){var t=e.all(".block-region[data-blockregion]").size(),n=e.all(".block-region").size();this._isusingnewblocksmethod=n===t,t>0&&n>0&&t!==n}return this._isusingnewblocksmethod},M.core.blockdraganddrop.init=function(e){this.is_using_blocks_render_method()?new o(e):new s(e)},M.core_blocks=M.core_blocks||{},M.core_blocks.init_dragdrop=function(e){M.core.blockdraganddrop.init(e)};var o=function(){o.superclass.constructor.apply(this,arguments)};o.prototype={skipnodetop:null,skipnodebottom:null,regionobjects:{},initializer:function(){var t=this.get("regions"),n=0,s,o,a,f;this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.BLOCKREGION;var l=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(l.size()>0){var c=l.item(0);c.addClass(r.BLOCKREGION),c.set("id",r.REGIONCONTENT),c.one("div").addClass(r.REGIONCONTENT)}for(n in t)o=t[n],s=new u({manager:this,region:o,node:e.one("#block-region-"+o)}),this.regionobjects[o]=s,a=new e.DD.Drop({node:s.get_droptarget(),groups -:this.groups,padding:"40 240 40 240"}),f=new e.DD.Delegate({container:s.get_droptarget(),nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}}),f.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),f.dd.plug(e.Plugin.DDWinScroll),f.on("drag:start",this.enable_all_regions,this),s.change_block_move_icons(this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(e){return e.test("[data-blockregion]")||(e=e.ancestor("[data-blockregion]")),e.getData("blockregion")},get_region_object:function(e){return this.regionobjects[this.get_block_region(e)]},enable_all_regions:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].enable()},disable_regions_if_required:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].disable_if_required()},drag_start:function(e){var t=e.target;t.get("node").previous()&&t.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=t.get("node").previous()),t.get("node").next()&&t.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=t.get("node").next())},drop_over:function(e){var t=e.drag.get("node"),n=e.drop.get("node");n.hasClass(r.REGIONCONTENT)&&n.one("."+r.BLOCKADMINBLOCK)&&n.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&n.prepend(t)},drop_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.disable_regions_if_required()},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag.get("node"),s=t.drop.get("node");i.previous()&&i.previous().hasClass(r.SKIPBLOCK)&&i.insert(i.previous(),"after"),this.skipnodetop&&i.insert(this.skipnodetop,"before"),this.skipnodebottom&&i.insert(this.skipnodebottom,"after");var o=M.util.add_lightbox(e,i),u={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(i),bui_newregion:this.get_block_region(s)};this.get("cmid")&&(u.cmid=this.get("cmid")),i.next("."+r.BLOCK)&&!i.next("."+r.BLOCK).hasClass(r.BLOCKADMINBLOCK)&&(u.bui_beforeid=this.get_block_id(i.next("."+r.BLOCK))),e.io(M.cfg.wwwroot+n,{method:"POST",data:u,on:{start:function(){o.show()},success:function(t,n){window.setTimeout(function(){o.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),o.hide()},complete:function(){this.disable_regions_if_required()}},context:this})}},e.extend(o,M.core.dragdrop,o.prototype,{NAME:"core-blocks-dragdrop-manager",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:[]}}});var u=function(){u.superclass.constructor.apply(this,arguments)};u.prototype={initializer:function(){var t=this.get("node");t||(t=this.create_and_add_node());var n=e.one("body"),i=t.all("."+r.BLOCK).size()>0,s=this.get_has_region_class();this.set("hasblocks",i),n.hasClass(s)||n.addClass(s),n.addClass(i?this.get_used_region_class():this.get_empty_region_class()),n.removeClass(i?this.get_empty_region_class():this.get_used_region_class())},create_and_add_node:function(){var t=e.Node.create,n=this.get("region"),i=t('
').addClass(r.BLOCKREGION).setData("blockregion",n),s=this.get("manager").get("regions"),o,u=!1,a=!1,f=!1,l,c;for(o in s)s[o].match(/(pre|left)/)?u=s[o]:s[o].match(/(post|right)/)&&(a=s[o]);return u!==!1&&a!==!1&&(n===u?(c=e.one("#block-region-"+a),c&&(c.insert(i,"before"),f=!0)):(l=e.one("#block-region-"+u),l&&(l.insert(i,"after"),f=!0))),f===!1&&e.one("body").append(i),this.set("node",i),i},change_block_move_icons:function(e){var t,n;this.get("node").all("."+r.BLOCK+" a."+r.EDITINGMOVE).each(function(r){r.setStyle("cursor","move"),t=e.get_drag_handle(r.getAttribute("title"),"","icon",!0),n=t.one("img"),n.addClass("iconsmall"),n.removeClass("icon"),r.replace(t)})},get_has_region_class:function(){return"has-region-"+this.get("region")},get_empty_region_class:function(){return"empty-region-"+this.get("region")},get_used_region_class:function(){return"used-region-"+this.get("region")},get_droptarget:function(){var e=this.get("node");return e.test('[data-droptarget="1"]')?e:e.one('[data-droptarget="1"]')},enable:function(){e.one("body").addClass(this.get_used_region_class()).removeClass(this.get_empty_region_class())},disable_if_required:function(){this.get("node").all("."+r.BLOCK).size()===0&&e.one("body").addClass(this.get_empty_region_class()).removeClass(this.get_used_region_class())}},e.extend(u,e.Base,u.prototype,{NAME:"core-blocks-dragdrop-blockregion",ATTRS:{manager:{writeOnce:"initOnly",validator:function(t){return e.Lang.isObject(t)&&t instanceof o}},region:{writeOnce:"initOnly",validator:function(t){return e.Lang.isString(t)}},node:{validator:function(t){return e.Lang.isObject(t)||e.Lang.isNull(t)}},hasblocks:{value:!1,validator:function(t){return e.Lang.isBoolean(t)}}}})},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification"]}); +YUI.add("moodle-core-blocks",function(e,t){var n="/lib/ajax/blocks.php",r={BLOCK:"block",BLOCKREGION:"block-region",BLOCKADMINBLOCK:"block_adminblock",EDITINGMOVE:"editing_move",HEADER:"header",LIGHTBOX:"lightbox",REGIONCONTENT:"region-content",SKIPBLOCK:"skip-block",SKIPBLOCKTO:"skip-block-to",MYINDEX:"page-my-index",REGIONMAIN:"region-main",BLOCKSMOVING:"blocks-moving"},i={DRAGHANDLE:"."+r.HEADER+" .commands .moodle-core-dragdrop-draghandle"},s=function(){s.superclass.constructor.apply(this,arguments)};e.extend(s,M.core.dragdrop,{skipnodetop:null,skipnodebottom:null,dragsourceregion:null,initializer:function(){this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.REGIONCONTENT;var t=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(t.size()>0){var n=t.item(0);n.addClass(r.BLOCKREGION),n.set("id",r.REGIONCONTENT),n.one("div").addClass(r.REGIONCONTENT)}var s=e.Node.all("div."+r.BLOCKREGION);if(s.size()===0)return!1;if(s.size()!==this.get("regions").length){var o=e.Node.create("
").addClass(r.BLOCKREGION),u=e.Node.create("
").addClass(r.REGIONCONTENT);o.appendChild(u);var a=s.filter("#region-pre"),f=s.filter("#region-post");a.size()===0&&f.size()===1?(o.setAttrs({id:"region-pre"}),f.item(0).insert(o,"before"),s.unshift(o)):f.size()===0&&a.size()===1&&(o.setAttrs({id:"region-post"}),a.item(0).insert(o,"after"),s.push(o))}s.each(function(t){new e.DD.Drop({node:t.one("div."+r.REGIONCONTENT),groups:this.groups,padding:"40 240 40 240"});var n=new e.DD.Delegate({container:t,nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}});n.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),n.dd.plug(e.Plugin.DDWinScroll);var s=t.all("."+r.BLOCK);s.each(function(e){var t=e.one("a."+r.EDITINGMOVE);t&&(t.replace(this.get_drag_handle(t.getAttribute("title"),"","iconsmall",!0)),e.one(i.DRAGHANDLE).setStyle("cursor","move"))},this)},this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(t){var n=t.ancestor("div."+r.BLOCKREGION).get("id").replace(/region-/i,"");return e.Array.indexOf(this.get("regions"),n)===-1?(right_to_left()&&(n==="post"?n="pre":n==="pre"&&(n="post")),"side-"+n):n},get_region_id:function(e){return e.get("id").replace(/region-/i,"")},drag_start:function(t){var n=t.target;this.dragsourceregion=n.get("node").ancestor("div."+r.BLOCKREGION),n.get("node").previous()&&n.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=n.get("node").previous()),n.get("node").next()&&n.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=n.get("node").next()),e.one("body").addClass(r.BLOCKSMOVING)},drop_over:function(t){var n=t.drag.get("node"),i=t.drop.get("node");i.hasClass(this.parentnodeclass)&&i.one("."+r.BLOCKADMINBLOCK)&&i.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&i.prepend(n);if(this.dragsourceregion.contains(i))return!1;var s=e.one("body"),o=this.get_region_id(this.dragsourceregion);s.hasClass("side-"+o+"-only")&&s.removeClass("side-"+o+"-only"),o=this.get_region_id(i.ancestor("div."+r.BLOCKREGION)),this.dragsourceregion.all("."+r.BLOCK).size()===0&&this.dragsourceregion.get("id").match(/(region-pre|region-post)/i)&&(s.hasClass("side-"+o+"-only")||s.addClass("side-"+o+"-only"))},drag_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.dragsourceregion=null,e.one("body").removeClass(r.BLOCKSMOVING)},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag,s=i.get("node"),o=t.drop.get("node");s.previous()&&s.previous().hasClass(r.SKIPBLOCK)&&s.insert(s.previous(),"after"),this.skipnodetop&&s.insert(this.skipnodetop,"before"),this.skipnodebottom&&s.insert(this.skipnodebottom,"after");var u=M.util.add_lightbox(e,s),a={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(s),bui_newregion:this.get_block_region(o)};this.get("cmid")&&(a.cmid=this.get("cmid")),s.next("."+this.samenodeclass)&&!s.next("."+this.samenodeclass).hasClass(r.BLOCKADMINBLOCK)&&(a.bui_beforeid=this.get_block_id(s.next("."+this.samenodeclass))),e.io(M.cfg.wwwroot+n,{method:"POST",data:a,on:{start:function(){u.show()},success:function(t,n){window.setTimeout(function(){u.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),u.hide()}},context:this})}},{NAME:"core-blocks-dragdrop",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:null}}}),M.core=M.core||{},M.core.blockdraganddrop=M.core.blockdraganddrop||{},M.core.blockdraganddrop._isusingnewblocksmethod=null,M.core.blockdraganddrop.is_using_blocks_render_method=function(){if(this._isusingnewblocksmethod===null){var t=e.all(".block-region[data-blockregion]").size(),n=e.all(".block-region").size();this._isusingnewblocksmethod=n===t,t>0&&n>0&&t!==n}return this._isusingnewblocksmethod},M.core.blockdraganddrop.init=function(e){this.is_using_blocks_render_method()?new o(e):new s(e)},M.core_blocks=M.core_blocks||{},M.core_blocks.init_dragdrop=function(e){M.core.blockdraganddrop.init(e)};var o=function(){o.superclass.constructor.apply(this,arguments)};o.prototype={skipnodetop:null,skipnodebottom:null,regionobjects:{},initializer:function(){var t=this.get("regions"),n=0,s,o,a;this.groups=["block"],this.samenodeclass=r.BLOCK,this.parentnodeclass=r.BLOCKREGION;var f=e.Node.all("body#"+r.MYINDEX+" #"+r.REGIONMAIN+" > ."+r.REGIONCONTENT);if(f.size()>0){var l=f.item(0);l.addClass(r.BLOCKREGION),l.set("id",r.REGIONCONTENT),l.one("div").addClass(r.REGIONCONTENT)}for(n in t)o=t[n],s=new u({manager:this,region:o,node:e.one("#block-region-"+o)}),this.regionobjects[o]=s,new e.DD.Drop({node:s.get_droptarget(),groups +:this.groups,padding:"40 240 40 240"}),a=new e.DD.Delegate({container:s.get_droptarget(),nodes:"."+r.BLOCK,target:!0,handles:[i.DRAGHANDLE],invalid:".block-hider-hide, .block-hider-show, .moveto",dragConfig:{groups:this.groups}}),a.dd.plug(e.Plugin.DDProxy,{moveOnEnd:!1}),a.dd.plug(e.Plugin.DDWinScroll),e.DD.DDM.on("ddm:start",this.enable_all_regions,this),s.change_block_move_icons(this)},get_block_id:function(e){return Number(e.get("id").replace(/inst/i,""))},get_block_region:function(e){return e.test("[data-blockregion]")||(e=e.ancestor("[data-blockregion]")),e.getData("blockregion")},get_region_object:function(e){return this.regionobjects[this.get_block_region(e)]},enable_all_regions:function(){var t=e.DD.DDM.activeDrag.get("groups");if(!t||e.Array.indexOf(t,"block")===-1)return;var n;for(n in this.regionobjects){if(!this.regionobjects.hasOwnProperty(n))continue;this.regionobjects[n].enable()}},disable_regions_if_required:function(){var e=0;for(e in this.regionobjects)this.regionobjects[e].disable_if_required()},drag_start:function(e){var t=e.target;t.get("node").previous()&&t.get("node").previous().hasClass(r.SKIPBLOCK)&&(this.skipnodetop=t.get("node").previous()),t.get("node").next()&&t.get("node").next().hasClass(r.SKIPBLOCKTO)&&(this.skipnodebottom=t.get("node").next())},drop_over:function(e){var t=e.drag.get("node"),n=e.drop.get("node");n.hasClass(r.REGIONCONTENT)&&n.one("."+r.BLOCKADMINBLOCK)&&n.one("."+r.BLOCKADMINBLOCK).next("."+r.BLOCK)&&n.prepend(t)},drop_end:function(){this.skipnodetop=null,this.skipnodebottom=null,this.disable_regions_if_required()},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(t){var i=t.drag.get("node"),s=t.drop.get("node");i.previous()&&i.previous().hasClass(r.SKIPBLOCK)&&i.insert(i.previous(),"after"),this.skipnodetop&&i.insert(this.skipnodetop,"before"),this.skipnodebottom&&i.insert(this.skipnodebottom,"after");var o=M.util.add_lightbox(e,i),u={sesskey:M.cfg.sesskey,courseid:this.get("courseid"),pagelayout:this.get("pagelayout"),pagetype:this.get("pagetype"),subpage:this.get("subpage"),contextid:this.get("contextid"),action:"move",bui_moveid:this.get_block_id(i),bui_newregion:this.get_block_region(s)};this.get("cmid")&&(u.cmid=this.get("cmid")),i.next("."+r.BLOCK)&&!i.next("."+r.BLOCK).hasClass(r.BLOCKADMINBLOCK)&&(u.bui_beforeid=this.get_block_id(i.next("."+r.BLOCK))),e.io(M.cfg.wwwroot+n,{method:"POST",data:u,on:{start:function(){o.show()},success:function(t,n){window.setTimeout(function(){o.hide()},250);try{var r=e.JSON.parse(n.responseText);r.error&&new M.core.ajaxException(r)}catch(i){}},failure:function(e,t){this.ajax_failure(t),o.hide()},complete:function(){this.disable_regions_if_required()}},context:this})}},e.extend(o,M.core.dragdrop,o.prototype,{NAME:"core-blocks-dragdrop-manager",ATTRS:{courseid:{value:null},cmid:{value:null},contextid:{value:null},pagelayout:{value:null},pagetype:{value:null},subpage:{value:null},regions:{value:[]}}});var u=function(){u.superclass.constructor.apply(this,arguments)};u.prototype={initializer:function(){var t=this.get("node");t||(t=this.create_and_add_node());var n=e.one("body"),i=t.all("."+r.BLOCK).size()>0,s=this.get_has_region_class();this.set("hasblocks",i),n.hasClass(s)||n.addClass(s),n.addClass(i?this.get_used_region_class():this.get_empty_region_class()),n.removeClass(i?this.get_empty_region_class():this.get_used_region_class())},create_and_add_node:function(){var t=e.Node.create,n=this.get("region"),i=t('
').addClass(r.BLOCKREGION).setData("blockregion",n),s=this.get("manager").get("regions"),o,u=!1,a=!1,f=!1,l,c;for(o in s)s[o].match(/(pre|left)/)?u=s[o]:s[o].match(/(post|right)/)&&(a=s[o]);return u!==!1&&a!==!1&&(n===u?(c=e.one("#block-region-"+a),c&&(c.insert(i,"before"),f=!0)):(l=e.one("#block-region-"+u),l&&(l.insert(i,"after"),f=!0))),f===!1&&e.one("body").append(i),this.set("node",i),i},change_block_move_icons:function(e){var t,n;this.get("node").all("."+r.BLOCK+" a."+r.EDITINGMOVE).each(function(r){r.setStyle("cursor","move"),t=e.get_drag_handle(r.getAttribute("title"),"","icon",!0),n=t.one("img"),n.addClass("iconsmall"),n.removeClass("icon"),r.replace(t)})},get_has_region_class:function(){return"has-region-"+this.get("region")},get_empty_region_class:function(){return"empty-region-"+this.get("region")},get_used_region_class:function(){return"used-region-"+this.get("region")},get_droptarget:function(){var e=this.get("node");return e.test('[data-droptarget="1"]')?e:e.one('[data-droptarget="1"]')},enable:function(){e.one("body").addClass(this.get_used_region_class()).removeClass(this.get_empty_region_class())},disable_if_required:function(){this.get("node").all("."+r.BLOCK).size()===0&&e.one("body").addClass(this.get_empty_region_class()).removeClass(this.get_used_region_class())}},e.extend(u,e.Base,u.prototype,{NAME:"core-blocks-dragdrop-blockregion",ATTRS:{manager:{writeOnce:"initOnly",validator:function(t){return e.Lang.isObject(t)&&t instanceof o}},region:{writeOnce:"initOnly",validator:function(t){return e.Lang.isString(t)}},node:{validator:function(t){return e.Lang.isObject(t)||e.Lang.isNull(t)}},hasblocks:{value:!1,validator:function(t){return e.Lang.isBoolean(t)}}}})},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification"]}); diff --git a/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js b/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js index bfea11aeebd..cda263bf9f6 100644 --- a/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js +++ b/lib/yui/build/moodle-core-blocks/moodle-core-blocks.js @@ -451,7 +451,6 @@ MANAGER.prototype = { i = 0, region, regionname, - droptarget, dragdelegation; // Evil required by M.core.dragdrop. @@ -480,7 +479,7 @@ MANAGER.prototype = { // Setting blockregion as droptarget (the case when it is empty) // The region-post (the right one) // is very narrow, so add extra padding on the left to drop block on it. - droptarget = new Y.DD.Drop({ + new Y.DD.Drop({ node: region.get_droptarget(), groups: this.groups, padding: '40 240 40 240' @@ -500,9 +499,10 @@ MANAGER.prototype = { moveOnEnd: false }); dragdelegation.dd.plug(Y.Plugin.DDWinScroll); - // On the mouse down event we will enable all block regions so that they can be dragged to. - // This is VERY important as without it dnd won't work for empty block regions. - dragdelegation.on('drag:start', this.enable_all_regions, this); + + // On the DD Manager start operation, we enable all block regions so that they can be drop targets. This + // must be done *before* drag:start but after dragging has been initialised. + Y.DD.DDM.on('ddm:start', this.enable_all_regions, this); region.change_block_move_icons(this); } @@ -543,12 +543,25 @@ MANAGER.prototype = { /** * Enables all fo the regions so that they are all visible while dragging is occuring. + * * @method enable_all_regions * @returns {undefined} */ enable_all_regions : function() { - var i = 0; + var groups = Y.DD.DDM.activeDrag.get('groups'); + + // As we're called by Y.DD.DDM, we can't be certain that the call + // relates specifically to a block drag/drop operation. Test + // whether the relevant group applies here. + if (!groups || Y.Array.indexOf(groups, 'block') === -1) { + return; + } + + var i; for (i in this.regionobjects) { + if (!this.regionobjects.hasOwnProperty(i)) { + continue; + } this.regionobjects[i].enable(); } }, diff --git a/lib/yui/src/blocks/js/manager.js b/lib/yui/src/blocks/js/manager.js index ab924ea336e..8eba3bf095c 100644 --- a/lib/yui/src/blocks/js/manager.js +++ b/lib/yui/src/blocks/js/manager.js @@ -58,7 +58,6 @@ MANAGER.prototype = { i = 0, region, regionname, - droptarget, dragdelegation; // Evil required by M.core.dragdrop. @@ -87,7 +86,7 @@ MANAGER.prototype = { // Setting blockregion as droptarget (the case when it is empty) // The region-post (the right one) // is very narrow, so add extra padding on the left to drop block on it. - droptarget = new Y.DD.Drop({ + new Y.DD.Drop({ node: region.get_droptarget(), groups: this.groups, padding: '40 240 40 240' @@ -107,9 +106,10 @@ MANAGER.prototype = { moveOnEnd: false }); dragdelegation.dd.plug(Y.Plugin.DDWinScroll); - // On the mouse down event we will enable all block regions so that they can be dragged to. - // This is VERY important as without it dnd won't work for empty block regions. - dragdelegation.on('drag:start', this.enable_all_regions, this); + + // On the DD Manager start operation, we enable all block regions so that they can be drop targets. This + // must be done *before* drag:start but after dragging has been initialised. + Y.DD.DDM.on('ddm:start', this.enable_all_regions, this); region.change_block_move_icons(this); } @@ -151,12 +151,25 @@ MANAGER.prototype = { /** * Enables all fo the regions so that they are all visible while dragging is occuring. + * * @method enable_all_regions * @returns {undefined} */ enable_all_regions : function() { - var i = 0; + var groups = Y.DD.DDM.activeDrag.get('groups'); + + // As we're called by Y.DD.DDM, we can't be certain that the call + // relates specifically to a block drag/drop operation. Test + // whether the relevant group applies here. + if (!groups || Y.Array.indexOf(groups, 'block') === -1) { + return; + } + + var i; for (i in this.regionobjects) { + if (!this.regionobjects.hasOwnProperty(i)) { + continue; + } this.regionobjects[i].enable(); } }, From 6769f7302bd216ba27ec56bcdd118fce44b8094b Mon Sep 17 00:00:00 2001 From: Tim Lock Date: Wed, 9 Apr 2014 13:13:24 +0930 Subject: [PATCH 11/26] MDL-45012: Enable support for wma files within tinymce Moodle Media plugin --- lib/filelib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/filelib.php b/lib/filelib.php index 0bb0800f62b..1d246bc733f 100644 --- a/lib/filelib.php +++ b/lib/filelib.php @@ -1559,6 +1559,7 @@ function &get_mimetypes_array() { 'webm' => array ('type'=>'video/webm', 'icon'=>'video', 'groups'=>array('video'), 'string'=>'video'), 'wmv' => array ('type'=>'video/x-ms-wmv', 'icon'=>'wmv', 'groups'=>array('video'), 'string'=>'video'), 'asf' => array ('type'=>'video/x-ms-asf', 'icon'=>'wmv', 'groups'=>array('video'), 'string'=>'video'), + 'wma' => array ('type'=>'audio/x-ms-wma', 'icon'=>'audio', 'groups'=>array('audio'), 'string'=>'audio'), 'xbk' => array ('type'=>'application/x-smarttech-notebook', 'icon'=>'archive'), 'xdp' => array ('type'=>'application/pdf', 'icon'=>'pdf'), From 55a579c960a0fb23db36a452cc18e5caed4d855c Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Sun, 13 Apr 2014 18:41:58 -0700 Subject: [PATCH 12/26] MDL-45071 mod_quiz: retrieve all the name fields when deleting a user override --- mod/quiz/overridedelete.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/quiz/overridedelete.php b/mod/quiz/overridedelete.php index 8d9144fc8ac..9ebc0251b57 100644 --- a/mod/quiz/overridedelete.php +++ b/mod/quiz/overridedelete.php @@ -86,8 +86,9 @@ if ($override->groupid) { $group = $DB->get_record('groups', array('id' => $override->groupid), 'id, name'); $confirmstr = get_string("overridedeletegroupsure", "quiz", $group->name); } else { + $namefields = get_all_user_name_fields(true); $user = $DB->get_record('user', array('id' => $override->userid), - 'id, firstname, lastname'); + 'id, ' . $namefields); $confirmstr = get_string("overridedeleteusersure", "quiz", fullname($user)); } From 7a1d3e4db8a33b2ac1c609b6833b96a4c4f6cfa9 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Thu, 10 Apr 2014 17:32:03 +0800 Subject: [PATCH 13/26] MDL-45037 gradebook: Allow dashes in xml grade values to be ignored. This was delivering an error message when trying to import an exported xml file (from Moodle). --- grade/import/xml/lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grade/import/xml/lib.php b/grade/import/xml/lib.php index 3e059f83c4a..3984cca059f 100644 --- a/grade/import/xml/lib.php +++ b/grade/import/xml/lib.php @@ -82,7 +82,7 @@ function import_xml_grades($text, $course, &$error) { $newgrade->importer = $USER->id; // check grade value exists and is a numeric grade - if (isset($result['#']['score'][0]['#'])) { + if (isset($result['#']['score'][0]['#']) && $result['#']['score'][0]['#'] !== '-') { if (is_numeric($result['#']['score'][0]['#'])) { $newgrade->finalgrade = $result['#']['score'][0]['#']; } else { From c4f6292cc8ece83b31f1ec3332fce48cdeb215eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20S=CC=8Ckoda?= Date: Mon, 14 Apr 2014 13:16:41 +0800 Subject: [PATCH 14/26] MDL-45049 improve debugging output in error log for NO_DEBUG_DISPLAY scripts --- lib/weblib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/weblib.php b/lib/weblib.php index a5780b0ece8..f2a6f153ee5 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -2920,7 +2920,7 @@ function debugging($message = '', $level = DEBUG_NORMAL, $backtrace = null) { if (!$backtrace) { $backtrace = debug_backtrace(); } - $from = format_backtrace($backtrace, CLI_SCRIPT); + $from = format_backtrace($backtrace, CLI_SCRIPT || NO_DEBUG_DISPLAY); if (PHPUNIT_TEST) { if (phpunit_util::debugging_triggered($message, $level, $from)) { // We are inside test, the debug message was logged. @@ -2931,7 +2931,7 @@ function debugging($message = '', $level = DEBUG_NORMAL, $backtrace = null) { if (NO_DEBUG_DISPLAY) { // Script does not want any errors or debugging in output, // we send the info to error log instead. - error_log('Debugging: ' . $message . $from); + error_log('Debugging: ' . $message . ' in '. PHP_EOL . $from); } else if ($forcedebug or $CFG->debugdisplay) { if (!defined('DEBUGGING_PRINTED')) { From 911d3e9f0b2883e108e2e34092c4c16a66ab5741 Mon Sep 17 00:00:00 2001 From: Jonathon Fowler Date: Tue, 15 Apr 2014 14:18:55 +1000 Subject: [PATCH 15/26] MDL-44270 files: handle drag-drop js error when event has null types This can happen when the 'dragover' event fires as has been observed in Safari. When the dataTransfer.types property of the event is null, accessing types.length throws a JavaScript error. --- lib/form/dndupload.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/form/dndupload.js b/lib/form/dndupload.js index 4be065040c7..f93f261c000 100644 --- a/lib/form/dndupload.js +++ b/lib/form/dndupload.js @@ -355,7 +355,10 @@ M.form_dndupload.init = function(Y, options) { * @return boolean true if event has files */ has_files: function(e) { - var types = e._event.dataTransfer.types; + // In some browsers, dataTransfer.types may be null for a + // 'dragover' event, so ensure a valid Array is always + // inspected. + var types = e._event.dataTransfer.types || []; for (var i=0; i Date: Wed, 16 Apr 2014 13:32:54 +0800 Subject: [PATCH 16/26] MDL-41975 repository_alfresco: Ensure Moodle sends GMT time to Alfresco --- lib/alfresco/Service/WebService/AlfrescoWebService.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/alfresco/Service/WebService/AlfrescoWebService.php b/lib/alfresco/Service/WebService/AlfrescoWebService.php index b549755b467..898dcdf73db 100644 --- a/lib/alfresco/Service/WebService/AlfrescoWebService.php +++ b/lib/alfresco/Service/WebService/AlfrescoWebService.php @@ -79,8 +79,8 @@ class AlfrescoWebService extends SoapClient // Construct Timestamp Header $timeStamp = $dom->createElementNS($this->wsUtilityNS, "Timestamp"); - $createdDate = date("Y-m-d\TH:i:s\Z", mktime(date("H")+24, date("i"), date("s"), date("m"), date("d"), date("Y"))); - $expiresDate = date("Y-m-d\TH:i:s\Z", mktime(date("H")+25, date("i"), date("s"), date("m"), date("d"), date("Y"))); + $createdDate = gmdate("Y-m-d\TH:i:s\Z", gmmktime(gmdate("H"), gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y"))); + $expiresDate = gmdate("Y-m-d\TH:i:s\Z", gmmktime(gmdate("H")+1, gmdate("i"), gmdate("s"), gmdate("m"), gmdate("d"), gmdate("Y"))); $created = new DOMElement("Created", $createdDate, $this->wsUtilityNS); $expires = new DOMElement("Expires", $expiresDate, $this->wsUtilityNS); $timeStamp->appendChild($created); From 8fe97a4be48a34d591da0accb88e10f5327bb73e Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Wed, 16 Apr 2014 13:38:27 +0800 Subject: [PATCH 17/26] MDL-41975 repository_alfresco: Updating details about Alfresco URL and timestamps --- lib/alfresco/README_MOODLE.txt | 2 ++ repository/alfresco/lang/en/repository_alfresco.php | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/alfresco/README_MOODLE.txt b/lib/alfresco/README_MOODLE.txt index 83179f07fdb..aaf6400c32c 100644 --- a/lib/alfresco/README_MOODLE.txt +++ b/lib/alfresco/README_MOODLE.txt @@ -34,6 +34,8 @@ - AlfrescoWebService::__soapCall() arguments do not match SoapClient::__soapCall() - AlfrescoWebService::__doRequest() arguments do not match SoapClient::__soapCall() +6. Apply the changes from MDL-41975 in regard with the timestamp + == Alfresco PHP Library == Installation and developer documentation for the Alfresco PHP Library can be found on the Alfresco Wiki. diff --git a/repository/alfresco/lang/en/repository_alfresco.php b/repository/alfresco/lang/en/repository_alfresco.php index fe75bd5beb7..1bcc0e0c981 100644 --- a/repository/alfresco/lang/en/repository_alfresco.php +++ b/repository/alfresco/lang/en/repository_alfresco.php @@ -24,7 +24,7 @@ */ $string['alfresco_url'] = 'Alfresco URL'; -$string['alfrescourltext'] = 'Afresco API url should be: http://yoursite.com/alfresco/api'; +$string['alfrescourltext'] = 'Afresco API URL should be: http://yoursite.com/alfresco/api or http://yoursite.com/alfresco/soapapi for Alfresco 4.2.d or greater.'; $string['alfresco:view'] = 'View alfresco repository'; $string['configplugin'] = 'Alfresco configuration'; $string['notitle'] = 'notitle'; From 0c30255b32d45cfe18cc156bdf2233f16a872f30 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Thu, 17 Apr 2014 12:46:07 +0800 Subject: [PATCH 18/26] MDL-42761 badges: Remove H2s from help popup --- lang/en/badges.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lang/en/badges.php b/lang/en/badges.php index 81772d80bba..34050127122 100644 --- a/lang/en/badges.php +++ b/lang/en/badges.php @@ -64,15 +64,15 @@ $string['awards'] = 'Recipients'; $string['backpackavailability'] = 'External badge verification'; $string['backpackavailability_help'] = 'For badge recipients to be able to prove they earned their badges from you, an external backpack service should be able to access your site and verify badges issued from it. Your site does not currently appear to be accessible, which means that badges you have already issued or will issue in the future cannot be verified. -##Why am I seeing this message? +**Why am I seeing this message?** It may be that your firewall prevents access from users outside your network, your site is password protected, or you are running the site on a computer that is not available from the Internet (such as a local development machine). -##Is this a problem? +**Is this a problem?** You should fix this issue on any production site where you are planning to issue badges, otherwise the recipients will not be able to prove they earned their badges from you. If your site is not yet live you can create and issue test badges, as long as the site is accessible before you go live. -##What if I can\'t make my whole site publicly accessible? +**What if I can\'t make my whole site publicly accessible?** The only URL required for verification is [your-site-url]/badges/assertion.php so if you are able to modify your firewall to allow external access to that file, badge verification will still work.'; $string['backpackbadges'] = 'You have {$a->totalbadges} badge(s) displayed from {$a->totalcollections} collection(s). Change backpack settings.'; From 86702277afe84291d3bf5bf1692d6ab5fbfd36c5 Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Thu, 17 Apr 2014 14:24:58 +0800 Subject: [PATCH 19/26] MDL-45154 user profiles: avoid redirection warnings --- user/profile/definelib.php | 4 ++-- user/profile/index.php | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/user/profile/definelib.php b/user/profile/definelib.php index 1b87534e104..b16556b88fb 100644 --- a/user/profile/definelib.php +++ b/user/profile/definelib.php @@ -418,7 +418,7 @@ function profile_list_categories() { function profile_edit_category($id, $redirect) { global $CFG, $DB, $OUTPUT; - require_once('index_category_form.php'); + require_once($CFG->dirroot.'/user/profile/index_category_form.php'); $categoryform = new category_form(); if ($category = $DB->get_record('user_info_category', array('id'=>$id))) { @@ -474,7 +474,7 @@ function profile_edit_field($id, $datatype, $redirect) { $field->description = clean_text($field->description, $field->descriptionformat); $field->description = array('text'=>$field->description, 'format'=>$field->descriptionformat, 'itemid'=>0); - require_once('index_field_form.php'); + require_once($CFG->dirroot.'/user/profile/index_field_form.php'); $fieldform = new field_form(null, $field->datatype); // Convert the data format for diff --git a/user/profile/index.php b/user/profile/index.php index 17ab381403f..4c6fe664b01 100644 --- a/user/profile/index.php +++ b/user/profile/index.php @@ -87,12 +87,11 @@ switch ($action) { //normal form } -/// Print the header -echo $OUTPUT->header(); -echo $OUTPUT->heading(get_string('profilefields', 'admin')); +// Show all categories. +$categories = $DB->get_records('user_info_category', null, 'sortorder ASC'); -/// Check that we have at least one category defined -if ($DB->count_records('user_info_category') == 0) { +// Check that we have at least one category defined. +if (empty($categories)) { $defaultcategory = new stdClass(); $defaultcategory->name = $strdefaultcategory; $defaultcategory->sortorder = 1; @@ -100,8 +99,9 @@ if ($DB->count_records('user_info_category') == 0) { redirect($redirect); } -/// Show all categories -$categories = $DB->get_records('user_info_category', null, 'sortorder ASC'); +// Print the header. +echo $OUTPUT->header(); +echo $OUTPUT->heading(get_string('profilefields', 'admin')); foreach ($categories as $category) { $table = new html_table(); From 99849ce13192636a50eb8d334a1d4ac6c00cb969 Mon Sep 17 00:00:00 2001 From: Rajeev S Date: Wed, 9 Apr 2014 10:36:11 +0530 Subject: [PATCH 20/26] MDL-43789: coursename disallows spaces in user bulk actions filter Spaces and other non alphanumeric characters are disallowed in coursename filter for user bulk actions.This prevents filtering based upon courserole if the coursename contains spaces or other non alphanumeric characters. --- user/filters/courserole.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/filters/courserole.php b/user/filters/courserole.php index 09d3d7f0f8a..22dad4e5fcc 100644 --- a/user/filters/courserole.php +++ b/user/filters/courserole.php @@ -46,7 +46,7 @@ class user_filter_courserole extends user_filter_type { $objs[] =& $mform->createElement('select', $this->_name .'_ct', null, $this->get_course_categories()); $objs[] =& $mform->createElement('text', $this->_name, null); $grp =& $mform->addElement('group', $this->_name.'_grp', $this->_label, $objs, '', false); - $mform->setType($this->_name, PARAM_ALPHANUMEXT); + $mform->setType($this->_name, PARAM_TEXT); if ($this->_advanced) { $mform->setAdvanced($this->_name.'_grp'); } From cb8e625f94d4233b49ed1d7a5cf2da0ba6cb8cce Mon Sep 17 00:00:00 2001 From: Sam Hemelryk Date: Thu, 17 Apr 2014 15:16:06 +1200 Subject: [PATCH 21/26] MDL-45147 my: automate testing of block restriction --- .../behat/restrict_available_blocks.feature | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 my/tests/behat/restrict_available_blocks.feature diff --git a/my/tests/behat/restrict_available_blocks.feature b/my/tests/behat/restrict_available_blocks.feature new file mode 100644 index 00000000000..abcd337c55b --- /dev/null +++ b/my/tests/behat/restrict_available_blocks.feature @@ -0,0 +1,42 @@ +@core @core_my +Feature: Restrict which blocks can be added to My home + In order to restrict which blocks can be added + As a student I need to ensure I can add the blocks + As an admin I need to remove the capability to add a blocks + As a student I need to ensure I can't add the blocks any more + + Background: + Given the following "users" exist: + | username | firstname | lastname | email | + | student1 | Student | 1 | student1@asd.com | + And the following "courses" exist: + | fullname | shortname | format | + | Course 1 | C1 | topics | + And the following "course enrolments" exist: + | user | course | role | + | student1 | C1 | student | + + Scenario: The comments block can be added to My home by default + And I log in as "student1" + And I follow "My home" + And I press "Customise this page" + Then the "Add a block" select box should contain "Comments" + And the "Add a block" select box should contain "Courses" + And the "Add a block" select box should contain "HTML" + And the "Add a block" select box should contain "Tags" + + @javascript + Scenario: Remove the ability to add the comments block to My home + When I log in as "admin" + And I set the following system permissions of "Authenticated user" role: + | block/comments:myaddinstance | Prohibit | + | block/course_list:myaddinstance | Prohibit | + | block/html:myaddinstance | Prohibit | + And I log out + And I log in as "student1" + And I follow "My home" + And I press "Customise this page" + Then the "Add a block" select box should not contain "Comments" + And the "Add a block" select box should not contain "Courses" + And the "Add a block" select box should not contain "HTML" + And the "Add a block" select box should contain "Tags" \ No newline at end of file From 58a309c3925fd00ec6083b7428f45f89d52a2a2f Mon Sep 17 00:00:00 2001 From: Nadav Kavalerchik Date: Thu, 18 Jul 2013 12:24:41 +0300 Subject: [PATCH 22/26] MDL-40716 - Activity labels are not visible in course completion report, when in RTL mode (theme/clean , bootstrap) --- report/progress/styles.css | 1 + 1 file changed, 1 insertion(+) diff --git a/report/progress/styles.css b/report/progress/styles.css index 2c0350c9134..902dbf8a39b 100644 --- a/report/progress/styles.css +++ b/report/progress/styles.css @@ -5,3 +5,4 @@ #page-report-progress-index .completion_prev {display:inline;margin-right:2em;} #page-report-progress-index .completion_pagingbar p {display:inline;margin:0;} #page-report-progress-index .completion_next {display:inline;margin-left:2em;} +#page-report-progress-index.dir-rtl #completion-progress th svg {direction:ltr;} From 8f1498e56205c0e9178af305d498891b671609b2 Mon Sep 17 00:00:00 2001 From: Matt Petro Date: Tue, 15 Apr 2014 23:11:32 -0400 Subject: [PATCH 23/26] MDL-45118 shibboleth: set context on index page --- auth/shibboleth/index.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/auth/shibboleth/index.php b/auth/shibboleth/index.php index 525675084db..f521442aade 100644 --- a/auth/shibboleth/index.php +++ b/auth/shibboleth/index.php @@ -4,7 +4,9 @@ require('../../config.php'); + $context = context_system::instance(); $PAGE->set_url('/auth/shibboleth/index.php'); + $PAGE->set_context($context); // Support for WAYFless URLs. $target = optional_param('target', '', PARAM_LOCALURL); From bad25f1c4dbeaf7b322889177a72f0224fff420e Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Tue, 22 Apr 2014 10:37:27 +0800 Subject: [PATCH 24/26] MDL-45154 user profiles: category name duplication error --- user/profile/index_category_form.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/profile/index_category_form.php b/user/profile/index_category_form.php index d835db12d58..20bb5354789 100644 --- a/user/profile/index_category_form.php +++ b/user/profile/index_category_form.php @@ -37,13 +37,13 @@ class category_form extends moodleform { $data = (object)$data; - $duplicate = $DB->record_exists('user_info_category', array('name'=>$data->name)); + $duplicate = $DB->get_field('user_info_category', 'id', array('name' => $data->name)); /// Check the name is unique if (!empty($data->id)) { // we are editing an existing record $olddata = $DB->get_record('user_info_category', array('id'=>$data->id)); // name has changed, new name in use, new name in use by another record - $dupfound = (($olddata->name !== $data->name) && $duplicate && ($data->id != $duplicate->id)); + $dupfound = (($olddata->name !== $data->name) && $duplicate && ($data->id != $duplicate)); } else { // new profile category $dupfound = $duplicate; From c07b42d7d8c03b83db28750ab567645ba8fa1650 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Tue, 22 Apr 2014 15:06:23 +0800 Subject: [PATCH 25/26] MDL-40716 report_completion: Set RTL --- report/completion/styles.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/report/completion/styles.css b/report/completion/styles.css index ed84511eb9a..fa601eb4e02 100644 --- a/report/completion/styles.css +++ b/report/completion/styles.css @@ -6,3 +6,6 @@ #page-report-completion-index .export-actions { text-align: center; } +#page-report-completion-index.dir-rtl #completion-progress th svg { + direction: ltr; +} From 0afcad7c36831e24ebf0fac50306720a334b27c9 Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Tue, 22 Apr 2014 12:26:47 +0200 Subject: [PATCH 26/26] weekly release 2.6.2+ --- version.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.php b/version.php index cd747c4addd..0e616a80d94 100644 --- a/version.php +++ b/version.php @@ -29,11 +29,11 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2013111802.07; // 20131118 = branching date YYYYMMDD - do not modify! +$version = 2013111802.08; // 20131118 = branching date YYYYMMDD - do not modify! // RR = release increments - 00 in DEV branches. // .XX = incremental changes. -$release = '2.6.2+ (Build: 20140417)'; // Human-friendly version name +$release = '2.6.2+ (Build: 20140422)'; // Human-friendly version name $branch = '26'; // This version's branch. $maturity = MATURITY_STABLE; // This version's maturity level.