PageRenderTime 45ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/tool/lp/amd/src/competencies.js

https://github.com/pauln/moodle
JavaScript | 338 lines | 242 code | 32 blank | 64 comment | 36 complexity | 520b8a882a1f196148ea3ff161e8e858 MD5 | raw file
  1. // This file is part of Moodle - http://moodle.org/
  2. //
  3. // Moodle is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation, either version 3 of the License, or
  6. // (at your option) any later version.
  7. //
  8. // Moodle is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. // GNU General Public License for more details.
  12. //
  13. // You should have received a copy of the GNU General Public License
  14. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  15. /**
  16. * Handle add/remove competency links.
  17. *
  18. * @module tool_lp/competencies
  19. * @package tool_lp
  20. * @copyright 2015 Damyon Wiese <damyon@moodle.com>
  21. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  22. */
  23. define(['jquery',
  24. 'core/notification',
  25. 'core/ajax',
  26. 'core/templates',
  27. 'core/str',
  28. 'tool_lp/competencypicker',
  29. 'tool_lp/dragdrop-reorder'],
  30. function($, notification, ajax, templates, str, Picker, dragdrop) {
  31. /**
  32. * Constructor
  33. *
  34. * @param {Number} itemid
  35. * @param {String} itemtype
  36. */
  37. var competencies = function(itemid, itemtype, pagectxid) {
  38. this.itemid = itemid;
  39. this.itemtype = itemtype;
  40. this.pageContextId = pagectxid;
  41. this.pickerInstance = null;
  42. $('[data-region="actions"] button').prop('disabled', false);
  43. this.registerEvents();
  44. this.registerDragDrop();
  45. };
  46. /**
  47. * Initialise the drag/drop code.
  48. * @method registerDragDrop
  49. */
  50. competencies.prototype.registerDragDrop = function() {
  51. var localthis = this;
  52. // Init this module.
  53. str.get_string('movecompetency', 'tool_lp').done(
  54. function(movestring) {
  55. dragdrop.dragdrop('movecompetency',
  56. movestring,
  57. { identifier: 'movecompetency', component: 'tool_lp'},
  58. { identifier: 'movecompetencyafter', component: 'tool_lp'},
  59. 'drag-samenode',
  60. 'drag-parentnode',
  61. 'drag-handlecontainer',
  62. function(drag, drop) {
  63. localthis.handleDrop.call(localthis, drag, drop);
  64. });
  65. }
  66. ).fail(notification.exception);
  67. };
  68. /**
  69. * Handle a drop from a drag/drop operation.
  70. *
  71. * @method handleDrop
  72. * @param {DOMNode} drag The dragged node.
  73. * @param {DOMNode} drop The dropped on node.
  74. */
  75. competencies.prototype.handleDrop = function(drag, drop) {
  76. var fromid = $(drag).data('id');
  77. var toid = $(drop).data('id');
  78. var localthis = this;
  79. var requests = [];
  80. if (localthis.itemtype == 'course') {
  81. requests = ajax.call([
  82. {
  83. methodname: 'core_competency_reorder_course_competency',
  84. args: { courseid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid }
  85. }
  86. ]);
  87. } else if (localthis.itemtype == 'template') {
  88. requests = ajax.call([
  89. {
  90. methodname: 'core_competency_reorder_template_competency',
  91. args: { templateid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid }
  92. }
  93. ]);
  94. } else if (localthis.itemtype == 'plan') {
  95. requests = ajax.call([
  96. {
  97. methodname: 'core_competency_reorder_plan_competency',
  98. args: { planid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid }
  99. }
  100. ]);
  101. } else {
  102. return null;
  103. }
  104. requests[0].fail(notification.exception);
  105. };
  106. /**
  107. * Pick a competency
  108. *
  109. * @method pickCompetency
  110. */
  111. competencies.prototype.pickCompetency = function() {
  112. var self = this;
  113. var requests;
  114. var pagerender;
  115. var pageregion;
  116. var pageContextIncludes;
  117. if (!self.pickerInstance) {
  118. if (self.itemtype === 'template' || self.itemtype === 'course') {
  119. pageContextIncludes = 'parents';
  120. }
  121. self.pickerInstance = new Picker(self.pageContextId, false, pageContextIncludes);
  122. self.pickerInstance.on('save', function(e, data) {
  123. var compIds = data.competencyIds;
  124. if (self.itemtype === "course") {
  125. requests = [];
  126. $.each(compIds, function(index, compId) {
  127. requests.push({
  128. methodname: 'core_competency_add_competency_to_course',
  129. args: { courseid: self.itemid, competencyid: compId }
  130. });
  131. });
  132. requests.push({
  133. methodname: 'tool_lp_data_for_course_competencies_page',
  134. args: { courseid: self.itemid }
  135. });
  136. pagerender = 'tool_lp/course_competencies_page';
  137. pageregion = 'coursecompetenciespage';
  138. } else if (self.itemtype === "template") {
  139. requests = [];
  140. $.each(compIds, function(index, compId) {
  141. requests.push({
  142. methodname: 'core_competency_add_competency_to_template',
  143. args: { templateid: self.itemid, competencyid: compId }
  144. });
  145. });
  146. requests.push({
  147. methodname: 'tool_lp_data_for_template_competencies_page',
  148. args: { templateid: self.itemid, pagecontext: { contextid: self.pageContextId }}
  149. });
  150. pagerender = 'tool_lp/template_competencies_page';
  151. pageregion = 'templatecompetenciespage';
  152. } else if (self.itemtype === "plan") {
  153. requests = [];
  154. $.each(compIds, function(index, compId) {
  155. requests.push({
  156. methodname: 'core_competency_add_competency_to_plan',
  157. args: { planid: self.itemid, competencyid: compId }
  158. });
  159. });
  160. requests.push({
  161. methodname: 'tool_lp_data_for_plan_page',
  162. args: { planid: self.itemid}
  163. });
  164. pagerender = 'tool_lp/plan_page';
  165. pageregion = 'plan-page';
  166. }
  167. ajax.call(requests)[requests.length - 1].then(function(context) {
  168. return templates.render(pagerender, context).done(function(html, js) {
  169. $('[data-region="' + pageregion + '"]').replaceWith(html);
  170. templates.runTemplateJS(js);
  171. });
  172. }, notification.exception);
  173. });
  174. }
  175. self.pickerInstance.display();
  176. };
  177. /**
  178. * Delete the link between competency and course, template or plan. Reload the page.
  179. *
  180. * @method doDelete
  181. * @param {int} deleteid The id of record to delete.
  182. */
  183. competencies.prototype.doDelete = function(deleteid) {
  184. var localthis = this;
  185. var requests = [],
  186. pagerender = '',
  187. pageregion = '';
  188. // Delete the link and reload the page template.
  189. if (localthis.itemtype == 'course') {
  190. requests = ajax.call([
  191. { methodname: 'core_competency_remove_competency_from_course',
  192. args: { courseid: localthis.itemid, competencyid: deleteid } },
  193. { methodname: 'tool_lp_data_for_course_competencies_page',
  194. args: { courseid: localthis.itemid } }
  195. ]);
  196. pagerender = 'tool_lp/course_competencies_page';
  197. pageregion = 'coursecompetenciespage';
  198. } else if (localthis.itemtype == 'template') {
  199. requests = ajax.call([
  200. { methodname: 'core_competency_remove_competency_from_template',
  201. args: { templateid: localthis.itemid, competencyid: deleteid } },
  202. { methodname: 'tool_lp_data_for_template_competencies_page',
  203. args: { templateid: localthis.itemid, pagecontext: { contextid: localthis.pageContextId } } }
  204. ]);
  205. pagerender = 'tool_lp/template_competencies_page';
  206. pageregion = 'templatecompetenciespage';
  207. } else if (localthis.itemtype == 'plan') {
  208. requests = ajax.call([
  209. { methodname: 'core_competency_remove_competency_from_plan',
  210. args: { planid: localthis.itemid, competencyid: deleteid } },
  211. { methodname: 'tool_lp_data_for_plan_page',
  212. args: { planid: localthis.itemid } }
  213. ]);
  214. pagerender = 'tool_lp/plan_page';
  215. pageregion = 'plan-page';
  216. }
  217. requests[1].done(function(context) {
  218. templates.render(pagerender, context).done(function(html, js) {
  219. $('[data-region="' + pageregion + '"]').replaceWith(html);
  220. templates.runTemplateJS(js);
  221. }).fail(notification.exception);
  222. }).fail(notification.exception);
  223. };
  224. /**
  225. * Show a confirm dialogue before deleting a competency.
  226. *
  227. * @method deleteHandler
  228. * @param {int} deleteid The id of record to delete.
  229. */
  230. competencies.prototype.deleteHandler = function(deleteid) {
  231. var localthis = this;
  232. var requests = [];
  233. var message;
  234. if (localthis.itemtype == 'course') {
  235. message = 'unlinkcompetencycourse';
  236. } else if (localthis.itemtype == 'template') {
  237. message = 'unlinkcompetencytemplate';
  238. } else if (localthis.itemtype == 'plan') {
  239. message = 'unlinkcompetencyplan';
  240. } else {
  241. return;
  242. }
  243. requests = ajax.call([{
  244. methodname: 'core_competency_read_competency',
  245. args: { id: deleteid }
  246. }]);
  247. requests[0].done(function(competency) {
  248. str.get_strings([
  249. { key: 'confirm', component: 'moodle' },
  250. { key: message, component: 'tool_lp', param: competency.shortname },
  251. { key: 'confirm', component: 'moodle' },
  252. { key: 'cancel', component: 'moodle' }
  253. ]).done(function (strings) {
  254. notification.confirm(
  255. strings[0], // Confirm.
  256. strings[1], // Unlink the competency X from the course?
  257. strings[2], // Confirm.
  258. strings[3], // Cancel.
  259. function() {
  260. localthis.doDelete(deleteid);
  261. }
  262. );
  263. }).fail(notification.exception);
  264. }).fail(notification.exception);
  265. };
  266. /**
  267. * Register the javascript event handlers for this page.
  268. *
  269. * @method registerEvents
  270. */
  271. competencies.prototype.registerEvents = function() {
  272. var localthis = this;
  273. if (localthis.itemtype == 'course') {
  274. // Course completion rule handling.
  275. $('[data-region="coursecompetenciespage"]').on('change', 'select[data-field="ruleoutcome"]', function(e){
  276. var requests = [];
  277. var pagerender = 'tool_lp/course_competencies_page';
  278. var pageregion = 'coursecompetenciespage';
  279. var coursecompetencyid = $(e.target).data('id');
  280. var ruleoutcome = $(e.target).val();
  281. requests = ajax.call([
  282. { methodname: 'core_competency_set_course_competency_ruleoutcome',
  283. args: { coursecompetencyid: coursecompetencyid, ruleoutcome: ruleoutcome } },
  284. { methodname: 'tool_lp_data_for_course_competencies_page',
  285. args: { courseid: localthis.itemid } }
  286. ]);
  287. requests[1].done(function(context) {
  288. templates.render(pagerender, context).done(function(html, js) {
  289. $('[data-region="' + pageregion + '"]').replaceWith(html);
  290. templates.runTemplateJS(js);
  291. }).fail(notification.exception);
  292. }).fail(notification.exception);
  293. });
  294. }
  295. $('[data-region="actions"] button').click(function(e) {
  296. e.preventDefault();
  297. localthis.pickCompetency();
  298. });
  299. $('[data-action="delete-competency-link"]').click(function(e) {
  300. e.preventDefault();
  301. var deleteid = $(e.target).closest('[data-id]').data('id');
  302. localthis.deleteHandler(deleteid);
  303. });
  304. };
  305. return /** @alias module:tool_lp/competencies */ competencies;
  306. });