mirror of
https://github.com/moodle/moodle.git
synced 2025-08-03 08:09:47 +02:00
MDL-55770 core_message: remove the send message pop-up
Revert "MDL-48933 core_message: New dialog to send a message to a user" Revert "MDL-48933 core_message: Behat tests to cover messenger dialogs"
This commit is contained in:
parent
5bf0ff278a
commit
658d0b2fd7
16 changed files with 4 additions and 2261 deletions
|
@ -39,7 +39,7 @@ class block_online_users extends block_base {
|
|||
}
|
||||
|
||||
function get_content() {
|
||||
global $USER, $CFG, $DB, $OUTPUT, $PAGE;
|
||||
global $USER, $CFG, $DB, $OUTPUT;
|
||||
|
||||
if ($this->content !== NULL) {
|
||||
return $this->content;
|
||||
|
@ -106,7 +106,6 @@ class block_online_users extends block_base {
|
|||
if (isloggedin() && has_capability('moodle/site:sendmessage', $this->page->context)
|
||||
&& !empty($CFG->messaging) && !isguestuser()) {
|
||||
$canshowicon = true;
|
||||
message_messenger_requirejs();
|
||||
} else {
|
||||
$canshowicon = false;
|
||||
}
|
||||
|
@ -126,10 +125,7 @@ class block_online_users extends block_base {
|
|||
if ($canshowicon and ($USER->id != $user->id) and !isguestuser($user)) { // Only when logged in and messaging active etc
|
||||
$anchortagcontents = '<img class="iconsmall" src="'.$OUTPUT->pix_url('t/message') . '" alt="'. get_string('messageselectadd') .'" />';
|
||||
$anchorurl = new moodle_url('/message/index.php', array('id' => $user->id));
|
||||
$anchortag = html_writer::link($anchorurl, $anchortagcontents, array_merge(
|
||||
message_messenger_sendmessage_link_params($user),
|
||||
array('title' => get_string('messageselectadd'))
|
||||
));
|
||||
$anchortag = html_writer::link($anchorurl, $anchortagcontents, array('title' => get_string('messageselectadd')));
|
||||
|
||||
$this->content->text .= '<div class="message">'.$anchortag.'</div>';
|
||||
}
|
||||
|
|
|
@ -59,7 +59,6 @@ $string['emailtagline'] = 'This is a copy of a message sent to you at "{$a->site
|
|||
$string['emptysearchstring'] = 'You must search for something';
|
||||
$string['enabled'] = 'Enabled';
|
||||
$string['errorcallingprocessor'] = 'Error calling defined output';
|
||||
$string['errorwhilesendingmessage'] = 'An error occurred while sending the message; please try again later.';
|
||||
$string['errortranslatingdefault'] = 'Error translating default setting provided by plugin, using system defaults instead.';
|
||||
$string['eventmessagecontactadded'] = 'Message contact added';
|
||||
$string['eventmessagecontactblocked'] = 'Message contact blocked';
|
||||
|
@ -99,11 +98,9 @@ $string['message'] = 'Message';
|
|||
$string['messagehistory'] = 'Message history';
|
||||
$string['messagehistoryfull'] = 'All messages';
|
||||
$string['messagenavigation'] = 'Message navigation:';
|
||||
$string['messagetosend'] = 'Message to send';
|
||||
$string['messagepreferences'] = 'Message preferences';
|
||||
$string['messageprocessors'] = 'Message processors';
|
||||
$string['messages'] = 'Messages';
|
||||
$string['messagesent'] = 'Message sent';
|
||||
$string['messaging'] = 'Messaging';
|
||||
$string['messagingblockednoncontact'] = '{$a} will not be able to reply as you have blocked non-contacts';
|
||||
$string['messagingdisabled'] = 'Messaging is disabled on this site, emails will be sent instead';
|
||||
|
@ -160,7 +157,6 @@ $string['selectmessagestodelete'] = 'Select messages or conversations to delete'
|
|||
$string['send'] = 'Send';
|
||||
$string['sendingvia'] = 'Sending "{$a->provider}" via "{$a->processor}"';
|
||||
$string['sendingviawhen'] = 'Sending "{$a->provider}" via "{$a->processor}" when {$a->state}';
|
||||
$string['sendingmessage'] = 'Sending message';
|
||||
$string['sendmessage'] = 'Send message';
|
||||
$string['sendmessageto'] = 'Send message to {$a}';
|
||||
$string['sendmessagetopopup'] = 'Send message to {$a} - new window';
|
||||
|
|
|
@ -4163,7 +4163,7 @@ EOD;
|
|||
'title' => get_string('message', 'message'),
|
||||
'url' => new moodle_url('/message/index.php', array('id' => $user->id)),
|
||||
'image' => 'message',
|
||||
'linkattributes' => message_messenger_sendmessage_link_params($user),
|
||||
'linkattributes' => array('role' => 'button'),
|
||||
'page' => $this->page
|
||||
),
|
||||
'togglecontact' => array(
|
||||
|
@ -4237,9 +4237,7 @@ EOD;
|
|||
foreach ($contextheader->additionalbuttons as $button) {
|
||||
if (!isset($button->page)) {
|
||||
// Include js for messaging.
|
||||
if ($button['buttontype'] === 'message') {
|
||||
message_messenger_requirejs();
|
||||
} else if ($button['buttontype'] === 'togglecontact') {
|
||||
if ($button['buttontype'] === 'togglecontact') {
|
||||
message_togglecontact_requirejs();
|
||||
}
|
||||
$image = $this->pix_icon($button['formattedimage'], $button['title'], 'moodle', array(
|
||||
|
|
|
@ -1,82 +0,0 @@
|
|||
<?php
|
||||
// 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/>.
|
||||
|
||||
/**
|
||||
* Ajax point of entry for messaging API.
|
||||
*
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
define('AJAX_SCRIPT', true);
|
||||
|
||||
require('../config.php');
|
||||
require_once($CFG->libdir . '/filelib.php');
|
||||
require_once(__DIR__ . '/lib.php');
|
||||
|
||||
// Only real logged in users.
|
||||
require_login(null, false, null, true, true);
|
||||
if (isguestuser()) {
|
||||
throw new require_login_exception('Guests are not allowed here.');
|
||||
}
|
||||
|
||||
// Messaging needs to be enabled.
|
||||
if (empty($CFG->messaging)) {
|
||||
throw new moodle_exception('disabled', 'core_message');
|
||||
}
|
||||
|
||||
$PAGE->set_context(null);
|
||||
require_sesskey();
|
||||
$action = optional_param('action', null, PARAM_ALPHA);
|
||||
$response = null;
|
||||
|
||||
switch ($action) {
|
||||
|
||||
// Sending a message.
|
||||
case 'sendmessage':
|
||||
|
||||
$userid = required_param('userid', PARAM_INT);
|
||||
if (empty($userid) || isguestuser($userid) || $userid == $USER->id) {
|
||||
// Cannot send messags to self, nobody or a guest.
|
||||
throw new coding_exception('Invalid user to send the message to');
|
||||
}
|
||||
|
||||
$message = required_param('message', PARAM_RAW);
|
||||
$user2 = core_user::get_user($userid);
|
||||
|
||||
// Only attempt to send the message if we have permission to message
|
||||
// the recipient.
|
||||
if (message_can_post_message($user2, $USER)) {
|
||||
$messageid = message_post_message($USER, $user2, $message, FORMAT_MOODLE);
|
||||
|
||||
if (!$messageid) {
|
||||
throw new moodle_exception('errorwhilesendingmessage', 'core_message');
|
||||
}
|
||||
} else {
|
||||
throw new moodle_exception('unabletomessageuser', 'core_message');
|
||||
}
|
||||
|
||||
$response = array();
|
||||
break;
|
||||
}
|
||||
|
||||
if ($response !== null) {
|
||||
echo json_encode($response);
|
||||
exit();
|
||||
}
|
||||
|
||||
throw new coding_exception('Invalid request');
|
|
@ -1972,41 +1972,6 @@ function message_count_unread_popup_notifications($useridto = 0) {
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Requires the JS libraries to send a message using a dialog.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function message_messenger_requirejs() {
|
||||
global $PAGE;
|
||||
|
||||
static $done = false;
|
||||
if ($done) {
|
||||
return;
|
||||
}
|
||||
|
||||
$PAGE->requires->yui_module(
|
||||
array('moodle-core_message-messenger'),
|
||||
'Y.M.core_message.messenger.init',
|
||||
array(array())
|
||||
);
|
||||
$PAGE->requires->strings_for_js(array(
|
||||
'errorwhilesendingmessage',
|
||||
'messagesent',
|
||||
'messagetosend',
|
||||
'sendingmessage',
|
||||
'sendmessage',
|
||||
'viewconversation',
|
||||
), 'core_message');
|
||||
$PAGE->requires->strings_for_js(array(
|
||||
'userisblockingyou',
|
||||
'userisblockingyounoncontact'
|
||||
), 'message');
|
||||
$PAGE->requires->string_for_js('error', 'core');
|
||||
|
||||
$done = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Requires the JS libraries for the toggle contact button.
|
||||
*
|
||||
|
@ -2024,29 +1989,6 @@ function message_togglecontact_requirejs() {
|
|||
$done = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the attributes to place on a link to open the 'Send message' dialog.
|
||||
*
|
||||
* @param object $user User object.
|
||||
* @return void
|
||||
*/
|
||||
function message_messenger_sendmessage_link_params($user) {
|
||||
$params = array(
|
||||
'data-trigger' => 'core_message-messenger::sendmessage',
|
||||
'data-fullname' => fullname($user),
|
||||
'data-userid' => $user->id,
|
||||
'role' => 'button'
|
||||
);
|
||||
|
||||
if (message_is_user_non_contact_blocked($user)) {
|
||||
$params['data-blocked-string'] = 'userisblockingyounoncontact';
|
||||
} else if (message_is_user_blocked($user)) {
|
||||
$params['data-blocked-string'] = 'userisblockingyou';
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the attributes to place on a contact button.
|
||||
*
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
@core @core_message
|
||||
Feature: Users can send messages to each other
|
||||
In order to communicate with another user
|
||||
As a user
|
||||
I can send private messages
|
||||
|
||||
Background:
|
||||
Given the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| user1 | User | One | one@example.com |
|
||||
| user2 | User | Two | two@example.com |
|
||||
|
||||
@javascript
|
||||
Scenario: Using the 'Send message' dialog on one's profile
|
||||
Given the following config values are set as admin:
|
||||
| forceloginforprofiles | 0 |
|
||||
And I log in as "user1"
|
||||
And I follow "Messages" in the user menu
|
||||
And I set the field "Search people and messages" to "User Two"
|
||||
And I press "Search people and messages"
|
||||
And I follow "Picture of User Two"
|
||||
When I press "Message"
|
||||
And I set the field "Message to send" to "Lorem ipsum sa messagus textus"
|
||||
And I press "Send message"
|
||||
And I am on homepage
|
||||
And I follow "Messages" in the user menu
|
||||
And I set the field "Search people and messages" to "User Two"
|
||||
And I press "Search people and messages"
|
||||
And I follow "Send message to User Two"
|
||||
Then I should see "Lorem ipsum sa messagus textus"
|
||||
|
||||
@javascript
|
||||
Scenario: Using the 'Send message' dialog on one's course profile
|
||||
Given the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| user1 | C1 | student |
|
||||
| user2 | C1 | student |
|
||||
And I log in as "user1"
|
||||
And I follow "Course 1"
|
||||
And I follow "Participants"
|
||||
And I follow "User Two"
|
||||
When I press "Message"
|
||||
And I set the field "Message to send" to "Lorem ipsum sa messagus textus"
|
||||
And I press "Send message"
|
||||
And I am on homepage
|
||||
And I follow "Messages" in the user menu
|
||||
And I set the field "Search people and messages" to "User Two"
|
||||
And I press "Search people and messages"
|
||||
And I follow "Send message to User Two"
|
||||
Then I should see "Lorem ipsum sa messagus textus"
|
||||
|
||||
@javascript
|
||||
Scenario: Using the 'Messages' page
|
||||
Given the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| user1 | C1 | student |
|
||||
| user2 | C1 | student |
|
||||
And I log in as "user1"
|
||||
And I follow "Messages" in the user menu
|
||||
And I set the field "Search people and messages" to "User Two"
|
||||
And I press "Search people and messages"
|
||||
And I follow "Send message to User Two"
|
||||
When I set the field "message" to "Lorem ipsum sa messagus textus"
|
||||
And I press "Send message"
|
||||
Then I should see "Lorem ipsum sa messagus textus"
|
|
@ -1,636 +0,0 @@
|
|||
YUI.add('moodle-core_message-messenger', function (Y, NAME) {
|
||||
|
||||
// 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/>.
|
||||
/* eslint-disable no-unused-vars */
|
||||
|
||||
/**
|
||||
* Messenger constants.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Cascading Style Sheet References.
|
||||
*
|
||||
* Using the name "CSS" would redefine the existing JS object CSS.
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var CSSR = {};
|
||||
|
||||
/**
|
||||
* Object containing a reference to the selectors.
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var SELECTORS = {};
|
||||
// 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/>.
|
||||
/* global SELECTORS */
|
||||
|
||||
/**
|
||||
* Messenger manager.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
SELECTORS.MANAGER = {
|
||||
SENDMESSAGE: '[data-trigger="core_message-messenger::sendmessage"]'
|
||||
};
|
||||
|
||||
/**
|
||||
* Messenger manager.
|
||||
*
|
||||
* @namespace M.core_message.messenger
|
||||
* @class MANAGER
|
||||
* @constructor
|
||||
*/
|
||||
var MANAGER = function() {
|
||||
MANAGER.superclass.constructor.apply(this, arguments);
|
||||
};
|
||||
Y.namespace('M.core_message.messenger').Manager = Y.extend(MANAGER, Y.Base, {
|
||||
|
||||
_sendMessageDialog: null,
|
||||
_events: [],
|
||||
|
||||
/**
|
||||
* Initializer.
|
||||
*
|
||||
* @method initializer
|
||||
*/
|
||||
initializer: function() {
|
||||
this._setEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sending a message.
|
||||
*
|
||||
* @method sendMessage
|
||||
* @param {Number} userid The user ID to send a message to.
|
||||
* @param {String} fullname The fullname of the user.
|
||||
* @param {EventFacade} e The event triggered, when any it should be passed to the dialog.
|
||||
*/
|
||||
sendMessage: function(userid, fullname, e) {
|
||||
var Klass;
|
||||
if (!this._sendMessageDialog) {
|
||||
Klass = Y.namespace('M.core_message.messenger.sendMessage');
|
||||
this._sendMessageDialog = new Klass({
|
||||
url: this.get('url')
|
||||
});
|
||||
}
|
||||
|
||||
this._sendMessageDialog.prepareForUser(userid, fullname);
|
||||
this._sendMessageDialog.show(e);
|
||||
},
|
||||
|
||||
/**
|
||||
* Pop up an alert dialogue to notify the logged in user that they are blocked from
|
||||
* messaging the target user.
|
||||
*
|
||||
* @method alertBlocked
|
||||
* @param {String} blockedString The identifier to retrieve the blocked user message.
|
||||
* @param {String} fullName The target user's full name.
|
||||
*/
|
||||
alertBlocked: function(blockedString, fullName) {
|
||||
new M.core.alert({
|
||||
title: M.util.get_string('error', 'core'),
|
||||
message: M.util.get_string(blockedString, 'message', fullName)
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Register the events.
|
||||
*
|
||||
* @method _setEvents.
|
||||
*/
|
||||
_setEvents: function() {
|
||||
var captureEvent = function(e) {
|
||||
var target = e.currentTarget,
|
||||
userid = parseInt(target.getData('userid'), 10),
|
||||
fullname = target.getData('fullname'),
|
||||
blockedString = target.getData('blocked-string');
|
||||
|
||||
if (!userid || !fullname) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Pass the validation before preventing defaults.
|
||||
e.preventDefault();
|
||||
if (blockedString) {
|
||||
this.alertBlocked(blockedString, fullname);
|
||||
} else {
|
||||
this.sendMessage(userid, fullname, e);
|
||||
}
|
||||
};
|
||||
|
||||
this._events.push(Y.delegate('click', captureEvent, 'body', SELECTORS.MANAGER.SENDMESSAGE, this));
|
||||
this._events.push(Y.one(Y.config.doc).delegate('key', captureEvent, 'space', SELECTORS.MANAGER.SENDMESSAGE, this));
|
||||
}
|
||||
|
||||
}, {
|
||||
NAME: 'core_message-messenger-manager',
|
||||
ATTRS: {
|
||||
|
||||
/**
|
||||
* URL to the message Ajax actions.
|
||||
*
|
||||
* @attribute url
|
||||
* @default M.cfg.wwwroot + '/message/ajax.php'
|
||||
* @type String
|
||||
*/
|
||||
url: {
|
||||
readonly: true,
|
||||
value: M.cfg.wwwroot + '/message/ajax.php'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var MANAGERINST;
|
||||
Y.namespace('M.core_message.messenger').init = function(config) {
|
||||
if (!MANAGERINST) {
|
||||
// Prevent duplicates of the manager if this function is called more than once.
|
||||
MANAGERINST = new MANAGER(config);
|
||||
}
|
||||
return MANAGERINST;
|
||||
};
|
||||
// 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/>.
|
||||
/* global CSSR, SELECTORS */
|
||||
|
||||
/**
|
||||
* Send message dialog.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
CSSR.SENDMSGDIALOG = {
|
||||
ACCESSHIDE: 'accesshide',
|
||||
ACTIONS: 'message-actions',
|
||||
FOOTER: 'message-footer',
|
||||
HIDDEN: 'hidden',
|
||||
HISTORYLINK: 'message-history',
|
||||
INPUT: 'message-input',
|
||||
INPUTAREA: 'message-area',
|
||||
NOTICE: 'message-notice',
|
||||
NOTICEAREA: 'message-notice-area',
|
||||
PREFIX: 'core_message-messenger-sendmessage',
|
||||
SENDBTN: 'message-send',
|
||||
WRAPPER: 'message-wrapper'
|
||||
};
|
||||
|
||||
SELECTORS.SENDMSGDIALOG = {
|
||||
FORM: 'form',
|
||||
HISTORYLINK: '.message-history',
|
||||
INPUT: '.message-input',
|
||||
NOTICE: '.message-notice div',
|
||||
NOTICEAREA: '.message-notice-area',
|
||||
SENDBTN: '.message-send'
|
||||
};
|
||||
|
||||
/**
|
||||
* Send message dialog.
|
||||
*
|
||||
* @namespace M.core_message
|
||||
* @class SENDMSGDIALOG
|
||||
* @constructor
|
||||
*/
|
||||
var SENDMSGDIALOG = function() {
|
||||
SENDMSGDIALOG.superclass.constructor.apply(this, arguments);
|
||||
};
|
||||
Y.namespace('M.core_message.messenger').sendMessage = Y.extend(SENDMSGDIALOG, M.core.dialogue, {
|
||||
|
||||
_bb: null,
|
||||
_sendLock: false,
|
||||
_hide: null,
|
||||
/**
|
||||
* Initializer.
|
||||
*
|
||||
* @method initializer
|
||||
*/
|
||||
initializer: function() {
|
||||
var tpl,
|
||||
content;
|
||||
|
||||
this._bb = this.get('boundingBox');
|
||||
this._hide = this.hide;
|
||||
|
||||
// Prepare the content area.
|
||||
tpl = Y.Handlebars.compile(
|
||||
'<form action="#" id="messageform">' +
|
||||
'<div class="{{CSSR.INPUTAREA}}">' +
|
||||
'<label class="{{CSSR.ACCESSHIDE}}" for="{{id}}">{{labelStr}}</label>' +
|
||||
'<textarea class="{{CSSR.INPUT}}" id="{{id}}"></textarea>' +
|
||||
'<div class="{{CSSR.NOTICEAREA}}" style="display: none;" aria-live="assertive">' +
|
||||
'<div class="{{CSSR.NOTICE}}"><div></div></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="{{CSSR.ACTIONS}}">' +
|
||||
'<input type="submit" value="{{sendStr}}" class="{{CSSR.SENDBTN}}">' +
|
||||
'<a href="#" class="{{CSSR.HISTORYLINK}}">{{viewHistoryStr}}</a>' +
|
||||
'<div style="clear: both;"></div>' +
|
||||
'</div>' +
|
||||
'</form>'
|
||||
);
|
||||
content = Y.Node.create(
|
||||
tpl({
|
||||
CSSR: CSSR.SENDMSGDIALOG,
|
||||
id: Y.guid(),
|
||||
labelStr: M.util.get_string('messagetosend', 'core_message'),
|
||||
loadingIcon: M.util.image_url('i/loading', 'moodle'),
|
||||
sendStr: M.util.get_string('sendmessage', 'core_message'),
|
||||
viewHistoryStr: M.util.get_string('viewconversation', 'core_message')
|
||||
})
|
||||
);
|
||||
this.setStdModContent(Y.WidgetStdMod.BODY, content, Y.WidgetStdMod.REPLACE);
|
||||
|
||||
// Use standard dialogue class name. This removes the default styling of the footer.
|
||||
this._bb.one('.moodle-dialogue-wrap').addClass('moodle-dialogue-content');
|
||||
|
||||
// Set the events listeners.
|
||||
this._setEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* Prepare the dialog for a user.
|
||||
*
|
||||
* @method prepareForUser
|
||||
* @param {Number} userid The user ID.
|
||||
* @param {String} fullname The user full name.
|
||||
*/
|
||||
prepareForUser: function(userid, fullname) {
|
||||
var title;
|
||||
|
||||
this.set('userid', userid);
|
||||
this.set('fullname', fullname);
|
||||
|
||||
// Prepare the title.
|
||||
title = Y.Node.create('<h1>' + Y.Escape.html(fullname) + '</h1>');
|
||||
this.setStdModContent(Y.WidgetStdMod.HEADER, title, Y.WidgetStdMod.REPLACE);
|
||||
|
||||
// Update the link to the conversation.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.HISTORYLINK)
|
||||
.set('href', M.cfg.wwwroot + '/message/index.php?id=' + this.get('userid'));
|
||||
|
||||
// Set the content as empty and lock send.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.INPUT).set('value', '');
|
||||
|
||||
// Register form with formchangechecker
|
||||
Y.use('moodle-core-formchangechecker', function() {
|
||||
M.core_formchangechecker.init({formid: "messageform"});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Send the message to the user.
|
||||
*
|
||||
* @method sendMessage
|
||||
* @param {String} message The message to be sent.
|
||||
*/
|
||||
sendMessage: function(message) {
|
||||
if (this._sendLock) {
|
||||
// Do not proceed if the lock is active.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!message || !this._validateMessage(message)) {
|
||||
// Do not send falsy messages.
|
||||
return;
|
||||
}
|
||||
|
||||
// Actually send the message.
|
||||
this._ioSend = Y.io(this.get('url'), {
|
||||
method: 'POST',
|
||||
data: {
|
||||
sesskey: M.cfg.sesskey,
|
||||
action: 'sendmessage',
|
||||
userid: this.get('userid'),
|
||||
message: message
|
||||
},
|
||||
on: {
|
||||
start: function() {
|
||||
var img = '<img alt="" role="presentation" src="' + M.util.image_url('i/loading_small', 'moodle') + '">';
|
||||
this.setSendLock(true);
|
||||
this.showNotice(img + ' ' + M.util.get_string('sendingmessage', 'core_message'));
|
||||
},
|
||||
success: function(id, response) {
|
||||
var data = null;
|
||||
|
||||
try {
|
||||
data = Y.JSON.parse(response.responseText);
|
||||
if (data.error) {
|
||||
this.hideNotice();
|
||||
new M.core.ajaxException(data);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
this.hideNotice();
|
||||
new M.core.exception(e);
|
||||
return;
|
||||
}
|
||||
|
||||
// Show a success message.
|
||||
this.showNotice(M.util.get_string('messagesent', 'core_message'));
|
||||
|
||||
// Hide the dialog.
|
||||
Y.later(1300, this, function() {
|
||||
this.setSendLock(false);
|
||||
this.hideNotice();
|
||||
this.hide();
|
||||
});
|
||||
},
|
||||
failure: function() {
|
||||
this.setSendLock(false);
|
||||
this.hideNotice();
|
||||
new M.core.alert({
|
||||
title: M.util.get_string('error', 'core'),
|
||||
message: M.util.get_string('errorwhilesendingmessage', 'core_message')
|
||||
});
|
||||
}
|
||||
},
|
||||
context: this
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Override the default hide function.
|
||||
* @method hide
|
||||
*/
|
||||
hide: function() {
|
||||
var self = this;
|
||||
|
||||
if (!M.core_formchangechecker.get_form_dirty_state()) {
|
||||
return SENDMSGDIALOG.superclass.hide.call(this, arguments);
|
||||
}
|
||||
|
||||
Y.use('moodle-core-notification-confirm', function() {
|
||||
var confirm = new M.core.confirm({
|
||||
title: M.util.get_string('confirm', 'moodle'),
|
||||
question: M.util.get_string('changesmadereallygoaway', 'moodle'),
|
||||
yesLabel: M.util.get_string('confirm', 'moodle'),
|
||||
noLabel: M.util.get_string('cancel', 'moodle')
|
||||
});
|
||||
confirm.on('complete-yes', function() {
|
||||
M.core_formchangechecker.reset_form_dirty_state();
|
||||
confirm.hide();
|
||||
confirm.destroy();
|
||||
return SENDMSGDIALOG.superclass.hide.call(this, arguments);
|
||||
}, self);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Show a notice.
|
||||
*
|
||||
* @method hideNotice.
|
||||
*/
|
||||
hideNotice: function() {
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICEAREA).hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* Show a notice.
|
||||
*
|
||||
* @param {String} html String to show.
|
||||
* @method showNotice.
|
||||
*/
|
||||
showNotice: function(html) {
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICE).setHTML(html);
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICEAREA).show();
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the send lock.
|
||||
*
|
||||
* We do not lock the send button because that would cause a focus change on screenreaders
|
||||
* which then conflicts with the aria-live region reading out that we are sending a message.
|
||||
*
|
||||
* @method setSendLock
|
||||
* @param {Boolean} lock When true, enables the lock.
|
||||
*/
|
||||
setSendLock: function(lock) {
|
||||
if (lock) {
|
||||
this._sendLock = true;
|
||||
} else {
|
||||
this._sendLock = false;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Register the events.
|
||||
*
|
||||
* @method _setEvents.
|
||||
*/
|
||||
_setEvents: function() {
|
||||
// Form submit.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.FORM).on('submit', function(e) {
|
||||
var message = this._bb.one(SELECTORS.SENDMSGDIALOG.INPUT).get('value');
|
||||
e.preventDefault();
|
||||
this.sendMessage(message);
|
||||
}, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Validates a message.
|
||||
*
|
||||
* @method _validateMessage
|
||||
* @param {String} message A message to be validated.
|
||||
*/
|
||||
_validateMessage: function(message) {
|
||||
var trimmed;
|
||||
if (!message) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Basic validation.
|
||||
trimmed = message.replace(' ', '')
|
||||
.replace(' ', '')
|
||||
.replace(/(<br\s*\/?>(<\/br\s*\/?>)?)+/, '')
|
||||
.trim();
|
||||
|
||||
return trimmed.length > 1;
|
||||
}
|
||||
|
||||
}, {
|
||||
NAME: 'core_message-messenger-sendmessage',
|
||||
CSS_PREFIX: CSSR.SENDMSGDIALOG.PREFIX,
|
||||
ATTRS: {
|
||||
|
||||
/**
|
||||
* Fullname of the user.
|
||||
*
|
||||
* @attribute fullname
|
||||
* @default ''
|
||||
* @type String
|
||||
*/
|
||||
fullname: {
|
||||
validator: Y.Lang.isString,
|
||||
value: ''
|
||||
},
|
||||
|
||||
/**
|
||||
* URL to the message Ajax actions.
|
||||
*
|
||||
* @attribute url
|
||||
* @default null
|
||||
* @type String
|
||||
*/
|
||||
url: {
|
||||
validator: Y.Lang.isString,
|
||||
value: null
|
||||
},
|
||||
|
||||
/**
|
||||
* User ID this dialog interacts with.
|
||||
*
|
||||
* @attribute userid
|
||||
* @default 0
|
||||
* @type Number
|
||||
*/
|
||||
userid: {
|
||||
validator: Y.Lang.isNumber,
|
||||
value: 0
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Y.Base.modifyAttrs(Y.namespace('M.core_message.messenger.sendMessage'), {
|
||||
|
||||
/**
|
||||
* List of extra classes.
|
||||
*
|
||||
* @attribute extraClasses
|
||||
* @default ['core_message-messenger-sendmessage']
|
||||
* @type Array
|
||||
*/
|
||||
extraClasses: {
|
||||
value: ['core_message-messenger-sendmessage']
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether to focus on the target that caused the Widget to be shown.
|
||||
*
|
||||
* @attribute focusOnPreviousTargetAfterHide
|
||||
* @default true
|
||||
* @type Node
|
||||
*/
|
||||
focusOnPreviousTargetAfterHide: {
|
||||
value: true
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* Width.
|
||||
*
|
||||
* @attribute width
|
||||
* @default '260px'
|
||||
* @type String|Number
|
||||
*/
|
||||
width: {
|
||||
value: '360px'
|
||||
},
|
||||
|
||||
/**
|
||||
* Boolean indicating whether or not the Widget is visible.
|
||||
*
|
||||
* @attribute visible
|
||||
* @default false
|
||||
* @type Boolean
|
||||
*/
|
||||
visible: {
|
||||
value: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the widget should be modal or not.
|
||||
*
|
||||
* @attribute modal
|
||||
* @type Boolean
|
||||
* @default true
|
||||
*/
|
||||
modal: {
|
||||
value: true
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the widget should be draggable or not.
|
||||
*
|
||||
* @attribute draggable
|
||||
* @type Boolean
|
||||
* @default false
|
||||
*/
|
||||
draggable: {
|
||||
value: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether to display the dialogue centrally on the screen.
|
||||
*
|
||||
* @attribute center
|
||||
* @type Boolean
|
||||
* @default false
|
||||
*/
|
||||
center: {
|
||||
value: true
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
}, '@VERSION@', {
|
||||
"requires": [
|
||||
"escape",
|
||||
"handlebars",
|
||||
"io-base",
|
||||
"moodle-core-notification-ajaxexception",
|
||||
"moodle-core-notification-alert",
|
||||
"moodle-core-notification-dialogue",
|
||||
"moodle-core-notification-exception"
|
||||
]
|
||||
});
|
File diff suppressed because one or more lines are too long
|
@ -1,636 +0,0 @@
|
|||
YUI.add('moodle-core_message-messenger', function (Y, NAME) {
|
||||
|
||||
// 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/>.
|
||||
/* eslint-disable no-unused-vars */
|
||||
|
||||
/**
|
||||
* Messenger constants.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Cascading Style Sheet References.
|
||||
*
|
||||
* Using the name "CSS" would redefine the existing JS object CSS.
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var CSSR = {};
|
||||
|
||||
/**
|
||||
* Object containing a reference to the selectors.
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var SELECTORS = {};
|
||||
// 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/>.
|
||||
/* global SELECTORS */
|
||||
|
||||
/**
|
||||
* Messenger manager.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
SELECTORS.MANAGER = {
|
||||
SENDMESSAGE: '[data-trigger="core_message-messenger::sendmessage"]'
|
||||
};
|
||||
|
||||
/**
|
||||
* Messenger manager.
|
||||
*
|
||||
* @namespace M.core_message.messenger
|
||||
* @class MANAGER
|
||||
* @constructor
|
||||
*/
|
||||
var MANAGER = function() {
|
||||
MANAGER.superclass.constructor.apply(this, arguments);
|
||||
};
|
||||
Y.namespace('M.core_message.messenger').Manager = Y.extend(MANAGER, Y.Base, {
|
||||
|
||||
_sendMessageDialog: null,
|
||||
_events: [],
|
||||
|
||||
/**
|
||||
* Initializer.
|
||||
*
|
||||
* @method initializer
|
||||
*/
|
||||
initializer: function() {
|
||||
this._setEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sending a message.
|
||||
*
|
||||
* @method sendMessage
|
||||
* @param {Number} userid The user ID to send a message to.
|
||||
* @param {String} fullname The fullname of the user.
|
||||
* @param {EventFacade} e The event triggered, when any it should be passed to the dialog.
|
||||
*/
|
||||
sendMessage: function(userid, fullname, e) {
|
||||
var Klass;
|
||||
if (!this._sendMessageDialog) {
|
||||
Klass = Y.namespace('M.core_message.messenger.sendMessage');
|
||||
this._sendMessageDialog = new Klass({
|
||||
url: this.get('url')
|
||||
});
|
||||
}
|
||||
|
||||
this._sendMessageDialog.prepareForUser(userid, fullname);
|
||||
this._sendMessageDialog.show(e);
|
||||
},
|
||||
|
||||
/**
|
||||
* Pop up an alert dialogue to notify the logged in user that they are blocked from
|
||||
* messaging the target user.
|
||||
*
|
||||
* @method alertBlocked
|
||||
* @param {String} blockedString The identifier to retrieve the blocked user message.
|
||||
* @param {String} fullName The target user's full name.
|
||||
*/
|
||||
alertBlocked: function(blockedString, fullName) {
|
||||
new M.core.alert({
|
||||
title: M.util.get_string('error', 'core'),
|
||||
message: M.util.get_string(blockedString, 'message', fullName)
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Register the events.
|
||||
*
|
||||
* @method _setEvents.
|
||||
*/
|
||||
_setEvents: function() {
|
||||
var captureEvent = function(e) {
|
||||
var target = e.currentTarget,
|
||||
userid = parseInt(target.getData('userid'), 10),
|
||||
fullname = target.getData('fullname'),
|
||||
blockedString = target.getData('blocked-string');
|
||||
|
||||
if (!userid || !fullname) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Pass the validation before preventing defaults.
|
||||
e.preventDefault();
|
||||
if (blockedString) {
|
||||
this.alertBlocked(blockedString, fullname);
|
||||
} else {
|
||||
this.sendMessage(userid, fullname, e);
|
||||
}
|
||||
};
|
||||
|
||||
this._events.push(Y.delegate('click', captureEvent, 'body', SELECTORS.MANAGER.SENDMESSAGE, this));
|
||||
this._events.push(Y.one(Y.config.doc).delegate('key', captureEvent, 'space', SELECTORS.MANAGER.SENDMESSAGE, this));
|
||||
}
|
||||
|
||||
}, {
|
||||
NAME: 'core_message-messenger-manager',
|
||||
ATTRS: {
|
||||
|
||||
/**
|
||||
* URL to the message Ajax actions.
|
||||
*
|
||||
* @attribute url
|
||||
* @default M.cfg.wwwroot + '/message/ajax.php'
|
||||
* @type String
|
||||
*/
|
||||
url: {
|
||||
readonly: true,
|
||||
value: M.cfg.wwwroot + '/message/ajax.php'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var MANAGERINST;
|
||||
Y.namespace('M.core_message.messenger').init = function(config) {
|
||||
if (!MANAGERINST) {
|
||||
// Prevent duplicates of the manager if this function is called more than once.
|
||||
MANAGERINST = new MANAGER(config);
|
||||
}
|
||||
return MANAGERINST;
|
||||
};
|
||||
// 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/>.
|
||||
/* global CSSR, SELECTORS */
|
||||
|
||||
/**
|
||||
* Send message dialog.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
CSSR.SENDMSGDIALOG = {
|
||||
ACCESSHIDE: 'accesshide',
|
||||
ACTIONS: 'message-actions',
|
||||
FOOTER: 'message-footer',
|
||||
HIDDEN: 'hidden',
|
||||
HISTORYLINK: 'message-history',
|
||||
INPUT: 'message-input',
|
||||
INPUTAREA: 'message-area',
|
||||
NOTICE: 'message-notice',
|
||||
NOTICEAREA: 'message-notice-area',
|
||||
PREFIX: 'core_message-messenger-sendmessage',
|
||||
SENDBTN: 'message-send',
|
||||
WRAPPER: 'message-wrapper'
|
||||
};
|
||||
|
||||
SELECTORS.SENDMSGDIALOG = {
|
||||
FORM: 'form',
|
||||
HISTORYLINK: '.message-history',
|
||||
INPUT: '.message-input',
|
||||
NOTICE: '.message-notice div',
|
||||
NOTICEAREA: '.message-notice-area',
|
||||
SENDBTN: '.message-send'
|
||||
};
|
||||
|
||||
/**
|
||||
* Send message dialog.
|
||||
*
|
||||
* @namespace M.core_message
|
||||
* @class SENDMSGDIALOG
|
||||
* @constructor
|
||||
*/
|
||||
var SENDMSGDIALOG = function() {
|
||||
SENDMSGDIALOG.superclass.constructor.apply(this, arguments);
|
||||
};
|
||||
Y.namespace('M.core_message.messenger').sendMessage = Y.extend(SENDMSGDIALOG, M.core.dialogue, {
|
||||
|
||||
_bb: null,
|
||||
_sendLock: false,
|
||||
_hide: null,
|
||||
/**
|
||||
* Initializer.
|
||||
*
|
||||
* @method initializer
|
||||
*/
|
||||
initializer: function() {
|
||||
var tpl,
|
||||
content;
|
||||
|
||||
this._bb = this.get('boundingBox');
|
||||
this._hide = this.hide;
|
||||
|
||||
// Prepare the content area.
|
||||
tpl = Y.Handlebars.compile(
|
||||
'<form action="#" id="messageform">' +
|
||||
'<div class="{{CSSR.INPUTAREA}}">' +
|
||||
'<label class="{{CSSR.ACCESSHIDE}}" for="{{id}}">{{labelStr}}</label>' +
|
||||
'<textarea class="{{CSSR.INPUT}}" id="{{id}}"></textarea>' +
|
||||
'<div class="{{CSSR.NOTICEAREA}}" style="display: none;" aria-live="assertive">' +
|
||||
'<div class="{{CSSR.NOTICE}}"><div></div></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="{{CSSR.ACTIONS}}">' +
|
||||
'<input type="submit" value="{{sendStr}}" class="{{CSSR.SENDBTN}}">' +
|
||||
'<a href="#" class="{{CSSR.HISTORYLINK}}">{{viewHistoryStr}}</a>' +
|
||||
'<div style="clear: both;"></div>' +
|
||||
'</div>' +
|
||||
'</form>'
|
||||
);
|
||||
content = Y.Node.create(
|
||||
tpl({
|
||||
CSSR: CSSR.SENDMSGDIALOG,
|
||||
id: Y.guid(),
|
||||
labelStr: M.util.get_string('messagetosend', 'core_message'),
|
||||
loadingIcon: M.util.image_url('i/loading', 'moodle'),
|
||||
sendStr: M.util.get_string('sendmessage', 'core_message'),
|
||||
viewHistoryStr: M.util.get_string('viewconversation', 'core_message')
|
||||
})
|
||||
);
|
||||
this.setStdModContent(Y.WidgetStdMod.BODY, content, Y.WidgetStdMod.REPLACE);
|
||||
|
||||
// Use standard dialogue class name. This removes the default styling of the footer.
|
||||
this._bb.one('.moodle-dialogue-wrap').addClass('moodle-dialogue-content');
|
||||
|
||||
// Set the events listeners.
|
||||
this._setEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* Prepare the dialog for a user.
|
||||
*
|
||||
* @method prepareForUser
|
||||
* @param {Number} userid The user ID.
|
||||
* @param {String} fullname The user full name.
|
||||
*/
|
||||
prepareForUser: function(userid, fullname) {
|
||||
var title;
|
||||
|
||||
this.set('userid', userid);
|
||||
this.set('fullname', fullname);
|
||||
|
||||
// Prepare the title.
|
||||
title = Y.Node.create('<h1>' + Y.Escape.html(fullname) + '</h1>');
|
||||
this.setStdModContent(Y.WidgetStdMod.HEADER, title, Y.WidgetStdMod.REPLACE);
|
||||
|
||||
// Update the link to the conversation.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.HISTORYLINK)
|
||||
.set('href', M.cfg.wwwroot + '/message/index.php?id=' + this.get('userid'));
|
||||
|
||||
// Set the content as empty and lock send.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.INPUT).set('value', '');
|
||||
|
||||
// Register form with formchangechecker
|
||||
Y.use('moodle-core-formchangechecker', function() {
|
||||
M.core_formchangechecker.init({formid: "messageform"});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Send the message to the user.
|
||||
*
|
||||
* @method sendMessage
|
||||
* @param {String} message The message to be sent.
|
||||
*/
|
||||
sendMessage: function(message) {
|
||||
if (this._sendLock) {
|
||||
// Do not proceed if the lock is active.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!message || !this._validateMessage(message)) {
|
||||
// Do not send falsy messages.
|
||||
return;
|
||||
}
|
||||
|
||||
// Actually send the message.
|
||||
this._ioSend = Y.io(this.get('url'), {
|
||||
method: 'POST',
|
||||
data: {
|
||||
sesskey: M.cfg.sesskey,
|
||||
action: 'sendmessage',
|
||||
userid: this.get('userid'),
|
||||
message: message
|
||||
},
|
||||
on: {
|
||||
start: function() {
|
||||
var img = '<img alt="" role="presentation" src="' + M.util.image_url('i/loading_small', 'moodle') + '">';
|
||||
this.setSendLock(true);
|
||||
this.showNotice(img + ' ' + M.util.get_string('sendingmessage', 'core_message'));
|
||||
},
|
||||
success: function(id, response) {
|
||||
var data = null;
|
||||
|
||||
try {
|
||||
data = Y.JSON.parse(response.responseText);
|
||||
if (data.error) {
|
||||
this.hideNotice();
|
||||
new M.core.ajaxException(data);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
this.hideNotice();
|
||||
new M.core.exception(e);
|
||||
return;
|
||||
}
|
||||
|
||||
// Show a success message.
|
||||
this.showNotice(M.util.get_string('messagesent', 'core_message'));
|
||||
|
||||
// Hide the dialog.
|
||||
Y.later(1300, this, function() {
|
||||
this.setSendLock(false);
|
||||
this.hideNotice();
|
||||
this.hide();
|
||||
});
|
||||
},
|
||||
failure: function() {
|
||||
this.setSendLock(false);
|
||||
this.hideNotice();
|
||||
new M.core.alert({
|
||||
title: M.util.get_string('error', 'core'),
|
||||
message: M.util.get_string('errorwhilesendingmessage', 'core_message')
|
||||
});
|
||||
}
|
||||
},
|
||||
context: this
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Override the default hide function.
|
||||
* @method hide
|
||||
*/
|
||||
hide: function() {
|
||||
var self = this;
|
||||
|
||||
if (!M.core_formchangechecker.get_form_dirty_state()) {
|
||||
return SENDMSGDIALOG.superclass.hide.call(this, arguments);
|
||||
}
|
||||
|
||||
Y.use('moodle-core-notification-confirm', function() {
|
||||
var confirm = new M.core.confirm({
|
||||
title: M.util.get_string('confirm', 'moodle'),
|
||||
question: M.util.get_string('changesmadereallygoaway', 'moodle'),
|
||||
yesLabel: M.util.get_string('confirm', 'moodle'),
|
||||
noLabel: M.util.get_string('cancel', 'moodle')
|
||||
});
|
||||
confirm.on('complete-yes', function() {
|
||||
M.core_formchangechecker.reset_form_dirty_state();
|
||||
confirm.hide();
|
||||
confirm.destroy();
|
||||
return SENDMSGDIALOG.superclass.hide.call(this, arguments);
|
||||
}, self);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Show a notice.
|
||||
*
|
||||
* @method hideNotice.
|
||||
*/
|
||||
hideNotice: function() {
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICEAREA).hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* Show a notice.
|
||||
*
|
||||
* @param {String} html String to show.
|
||||
* @method showNotice.
|
||||
*/
|
||||
showNotice: function(html) {
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICE).setHTML(html);
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICEAREA).show();
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the send lock.
|
||||
*
|
||||
* We do not lock the send button because that would cause a focus change on screenreaders
|
||||
* which then conflicts with the aria-live region reading out that we are sending a message.
|
||||
*
|
||||
* @method setSendLock
|
||||
* @param {Boolean} lock When true, enables the lock.
|
||||
*/
|
||||
setSendLock: function(lock) {
|
||||
if (lock) {
|
||||
this._sendLock = true;
|
||||
} else {
|
||||
this._sendLock = false;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Register the events.
|
||||
*
|
||||
* @method _setEvents.
|
||||
*/
|
||||
_setEvents: function() {
|
||||
// Form submit.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.FORM).on('submit', function(e) {
|
||||
var message = this._bb.one(SELECTORS.SENDMSGDIALOG.INPUT).get('value');
|
||||
e.preventDefault();
|
||||
this.sendMessage(message);
|
||||
}, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Validates a message.
|
||||
*
|
||||
* @method _validateMessage
|
||||
* @param {String} message A message to be validated.
|
||||
*/
|
||||
_validateMessage: function(message) {
|
||||
var trimmed;
|
||||
if (!message) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Basic validation.
|
||||
trimmed = message.replace(' ', '')
|
||||
.replace(' ', '')
|
||||
.replace(/(<br\s*\/?>(<\/br\s*\/?>)?)+/, '')
|
||||
.trim();
|
||||
|
||||
return trimmed.length > 1;
|
||||
}
|
||||
|
||||
}, {
|
||||
NAME: 'core_message-messenger-sendmessage',
|
||||
CSS_PREFIX: CSSR.SENDMSGDIALOG.PREFIX,
|
||||
ATTRS: {
|
||||
|
||||
/**
|
||||
* Fullname of the user.
|
||||
*
|
||||
* @attribute fullname
|
||||
* @default ''
|
||||
* @type String
|
||||
*/
|
||||
fullname: {
|
||||
validator: Y.Lang.isString,
|
||||
value: ''
|
||||
},
|
||||
|
||||
/**
|
||||
* URL to the message Ajax actions.
|
||||
*
|
||||
* @attribute url
|
||||
* @default null
|
||||
* @type String
|
||||
*/
|
||||
url: {
|
||||
validator: Y.Lang.isString,
|
||||
value: null
|
||||
},
|
||||
|
||||
/**
|
||||
* User ID this dialog interacts with.
|
||||
*
|
||||
* @attribute userid
|
||||
* @default 0
|
||||
* @type Number
|
||||
*/
|
||||
userid: {
|
||||
validator: Y.Lang.isNumber,
|
||||
value: 0
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Y.Base.modifyAttrs(Y.namespace('M.core_message.messenger.sendMessage'), {
|
||||
|
||||
/**
|
||||
* List of extra classes.
|
||||
*
|
||||
* @attribute extraClasses
|
||||
* @default ['core_message-messenger-sendmessage']
|
||||
* @type Array
|
||||
*/
|
||||
extraClasses: {
|
||||
value: ['core_message-messenger-sendmessage']
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether to focus on the target that caused the Widget to be shown.
|
||||
*
|
||||
* @attribute focusOnPreviousTargetAfterHide
|
||||
* @default true
|
||||
* @type Node
|
||||
*/
|
||||
focusOnPreviousTargetAfterHide: {
|
||||
value: true
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* Width.
|
||||
*
|
||||
* @attribute width
|
||||
* @default '260px'
|
||||
* @type String|Number
|
||||
*/
|
||||
width: {
|
||||
value: '360px'
|
||||
},
|
||||
|
||||
/**
|
||||
* Boolean indicating whether or not the Widget is visible.
|
||||
*
|
||||
* @attribute visible
|
||||
* @default false
|
||||
* @type Boolean
|
||||
*/
|
||||
visible: {
|
||||
value: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the widget should be modal or not.
|
||||
*
|
||||
* @attribute modal
|
||||
* @type Boolean
|
||||
* @default true
|
||||
*/
|
||||
modal: {
|
||||
value: true
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the widget should be draggable or not.
|
||||
*
|
||||
* @attribute draggable
|
||||
* @type Boolean
|
||||
* @default false
|
||||
*/
|
||||
draggable: {
|
||||
value: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether to display the dialogue centrally on the screen.
|
||||
*
|
||||
* @attribute center
|
||||
* @type Boolean
|
||||
* @default false
|
||||
*/
|
||||
center: {
|
||||
value: true
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
}, '@VERSION@', {
|
||||
"requires": [
|
||||
"escape",
|
||||
"handlebars",
|
||||
"io-base",
|
||||
"moodle-core-notification-ajaxexception",
|
||||
"moodle-core-notification-alert",
|
||||
"moodle-core-notification-dialogue",
|
||||
"moodle-core-notification-exception"
|
||||
]
|
||||
});
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"name": "moodle-core_message-messenger",
|
||||
"builds": {
|
||||
"moodle-core_message-messenger": {
|
||||
"jsfiles": [
|
||||
"constants.js",
|
||||
"manager.js",
|
||||
"sendmessage.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
41
message/yui/src/messenger/js/constants.js
vendored
41
message/yui/src/messenger/js/constants.js
vendored
|
@ -1,41 +0,0 @@
|
|||
// 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/>.
|
||||
/* eslint-disable no-unused-vars */
|
||||
|
||||
/**
|
||||
* Messenger constants.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Cascading Style Sheet References.
|
||||
*
|
||||
* Using the name "CSS" would redefine the existing JS object CSS.
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var CSSR = {};
|
||||
|
||||
/**
|
||||
* Object containing a reference to the selectors.
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
var SELECTORS = {};
|
144
message/yui/src/messenger/js/manager.js
vendored
144
message/yui/src/messenger/js/manager.js
vendored
|
@ -1,144 +0,0 @@
|
|||
// 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/>.
|
||||
/* global SELECTORS */
|
||||
|
||||
/**
|
||||
* Messenger manager.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
SELECTORS.MANAGER = {
|
||||
SENDMESSAGE: '[data-trigger="core_message-messenger::sendmessage"]'
|
||||
};
|
||||
|
||||
/**
|
||||
* Messenger manager.
|
||||
*
|
||||
* @namespace M.core_message.messenger
|
||||
* @class MANAGER
|
||||
* @constructor
|
||||
*/
|
||||
var MANAGER = function() {
|
||||
MANAGER.superclass.constructor.apply(this, arguments);
|
||||
};
|
||||
Y.namespace('M.core_message.messenger').Manager = Y.extend(MANAGER, Y.Base, {
|
||||
|
||||
_sendMessageDialog: null,
|
||||
_events: [],
|
||||
|
||||
/**
|
||||
* Initializer.
|
||||
*
|
||||
* @method initializer
|
||||
*/
|
||||
initializer: function() {
|
||||
this._setEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sending a message.
|
||||
*
|
||||
* @method sendMessage
|
||||
* @param {Number} userid The user ID to send a message to.
|
||||
* @param {String} fullname The fullname of the user.
|
||||
* @param {EventFacade} e The event triggered, when any it should be passed to the dialog.
|
||||
*/
|
||||
sendMessage: function(userid, fullname, e) {
|
||||
var Klass;
|
||||
if (!this._sendMessageDialog) {
|
||||
Klass = Y.namespace('M.core_message.messenger.sendMessage');
|
||||
this._sendMessageDialog = new Klass({
|
||||
url: this.get('url')
|
||||
});
|
||||
}
|
||||
|
||||
this._sendMessageDialog.prepareForUser(userid, fullname);
|
||||
this._sendMessageDialog.show(e);
|
||||
},
|
||||
|
||||
/**
|
||||
* Pop up an alert dialogue to notify the logged in user that they are blocked from
|
||||
* messaging the target user.
|
||||
*
|
||||
* @method alertBlocked
|
||||
* @param {String} blockedString The identifier to retrieve the blocked user message.
|
||||
* @param {String} fullName The target user's full name.
|
||||
*/
|
||||
alertBlocked: function(blockedString, fullName) {
|
||||
new M.core.alert({
|
||||
title: M.util.get_string('error', 'core'),
|
||||
message: M.util.get_string(blockedString, 'message', fullName)
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Register the events.
|
||||
*
|
||||
* @method _setEvents.
|
||||
*/
|
||||
_setEvents: function() {
|
||||
var captureEvent = function(e) {
|
||||
var target = e.currentTarget,
|
||||
userid = parseInt(target.getData('userid'), 10),
|
||||
fullname = target.getData('fullname'),
|
||||
blockedString = target.getData('blocked-string');
|
||||
|
||||
if (!userid || !fullname) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Pass the validation before preventing defaults.
|
||||
e.preventDefault();
|
||||
if (blockedString) {
|
||||
this.alertBlocked(blockedString, fullname);
|
||||
} else {
|
||||
this.sendMessage(userid, fullname, e);
|
||||
}
|
||||
};
|
||||
|
||||
this._events.push(Y.delegate('click', captureEvent, 'body', SELECTORS.MANAGER.SENDMESSAGE, this));
|
||||
this._events.push(Y.one(Y.config.doc).delegate('key', captureEvent, 'space', SELECTORS.MANAGER.SENDMESSAGE, this));
|
||||
}
|
||||
|
||||
}, {
|
||||
NAME: 'core_message-messenger-manager',
|
||||
ATTRS: {
|
||||
|
||||
/**
|
||||
* URL to the message Ajax actions.
|
||||
*
|
||||
* @attribute url
|
||||
* @default M.cfg.wwwroot + '/message/ajax.php'
|
||||
* @type String
|
||||
*/
|
||||
url: {
|
||||
readonly: true,
|
||||
value: M.cfg.wwwroot + '/message/ajax.php'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var MANAGERINST;
|
||||
Y.namespace('M.core_message.messenger').init = function(config) {
|
||||
if (!MANAGERINST) {
|
||||
// Prevent duplicates of the manager if this function is called more than once.
|
||||
MANAGERINST = new MANAGER(config);
|
||||
}
|
||||
return MANAGERINST;
|
||||
};
|
436
message/yui/src/messenger/js/sendmessage.js
vendored
436
message/yui/src/messenger/js/sendmessage.js
vendored
|
@ -1,436 +0,0 @@
|
|||
// 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/>.
|
||||
/* global CSSR, SELECTORS */
|
||||
|
||||
/**
|
||||
* Send message dialog.
|
||||
*
|
||||
* @module moodle-core_message-messenger
|
||||
* @package core_message
|
||||
* @copyright 2015 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
CSSR.SENDMSGDIALOG = {
|
||||
ACCESSHIDE: 'accesshide',
|
||||
ACTIONS: 'message-actions',
|
||||
FOOTER: 'message-footer',
|
||||
HIDDEN: 'hidden',
|
||||
HISTORYLINK: 'message-history',
|
||||
INPUT: 'message-input',
|
||||
INPUTAREA: 'message-area',
|
||||
NOTICE: 'message-notice',
|
||||
NOTICEAREA: 'message-notice-area',
|
||||
PREFIX: 'core_message-messenger-sendmessage',
|
||||
SENDBTN: 'message-send',
|
||||
WRAPPER: 'message-wrapper'
|
||||
};
|
||||
|
||||
SELECTORS.SENDMSGDIALOG = {
|
||||
FORM: 'form',
|
||||
HISTORYLINK: '.message-history',
|
||||
INPUT: '.message-input',
|
||||
NOTICE: '.message-notice div',
|
||||
NOTICEAREA: '.message-notice-area',
|
||||
SENDBTN: '.message-send'
|
||||
};
|
||||
|
||||
/**
|
||||
* Send message dialog.
|
||||
*
|
||||
* @namespace M.core_message
|
||||
* @class SENDMSGDIALOG
|
||||
* @constructor
|
||||
*/
|
||||
var SENDMSGDIALOG = function() {
|
||||
SENDMSGDIALOG.superclass.constructor.apply(this, arguments);
|
||||
};
|
||||
Y.namespace('M.core_message.messenger').sendMessage = Y.extend(SENDMSGDIALOG, M.core.dialogue, {
|
||||
|
||||
_bb: null,
|
||||
_sendLock: false,
|
||||
_hide: null,
|
||||
/**
|
||||
* Initializer.
|
||||
*
|
||||
* @method initializer
|
||||
*/
|
||||
initializer: function() {
|
||||
var tpl,
|
||||
content;
|
||||
|
||||
this._bb = this.get('boundingBox');
|
||||
this._hide = this.hide;
|
||||
|
||||
// Prepare the content area.
|
||||
tpl = Y.Handlebars.compile(
|
||||
'<form action="#" id="messageform">' +
|
||||
'<div class="{{CSSR.INPUTAREA}}">' +
|
||||
'<label class="{{CSSR.ACCESSHIDE}}" for="{{id}}">{{labelStr}}</label>' +
|
||||
'<textarea class="{{CSSR.INPUT}}" id="{{id}}"></textarea>' +
|
||||
'<div class="{{CSSR.NOTICEAREA}}" style="display: none;" aria-live="assertive">' +
|
||||
'<div class="{{CSSR.NOTICE}}"><div></div></div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'<div class="{{CSSR.ACTIONS}}">' +
|
||||
'<input type="submit" value="{{sendStr}}" class="{{CSSR.SENDBTN}}">' +
|
||||
'<a href="#" class="{{CSSR.HISTORYLINK}}">{{viewHistoryStr}}</a>' +
|
||||
'<div style="clear: both;"></div>' +
|
||||
'</div>' +
|
||||
'</form>'
|
||||
);
|
||||
content = Y.Node.create(
|
||||
tpl({
|
||||
CSSR: CSSR.SENDMSGDIALOG,
|
||||
id: Y.guid(),
|
||||
labelStr: M.util.get_string('messagetosend', 'core_message'),
|
||||
loadingIcon: M.util.image_url('i/loading', 'moodle'),
|
||||
sendStr: M.util.get_string('sendmessage', 'core_message'),
|
||||
viewHistoryStr: M.util.get_string('viewconversation', 'core_message')
|
||||
})
|
||||
);
|
||||
this.setStdModContent(Y.WidgetStdMod.BODY, content, Y.WidgetStdMod.REPLACE);
|
||||
|
||||
// Use standard dialogue class name. This removes the default styling of the footer.
|
||||
this._bb.one('.moodle-dialogue-wrap').addClass('moodle-dialogue-content');
|
||||
|
||||
// Set the events listeners.
|
||||
this._setEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* Prepare the dialog for a user.
|
||||
*
|
||||
* @method prepareForUser
|
||||
* @param {Number} userid The user ID.
|
||||
* @param {String} fullname The user full name.
|
||||
*/
|
||||
prepareForUser: function(userid, fullname) {
|
||||
var title;
|
||||
|
||||
this.set('userid', userid);
|
||||
this.set('fullname', fullname);
|
||||
|
||||
// Prepare the title.
|
||||
title = Y.Node.create('<h1>' + Y.Escape.html(fullname) + '</h1>');
|
||||
this.setStdModContent(Y.WidgetStdMod.HEADER, title, Y.WidgetStdMod.REPLACE);
|
||||
|
||||
// Update the link to the conversation.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.HISTORYLINK)
|
||||
.set('href', M.cfg.wwwroot + '/message/index.php?id=' + this.get('userid'));
|
||||
|
||||
// Set the content as empty and lock send.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.INPUT).set('value', '');
|
||||
|
||||
// Register form with formchangechecker
|
||||
Y.use('moodle-core-formchangechecker', function() {
|
||||
M.core_formchangechecker.init({formid: "messageform"});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Send the message to the user.
|
||||
*
|
||||
* @method sendMessage
|
||||
* @param {String} message The message to be sent.
|
||||
*/
|
||||
sendMessage: function(message) {
|
||||
if (this._sendLock) {
|
||||
// Do not proceed if the lock is active.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!message || !this._validateMessage(message)) {
|
||||
// Do not send falsy messages.
|
||||
return;
|
||||
}
|
||||
|
||||
// Actually send the message.
|
||||
this._ioSend = Y.io(this.get('url'), {
|
||||
method: 'POST',
|
||||
data: {
|
||||
sesskey: M.cfg.sesskey,
|
||||
action: 'sendmessage',
|
||||
userid: this.get('userid'),
|
||||
message: message
|
||||
},
|
||||
on: {
|
||||
start: function() {
|
||||
var img = '<img alt="" role="presentation" src="' + M.util.image_url('i/loading_small', 'moodle') + '">';
|
||||
this.setSendLock(true);
|
||||
this.showNotice(img + ' ' + M.util.get_string('sendingmessage', 'core_message'));
|
||||
},
|
||||
success: function(id, response) {
|
||||
var data = null;
|
||||
|
||||
try {
|
||||
data = Y.JSON.parse(response.responseText);
|
||||
if (data.error) {
|
||||
this.hideNotice();
|
||||
new M.core.ajaxException(data);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
this.hideNotice();
|
||||
new M.core.exception(e);
|
||||
return;
|
||||
}
|
||||
|
||||
// Show a success message.
|
||||
this.showNotice(M.util.get_string('messagesent', 'core_message'));
|
||||
|
||||
// Hide the dialog.
|
||||
Y.later(1300, this, function() {
|
||||
this.setSendLock(false);
|
||||
this.hideNotice();
|
||||
this.hide();
|
||||
});
|
||||
},
|
||||
failure: function() {
|
||||
this.setSendLock(false);
|
||||
this.hideNotice();
|
||||
new M.core.alert({
|
||||
title: M.util.get_string('error', 'core'),
|
||||
message: M.util.get_string('errorwhilesendingmessage', 'core_message')
|
||||
});
|
||||
}
|
||||
},
|
||||
context: this
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Override the default hide function.
|
||||
* @method hide
|
||||
*/
|
||||
hide: function() {
|
||||
var self = this;
|
||||
|
||||
if (!M.core_formchangechecker.get_form_dirty_state()) {
|
||||
return SENDMSGDIALOG.superclass.hide.call(this, arguments);
|
||||
}
|
||||
|
||||
Y.use('moodle-core-notification-confirm', function() {
|
||||
var confirm = new M.core.confirm({
|
||||
title: M.util.get_string('confirm', 'moodle'),
|
||||
question: M.util.get_string('changesmadereallygoaway', 'moodle'),
|
||||
yesLabel: M.util.get_string('confirm', 'moodle'),
|
||||
noLabel: M.util.get_string('cancel', 'moodle')
|
||||
});
|
||||
confirm.on('complete-yes', function() {
|
||||
M.core_formchangechecker.reset_form_dirty_state();
|
||||
confirm.hide();
|
||||
confirm.destroy();
|
||||
return SENDMSGDIALOG.superclass.hide.call(this, arguments);
|
||||
}, self);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Show a notice.
|
||||
*
|
||||
* @method hideNotice.
|
||||
*/
|
||||
hideNotice: function() {
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICEAREA).hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* Show a notice.
|
||||
*
|
||||
* @param {String} html String to show.
|
||||
* @method showNotice.
|
||||
*/
|
||||
showNotice: function(html) {
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICE).setHTML(html);
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.NOTICEAREA).show();
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the send lock.
|
||||
*
|
||||
* We do not lock the send button because that would cause a focus change on screenreaders
|
||||
* which then conflicts with the aria-live region reading out that we are sending a message.
|
||||
*
|
||||
* @method setSendLock
|
||||
* @param {Boolean} lock When true, enables the lock.
|
||||
*/
|
||||
setSendLock: function(lock) {
|
||||
if (lock) {
|
||||
this._sendLock = true;
|
||||
} else {
|
||||
this._sendLock = false;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Register the events.
|
||||
*
|
||||
* @method _setEvents.
|
||||
*/
|
||||
_setEvents: function() {
|
||||
// Form submit.
|
||||
this._bb.one(SELECTORS.SENDMSGDIALOG.FORM).on('submit', function(e) {
|
||||
var message = this._bb.one(SELECTORS.SENDMSGDIALOG.INPUT).get('value');
|
||||
e.preventDefault();
|
||||
this.sendMessage(message);
|
||||
}, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Validates a message.
|
||||
*
|
||||
* @method _validateMessage
|
||||
* @param {String} message A message to be validated.
|
||||
*/
|
||||
_validateMessage: function(message) {
|
||||
var trimmed;
|
||||
if (!message) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Basic validation.
|
||||
trimmed = message.replace(' ', '')
|
||||
.replace(' ', '')
|
||||
.replace(/(<br\s*\/?>(<\/br\s*\/?>)?)+/, '')
|
||||
.trim();
|
||||
|
||||
return trimmed.length > 1;
|
||||
}
|
||||
|
||||
}, {
|
||||
NAME: 'core_message-messenger-sendmessage',
|
||||
CSS_PREFIX: CSSR.SENDMSGDIALOG.PREFIX,
|
||||
ATTRS: {
|
||||
|
||||
/**
|
||||
* Fullname of the user.
|
||||
*
|
||||
* @attribute fullname
|
||||
* @default ''
|
||||
* @type String
|
||||
*/
|
||||
fullname: {
|
||||
validator: Y.Lang.isString,
|
||||
value: ''
|
||||
},
|
||||
|
||||
/**
|
||||
* URL to the message Ajax actions.
|
||||
*
|
||||
* @attribute url
|
||||
* @default null
|
||||
* @type String
|
||||
*/
|
||||
url: {
|
||||
validator: Y.Lang.isString,
|
||||
value: null
|
||||
},
|
||||
|
||||
/**
|
||||
* User ID this dialog interacts with.
|
||||
*
|
||||
* @attribute userid
|
||||
* @default 0
|
||||
* @type Number
|
||||
*/
|
||||
userid: {
|
||||
validator: Y.Lang.isNumber,
|
||||
value: 0
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Y.Base.modifyAttrs(Y.namespace('M.core_message.messenger.sendMessage'), {
|
||||
|
||||
/**
|
||||
* List of extra classes.
|
||||
*
|
||||
* @attribute extraClasses
|
||||
* @default ['core_message-messenger-sendmessage']
|
||||
* @type Array
|
||||
*/
|
||||
extraClasses: {
|
||||
value: ['core_message-messenger-sendmessage']
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether to focus on the target that caused the Widget to be shown.
|
||||
*
|
||||
* @attribute focusOnPreviousTargetAfterHide
|
||||
* @default true
|
||||
* @type Node
|
||||
*/
|
||||
focusOnPreviousTargetAfterHide: {
|
||||
value: true
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* Width.
|
||||
*
|
||||
* @attribute width
|
||||
* @default '260px'
|
||||
* @type String|Number
|
||||
*/
|
||||
width: {
|
||||
value: '360px'
|
||||
},
|
||||
|
||||
/**
|
||||
* Boolean indicating whether or not the Widget is visible.
|
||||
*
|
||||
* @attribute visible
|
||||
* @default false
|
||||
* @type Boolean
|
||||
*/
|
||||
visible: {
|
||||
value: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the widget should be modal or not.
|
||||
*
|
||||
* @attribute modal
|
||||
* @type Boolean
|
||||
* @default true
|
||||
*/
|
||||
modal: {
|
||||
value: true
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether the widget should be draggable or not.
|
||||
*
|
||||
* @attribute draggable
|
||||
* @type Boolean
|
||||
* @default false
|
||||
*/
|
||||
draggable: {
|
||||
value: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Whether to display the dialogue centrally on the screen.
|
||||
*
|
||||
* @attribute center
|
||||
* @type Boolean
|
||||
* @default false
|
||||
*/
|
||||
center: {
|
||||
value: true
|
||||
}
|
||||
|
||||
});
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"moodle-core_message-messenger": {
|
||||
"requires": [
|
||||
"escape",
|
||||
"handlebars",
|
||||
"io-base",
|
||||
"moodle-core-notification-ajaxexception",
|
||||
"moodle-core-notification-alert",
|
||||
"moodle-core-notification-dialogue",
|
||||
"moodle-core-notification-exception"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -584,67 +584,6 @@
|
|||
width: auto;
|
||||
}
|
||||
|
||||
/** Messenger send message dialog */
|
||||
.core_message-messenger-sendmessage-hidden {
|
||||
display: none;
|
||||
}
|
||||
.core_message-messenger-sendmessage {
|
||||
.message-actions {
|
||||
position: relative;
|
||||
}
|
||||
.message-area {
|
||||
height: 240px;
|
||||
max-height: 100%;
|
||||
position: relative;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.message-input {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.box-sizing(border-box);
|
||||
}
|
||||
.message-send {
|
||||
margin: 0;
|
||||
float: right;
|
||||
}
|
||||
.message-notice-area {
|
||||
display: table;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.message-notice {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
> div {
|
||||
background: #eee;
|
||||
padding: 5px;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
.message-footer {
|
||||
margin-top: 3px;
|
||||
line-height: 20px;
|
||||
}
|
||||
.message-history {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.dir-rtl {
|
||||
.core_message-messenger-sendmessage {
|
||||
.message-send {
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.preferences-container {
|
||||
.container-fluid {
|
||||
padding: 0;
|
||||
|
|
|
@ -6241,61 +6241,6 @@ a.ygtvspacer:hover {
|
|||
#page-user-action_redir #edit-messagebody {
|
||||
width: auto;
|
||||
}
|
||||
/** Messenger send message dialog */
|
||||
.core_message-messenger-sendmessage-hidden {
|
||||
display: none;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-actions {
|
||||
position: relative;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-area {
|
||||
height: 240px;
|
||||
max-height: 100%;
|
||||
position: relative;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-input {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-send {
|
||||
margin: 0;
|
||||
float: right;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-notice-area {
|
||||
display: table;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-notice {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-notice > div {
|
||||
background: #eee;
|
||||
padding: 5px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-footer {
|
||||
margin-top: 3px;
|
||||
line-height: 20px;
|
||||
}
|
||||
.core_message-messenger-sendmessage .message-history {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
.dir-rtl .core_message-messenger-sendmessage .message-send {
|
||||
float: left;
|
||||
}
|
||||
.preferences-container .container-fluid {
|
||||
padding: 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue