mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 00:12:56 +02:00
Merge branch 'MDL-59383-master' of git://github.com/lameze/moodle
This commit is contained in:
commit
e578ab114c
1
calendar/amd/build/calendar.min.js
vendored
Normal file
1
calendar/amd/build/calendar.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
define(["jquery","core/ajax","core/str","core/templates","core/notification","core/custom_interaction_events","core/modal_factory","core_calendar/summary_modal","core_calendar/calendar_repository"],function(a,b,c,d,e,f,g,h,i){var j={ROOT:"[data-region='calendar']",EVENT_LINK:"[data-action='view-event']"},k=null,l=function(a){var b="type"+a;return c.get_string(b,"core_calendar").then(function(a){return a}).fail(e.exception)},m=function(a){var b=i.getEventById(a);return b.then(function(a){return a.event?a.event:void b.fail(e.exception)}).then(function(a){return l(a.eventtype).then(function(b){return a.eventtype=b,a})}).then(function(a){return k.done(function(b){b.setTitle(a.name),b.setBody(d.render("core_calendar/event_summary_body",a)),0==a.caneditevent&&b.setFooter(""),b.show()})})},n=function(b){b=a(b);var c=!1;b.on("click",j.EVENT_LINK,function(b){if(!c){c=!0,b.preventDefault();var d=a(b.target).closest(j.EVENT_LINK),e=d.attr("data-event-id");m(e).done(function(){c=!1})}})};return{init:function(){k=g.create({type:h.TYPE}),n(j.ROOT)}}});
|
1
calendar/amd/build/calendar_repository.min.js
vendored
Normal file
1
calendar/amd/build/calendar_repository.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
define(["jquery","core/ajax"],function(a,b){var c=function(a){var c={methodname:"core_calendar_get_calendar_event_by_id",args:{eventid:a}};return b.call([c])[0]};return{getEventById:c}});
|
1
calendar/amd/build/summary_modal.min.js
vendored
Normal file
1
calendar/amd/build/summary_modal.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
define(["jquery","core/notification","core/custom_interaction_events","core/modal","core/modal_registry"],function(a,b,c,d,e){var f=!1,g={EDIT_BUTTON:'[data-action="edit"]',DELETE_BUTTON:'[data-action="delete"]',EVENT_LINK:'[data-action="event-link"]'},h=function(a){d.call(this,a),this.getFooter().find(g.EDIT_BUTTON).length||b.exception({message:"No edit button found"}),this.getFooter().find(g.DELETE_BUTTON).length||b.exception({message:"No delete button found"})};return h.TYPE="core_calendar-event_summary",h.prototype=Object.create(d.prototype),h.prototype.constructor=h,f||(e.register(h.TYPE,h,"core_calendar/event_summary_modal"),f=!0),h});
|
117
calendar/amd/src/calendar.js
Normal file
117
calendar/amd/src/calendar.js
Normal file
@ -0,0 +1,117 @@
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* A javascript module to calendar events.
|
||||
*
|
||||
* @module core_calendar/calendar
|
||||
* @package core_calendar
|
||||
* @copyright 2017 Simey Lameze <simey@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
define(['jquery', 'core/ajax', 'core/str', 'core/templates', 'core/notification', 'core/custom_interaction_events',
|
||||
'core/modal_factory', 'core_calendar/summary_modal', 'core_calendar/calendar_repository'],
|
||||
function($, Ajax, Str, Templates, Notification, CustomEvents, ModalFactory, SummaryModal, CalendarRepository) {
|
||||
|
||||
var SELECTORS = {
|
||||
ROOT: "[data-region='calendar']",
|
||||
EVENT_LINK: "[data-action='view-event']",
|
||||
};
|
||||
|
||||
var modalPromise = null;
|
||||
|
||||
/**
|
||||
* Get the event type lang string.
|
||||
*
|
||||
* @param {String} eventType The event type.
|
||||
* @return {String} The lang string of the event type.
|
||||
*/
|
||||
var getEventType = function(eventType) {
|
||||
var lang = 'type' + eventType;
|
||||
return Str.get_string(lang, 'core_calendar').then(function(langStr) {
|
||||
return langStr;
|
||||
}).fail(Notification.exception);
|
||||
};
|
||||
|
||||
/**
|
||||
* Render the event summary modal.
|
||||
*
|
||||
* @param {Number} eventId The calendar event id.
|
||||
* @return {promise} The summary modal promise.
|
||||
*/
|
||||
var renderEventSummaryModal = function(eventId) {
|
||||
|
||||
var promise = CalendarRepository.getEventById(eventId);
|
||||
|
||||
return promise.then(function(result) {
|
||||
if (!result.event) {
|
||||
promise.fail(Notification.exception);
|
||||
} else {
|
||||
return result.event;
|
||||
}
|
||||
}).then(function(eventdata) {
|
||||
return getEventType(eventdata.eventtype).then(function(langStr) {
|
||||
eventdata.eventtype = langStr;
|
||||
return eventdata;
|
||||
});
|
||||
}).then(function(eventdata) {
|
||||
return modalPromise.done(function(modal) {
|
||||
modal.setTitle(eventdata.name);
|
||||
modal.setBody(Templates.render('core_calendar/event_summary_body', eventdata));
|
||||
|
||||
// Hide edit and delete buttons if I don't have permission.
|
||||
if (eventdata.caneditevent == false) {
|
||||
modal.setFooter('');
|
||||
}
|
||||
|
||||
modal.show();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Register event listeners for the module.
|
||||
*
|
||||
* @param {object} root The root element.
|
||||
*/
|
||||
var registerEventListeners = function(root) {
|
||||
root = $(root);
|
||||
|
||||
var loading = false;
|
||||
root.on('click', SELECTORS.EVENT_LINK, function(e) {
|
||||
if (!loading) {
|
||||
loading = true;
|
||||
e.preventDefault();
|
||||
|
||||
var eventElement = $(e.target).closest(SELECTORS.EVENT_LINK);
|
||||
var eventId = eventElement.attr('data-event-id');
|
||||
|
||||
renderEventSummaryModal(eventId).done(function() {
|
||||
loading = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
init: function() {
|
||||
modalPromise = ModalFactory.create({
|
||||
type: SummaryModal.TYPE
|
||||
});
|
||||
|
||||
registerEventListeners(SELECTORS.ROOT);
|
||||
}
|
||||
};
|
||||
});
|
50
calendar/amd/src/calendar_repository.js
Normal file
50
calendar/amd/src/calendar_repository.js
Normal file
@ -0,0 +1,50 @@
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* A javascript module to handle calendar ajax actions.
|
||||
*
|
||||
* @module core_calendar/calendar_repository
|
||||
* @class repository
|
||||
* @package core_calendar
|
||||
* @copyright 2017 Simey Lameze <lameze@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
define(['jquery', 'core/ajax'], function($, Ajax) {
|
||||
|
||||
|
||||
/**
|
||||
* Get a calendar event by id.
|
||||
*
|
||||
* @method getEventById
|
||||
* @param {int} eventId The event id.
|
||||
* @return {promise} Resolved with requested calendar event
|
||||
*/
|
||||
var getEventById = function(eventId) {
|
||||
|
||||
var request = {
|
||||
methodname: 'core_calendar_get_calendar_event_by_id',
|
||||
args: {
|
||||
eventid: eventId
|
||||
}
|
||||
};
|
||||
|
||||
return Ajax.call([request])[0];
|
||||
};
|
||||
|
||||
return {
|
||||
getEventById: getEventById
|
||||
};
|
||||
});
|
64
calendar/amd/src/summary_modal.js
Normal file
64
calendar/amd/src/summary_modal.js
Normal file
@ -0,0 +1,64 @@
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* A javascript module to handle summary modal.
|
||||
*
|
||||
* @module core_calendar/summary_modal
|
||||
* @package core_calendar
|
||||
* @copyright 2017 Simey Lameze <simey@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
define(['jquery', 'core/notification', 'core/custom_interaction_events', 'core/modal', 'core/modal_registry'],
|
||||
function($, Notification, CustomEvents, Modal, ModalRegistry) {
|
||||
|
||||
var registered = false;
|
||||
var SELECTORS = {
|
||||
EDIT_BUTTON: '[data-action="edit"]',
|
||||
DELETE_BUTTON: '[data-action="delete"]',
|
||||
EVENT_LINK: '[data-action="event-link"]'
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor for the Modal.
|
||||
*
|
||||
* @param {object} root The root jQuery element for the modal
|
||||
*/
|
||||
var ModalEventSummary = function(root) {
|
||||
Modal.call(this, root);
|
||||
|
||||
if (!this.getFooter().find(SELECTORS.EDIT_BUTTON).length) {
|
||||
Notification.exception({message: 'No edit button found'});
|
||||
}
|
||||
|
||||
if (!this.getFooter().find(SELECTORS.DELETE_BUTTON).length) {
|
||||
Notification.exception({message: 'No delete button found'});
|
||||
}
|
||||
};
|
||||
|
||||
ModalEventSummary.TYPE = 'core_calendar-event_summary';
|
||||
ModalEventSummary.prototype = Object.create(Modal.prototype);
|
||||
ModalEventSummary.prototype.constructor = ModalEventSummary;
|
||||
|
||||
// Automatically register with the modal registry the first time this module is imported so that you can create modals
|
||||
// of this type using the modal factory.
|
||||
if (!registered) {
|
||||
ModalRegistry.register(ModalEventSummary.TYPE, ModalEventSummary, 'core_calendar/event_summary_modal');
|
||||
registered = true;
|
||||
}
|
||||
|
||||
return ModalEventSummary;
|
||||
|
||||
});
|
@ -687,4 +687,77 @@ class core_calendar_external extends external_api {
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters.
|
||||
*
|
||||
* @return external_function_parameters
|
||||
*/
|
||||
public static function get_calendar_event_by_id_parameters() {
|
||||
return new external_function_parameters(
|
||||
array(
|
||||
'eventid' => new external_value(PARAM_INT, 'The event id to be retrieved'),
|
||||
)
|
||||
);
|
||||
}
|
||||
/**
|
||||
* Get calendar event by id.
|
||||
*
|
||||
* @param int $eventid The calendar event id to be retrieved.
|
||||
* @return array Array of event details
|
||||
*/
|
||||
public static function get_calendar_event_by_id($eventid) {
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot."/calendar/lib.php");
|
||||
|
||||
// Parameter validation.
|
||||
$params = ['eventid' => $eventid];
|
||||
$params = self::validate_parameters(self::get_calendar_event_by_id_parameters(), $params);
|
||||
|
||||
$warnings = array();
|
||||
|
||||
// We need to get events asked for eventids.
|
||||
$event = calendar_get_events_by_id([$eventid]);
|
||||
$eventobj = calendar_event::load($eventid);
|
||||
$event[$eventid]->caneditevent = calendar_edit_event_allowed($eventobj);
|
||||
|
||||
return array('event' => $event[$eventid], 'warnings' => $warnings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method result value
|
||||
*
|
||||
* @return external_description
|
||||
*/
|
||||
public static function get_calendar_event_by_id_returns() {
|
||||
|
||||
return new external_single_structure(array(
|
||||
'event' => new external_single_structure(
|
||||
array(
|
||||
'id' => new external_value(PARAM_INT, 'event id'),
|
||||
'name' => new external_value(PARAM_TEXT, 'event name'),
|
||||
'description' => new external_value(PARAM_RAW, 'Description', VALUE_OPTIONAL, null, NULL_ALLOWED),
|
||||
'format' => new external_format_value('description'),
|
||||
'courseid' => new external_value(PARAM_INT, 'course id'),
|
||||
'groupid' => new external_value(PARAM_INT, 'group id'),
|
||||
'userid' => new external_value(PARAM_INT, 'user id'),
|
||||
'repeatid' => new external_value(PARAM_INT, 'repeat id'),
|
||||
'modulename' => new external_value(PARAM_TEXT, 'module name', VALUE_OPTIONAL, null, NULL_ALLOWED),
|
||||
'instance' => new external_value(PARAM_INT, 'instance id'),
|
||||
'eventtype' => new external_value(PARAM_TEXT, 'Event type'),
|
||||
'timestart' => new external_value(PARAM_INT, 'timestart'),
|
||||
'timeduration' => new external_value(PARAM_INT, 'time duration'),
|
||||
'visible' => new external_value(PARAM_INT, 'visible'),
|
||||
'uuid' => new external_value(PARAM_TEXT, 'unique id of ical events', VALUE_OPTIONAL, null, NULL_NOT_ALLOWED),
|
||||
'sequence' => new external_value(PARAM_INT, 'sequence'),
|
||||
'timemodified' => new external_value(PARAM_INT, 'time modified'),
|
||||
'subscriptionid' => new external_value(PARAM_INT, 'Subscription id', VALUE_OPTIONAL, null, NULL_ALLOWED),
|
||||
'caneditevent' => new external_value(PARAM_BOOL, 'Whether the user can edit the event'),
|
||||
),
|
||||
'event'
|
||||
),
|
||||
'warnings' => new external_warnings()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ class core_calendar_renderer extends plugin_renderer_base {
|
||||
* @return string
|
||||
*/
|
||||
public function start_layout() {
|
||||
return html_writer::start_tag('div', array('class'=>'maincalendar'));
|
||||
return html_writer::start_tag('div', ['data-region' => 'calendar', 'class' => 'maincalendar']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -517,7 +517,8 @@ class core_calendar_renderer extends plugin_renderer_base {
|
||||
];
|
||||
$eventname = get_string('eventnameandcourse', 'calendar', $eventnameparams);
|
||||
}
|
||||
$link = html_writer::link($dayhref, $eventname);
|
||||
$link = html_writer::link($dayhref, $eventname, ['data-action' => 'view-event',
|
||||
'data-event-id' => $events[$eventindex]->id]);
|
||||
$cell->text .= html_writer::tag('li', $link, $attributes);
|
||||
}
|
||||
$cell->text .= html_writer::end_tag('ul');
|
||||
|
37
calendar/templates/event_summary_body.mustache
Normal file
37
calendar/templates/event_summary_body.mustache
Normal file
@ -0,0 +1,37 @@
|
||||
{{!
|
||||
This file is part of Moodle - http://moodle.org/
|
||||
|
||||
Moodle is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Moodle is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
}}
|
||||
{{!
|
||||
@template core_calendar/event_summary_body
|
||||
|
||||
This template renders the body of calendar events summary modal.
|
||||
|
||||
Example context (json):
|
||||
{
|
||||
"timestart": 1490320388,
|
||||
"description": "An random event description",
|
||||
"eventtype": "open",
|
||||
}
|
||||
}}
|
||||
<div class="container">
|
||||
<h4>{{#str}} when, core_calendar {{/str}}</h4>
|
||||
{{#userdate}} {{timestart}}, {{#str}} strftimerecentfull {{/str}} {{/userdate}}
|
||||
<br>
|
||||
<h4>{{#str}} description {{/str}}</h4>
|
||||
{{{description}}}
|
||||
<h4>{{#str}} eventtype, core_calendar {{/str}}</h4>
|
||||
{{eventtype}}
|
||||
</div>
|
32
calendar/templates/event_summary_modal.mustache
Normal file
32
calendar/templates/event_summary_modal.mustache
Normal file
@ -0,0 +1,32 @@
|
||||
{{!
|
||||
This file is part of Moodle - http://moodle.org/
|
||||
|
||||
Moodle is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Moodle is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
}}
|
||||
{{!
|
||||
@template core_calendar/event_summary_modal
|
||||
|
||||
This template renders the calendar events summary modal.
|
||||
|
||||
Example context (json):
|
||||
{
|
||||
"title": "Assignment due 1",
|
||||
}
|
||||
}}
|
||||
{{< core/modal }}
|
||||
{{$footer}}
|
||||
<button type="button" class="btn btn-secondary pull-xs-left" data-action="delete">{{#str}} delete {{/str}}</button>
|
||||
<button type="button" class="btn btn-primary" data-action="edit">{{#str}} edit {{/str}}</button>
|
||||
{{/footer}}
|
||||
{{/ core/modal }}
|
@ -176,4 +176,5 @@ if (!empty($CFG->enablecalendarexport)) {
|
||||
echo $OUTPUT->container_end();
|
||||
echo html_writer::end_tag('div');
|
||||
echo $renderer->complete_layout();
|
||||
$PAGE->requires->js_call_amd('core_calendar/calendar', 'init');
|
||||
echo $OUTPUT->footer();
|
||||
|
@ -108,6 +108,7 @@ $string['eventsrelatedtogroups'] = 'Events related to groups';
|
||||
$string['eventstarttime'] = 'Start time';
|
||||
$string['eventstoexport'] = 'Events to export';
|
||||
$string['eventtime'] = 'Time';
|
||||
$string['eventtype'] = 'Event type';
|
||||
$string['eventview'] = 'Event details';
|
||||
$string['eventcalendareventcreated'] = 'Calendar event created';
|
||||
$string['eventcalendareventupdated'] = 'Calendar event updated';
|
||||
@ -222,8 +223,11 @@ $string['tt_showgroups'] = 'Group events are hidden (click to show)';
|
||||
$string['tt_showuser'] = 'User events are hidden (click to show)';
|
||||
$string['tue'] = 'Tue';
|
||||
$string['tuesday'] = 'Tuesday';
|
||||
$string['typeclose'] = 'Close event';
|
||||
$string['typecourse'] = 'Course event';
|
||||
$string['typedue'] = 'Due event';
|
||||
$string['typegroup'] = 'Group event';
|
||||
$string['typeopen'] = 'Open event';
|
||||
$string['typesite'] = 'Site event';
|
||||
$string['typeuser'] = 'User event';
|
||||
$string['upcomingevents'] = 'Upcoming events';
|
||||
@ -237,6 +241,7 @@ $string['wednesday'] = 'Wednesday';
|
||||
$string['weekly'] = 'Weekly';
|
||||
$string['weeknext'] = 'Next week';
|
||||
$string['weekthis'] = 'This week';
|
||||
$string['when'] = 'When';
|
||||
$string['yesterday'] = 'Yesterday';
|
||||
$string['youcandeleteallrepeats'] = 'This event is part of a repeating event series. You can delete this event only, or all {$a} events in the series at once.';
|
||||
|
||||
|
@ -115,6 +115,16 @@ $functions = array(
|
||||
'ajax' => true,
|
||||
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
|
||||
),
|
||||
'core_calendar_get_calendar_event_by_id' => array(
|
||||
'classname' => 'core_calendar_external',
|
||||
'methodname' => 'get_calendar_event_by_id',
|
||||
'description' => 'Get calendar event by id',
|
||||
'classpath' => 'calendar/externallib.php',
|
||||
'type' => 'read',
|
||||
'capabilities' => 'moodle/calendar:manageentries, moodle/calendar:manageownentries, moodle/calendar:managegroupentries',
|
||||
'ajax' => true,
|
||||
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
|
||||
),
|
||||
'core_cohort_add_cohort_members' => array(
|
||||
'classname' => 'core_cohort_external',
|
||||
'methodname' => 'add_cohort_members',
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$version = 2017071001.00; // YYYYMMDD = weekly release date of this DEV branch.
|
||||
$version = 2017071001.01; // YYYYMMDD = weekly release date of this DEV branch.
|
||||
// RR = release increments - 00 in DEV branches.
|
||||
// .XX = incremental changes.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user