calendar/amd/src/calendar_filter.js

  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. * This module is responsible for the calendar filter.
  17. *
  18. * @module core_calendar/calendar_filter
  19. * @copyright 2017 Andrew Nicols <andrew@nicols.co.uk>
  20. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  21. */
  22. define([
  23. 'jquery',
  24. 'core_calendar/selectors',
  25. 'core_calendar/events',
  26. 'core/str',
  27. 'core/templates',
  28. ],
  29. function(
  30. $,
  31. CalendarSelectors,
  32. CalendarEvents,
  33. Str,
  34. Templates
  35. ) {
  36. var registerEventListeners = function(root) {
  37. root.on('click', CalendarSelectors.eventFilterItem, function(e) {
  38. var target = $(e.currentTarget);
  39. toggleFilter(target);
  40. e.preventDefault();
  41. });
  42. $('body').on(CalendarEvents.viewUpdated, function() {
  43. var filters = root.find(CalendarSelectors.eventFilterItem);
  44. filters.each(function(i, filter) {
  45. filter = $(filter);
  46. if (filter.data('eventtype-hidden')) {
  47. var data = getFilterData(filter);
  48. fireFilterChangedEvent(data);
  49. }
  50. });
  51. });
  52. };
  53. var toggleFilter = function(target) {
  54. var data = getFilterData(target);
  55. // Toggle the hidden. We need to render the template before we change the value.
  56. data.hidden = !data.hidden;
  57. M.util.js_pending("core_calendar/calendar_filter:toggleFilter");
  58. return Str.get_string('eventtype' + data.eventtype, 'calendar')
  59. .then(function(nameStr) {
  60. data.name = nameStr;
  61. data.icon = true;
  62. data.key = 'i/' + data.eventtype + 'event';
  63. data.component = 'core';
  64. return data;
  65. })
  66. .then(function(context) {
  67. return Templates.render('core_calendar/event_filter_key', context);
  68. })
  69. .then(function(html, js) {
  70. return Templates.replaceNode(target, html, js);
  71. })
  72. .then(function() {
  73. fireFilterChangedEvent(data);
  74. M.util.js_complete("core_calendar/calendar_filter:toggleFilter");
  75. return;
  76. });
  77. };
  78. /**
  79. * Fire the filterChanged event for the specified data.
  80. *
  81. * @param {object} data The data to include
  82. */
  83. var fireFilterChangedEvent = function(data) {
  84. M.util.js_pending("month-mini-filterChanged");
  85. $('body').trigger(CalendarEvents.filterChanged, {
  86. type: data.eventtype,
  87. hidden: data.hidden,
  88. });
  89. M.util.js_complete("month-mini-filterChanged");
  90. };
  91. /**
  92. * Get the filter data for the specified target.
  93. *
  94. * @param {jQuery} target The target node
  95. * @return {Object}
  96. */
  97. var getFilterData = function(target) {
  98. return {
  99. eventtype: target.data('eventtype'),
  100. hidden: target.data('eventtype-hidden'),
  101. };
  102. };
  103. return {
  104. init: function(root) {
  105. root = $(root);
  106. registerEventListeners(root);
  107. }
  108. };
  109. });