Updated dist files
This commit is contained in:
parent
d871392039
commit
1d8a45ff88
607
dist/converse-no-dependencies.js
vendored
607
dist/converse-no-dependencies.js
vendored
@ -15455,7 +15455,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
*/
|
||||
var affiliations = _.uniq(_.map(members, 'affiliation'));
|
||||
|
||||
_.each(affiliations, _.partial(this.setAffiliation.bind(this), _, members));
|
||||
return Promise.all(_.map(affiliations, _.partial(this.setAffiliation.bind(this), _, members)));
|
||||
},
|
||||
getJidsWithAffiliations: function getJidsWithAffiliations(affiliations) {
|
||||
var _this8 = this;
|
||||
@ -15494,8 +15494,10 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
* to update the list.
|
||||
*/
|
||||
this.getJidsWithAffiliations(affiliations).then(function (old_members) {
|
||||
_this9.setAffiliations(deltaFunc(members, old_members));
|
||||
});
|
||||
return _this9.setAffiliations(deltaFunc(members, old_members));
|
||||
}).then(function () {
|
||||
return _this9.occupants.fetchMembers();
|
||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
|
||||
},
|
||||
checkForReservedNick: function checkForReservedNick(callback, errback) {
|
||||
/* Use service-discovery to ask the XMPP server whether
|
||||
@ -15819,6 +15821,9 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
if (hash && vcard.get('image_hash') !== hash) {
|
||||
_converse.api.vcard.update(vcard);
|
||||
}
|
||||
},
|
||||
getDisplayName: function getDisplayName() {
|
||||
return this.get('nick') || this.get('jid');
|
||||
}
|
||||
});
|
||||
_converse.ChatRoomOccupants = Backbone.Collection.extend({
|
||||
@ -15828,8 +15833,8 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
var role2 = occupant2.get('role') || 'none';
|
||||
|
||||
if (MUC_ROLE_WEIGHTS[role1] === MUC_ROLE_WEIGHTS[role2]) {
|
||||
var nick1 = occupant1.get('nick').toLowerCase();
|
||||
var nick2 = occupant2.get('nick').toLowerCase();
|
||||
var nick1 = occupant1.getDisplayName().toLowerCase();
|
||||
var nick2 = occupant2.getDisplayName().toLowerCase();
|
||||
return nick1 < nick2 ? -1 : nick1 > nick2 ? 1 : 0;
|
||||
} else {
|
||||
return MUC_ROLE_WEIGHTS[role1] < MUC_ROLE_WEIGHTS[role2] ? -1 : 1;
|
||||
@ -15838,7 +15843,33 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
fetchMembers: function fetchMembers() {
|
||||
var _this10 = this;
|
||||
|
||||
var old_jids = _.uniq(_.concat(_.map(this.where({
|
||||
'affiliation': 'admin'
|
||||
}), function (item) {
|
||||
return item.get('jid');
|
||||
}), _.map(this.where({
|
||||
'affiliation': 'member'
|
||||
}), function (item) {
|
||||
return item.get('jid');
|
||||
}), _.map(this.where({
|
||||
'affiliation': 'owner'
|
||||
}), function (item) {
|
||||
return item.get('jid');
|
||||
})));
|
||||
|
||||
this.chatroom.getJidsWithAffiliations(['member', 'owner', 'admin']).then(function (jids) {
|
||||
_.each(_.difference(old_jids, jids), function (removed_jid) {
|
||||
// Remove absent occupants who've been removed from
|
||||
// the members lists.
|
||||
var occupant = _this10.findOccupant({
|
||||
'jid': removed_jid
|
||||
});
|
||||
|
||||
if (occupant.get('show') === 'offline') {
|
||||
occupant.destroy();
|
||||
}
|
||||
});
|
||||
|
||||
_.each(jids, function (attrs) {
|
||||
var occupant = _this10.findOccupant({
|
||||
'jid': attrs.jid
|
||||
@ -16802,7 +16833,7 @@ return __p
|
||||
});
|
||||
});
|
||||
//# sourceMappingURL=converse-bookmarks.js.map;
|
||||
// Native Javascript for Bootstrap 4 v2.0.21 | © dnp_theme | MIT-License
|
||||
// Native Javascript for Bootstrap 4 v2.0.22 | © dnp_theme | MIT-License
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD support:
|
||||
@ -17035,9 +17066,11 @@ return __p
|
||||
rect = link[getBoundingClientRect](),
|
||||
scroll = parent === DOC[body] ? getScroll() : { x: parent[offsetLeft] + parent[scrollLeft], y: parent[offsetTop] + parent[scrollTop] },
|
||||
linkDimensions = { w: rect[right] - rect[left], h: rect[bottom] - rect[top] },
|
||||
isPopover = hasClass(element,'popover'),
|
||||
topPosition, leftPosition,
|
||||
|
||||
arrow = queryElement('.arrow',element),
|
||||
arrowWidth = arrow[offsetWidth], isPopover = hasClass(element,'popover'),
|
||||
topPosition, leftPosition, arrowTop, arrowLeft,
|
||||
arrowTop, arrowLeft, arrowWidth, arrowHeight,
|
||||
|
||||
halfTopExceed = rect[top] + linkDimensions.h/2 - elementDimensions.h/2 < 0,
|
||||
halfLeftExceed = rect[left] + linkDimensions.w/2 - elementDimensions.w/2 < 0,
|
||||
@ -17055,10 +17088,16 @@ return __p
|
||||
position = position === left && leftExceed ? right : position;
|
||||
position = position === right && rightExceed ? left : position;
|
||||
|
||||
// update tooltip/popover class
|
||||
element.className[indexOf](position) === -1 && (element.className = element.className.replace(tipPositions,position));
|
||||
|
||||
// we check the computed width & height and update here
|
||||
arrowWidth = arrow[offsetWidth]; arrowHeight = arrow[offsetHeight];
|
||||
|
||||
// apply styling to tooltip or popover
|
||||
if ( position === left || position === right ) { // secondary|side positions
|
||||
if ( position === left ) { // LEFT
|
||||
leftPosition = rect[left] + scroll.x - elementDimensions.w;
|
||||
leftPosition = rect[left] + scroll.x - elementDimensions.w - ( isPopover ? arrowWidth : 0 );
|
||||
} else { // RIGHT
|
||||
leftPosition = rect[left] + scroll.x + linkDimensions.w;
|
||||
}
|
||||
@ -17066,48 +17105,42 @@ return __p
|
||||
// adjust top and arrow
|
||||
if (halfTopExceed) {
|
||||
topPosition = rect[top] + scroll.y;
|
||||
arrowTop = linkDimensions.h/2;
|
||||
arrowTop = linkDimensions.h/2 - arrowWidth;
|
||||
} else if (halfBottomExceed) {
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h + linkDimensions.h;
|
||||
arrowTop = elementDimensions.h - linkDimensions.h/2;
|
||||
arrowTop = elementDimensions.h - linkDimensions.h/2 - arrowWidth;
|
||||
} else {
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h/2 + linkDimensions.h/2;
|
||||
arrowTop = elementDimensions.h/2;
|
||||
arrowTop = elementDimensions.h/2 - (isPopover ? arrowHeight*0.9 : arrowHeight/2);
|
||||
}
|
||||
} else if ( position === top || position === bottom ) { // primary|vertical positions
|
||||
if ( position === top) { // TOP
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h;
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h - ( isPopover ? arrowHeight : 0 );
|
||||
} else { // BOTTOM
|
||||
topPosition = rect[top] + scroll.y + linkDimensions.h;
|
||||
}
|
||||
// adjust left | right and also the arrow
|
||||
if (halfLeftExceed) {
|
||||
leftPosition = 0;
|
||||
arrowLeft = rect[left] + linkDimensions.w/2;
|
||||
arrowLeft = rect[left] + linkDimensions.w/2 - arrowWidth;
|
||||
} else if (halfRightExceed) {
|
||||
leftPosition = windowWidth - elementDimensions.w*1.01;
|
||||
arrowLeft = elementDimensions.w - ( windowWidth - rect[left] ) + linkDimensions.w/2;
|
||||
arrowLeft = elementDimensions.w - ( windowWidth - rect[left] ) + linkDimensions.w/2 - arrowWidth/2;
|
||||
} else {
|
||||
leftPosition = rect[left] + scroll.x - elementDimensions.w/2 + linkDimensions.w/2;
|
||||
arrowLeft = elementDimensions.w/2;
|
||||
arrowLeft = elementDimensions.w/2 - arrowWidth/2;
|
||||
}
|
||||
}
|
||||
|
||||
// fixing some CSS bug with Bootstrap 4 alpha
|
||||
topPosition = position === top && isPopover ? topPosition - arrowWidth : topPosition;
|
||||
leftPosition = position === left && isPopover ? leftPosition - arrowWidth : leftPosition;
|
||||
|
||||
// apply style to tooltip/popover and it's arrow
|
||||
// apply style to tooltip/popover and its arrow
|
||||
element[style][top] = topPosition + 'px';
|
||||
element[style][left] = leftPosition + 'px';
|
||||
|
||||
arrowTop && (arrow[style][top] = arrowTop + 'px');
|
||||
arrowLeft && (arrow[style][left] = arrowLeft + 'px');
|
||||
|
||||
element.className[indexOf](position) === -1 && (element.className = element.className.replace(tipPositions,position));
|
||||
};
|
||||
|
||||
BSN.version = '2.0.21';
|
||||
BSN.version = '2.0.22';
|
||||
|
||||
/* Native Javascript for Bootstrap 4 | Alert
|
||||
-------------------------------------------*/
|
||||
@ -17503,7 +17536,7 @@ return __p
|
||||
collapsed = 'collapsed',
|
||||
|
||||
// private methods
|
||||
openAction = function(collapseElement) {
|
||||
openAction = function(collapseElement,toggle) {
|
||||
bootstrapCustomEvent.call(collapseElement, showEvent, component);
|
||||
isAnimating = true;
|
||||
addClass(collapseElement,collapsing);
|
||||
@ -17513,6 +17546,7 @@ return __p
|
||||
emulateTransitionEnd(collapseElement, function() {
|
||||
isAnimating = false;
|
||||
collapseElement[setAttribute](ariaExpanded,'true');
|
||||
toggle[setAttribute](ariaExpanded,'true');
|
||||
removeClass(collapseElement,collapsing);
|
||||
addClass(collapseElement, component);
|
||||
addClass(collapseElement,showClass);
|
||||
@ -17520,7 +17554,7 @@ return __p
|
||||
bootstrapCustomEvent.call(collapseElement, shownEvent, component);
|
||||
});
|
||||
},
|
||||
closeAction = function(collapseElement) {
|
||||
closeAction = function(collapseElement,toggle) {
|
||||
bootstrapCustomEvent.call(collapseElement, hideEvent, component);
|
||||
isAnimating = true;
|
||||
collapseElement[style][height] = collapseElement[scrollHeight] + 'px'; // set height first
|
||||
@ -17533,6 +17567,7 @@ return __p
|
||||
emulateTransitionEnd(collapseElement, function() {
|
||||
isAnimating = false;
|
||||
collapseElement[setAttribute](ariaExpanded,'false');
|
||||
toggle[setAttribute](ariaExpanded,'false');
|
||||
removeClass(collapseElement,collapsing);
|
||||
addClass(collapseElement,component);
|
||||
collapseElement[style][height] = '';
|
||||
@ -17554,7 +17589,7 @@ return __p
|
||||
else { self.hide(); }
|
||||
};
|
||||
this.hide = function() {
|
||||
closeAction(collapse);
|
||||
closeAction(collapse,element);
|
||||
addClass(element,collapsed);
|
||||
};
|
||||
this.show = function() {
|
||||
@ -17564,13 +17599,13 @@ return __p
|
||||
|| queryElement('['+dataToggle+'="'+component+'"][href="#'+activeCollapse.id+'"]',accordion) ),
|
||||
correspondingCollapse = toggle && (toggle[getAttribute](dataTarget) || toggle.href);
|
||||
if ( activeCollapse && toggle && activeCollapse !== collapse ) {
|
||||
closeAction(activeCollapse);
|
||||
closeAction(activeCollapse,toggle);
|
||||
if ( correspondingCollapse.split('#')[1] !== collapse.id ) { addClass(toggle,collapsed); }
|
||||
else { removeClass(toggle,collapsed); }
|
||||
}
|
||||
}
|
||||
|
||||
openAction(collapse);
|
||||
openAction(collapse,element);
|
||||
removeClass(element,collapsed);
|
||||
};
|
||||
|
||||
@ -17860,7 +17895,7 @@ return __p
|
||||
modal[style].display = '';
|
||||
element && (setFocus(element));
|
||||
|
||||
setTimeout(function(){
|
||||
(function(){
|
||||
if (!getElementsByClassName(DOC,component+' '+showClass)[0]) {
|
||||
resetAdjustments();
|
||||
resetScrollbar();
|
||||
@ -17872,7 +17907,7 @@ return __p
|
||||
dismissHandlerToggle();
|
||||
keydownHandlerToggle();
|
||||
}
|
||||
}, 50);
|
||||
}());
|
||||
},
|
||||
// handlers
|
||||
clickHandler = function(e) {
|
||||
@ -17945,9 +17980,9 @@ return __p
|
||||
removeClass(modal,showClass);
|
||||
modal[setAttribute](ariaHidden, true);
|
||||
|
||||
setTimeout(function(){
|
||||
(function(){
|
||||
hasClass(modal,'fade') ? emulateTransitionEnd(modal, triggerHide) : triggerHide();
|
||||
}, supportTransitions ? 150 : 0);
|
||||
}());
|
||||
};
|
||||
this.setContent = function( content ) {
|
||||
queryElement('.'+component+'-content',modal)[innerHTML] = content;
|
||||
@ -18365,7 +18400,7 @@ return __p
|
||||
e[preventDefault]();
|
||||
next = e[target][getAttribute](dataToggle) === component || (href && href.charAt(0) === '#')
|
||||
? e[target] : e[target][parentNode]; // allow for child elements like icons to use the handler
|
||||
!tabs[isAnimating] && !hasClass(next[parentNode],active) && self.show();
|
||||
!tabs[isAnimating] && !hasClass(next,active) && self.show();
|
||||
};
|
||||
|
||||
// public method
|
||||
@ -20242,7 +20277,9 @@ __p += '\n <p class="user-custom-message">' +
|
||||
__e( o.status ) +
|
||||
'</p>\n </div>\n </div>\n </div>\n <div class="chatbox-buttons row no-gutters">\n <a class="chatbox-btn close-chatbox-button fa fa-close" title=' +
|
||||
__e(o.info_close) +
|
||||
'></a>\n <!-- <a class="chatbox-btn fa fa-vcard" title="Contact profile" data-toggle="modal" data-target="#contactProfileModal"></a> -->\n </div>\n</div>\n';
|
||||
'></a>\n <a class="chatbox-btn show-user-details-modal fa fa-vcard" title="' +
|
||||
__e(o.info_details) +
|
||||
'"></a>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
@ -20404,6 +20441,84 @@ return __p
|
||||
};});
|
||||
|
||||
|
||||
define('tpl!user_details_modal', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
|
||||
function print() { __p += __j.call(arguments, '') }
|
||||
__p += '<div class="modal fade" id="user-profile-modal" tabindex="-1" role="dialog" aria-labelledby="user-profile-modal-label" aria-hidden="true">\n <div class="modal-dialog" role="document">\n <div class="modal-content">\n <div class="modal-header">\n <h5 class="modal-title" id="user-profile-modal-label">' +
|
||||
__e(o.display_name) +
|
||||
'</h5>\n <button type="button" class="close" data-dismiss="modal" aria-label="' +
|
||||
__e(o.label_close) +
|
||||
'"><span aria-hidden="true">×</span></button>\n </div>\n <div class="modal-body">\n ';
|
||||
if (o.image) { ;
|
||||
__p += '\n <img alt="' +
|
||||
__e(o.alt_profile_image) +
|
||||
'"\n class="img-thumbnail avatar align-self-center mb-3"\n height="100" width="100" src="data:' +
|
||||
__e(o.image_type) +
|
||||
';base64,' +
|
||||
__e(o.image) +
|
||||
'"/>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.fullname) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_fullname) +
|
||||
':</label> ' +
|
||||
__e(o.fullname) +
|
||||
'</p>\n ';
|
||||
} ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_jid) +
|
||||
':</label> ' +
|
||||
__e(o.jid) +
|
||||
'</p>\n ';
|
||||
if (o.nickname) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_nickname) +
|
||||
':</label> ' +
|
||||
__e(o.nickname) +
|
||||
'</p>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.url) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_url) +
|
||||
':</label> <a target="_blank" rel="noopener" href="' +
|
||||
__e(o.url) +
|
||||
'">' +
|
||||
__e(o.url) +
|
||||
'</a></p>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.email) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_email) +
|
||||
':</label> <a href="mailto:' +
|
||||
__e(o.email) +
|
||||
'">' +
|
||||
__e(o.email) +
|
||||
'</a></p>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.role) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_role) +
|
||||
':</label> ' +
|
||||
__e(o.role) +
|
||||
'</p>\n ';
|
||||
} ;
|
||||
__p += '\n </div>\n <div class="modal-footer">\n ';
|
||||
if (o.allow_contact_removal && o.is_roster_contact) { ;
|
||||
__p += '\n <button type="button" class="btn btn-danger remove-contact" data-dismiss="modal"><i class="fa fa-trash"> </i>' +
|
||||
__e(o.label_remove) +
|
||||
'</button>\n ';
|
||||
} ;
|
||||
__p += '\n <button type="button" class="btn btn-secondary" data-dismiss="modal">' +
|
||||
__e(o.label_close) +
|
||||
'</button>\n </div>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
|
||||
define('tpl!toolbar_fileupload', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape;
|
||||
__p += '<li class="upload-file">\n <a class="fa fa-paperclip" title="' +
|
||||
@ -20471,6 +20586,132 @@ return __p
|
||||
};});
|
||||
|
||||
|
||||
define('tpl!alert_modal', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
|
||||
function print() { __p += __j.call(arguments, '') }
|
||||
__p += '<div class="modal" tabindex="-1" role="dialog">\n <div class="modal-dialog" role="document">\n <div class="modal-content">\n <div class="modal-header ' +
|
||||
__e(o.type) +
|
||||
'">\n <h5 class="modal-title">' +
|
||||
__e(o.title) +
|
||||
'</h5>\n <button type="button" class="close" data-dismiss="modal" aria-label="Close">\n <span aria-hidden="true">×</span>\n </button>\n </div>\n <div class="modal-body">';
|
||||
_.each(o.messages, function (message) { ;
|
||||
__p += '\n <p>' +
|
||||
__e(message) +
|
||||
'</p>\n ';
|
||||
}) ;
|
||||
__p += '\n </div>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
// Converse.js
|
||||
// http://conversejs.org
|
||||
//
|
||||
// Copyright (c) 2018, the Converse.js developers
|
||||
// Licensed under the Mozilla Public License (MPLv2)
|
||||
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define('converse-modal',[
|
||||
"converse-core",
|
||||
"tpl!alert_modal",
|
||||
"bootstrap",
|
||||
"backbone.vdomview"
|
||||
], factory);
|
||||
}
|
||||
}(this, function (converse, tpl_alert_modal, bootstrap) {
|
||||
"use strict";
|
||||
|
||||
const { Strophe, Backbone, _ } = converse.env;
|
||||
|
||||
converse.plugins.add('converse-modal', {
|
||||
|
||||
initialize () {
|
||||
const { _converse } = this;
|
||||
|
||||
_converse.BootstrapModal = Backbone.VDOMView.extend({
|
||||
|
||||
initialize () {
|
||||
this.render().insertIntoDOM();
|
||||
this.modal = new bootstrap.Modal(this.el, {
|
||||
backdrop: 'static',
|
||||
keyboard: true
|
||||
});
|
||||
this.el.addEventListener('hide.bs.modal', (event) => {
|
||||
if (!_.isNil(this.trigger_el)) {
|
||||
this.trigger_el.classList.remove('selected');
|
||||
}
|
||||
}, false);
|
||||
},
|
||||
|
||||
insertIntoDOM () {
|
||||
const container_el = _converse.chatboxviews.el.querySelector("#converse-modals");
|
||||
container_el.insertAdjacentElement('beforeEnd', this.el);
|
||||
},
|
||||
|
||||
show (ev) {
|
||||
if (ev) {
|
||||
ev.preventDefault();
|
||||
this.trigger_el = ev.target;
|
||||
this.trigger_el.classList.add('selected');
|
||||
}
|
||||
this.modal.show();
|
||||
}
|
||||
});
|
||||
|
||||
_converse.Alert = _converse.BootstrapModal.extend({
|
||||
|
||||
initialize () {
|
||||
_converse.BootstrapModal.prototype.initialize.apply(this, arguments);
|
||||
this.model.on('change', this.render, this);
|
||||
},
|
||||
|
||||
toHTML () {
|
||||
return tpl_alert_modal(this.model.toJSON());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/************************ BEGIN API ************************/
|
||||
// We extend the default converse.js API to add methods specific to MUC chat rooms.
|
||||
let alert
|
||||
|
||||
_.extend(_converse.api, {
|
||||
'alert': {
|
||||
'show' (type, title, messages) {
|
||||
if (_.isString(messages)) {
|
||||
messages = [messages];
|
||||
}
|
||||
if (type === Strophe.LogLevel.ERROR) {
|
||||
type = 'alert-danger';
|
||||
} else if (type === Strophe.LogLevel.INFO) {
|
||||
type = 'alert-info';
|
||||
} else if (type === Strophe.LogLevel.WARN) {
|
||||
type = 'alert-warning';
|
||||
}
|
||||
|
||||
if (_.isUndefined(alert)) {
|
||||
const model = new Backbone.Model({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
})
|
||||
alert = new _converse.Alert({'model': model});
|
||||
} else {
|
||||
alert.model.set({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
});
|
||||
}
|
||||
alert.show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}));
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* filesize
|
||||
@ -20895,6 +21136,12 @@ return __p
|
||||
});
|
||||
}
|
||||
|
||||
_converse.api.waitUntil('rosterContactsFetched').then(function () {
|
||||
_this4.addRelatedContact(_converse.roster.findWhere({
|
||||
'jid': _this4.get('jid')
|
||||
}));
|
||||
});
|
||||
|
||||
this.messages = new _converse.Messages();
|
||||
this.messages.browserStorage = new Backbone.BrowserStorage[_converse.message_storage](b64_sha1("converse.messages".concat(this.get('jid')).concat(_converse.bare_jid)));
|
||||
this.messages.chatbox = this;
|
||||
@ -20912,6 +21159,15 @@ return __p
|
||||
'user_id': Strophe.getNodeFromJid(this.get('jid'))
|
||||
});
|
||||
},
|
||||
addRelatedContact: function addRelatedContact(contact) {
|
||||
if (!_.isUndefined(contact)) {
|
||||
this.contact = contact;
|
||||
this.trigger('contactAdded', contact);
|
||||
}
|
||||
},
|
||||
getDisplayName: function getDisplayName() {
|
||||
return this.vcard.get('fullname') || this.get('jid');
|
||||
},
|
||||
createMessageStanza: function createMessageStanza(message) {
|
||||
/* Given a _converse.Message Backbone.Model, return the XML
|
||||
* stanza that represents it.
|
||||
@ -21447,6 +21703,19 @@ return __p
|
||||
|
||||
_converse.on('chatBoxesFetched', autoJoinChats);
|
||||
|
||||
_converse.api.waitUntil('rosterContactsFetched').then(function () {
|
||||
_converse.roster.on('add', function (contact) {
|
||||
/* When a new contact is added, check if we already have a
|
||||
* chatbox open for it, and if so attach it to the chatbox.
|
||||
*/
|
||||
var chatbox = _converse.chatboxes.findWhere({
|
||||
'jid': contact.get('jid')
|
||||
});
|
||||
|
||||
chatbox.addRelatedContact(contact);
|
||||
});
|
||||
});
|
||||
|
||||
_converse.on('addClientFeatures', function () {
|
||||
_converse.api.disco.addFeature(Strophe.NS.HTTPUPLOAD);
|
||||
|
||||
@ -21877,8 +22146,8 @@ return __p
|
||||
// Copyright (c) 2012-2018, the Converse.js developers
|
||||
// Licensed under the Mozilla Public License (MPLv2)
|
||||
(function (root, factory) {
|
||||
define('converse-chatview',["converse-core", "bootstrap", "emojione", "xss", "tpl!action", "tpl!chatbox", "tpl!chatbox_head", "tpl!chatbox_message_form", "tpl!emojis", "tpl!error_message", "tpl!help_message", "tpl!info", "tpl!new_day", "tpl!toolbar_fileupload", "tpl!spinner", "tpl!spoiler_button", "tpl!status_message", "tpl!toolbar", "converse-chatboxes", "converse-message-view"], factory);
|
||||
})(this, function (converse, bootstrap, emojione, xss, tpl_action, tpl_chatbox, tpl_chatbox_head, tpl_chatbox_message_form, tpl_emojis, tpl_error_message, tpl_help_message, tpl_info, tpl_new_day, tpl_toolbar_fileupload, tpl_spinner, tpl_spoiler_button, tpl_status_message, tpl_toolbar) {
|
||||
define('converse-chatview',["converse-core", "bootstrap", "emojione", "xss", "tpl!action", "tpl!chatbox", "tpl!chatbox_head", "tpl!chatbox_message_form", "tpl!emojis", "tpl!error_message", "tpl!help_message", "tpl!info", "tpl!new_day", "tpl!user_details_modal", "tpl!toolbar_fileupload", "tpl!spinner", "tpl!spoiler_button", "tpl!status_message", "tpl!toolbar", "converse-modal", "converse-chatboxes", "converse-message-view"], factory);
|
||||
})(this, function (converse, bootstrap, emojione, xss, tpl_action, tpl_chatbox, tpl_chatbox_head, tpl_chatbox_message_form, tpl_emojis, tpl_error_message, tpl_help_message, tpl_info, tpl_new_day, tpl_user_details_modal, tpl_toolbar_fileupload, tpl_spinner, tpl_spoiler_button, tpl_status_message, tpl_toolbar) {
|
||||
"use strict";
|
||||
|
||||
var _converse$env = converse.env,
|
||||
@ -21907,7 +22176,7 @@ return __p
|
||||
*
|
||||
* NB: These plugins need to have already been loaded via require.js.
|
||||
*/
|
||||
dependencies: ["converse-chatboxes", "converse-disco", "converse-message-view"],
|
||||
dependencies: ["converse-chatboxes", "converse-disco", "converse-message-view", "converse-modal"],
|
||||
overrides: {
|
||||
// Overrides mentioned here will be picked up by converse.js's
|
||||
// plugin architecture they will replace existing methods on the
|
||||
@ -22060,6 +22329,70 @@ return __p
|
||||
});
|
||||
}
|
||||
});
|
||||
_converse.UserDetailsModal = _converse.BootstrapModal.extend({
|
||||
events: {
|
||||
'click button.remove-contact': 'removeContact'
|
||||
},
|
||||
initialize: function initialize() {
|
||||
_converse.BootstrapModal.prototype.initialize.apply(this, arguments);
|
||||
|
||||
this.model.on('contactAdded', this.registerContactEventHandlers, this);
|
||||
this.registerContactEventHandlers();
|
||||
},
|
||||
toHTML: function toHTML() {
|
||||
return tpl_user_details_modal(_.extend(this.model.toJSON(), this.model.vcard.toJSON(), {
|
||||
'allow_contact_removal': _converse.allow_contact_removal,
|
||||
'alt_profile_image': __("The User's Profile Image"),
|
||||
'display_name': this.model.getDisplayName(),
|
||||
'is_roster_contact': !_.isUndefined(this.model.contact),
|
||||
'label_close': __('Close'),
|
||||
'label_email': __('Email'),
|
||||
'label_fullname': __('Full Name'),
|
||||
'label_jid': __('Jabber ID'),
|
||||
'label_nickname': __('Nickname'),
|
||||
'label_remove': __('Remove as contact'),
|
||||
'label_role': __('Role'),
|
||||
'label_url': __('URL')
|
||||
}));
|
||||
},
|
||||
registerContactEventHandlers: function registerContactEventHandlers() {
|
||||
var _this = this;
|
||||
|
||||
if (!_.isUndefined(this.model.contact)) {
|
||||
this.model.contact.on('change', this.render, this);
|
||||
this.model.contact.vcard.on('change', this.render, this);
|
||||
this.model.contact.on('destroy', function () {
|
||||
delete _this.model.contact;
|
||||
|
||||
_this.render();
|
||||
});
|
||||
}
|
||||
},
|
||||
removeContact: function removeContact(ev) {
|
||||
var _this2 = this;
|
||||
|
||||
if (ev && ev.preventDefault) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
if (!_converse.allow_contact_removal) {
|
||||
return;
|
||||
}
|
||||
|
||||
var result = confirm(__("Are you sure you want to remove this contact?"));
|
||||
|
||||
if (result === true) {
|
||||
this.modal.hide();
|
||||
this.model.contact.removeFromRoster(function (iq) {
|
||||
_this2.model.contact.destroy();
|
||||
}, function (err) {
|
||||
_converse.log(err, Strophe.LogLevel.ERROR);
|
||||
|
||||
_converse.api.alert.show(Strophe.LogLevel.ERROR, __('Error'), [__('Sorry, there was an error while trying to remove %1$s as a contact.', _this2.model.contact.getDisplayName())]);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
_converse.ChatBoxView = Backbone.NativeView.extend({
|
||||
length: 200,
|
||||
className: 'chatbox hidden',
|
||||
@ -22068,6 +22401,7 @@ return __p
|
||||
events: {
|
||||
'change input.fileupload': 'onFileSelection',
|
||||
'click .close-chatbox-button': 'close',
|
||||
'click .show-user-details-modal': 'showUserDetailsModal',
|
||||
'click .new-msgs-indicator': 'viewUnreadMessages',
|
||||
'click .send-button': 'onFormSubmitted',
|
||||
'click .toggle-call': 'toggleCall',
|
||||
@ -22150,6 +22484,15 @@ return __p
|
||||
}));
|
||||
this.renderToolbar();
|
||||
},
|
||||
showUserDetailsModal: function showUserDetailsModal(ev) {
|
||||
if (_.isUndefined(this.user_details_modal)) {
|
||||
this.user_details_modal = new _converse.UserDetailsModal({
|
||||
model: this.model
|
||||
});
|
||||
}
|
||||
|
||||
this.user_details_modal.show(ev);
|
||||
},
|
||||
toggleFileUpload: function toggleFileUpload(ev) {
|
||||
this.el.querySelector('input.fileupload').click();
|
||||
},
|
||||
@ -22157,18 +22500,18 @@ return __p
|
||||
this.model.sendFiles(evt.target.files);
|
||||
},
|
||||
addFileUploadButton: function addFileUploadButton(options) {
|
||||
var _this = this;
|
||||
var _this3 = this;
|
||||
|
||||
_converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain).then(function (result) {
|
||||
if (result.length) {
|
||||
_this.el.querySelector('.chat-toolbar').insertAdjacentHTML('beforeend', tpl_toolbar_fileupload({
|
||||
_this3.el.querySelector('.chat-toolbar').insertAdjacentHTML('beforeend', tpl_toolbar_fileupload({
|
||||
'tooltip_upload_file': __('Choose a file to send')
|
||||
}));
|
||||
}
|
||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
|
||||
},
|
||||
addSpoilerButton: function addSpoilerButton(options) {
|
||||
var _this2 = this;
|
||||
var _this4 = this;
|
||||
|
||||
/* Asynchronously adds a button for writing spoiler
|
||||
* messages, based on whether the contact's client supports
|
||||
@ -22189,12 +22532,12 @@ return __p
|
||||
return _converse.api.disco.supports(Strophe.NS.SPOILER, "".concat(contact_jid, "/").concat(resource));
|
||||
})).then(function (results) {
|
||||
if (results.length) {
|
||||
var html = tpl_spoiler_button(_this2.model.toJSON());
|
||||
var html = tpl_spoiler_button(_this4.model.toJSON());
|
||||
|
||||
if (_converse.visible_toolbar_buttons.emoji) {
|
||||
_this2.el.querySelector('.toggle-smiley').insertAdjacentHTML('afterEnd', html);
|
||||
_this4.el.querySelector('.toggle-smiley').insertAdjacentHTML('afterEnd', html);
|
||||
} else {
|
||||
_this2.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
|
||||
_this4.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
|
||||
}
|
||||
}
|
||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
|
||||
@ -22205,6 +22548,11 @@ return __p
|
||||
});
|
||||
this.heading.render();
|
||||
this.heading.chatview = this;
|
||||
|
||||
if (!_.isUndefined(this.model.contact)) {
|
||||
this.model.contact.on('destroy', this.heading.render, this);
|
||||
}
|
||||
|
||||
var flyout = this.el.querySelector('.flyout');
|
||||
flyout.insertBefore(this.heading.el, flyout.querySelector('.chat-body'));
|
||||
return this;
|
||||
@ -22380,10 +22728,10 @@ return __p
|
||||
}
|
||||
},
|
||||
showHelpMessages: function showHelpMessages(msgs, type, spinner) {
|
||||
var _this3 = this;
|
||||
var _this5 = this;
|
||||
|
||||
_.each(msgs, function (msg) {
|
||||
_this3.content.insertAdjacentHTML('beforeend', tpl_help_message({
|
||||
_this5.content.insertAdjacentHTML('beforeend', tpl_help_message({
|
||||
'isodate': moment().format(),
|
||||
'type': type,
|
||||
'message': xss.filterXSS(msg, {
|
||||
@ -23263,132 +23611,6 @@ __e(o.label_search) +
|
||||
return __p
|
||||
};});
|
||||
|
||||
|
||||
define('tpl!alert_modal', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
|
||||
function print() { __p += __j.call(arguments, '') }
|
||||
__p += '<div class="modal" tabindex="-1" role="dialog">\n <div class="modal-dialog" role="document">\n <div class="modal-content">\n <div class="modal-header ' +
|
||||
__e(o.type) +
|
||||
'">\n <h5 class="modal-title">' +
|
||||
__e(o.title) +
|
||||
'</h5>\n <button type="button" class="close" data-dismiss="modal" aria-label="Close">\n <span aria-hidden="true">×</span>\n </button>\n </div>\n <div class="modal-body">';
|
||||
_.each(o.messages, function (message) { ;
|
||||
__p += '\n <p>' +
|
||||
__e(message) +
|
||||
'</p>\n ';
|
||||
}) ;
|
||||
__p += '\n </div>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
// Converse.js
|
||||
// http://conversejs.org
|
||||
//
|
||||
// Copyright (c) 2018, the Converse.js developers
|
||||
// Licensed under the Mozilla Public License (MPLv2)
|
||||
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define('converse-modal',[
|
||||
"converse-core",
|
||||
"tpl!alert_modal",
|
||||
"bootstrap",
|
||||
"backbone.vdomview"
|
||||
], factory);
|
||||
}
|
||||
}(this, function (converse, tpl_alert_modal, bootstrap) {
|
||||
"use strict";
|
||||
|
||||
const { Strophe, Backbone, _ } = converse.env;
|
||||
|
||||
converse.plugins.add('converse-modal', {
|
||||
|
||||
initialize () {
|
||||
const { _converse } = this;
|
||||
|
||||
_converse.BootstrapModal = Backbone.VDOMView.extend({
|
||||
|
||||
initialize () {
|
||||
this.render().insertIntoDOM();
|
||||
this.modal = new bootstrap.Modal(this.el, {
|
||||
backdrop: 'static',
|
||||
keyboard: true
|
||||
});
|
||||
this.el.addEventListener('hide.bs.modal', (event) => {
|
||||
if (!_.isNil(this.trigger_el)) {
|
||||
this.trigger_el.classList.remove('selected');
|
||||
}
|
||||
}, false);
|
||||
},
|
||||
|
||||
insertIntoDOM () {
|
||||
const container_el = _converse.chatboxviews.el.querySelector("#converse-modals");
|
||||
container_el.insertAdjacentElement('beforeEnd', this.el);
|
||||
},
|
||||
|
||||
show (ev) {
|
||||
if (ev) {
|
||||
ev.preventDefault();
|
||||
this.trigger_el = ev.target;
|
||||
this.trigger_el.classList.add('selected');
|
||||
}
|
||||
this.modal.show();
|
||||
}
|
||||
});
|
||||
|
||||
_converse.Alert = _converse.BootstrapModal.extend({
|
||||
|
||||
initialize () {
|
||||
_converse.BootstrapModal.prototype.initialize.apply(this, arguments);
|
||||
this.model.on('change', this.render, this);
|
||||
},
|
||||
|
||||
toHTML () {
|
||||
return tpl_alert_modal(this.model.toJSON());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/************************ BEGIN API ************************/
|
||||
// We extend the default converse.js API to add methods specific to MUC chat rooms.
|
||||
let alert
|
||||
|
||||
_.extend(_converse.api, {
|
||||
'alert': {
|
||||
'show' (type, title, messages) {
|
||||
if (_.isString(messages)) {
|
||||
messages = [messages];
|
||||
}
|
||||
if (type === Strophe.LogLevel.ERROR) {
|
||||
type = 'alert-danger';
|
||||
} else if (type === Strophe.LogLevel.INFO) {
|
||||
type = 'alert-info';
|
||||
} else if (type === Strophe.LogLevel.WARN) {
|
||||
type = 'alert-warning';
|
||||
}
|
||||
|
||||
if (_.isUndefined(alert)) {
|
||||
const model = new Backbone.Model({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
})
|
||||
alert = new _converse.Alert({'model': model});
|
||||
} else {
|
||||
alert.model.set({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
});
|
||||
}
|
||||
alert.show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}));
|
||||
|
||||
// Converse.js
|
||||
// http://conversejs.org
|
||||
//
|
||||
@ -24549,10 +24771,10 @@ __e(o.label_role) +
|
||||
__e(o.role) +
|
||||
'" aria-describedby="vcard-role-help">\n <small id="vcard-role-help" class="form-text text-muted">' +
|
||||
__e(o.label_role_help) +
|
||||
'</small>\n </div>\n </div>\n <div class="modal-footer">\n <button type="submit" class="save-form btn btn-primary">' +
|
||||
__e(o.label_save) +
|
||||
'</button>\n <button type="button" class="btn btn-secondary" data-dismiss="modal">' +
|
||||
'</small>\n </div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-secondary" data-dismiss="modal">' +
|
||||
__e(o.label_close) +
|
||||
'</button>\n <button type="submit" class="save-form btn btn-primary">' +
|
||||
__e(o.label_save) +
|
||||
'</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
@ -28514,7 +28736,7 @@ return __p
|
||||
'click .close-chatbox-button': 'close',
|
||||
'click .configure-chatroom-button': 'getAndRenderConfigurationForm',
|
||||
'click .new-msgs-indicator': 'viewUnreadMessages',
|
||||
'click .occupant': 'onOccupantClicked',
|
||||
'click .occupant-nick': 'onOccupantClicked',
|
||||
'click .send-button': 'onFormSubmitted',
|
||||
'click .toggle-call': 'toggleCall',
|
||||
'click .toggle-occupants': 'toggleOccupants',
|
||||
@ -28778,8 +29000,12 @@ return __p
|
||||
return true;
|
||||
},
|
||||
|
||||
onCommandError () {
|
||||
this.showErrorMessage(__("Error: could not execute the command"), true);
|
||||
onCommandError (err) {
|
||||
_converse.log(err, Strophe.LogLevel.FATAL);
|
||||
this.showErrorMessage(
|
||||
__("Sorry, an error happened while running the command. Check your browser's developer console for details."),
|
||||
true
|
||||
);
|
||||
},
|
||||
|
||||
parseMessageForCommands (text) {
|
||||
@ -28799,14 +29025,20 @@ return __p
|
||||
this.model.setAffiliation('admin',
|
||||
[{ 'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(
|
||||
() => this.model.occupants.fetchMembers(),
|
||||
(err) => this.onCommandError(err)
|
||||
);
|
||||
break;
|
||||
case 'ban':
|
||||
if (!this.validateRoleChangeCommand(command, args)) { break; }
|
||||
this.model.setAffiliation('outcast',
|
||||
[{ 'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(
|
||||
() => this.model.occupants.fetchMembers(),
|
||||
(err) => this.onCommandError(err)
|
||||
);
|
||||
break;
|
||||
case 'deop':
|
||||
if (!this.validateRoleChangeCommand(command, args)) { break; }
|
||||
@ -28851,7 +29083,10 @@ return __p
|
||||
this.model.setAffiliation('member',
|
||||
[{ 'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(
|
||||
() => this.model.occupants.fetchMembers(),
|
||||
(err) => this.onCommandError(err)
|
||||
);
|
||||
break;
|
||||
case 'nick':
|
||||
_converse.connection.send($pres({
|
||||
@ -28865,7 +29100,10 @@ return __p
|
||||
this.model.setAffiliation('owner',
|
||||
[{ 'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(
|
||||
() => this.model.occupants.fetchMembers(),
|
||||
(err) => this.onCommandError(err)
|
||||
);
|
||||
break;
|
||||
case 'op':
|
||||
if (!this.validateRoleChangeCommand(command, args)) { break; }
|
||||
@ -28878,7 +29116,10 @@ return __p
|
||||
this.model.setAffiliation('none',
|
||||
[{ 'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(
|
||||
() => this.model.occupants.fetchMembers(),
|
||||
(err) => this.onCommandError(err)
|
||||
);
|
||||
break;
|
||||
case 'topic':
|
||||
case 'subject':
|
||||
|
616
dist/converse.js
vendored
616
dist/converse.js
vendored
@ -48192,7 +48192,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
*/
|
||||
var affiliations = _.uniq(_.map(members, 'affiliation'));
|
||||
|
||||
_.each(affiliations, _.partial(this.setAffiliation.bind(this), _, members));
|
||||
return Promise.all(_.map(affiliations, _.partial(this.setAffiliation.bind(this), _, members)));
|
||||
},
|
||||
getJidsWithAffiliations: function getJidsWithAffiliations(affiliations) {
|
||||
var _this8 = this;
|
||||
@ -48231,8 +48231,10 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
* to update the list.
|
||||
*/
|
||||
this.getJidsWithAffiliations(affiliations).then(function (old_members) {
|
||||
_this9.setAffiliations(deltaFunc(members, old_members));
|
||||
});
|
||||
return _this9.setAffiliations(deltaFunc(members, old_members));
|
||||
}).then(function () {
|
||||
return _this9.occupants.fetchMembers();
|
||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
|
||||
},
|
||||
checkForReservedNick: function checkForReservedNick(callback, errback) {
|
||||
/* Use service-discovery to ask the XMPP server whether
|
||||
@ -48556,6 +48558,9 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
if (hash && vcard.get('image_hash') !== hash) {
|
||||
_converse.api.vcard.update(vcard);
|
||||
}
|
||||
},
|
||||
getDisplayName: function getDisplayName() {
|
||||
return this.get('nick') || this.get('jid');
|
||||
}
|
||||
});
|
||||
_converse.ChatRoomOccupants = Backbone.Collection.extend({
|
||||
@ -48565,8 +48570,8 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
var role2 = occupant2.get('role') || 'none';
|
||||
|
||||
if (MUC_ROLE_WEIGHTS[role1] === MUC_ROLE_WEIGHTS[role2]) {
|
||||
var nick1 = occupant1.get('nick').toLowerCase();
|
||||
var nick2 = occupant2.get('nick').toLowerCase();
|
||||
var nick1 = occupant1.getDisplayName().toLowerCase();
|
||||
var nick2 = occupant2.getDisplayName().toLowerCase();
|
||||
return nick1 < nick2 ? -1 : nick1 > nick2 ? 1 : 0;
|
||||
} else {
|
||||
return MUC_ROLE_WEIGHTS[role1] < MUC_ROLE_WEIGHTS[role2] ? -1 : 1;
|
||||
@ -48575,7 +48580,33 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
|
||||
fetchMembers: function fetchMembers() {
|
||||
var _this10 = this;
|
||||
|
||||
var old_jids = _.uniq(_.concat(_.map(this.where({
|
||||
'affiliation': 'admin'
|
||||
}), function (item) {
|
||||
return item.get('jid');
|
||||
}), _.map(this.where({
|
||||
'affiliation': 'member'
|
||||
}), function (item) {
|
||||
return item.get('jid');
|
||||
}), _.map(this.where({
|
||||
'affiliation': 'owner'
|
||||
}), function (item) {
|
||||
return item.get('jid');
|
||||
})));
|
||||
|
||||
this.chatroom.getJidsWithAffiliations(['member', 'owner', 'admin']).then(function (jids) {
|
||||
_.each(_.difference(old_jids, jids), function (removed_jid) {
|
||||
// Remove absent occupants who've been removed from
|
||||
// the members lists.
|
||||
var occupant = _this10.findOccupant({
|
||||
'jid': removed_jid
|
||||
});
|
||||
|
||||
if (occupant.get('show') === 'offline') {
|
||||
occupant.destroy();
|
||||
}
|
||||
});
|
||||
|
||||
_.each(jids, function (attrs) {
|
||||
var occupant = _this10.findOccupant({
|
||||
'jid': attrs.jid
|
||||
@ -49539,7 +49570,7 @@ return __p
|
||||
});
|
||||
});
|
||||
//# sourceMappingURL=converse-bookmarks.js.map;
|
||||
// Native Javascript for Bootstrap 4 v2.0.21 | © dnp_theme | MIT-License
|
||||
// Native Javascript for Bootstrap 4 v2.0.22 | © dnp_theme | MIT-License
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD support:
|
||||
@ -49772,9 +49803,11 @@ return __p
|
||||
rect = link[getBoundingClientRect](),
|
||||
scroll = parent === DOC[body] ? getScroll() : { x: parent[offsetLeft] + parent[scrollLeft], y: parent[offsetTop] + parent[scrollTop] },
|
||||
linkDimensions = { w: rect[right] - rect[left], h: rect[bottom] - rect[top] },
|
||||
isPopover = hasClass(element,'popover'),
|
||||
topPosition, leftPosition,
|
||||
|
||||
arrow = queryElement('.arrow',element),
|
||||
arrowWidth = arrow[offsetWidth], isPopover = hasClass(element,'popover'),
|
||||
topPosition, leftPosition, arrowTop, arrowLeft,
|
||||
arrowTop, arrowLeft, arrowWidth, arrowHeight,
|
||||
|
||||
halfTopExceed = rect[top] + linkDimensions.h/2 - elementDimensions.h/2 < 0,
|
||||
halfLeftExceed = rect[left] + linkDimensions.w/2 - elementDimensions.w/2 < 0,
|
||||
@ -49792,10 +49825,16 @@ return __p
|
||||
position = position === left && leftExceed ? right : position;
|
||||
position = position === right && rightExceed ? left : position;
|
||||
|
||||
// update tooltip/popover class
|
||||
element.className[indexOf](position) === -1 && (element.className = element.className.replace(tipPositions,position));
|
||||
|
||||
// we check the computed width & height and update here
|
||||
arrowWidth = arrow[offsetWidth]; arrowHeight = arrow[offsetHeight];
|
||||
|
||||
// apply styling to tooltip or popover
|
||||
if ( position === left || position === right ) { // secondary|side positions
|
||||
if ( position === left ) { // LEFT
|
||||
leftPosition = rect[left] + scroll.x - elementDimensions.w;
|
||||
leftPosition = rect[left] + scroll.x - elementDimensions.w - ( isPopover ? arrowWidth : 0 );
|
||||
} else { // RIGHT
|
||||
leftPosition = rect[left] + scroll.x + linkDimensions.w;
|
||||
}
|
||||
@ -49803,48 +49842,42 @@ return __p
|
||||
// adjust top and arrow
|
||||
if (halfTopExceed) {
|
||||
topPosition = rect[top] + scroll.y;
|
||||
arrowTop = linkDimensions.h/2;
|
||||
arrowTop = linkDimensions.h/2 - arrowWidth;
|
||||
} else if (halfBottomExceed) {
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h + linkDimensions.h;
|
||||
arrowTop = elementDimensions.h - linkDimensions.h/2;
|
||||
arrowTop = elementDimensions.h - linkDimensions.h/2 - arrowWidth;
|
||||
} else {
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h/2 + linkDimensions.h/2;
|
||||
arrowTop = elementDimensions.h/2;
|
||||
arrowTop = elementDimensions.h/2 - (isPopover ? arrowHeight*0.9 : arrowHeight/2);
|
||||
}
|
||||
} else if ( position === top || position === bottom ) { // primary|vertical positions
|
||||
if ( position === top) { // TOP
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h;
|
||||
topPosition = rect[top] + scroll.y - elementDimensions.h - ( isPopover ? arrowHeight : 0 );
|
||||
} else { // BOTTOM
|
||||
topPosition = rect[top] + scroll.y + linkDimensions.h;
|
||||
}
|
||||
// adjust left | right and also the arrow
|
||||
if (halfLeftExceed) {
|
||||
leftPosition = 0;
|
||||
arrowLeft = rect[left] + linkDimensions.w/2;
|
||||
arrowLeft = rect[left] + linkDimensions.w/2 - arrowWidth;
|
||||
} else if (halfRightExceed) {
|
||||
leftPosition = windowWidth - elementDimensions.w*1.01;
|
||||
arrowLeft = elementDimensions.w - ( windowWidth - rect[left] ) + linkDimensions.w/2;
|
||||
arrowLeft = elementDimensions.w - ( windowWidth - rect[left] ) + linkDimensions.w/2 - arrowWidth/2;
|
||||
} else {
|
||||
leftPosition = rect[left] + scroll.x - elementDimensions.w/2 + linkDimensions.w/2;
|
||||
arrowLeft = elementDimensions.w/2;
|
||||
arrowLeft = elementDimensions.w/2 - arrowWidth/2;
|
||||
}
|
||||
}
|
||||
|
||||
// fixing some CSS bug with Bootstrap 4 alpha
|
||||
topPosition = position === top && isPopover ? topPosition - arrowWidth : topPosition;
|
||||
leftPosition = position === left && isPopover ? leftPosition - arrowWidth : leftPosition;
|
||||
|
||||
// apply style to tooltip/popover and it's arrow
|
||||
// apply style to tooltip/popover and its arrow
|
||||
element[style][top] = topPosition + 'px';
|
||||
element[style][left] = leftPosition + 'px';
|
||||
|
||||
arrowTop && (arrow[style][top] = arrowTop + 'px');
|
||||
arrowLeft && (arrow[style][left] = arrowLeft + 'px');
|
||||
|
||||
element.className[indexOf](position) === -1 && (element.className = element.className.replace(tipPositions,position));
|
||||
};
|
||||
|
||||
BSN.version = '2.0.21';
|
||||
BSN.version = '2.0.22';
|
||||
|
||||
/* Native Javascript for Bootstrap 4 | Alert
|
||||
-------------------------------------------*/
|
||||
@ -50240,7 +50273,7 @@ return __p
|
||||
collapsed = 'collapsed',
|
||||
|
||||
// private methods
|
||||
openAction = function(collapseElement) {
|
||||
openAction = function(collapseElement,toggle) {
|
||||
bootstrapCustomEvent.call(collapseElement, showEvent, component);
|
||||
isAnimating = true;
|
||||
addClass(collapseElement,collapsing);
|
||||
@ -50250,6 +50283,7 @@ return __p
|
||||
emulateTransitionEnd(collapseElement, function() {
|
||||
isAnimating = false;
|
||||
collapseElement[setAttribute](ariaExpanded,'true');
|
||||
toggle[setAttribute](ariaExpanded,'true');
|
||||
removeClass(collapseElement,collapsing);
|
||||
addClass(collapseElement, component);
|
||||
addClass(collapseElement,showClass);
|
||||
@ -50257,7 +50291,7 @@ return __p
|
||||
bootstrapCustomEvent.call(collapseElement, shownEvent, component);
|
||||
});
|
||||
},
|
||||
closeAction = function(collapseElement) {
|
||||
closeAction = function(collapseElement,toggle) {
|
||||
bootstrapCustomEvent.call(collapseElement, hideEvent, component);
|
||||
isAnimating = true;
|
||||
collapseElement[style][height] = collapseElement[scrollHeight] + 'px'; // set height first
|
||||
@ -50270,6 +50304,7 @@ return __p
|
||||
emulateTransitionEnd(collapseElement, function() {
|
||||
isAnimating = false;
|
||||
collapseElement[setAttribute](ariaExpanded,'false');
|
||||
toggle[setAttribute](ariaExpanded,'false');
|
||||
removeClass(collapseElement,collapsing);
|
||||
addClass(collapseElement,component);
|
||||
collapseElement[style][height] = '';
|
||||
@ -50291,7 +50326,7 @@ return __p
|
||||
else { self.hide(); }
|
||||
};
|
||||
this.hide = function() {
|
||||
closeAction(collapse);
|
||||
closeAction(collapse,element);
|
||||
addClass(element,collapsed);
|
||||
};
|
||||
this.show = function() {
|
||||
@ -50301,13 +50336,13 @@ return __p
|
||||
|| queryElement('['+dataToggle+'="'+component+'"][href="#'+activeCollapse.id+'"]',accordion) ),
|
||||
correspondingCollapse = toggle && (toggle[getAttribute](dataTarget) || toggle.href);
|
||||
if ( activeCollapse && toggle && activeCollapse !== collapse ) {
|
||||
closeAction(activeCollapse);
|
||||
closeAction(activeCollapse,toggle);
|
||||
if ( correspondingCollapse.split('#')[1] !== collapse.id ) { addClass(toggle,collapsed); }
|
||||
else { removeClass(toggle,collapsed); }
|
||||
}
|
||||
}
|
||||
|
||||
openAction(collapse);
|
||||
openAction(collapse,element);
|
||||
removeClass(element,collapsed);
|
||||
};
|
||||
|
||||
@ -50597,7 +50632,7 @@ return __p
|
||||
modal[style].display = '';
|
||||
element && (setFocus(element));
|
||||
|
||||
setTimeout(function(){
|
||||
(function(){
|
||||
if (!getElementsByClassName(DOC,component+' '+showClass)[0]) {
|
||||
resetAdjustments();
|
||||
resetScrollbar();
|
||||
@ -50609,7 +50644,7 @@ return __p
|
||||
dismissHandlerToggle();
|
||||
keydownHandlerToggle();
|
||||
}
|
||||
}, 50);
|
||||
}());
|
||||
},
|
||||
// handlers
|
||||
clickHandler = function(e) {
|
||||
@ -50682,9 +50717,9 @@ return __p
|
||||
removeClass(modal,showClass);
|
||||
modal[setAttribute](ariaHidden, true);
|
||||
|
||||
setTimeout(function(){
|
||||
(function(){
|
||||
hasClass(modal,'fade') ? emulateTransitionEnd(modal, triggerHide) : triggerHide();
|
||||
}, supportTransitions ? 150 : 0);
|
||||
}());
|
||||
};
|
||||
this.setContent = function( content ) {
|
||||
queryElement('.'+component+'-content',modal)[innerHTML] = content;
|
||||
@ -51102,7 +51137,7 @@ return __p
|
||||
e[preventDefault]();
|
||||
next = e[target][getAttribute](dataToggle) === component || (href && href.charAt(0) === '#')
|
||||
? e[target] : e[target][parentNode]; // allow for child elements like icons to use the handler
|
||||
!tabs[isAnimating] && !hasClass(next[parentNode],active) && self.show();
|
||||
!tabs[isAnimating] && !hasClass(next,active) && self.show();
|
||||
};
|
||||
|
||||
// public method
|
||||
@ -52979,7 +53014,9 @@ __p += '\n <p class="user-custom-message">' +
|
||||
__e( o.status ) +
|
||||
'</p>\n </div>\n </div>\n </div>\n <div class="chatbox-buttons row no-gutters">\n <a class="chatbox-btn close-chatbox-button fa fa-close" title=' +
|
||||
__e(o.info_close) +
|
||||
'></a>\n <!-- <a class="chatbox-btn fa fa-vcard" title="Contact profile" data-toggle="modal" data-target="#contactProfileModal"></a> -->\n </div>\n</div>\n';
|
||||
'></a>\n <a class="chatbox-btn show-user-details-modal fa fa-vcard" title="' +
|
||||
__e(o.info_details) +
|
||||
'"></a>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
@ -53141,6 +53178,84 @@ return __p
|
||||
};});
|
||||
|
||||
|
||||
define('tpl!user_details_modal', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
|
||||
function print() { __p += __j.call(arguments, '') }
|
||||
__p += '<div class="modal fade" id="user-profile-modal" tabindex="-1" role="dialog" aria-labelledby="user-profile-modal-label" aria-hidden="true">\n <div class="modal-dialog" role="document">\n <div class="modal-content">\n <div class="modal-header">\n <h5 class="modal-title" id="user-profile-modal-label">' +
|
||||
__e(o.display_name) +
|
||||
'</h5>\n <button type="button" class="close" data-dismiss="modal" aria-label="' +
|
||||
__e(o.label_close) +
|
||||
'"><span aria-hidden="true">×</span></button>\n </div>\n <div class="modal-body">\n ';
|
||||
if (o.image) { ;
|
||||
__p += '\n <img alt="' +
|
||||
__e(o.alt_profile_image) +
|
||||
'"\n class="img-thumbnail avatar align-self-center mb-3"\n height="100" width="100" src="data:' +
|
||||
__e(o.image_type) +
|
||||
';base64,' +
|
||||
__e(o.image) +
|
||||
'"/>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.fullname) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_fullname) +
|
||||
':</label> ' +
|
||||
__e(o.fullname) +
|
||||
'</p>\n ';
|
||||
} ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_jid) +
|
||||
':</label> ' +
|
||||
__e(o.jid) +
|
||||
'</p>\n ';
|
||||
if (o.nickname) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_nickname) +
|
||||
':</label> ' +
|
||||
__e(o.nickname) +
|
||||
'</p>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.url) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_url) +
|
||||
':</label> <a target="_blank" rel="noopener" href="' +
|
||||
__e(o.url) +
|
||||
'">' +
|
||||
__e(o.url) +
|
||||
'</a></p>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.email) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_email) +
|
||||
':</label> <a href="mailto:' +
|
||||
__e(o.email) +
|
||||
'">' +
|
||||
__e(o.email) +
|
||||
'</a></p>\n ';
|
||||
} ;
|
||||
__p += '\n ';
|
||||
if (o.role) { ;
|
||||
__p += '\n <p><label>' +
|
||||
__e(o.label_role) +
|
||||
':</label> ' +
|
||||
__e(o.role) +
|
||||
'</p>\n ';
|
||||
} ;
|
||||
__p += '\n </div>\n <div class="modal-footer">\n ';
|
||||
if (o.allow_contact_removal && o.is_roster_contact) { ;
|
||||
__p += '\n <button type="button" class="btn btn-danger remove-contact" data-dismiss="modal"><i class="fa fa-trash"> </i>' +
|
||||
__e(o.label_remove) +
|
||||
'</button>\n ';
|
||||
} ;
|
||||
__p += '\n <button type="button" class="btn btn-secondary" data-dismiss="modal">' +
|
||||
__e(o.label_close) +
|
||||
'</button>\n </div>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
|
||||
define('tpl!toolbar_fileupload', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape;
|
||||
__p += '<li class="upload-file">\n <a class="fa fa-paperclip" title="' +
|
||||
@ -53208,6 +53323,128 @@ return __p
|
||||
};});
|
||||
|
||||
|
||||
define('tpl!alert_modal', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
|
||||
function print() { __p += __j.call(arguments, '') }
|
||||
__p += '<div class="modal" tabindex="-1" role="dialog">\n <div class="modal-dialog" role="document">\n <div class="modal-content">\n <div class="modal-header ' +
|
||||
__e(o.type) +
|
||||
'">\n <h5 class="modal-title">' +
|
||||
__e(o.title) +
|
||||
'</h5>\n <button type="button" class="close" data-dismiss="modal" aria-label="Close">\n <span aria-hidden="true">×</span>\n </button>\n </div>\n <div class="modal-body">';
|
||||
_.each(o.messages, function (message) { ;
|
||||
__p += '\n <p>' +
|
||||
__e(message) +
|
||||
'</p>\n ';
|
||||
}) ;
|
||||
__p += '\n </div>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
// Converse.js
|
||||
// http://conversejs.org
|
||||
//
|
||||
// Copyright (c) 2018, the Converse.js developers
|
||||
// Licensed under the Mozilla Public License (MPLv2)
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define('converse-modal',["converse-core", "tpl!alert_modal", "bootstrap", "backbone.vdomview"], factory);
|
||||
}
|
||||
})(this, function (converse, tpl_alert_modal, bootstrap) {
|
||||
"use strict";
|
||||
|
||||
var _converse$env = converse.env,
|
||||
Strophe = _converse$env.Strophe,
|
||||
Backbone = _converse$env.Backbone,
|
||||
_ = _converse$env._;
|
||||
converse.plugins.add('converse-modal', {
|
||||
initialize: function initialize() {
|
||||
var _converse = this._converse;
|
||||
_converse.BootstrapModal = Backbone.VDOMView.extend({
|
||||
initialize: function initialize() {
|
||||
var _this = this;
|
||||
|
||||
this.render().insertIntoDOM();
|
||||
this.modal = new bootstrap.Modal(this.el, {
|
||||
backdrop: 'static',
|
||||
keyboard: true
|
||||
});
|
||||
this.el.addEventListener('hide.bs.modal', function (event) {
|
||||
if (!_.isNil(_this.trigger_el)) {
|
||||
_this.trigger_el.classList.remove('selected');
|
||||
}
|
||||
}, false);
|
||||
},
|
||||
insertIntoDOM: function insertIntoDOM() {
|
||||
var container_el = _converse.chatboxviews.el.querySelector("#converse-modals");
|
||||
|
||||
container_el.insertAdjacentElement('beforeEnd', this.el);
|
||||
},
|
||||
show: function show(ev) {
|
||||
if (ev) {
|
||||
ev.preventDefault();
|
||||
this.trigger_el = ev.target;
|
||||
this.trigger_el.classList.add('selected');
|
||||
}
|
||||
|
||||
this.modal.show();
|
||||
}
|
||||
});
|
||||
_converse.Alert = _converse.BootstrapModal.extend({
|
||||
initialize: function initialize() {
|
||||
_converse.BootstrapModal.prototype.initialize.apply(this, arguments);
|
||||
|
||||
this.model.on('change', this.render, this);
|
||||
},
|
||||
toHTML: function toHTML() {
|
||||
return tpl_alert_modal(this.model.toJSON());
|
||||
}
|
||||
});
|
||||
/************************ BEGIN API ************************/
|
||||
// We extend the default converse.js API to add methods specific to MUC chat rooms.
|
||||
|
||||
var alert;
|
||||
|
||||
_.extend(_converse.api, {
|
||||
'alert': {
|
||||
'show': function show(type, title, messages) {
|
||||
if (_.isString(messages)) {
|
||||
messages = [messages];
|
||||
}
|
||||
|
||||
if (type === Strophe.LogLevel.ERROR) {
|
||||
type = 'alert-danger';
|
||||
} else if (type === Strophe.LogLevel.INFO) {
|
||||
type = 'alert-info';
|
||||
} else if (type === Strophe.LogLevel.WARN) {
|
||||
type = 'alert-warning';
|
||||
}
|
||||
|
||||
if (_.isUndefined(alert)) {
|
||||
var model = new Backbone.Model({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
});
|
||||
alert = new _converse.Alert({
|
||||
'model': model
|
||||
});
|
||||
} else {
|
||||
alert.model.set({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
});
|
||||
}
|
||||
|
||||
alert.show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
//# sourceMappingURL=converse-modal.js.map;
|
||||
|
||||
|
||||
/**
|
||||
* filesize
|
||||
@ -53632,6 +53869,12 @@ return __p
|
||||
});
|
||||
}
|
||||
|
||||
_converse.api.waitUntil('rosterContactsFetched').then(function () {
|
||||
_this4.addRelatedContact(_converse.roster.findWhere({
|
||||
'jid': _this4.get('jid')
|
||||
}));
|
||||
});
|
||||
|
||||
this.messages = new _converse.Messages();
|
||||
this.messages.browserStorage = new Backbone.BrowserStorage[_converse.message_storage](b64_sha1("converse.messages".concat(this.get('jid')).concat(_converse.bare_jid)));
|
||||
this.messages.chatbox = this;
|
||||
@ -53649,6 +53892,15 @@ return __p
|
||||
'user_id': Strophe.getNodeFromJid(this.get('jid'))
|
||||
});
|
||||
},
|
||||
addRelatedContact: function addRelatedContact(contact) {
|
||||
if (!_.isUndefined(contact)) {
|
||||
this.contact = contact;
|
||||
this.trigger('contactAdded', contact);
|
||||
}
|
||||
},
|
||||
getDisplayName: function getDisplayName() {
|
||||
return this.vcard.get('fullname') || this.get('jid');
|
||||
},
|
||||
createMessageStanza: function createMessageStanza(message) {
|
||||
/* Given a _converse.Message Backbone.Model, return the XML
|
||||
* stanza that represents it.
|
||||
@ -54184,6 +54436,19 @@ return __p
|
||||
|
||||
_converse.on('chatBoxesFetched', autoJoinChats);
|
||||
|
||||
_converse.api.waitUntil('rosterContactsFetched').then(function () {
|
||||
_converse.roster.on('add', function (contact) {
|
||||
/* When a new contact is added, check if we already have a
|
||||
* chatbox open for it, and if so attach it to the chatbox.
|
||||
*/
|
||||
var chatbox = _converse.chatboxes.findWhere({
|
||||
'jid': contact.get('jid')
|
||||
});
|
||||
|
||||
chatbox.addRelatedContact(contact);
|
||||
});
|
||||
});
|
||||
|
||||
_converse.on('addClientFeatures', function () {
|
||||
_converse.api.disco.addFeature(Strophe.NS.HTTPUPLOAD);
|
||||
|
||||
@ -54582,8 +54847,8 @@ return __p
|
||||
// Copyright (c) 2012-2018, the Converse.js developers
|
||||
// Licensed under the Mozilla Public License (MPLv2)
|
||||
(function (root, factory) {
|
||||
define('converse-chatview',["converse-core", "bootstrap", "emojione", "xss", "tpl!action", "tpl!chatbox", "tpl!chatbox_head", "tpl!chatbox_message_form", "tpl!emojis", "tpl!error_message", "tpl!help_message", "tpl!info", "tpl!new_day", "tpl!toolbar_fileupload", "tpl!spinner", "tpl!spoiler_button", "tpl!status_message", "tpl!toolbar", "converse-chatboxes", "converse-message-view"], factory);
|
||||
})(this, function (converse, bootstrap, emojione, xss, tpl_action, tpl_chatbox, tpl_chatbox_head, tpl_chatbox_message_form, tpl_emojis, tpl_error_message, tpl_help_message, tpl_info, tpl_new_day, tpl_toolbar_fileupload, tpl_spinner, tpl_spoiler_button, tpl_status_message, tpl_toolbar) {
|
||||
define('converse-chatview',["converse-core", "bootstrap", "emojione", "xss", "tpl!action", "tpl!chatbox", "tpl!chatbox_head", "tpl!chatbox_message_form", "tpl!emojis", "tpl!error_message", "tpl!help_message", "tpl!info", "tpl!new_day", "tpl!user_details_modal", "tpl!toolbar_fileupload", "tpl!spinner", "tpl!spoiler_button", "tpl!status_message", "tpl!toolbar", "converse-modal", "converse-chatboxes", "converse-message-view"], factory);
|
||||
})(this, function (converse, bootstrap, emojione, xss, tpl_action, tpl_chatbox, tpl_chatbox_head, tpl_chatbox_message_form, tpl_emojis, tpl_error_message, tpl_help_message, tpl_info, tpl_new_day, tpl_user_details_modal, tpl_toolbar_fileupload, tpl_spinner, tpl_spoiler_button, tpl_status_message, tpl_toolbar) {
|
||||
"use strict";
|
||||
|
||||
var _converse$env = converse.env,
|
||||
@ -54612,7 +54877,7 @@ return __p
|
||||
*
|
||||
* NB: These plugins need to have already been loaded via require.js.
|
||||
*/
|
||||
dependencies: ["converse-chatboxes", "converse-disco", "converse-message-view"],
|
||||
dependencies: ["converse-chatboxes", "converse-disco", "converse-message-view", "converse-modal"],
|
||||
overrides: {
|
||||
// Overrides mentioned here will be picked up by converse.js's
|
||||
// plugin architecture they will replace existing methods on the
|
||||
@ -54765,6 +55030,70 @@ return __p
|
||||
});
|
||||
}
|
||||
});
|
||||
_converse.UserDetailsModal = _converse.BootstrapModal.extend({
|
||||
events: {
|
||||
'click button.remove-contact': 'removeContact'
|
||||
},
|
||||
initialize: function initialize() {
|
||||
_converse.BootstrapModal.prototype.initialize.apply(this, arguments);
|
||||
|
||||
this.model.on('contactAdded', this.registerContactEventHandlers, this);
|
||||
this.registerContactEventHandlers();
|
||||
},
|
||||
toHTML: function toHTML() {
|
||||
return tpl_user_details_modal(_.extend(this.model.toJSON(), this.model.vcard.toJSON(), {
|
||||
'allow_contact_removal': _converse.allow_contact_removal,
|
||||
'alt_profile_image': __("The User's Profile Image"),
|
||||
'display_name': this.model.getDisplayName(),
|
||||
'is_roster_contact': !_.isUndefined(this.model.contact),
|
||||
'label_close': __('Close'),
|
||||
'label_email': __('Email'),
|
||||
'label_fullname': __('Full Name'),
|
||||
'label_jid': __('Jabber ID'),
|
||||
'label_nickname': __('Nickname'),
|
||||
'label_remove': __('Remove as contact'),
|
||||
'label_role': __('Role'),
|
||||
'label_url': __('URL')
|
||||
}));
|
||||
},
|
||||
registerContactEventHandlers: function registerContactEventHandlers() {
|
||||
var _this = this;
|
||||
|
||||
if (!_.isUndefined(this.model.contact)) {
|
||||
this.model.contact.on('change', this.render, this);
|
||||
this.model.contact.vcard.on('change', this.render, this);
|
||||
this.model.contact.on('destroy', function () {
|
||||
delete _this.model.contact;
|
||||
|
||||
_this.render();
|
||||
});
|
||||
}
|
||||
},
|
||||
removeContact: function removeContact(ev) {
|
||||
var _this2 = this;
|
||||
|
||||
if (ev && ev.preventDefault) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
if (!_converse.allow_contact_removal) {
|
||||
return;
|
||||
}
|
||||
|
||||
var result = confirm(__("Are you sure you want to remove this contact?"));
|
||||
|
||||
if (result === true) {
|
||||
this.modal.hide();
|
||||
this.model.contact.removeFromRoster(function (iq) {
|
||||
_this2.model.contact.destroy();
|
||||
}, function (err) {
|
||||
_converse.log(err, Strophe.LogLevel.ERROR);
|
||||
|
||||
_converse.api.alert.show(Strophe.LogLevel.ERROR, __('Error'), [__('Sorry, there was an error while trying to remove %1$s as a contact.', _this2.model.contact.getDisplayName())]);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
_converse.ChatBoxView = Backbone.NativeView.extend({
|
||||
length: 200,
|
||||
className: 'chatbox hidden',
|
||||
@ -54773,6 +55102,7 @@ return __p
|
||||
events: {
|
||||
'change input.fileupload': 'onFileSelection',
|
||||
'click .close-chatbox-button': 'close',
|
||||
'click .show-user-details-modal': 'showUserDetailsModal',
|
||||
'click .new-msgs-indicator': 'viewUnreadMessages',
|
||||
'click .send-button': 'onFormSubmitted',
|
||||
'click .toggle-call': 'toggleCall',
|
||||
@ -54855,6 +55185,15 @@ return __p
|
||||
}));
|
||||
this.renderToolbar();
|
||||
},
|
||||
showUserDetailsModal: function showUserDetailsModal(ev) {
|
||||
if (_.isUndefined(this.user_details_modal)) {
|
||||
this.user_details_modal = new _converse.UserDetailsModal({
|
||||
model: this.model
|
||||
});
|
||||
}
|
||||
|
||||
this.user_details_modal.show(ev);
|
||||
},
|
||||
toggleFileUpload: function toggleFileUpload(ev) {
|
||||
this.el.querySelector('input.fileupload').click();
|
||||
},
|
||||
@ -54862,18 +55201,18 @@ return __p
|
||||
this.model.sendFiles(evt.target.files);
|
||||
},
|
||||
addFileUploadButton: function addFileUploadButton(options) {
|
||||
var _this = this;
|
||||
var _this3 = this;
|
||||
|
||||
_converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain).then(function (result) {
|
||||
if (result.length) {
|
||||
_this.el.querySelector('.chat-toolbar').insertAdjacentHTML('beforeend', tpl_toolbar_fileupload({
|
||||
_this3.el.querySelector('.chat-toolbar').insertAdjacentHTML('beforeend', tpl_toolbar_fileupload({
|
||||
'tooltip_upload_file': __('Choose a file to send')
|
||||
}));
|
||||
}
|
||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
|
||||
},
|
||||
addSpoilerButton: function addSpoilerButton(options) {
|
||||
var _this2 = this;
|
||||
var _this4 = this;
|
||||
|
||||
/* Asynchronously adds a button for writing spoiler
|
||||
* messages, based on whether the contact's client supports
|
||||
@ -54894,12 +55233,12 @@ return __p
|
||||
return _converse.api.disco.supports(Strophe.NS.SPOILER, "".concat(contact_jid, "/").concat(resource));
|
||||
})).then(function (results) {
|
||||
if (results.length) {
|
||||
var html = tpl_spoiler_button(_this2.model.toJSON());
|
||||
var html = tpl_spoiler_button(_this4.model.toJSON());
|
||||
|
||||
if (_converse.visible_toolbar_buttons.emoji) {
|
||||
_this2.el.querySelector('.toggle-smiley').insertAdjacentHTML('afterEnd', html);
|
||||
_this4.el.querySelector('.toggle-smiley').insertAdjacentHTML('afterEnd', html);
|
||||
} else {
|
||||
_this2.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
|
||||
_this4.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
|
||||
}
|
||||
}
|
||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
|
||||
@ -54910,6 +55249,11 @@ return __p
|
||||
});
|
||||
this.heading.render();
|
||||
this.heading.chatview = this;
|
||||
|
||||
if (!_.isUndefined(this.model.contact)) {
|
||||
this.model.contact.on('destroy', this.heading.render, this);
|
||||
}
|
||||
|
||||
var flyout = this.el.querySelector('.flyout');
|
||||
flyout.insertBefore(this.heading.el, flyout.querySelector('.chat-body'));
|
||||
return this;
|
||||
@ -55085,10 +55429,10 @@ return __p
|
||||
}
|
||||
},
|
||||
showHelpMessages: function showHelpMessages(msgs, type, spinner) {
|
||||
var _this3 = this;
|
||||
var _this5 = this;
|
||||
|
||||
_.each(msgs, function (msg) {
|
||||
_this3.content.insertAdjacentHTML('beforeend', tpl_help_message({
|
||||
_this5.content.insertAdjacentHTML('beforeend', tpl_help_message({
|
||||
'isodate': moment().format(),
|
||||
'type': type,
|
||||
'message': xss.filterXSS(msg, {
|
||||
@ -56484,128 +56828,6 @@ define("awesomplete", (function (global) {
|
||||
};
|
||||
}(this)));
|
||||
|
||||
|
||||
define('tpl!alert_modal', ['lodash'], function(_) {return function(o) {
|
||||
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
|
||||
function print() { __p += __j.call(arguments, '') }
|
||||
__p += '<div class="modal" tabindex="-1" role="dialog">\n <div class="modal-dialog" role="document">\n <div class="modal-content">\n <div class="modal-header ' +
|
||||
__e(o.type) +
|
||||
'">\n <h5 class="modal-title">' +
|
||||
__e(o.title) +
|
||||
'</h5>\n <button type="button" class="close" data-dismiss="modal" aria-label="Close">\n <span aria-hidden="true">×</span>\n </button>\n </div>\n <div class="modal-body">';
|
||||
_.each(o.messages, function (message) { ;
|
||||
__p += '\n <p>' +
|
||||
__e(message) +
|
||||
'</p>\n ';
|
||||
}) ;
|
||||
__p += '\n </div>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
|
||||
// Converse.js
|
||||
// http://conversejs.org
|
||||
//
|
||||
// Copyright (c) 2018, the Converse.js developers
|
||||
// Licensed under the Mozilla Public License (MPLv2)
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define('converse-modal',["converse-core", "tpl!alert_modal", "bootstrap", "backbone.vdomview"], factory);
|
||||
}
|
||||
})(this, function (converse, tpl_alert_modal, bootstrap) {
|
||||
"use strict";
|
||||
|
||||
var _converse$env = converse.env,
|
||||
Strophe = _converse$env.Strophe,
|
||||
Backbone = _converse$env.Backbone,
|
||||
_ = _converse$env._;
|
||||
converse.plugins.add('converse-modal', {
|
||||
initialize: function initialize() {
|
||||
var _converse = this._converse;
|
||||
_converse.BootstrapModal = Backbone.VDOMView.extend({
|
||||
initialize: function initialize() {
|
||||
var _this = this;
|
||||
|
||||
this.render().insertIntoDOM();
|
||||
this.modal = new bootstrap.Modal(this.el, {
|
||||
backdrop: 'static',
|
||||
keyboard: true
|
||||
});
|
||||
this.el.addEventListener('hide.bs.modal', function (event) {
|
||||
if (!_.isNil(_this.trigger_el)) {
|
||||
_this.trigger_el.classList.remove('selected');
|
||||
}
|
||||
}, false);
|
||||
},
|
||||
insertIntoDOM: function insertIntoDOM() {
|
||||
var container_el = _converse.chatboxviews.el.querySelector("#converse-modals");
|
||||
|
||||
container_el.insertAdjacentElement('beforeEnd', this.el);
|
||||
},
|
||||
show: function show(ev) {
|
||||
if (ev) {
|
||||
ev.preventDefault();
|
||||
this.trigger_el = ev.target;
|
||||
this.trigger_el.classList.add('selected');
|
||||
}
|
||||
|
||||
this.modal.show();
|
||||
}
|
||||
});
|
||||
_converse.Alert = _converse.BootstrapModal.extend({
|
||||
initialize: function initialize() {
|
||||
_converse.BootstrapModal.prototype.initialize.apply(this, arguments);
|
||||
|
||||
this.model.on('change', this.render, this);
|
||||
},
|
||||
toHTML: function toHTML() {
|
||||
return tpl_alert_modal(this.model.toJSON());
|
||||
}
|
||||
});
|
||||
/************************ BEGIN API ************************/
|
||||
// We extend the default converse.js API to add methods specific to MUC chat rooms.
|
||||
|
||||
var alert;
|
||||
|
||||
_.extend(_converse.api, {
|
||||
'alert': {
|
||||
'show': function show(type, title, messages) {
|
||||
if (_.isString(messages)) {
|
||||
messages = [messages];
|
||||
}
|
||||
|
||||
if (type === Strophe.LogLevel.ERROR) {
|
||||
type = 'alert-danger';
|
||||
} else if (type === Strophe.LogLevel.INFO) {
|
||||
type = 'alert-info';
|
||||
} else if (type === Strophe.LogLevel.WARN) {
|
||||
type = 'alert-warning';
|
||||
}
|
||||
|
||||
if (_.isUndefined(alert)) {
|
||||
var model = new Backbone.Model({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
});
|
||||
alert = new _converse.Alert({
|
||||
'model': model
|
||||
});
|
||||
} else {
|
||||
alert.model.set({
|
||||
'title': title,
|
||||
'messages': messages,
|
||||
'type': type
|
||||
});
|
||||
}
|
||||
|
||||
alert.show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
//# sourceMappingURL=converse-modal.js.map;
|
||||
// Converse.js
|
||||
// http://conversejs.org
|
||||
//
|
||||
@ -57766,10 +57988,10 @@ __e(o.label_role) +
|
||||
__e(o.role) +
|
||||
'" aria-describedby="vcard-role-help">\n <small id="vcard-role-help" class="form-text text-muted">' +
|
||||
__e(o.label_role_help) +
|
||||
'</small>\n </div>\n </div>\n <div class="modal-footer">\n <button type="submit" class="save-form btn btn-primary">' +
|
||||
__e(o.label_save) +
|
||||
'</button>\n <button type="button" class="btn btn-secondary" data-dismiss="modal">' +
|
||||
'</small>\n </div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-secondary" data-dismiss="modal">' +
|
||||
__e(o.label_close) +
|
||||
'</button>\n <button type="submit" class="save-form btn btn-primary">' +
|
||||
__e(o.label_save) +
|
||||
'</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n';
|
||||
return __p
|
||||
};});
|
||||
@ -64189,7 +64411,7 @@ return __p
|
||||
'click .close-chatbox-button': 'close',
|
||||
'click .configure-chatroom-button': 'getAndRenderConfigurationForm',
|
||||
'click .new-msgs-indicator': 'viewUnreadMessages',
|
||||
'click .occupant': 'onOccupantClicked',
|
||||
'click .occupant-nick': 'onOccupantClicked',
|
||||
'click .send-button': 'onFormSubmitted',
|
||||
'click .toggle-call': 'toggleCall',
|
||||
'click .toggle-occupants': 'toggleOccupants',
|
||||
@ -64462,10 +64684,14 @@ return __p
|
||||
|
||||
return true;
|
||||
},
|
||||
onCommandError: function onCommandError() {
|
||||
this.showErrorMessage(__("Error: could not execute the command"), true);
|
||||
onCommandError: function onCommandError(err) {
|
||||
_converse.log(err, Strophe.LogLevel.FATAL);
|
||||
|
||||
this.showErrorMessage(__("Sorry, an error happened while running the command. Check your browser's developer console for details."), true);
|
||||
},
|
||||
parseMessageForCommands: function parseMessageForCommands(text) {
|
||||
var _this4 = this;
|
||||
|
||||
var _super_ = _converse.ChatBoxView.prototype;
|
||||
|
||||
if (_super_.parseMessageForCommands.apply(this, arguments)) {
|
||||
@ -64489,7 +64715,11 @@ return __p
|
||||
this.model.setAffiliation('admin', [{
|
||||
'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(function () {
|
||||
return _this4.model.occupants.fetchMembers();
|
||||
}, function (err) {
|
||||
return _this4.onCommandError(err);
|
||||
});
|
||||
break;
|
||||
|
||||
case 'ban':
|
||||
@ -64500,7 +64730,11 @@ return __p
|
||||
this.model.setAffiliation('outcast', [{
|
||||
'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(function () {
|
||||
return _this4.model.occupants.fetchMembers();
|
||||
}, function (err) {
|
||||
return _this4.onCommandError(err);
|
||||
});
|
||||
break;
|
||||
|
||||
case 'deop':
|
||||
@ -64539,7 +64773,11 @@ return __p
|
||||
this.model.setAffiliation('member', [{
|
||||
'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(function () {
|
||||
return _this4.model.occupants.fetchMembers();
|
||||
}, function (err) {
|
||||
return _this4.onCommandError(err);
|
||||
});
|
||||
break;
|
||||
|
||||
case 'nick':
|
||||
@ -64559,7 +64797,11 @@ return __p
|
||||
this.model.setAffiliation('owner', [{
|
||||
'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(function () {
|
||||
return _this4.model.occupants.fetchMembers();
|
||||
}, function (err) {
|
||||
return _this4.onCommandError(err);
|
||||
});
|
||||
break;
|
||||
|
||||
case 'op':
|
||||
@ -64578,7 +64820,11 @@ return __p
|
||||
this.model.setAffiliation('none', [{
|
||||
'jid': args[0],
|
||||
'reason': args[1]
|
||||
}]).then(null, this.onCommandError.bind(this));
|
||||
}]).then(function () {
|
||||
return _this4.model.occupants.fetchMembers();
|
||||
}, function (err) {
|
||||
return _this4.onCommandError(err);
|
||||
});
|
||||
break;
|
||||
|
||||
case 'topic':
|
||||
@ -64662,7 +64908,7 @@ return __p
|
||||
return this;
|
||||
},
|
||||
renderConfigurationForm: function renderConfigurationForm(stanza) {
|
||||
var _this4 = this;
|
||||
var _this5 = this;
|
||||
|
||||
/* Renders a form given an IQ stanza containing the current
|
||||
* room configuration.
|
||||
@ -64707,14 +64953,14 @@ return __p
|
||||
last_fieldset_el.querySelector('input[type=button]').addEventListener('click', function (ev) {
|
||||
ev.preventDefault();
|
||||
|
||||
_this4.closeForm();
|
||||
_this5.closeForm();
|
||||
});
|
||||
form_el.addEventListener('submit', function (ev) {
|
||||
ev.preventDefault();
|
||||
|
||||
_this4.model.saveConfiguration(ev.target).then(_this4.model.getRoomFeatures.bind(_this4.model));
|
||||
_this5.model.saveConfiguration(ev.target).then(_this5.model.getRoomFeatures.bind(_this5.model));
|
||||
|
||||
_this4.closeForm();
|
||||
_this5.closeForm();
|
||||
}, false);
|
||||
},
|
||||
closeForm: function closeForm() {
|
||||
@ -64979,7 +65225,7 @@ return __p
|
||||
return notification;
|
||||
},
|
||||
showNotificationsforUser: function showNotificationsforUser(notification) {
|
||||
var _this5 = this;
|
||||
var _this6 = this;
|
||||
|
||||
/* Given the notification object generated by
|
||||
* parseXUserElement, display any relevant messages and
|
||||
@ -65001,7 +65247,7 @@ return __p
|
||||
}
|
||||
|
||||
_.each(notification.messages, function (message) {
|
||||
_this5.content.insertAdjacentHTML('beforeend', tpl_info({
|
||||
_this6.content.insertAdjacentHTML('beforeend', tpl_info({
|
||||
'data': '',
|
||||
'isodate': moment().format(),
|
||||
'extra_classes': 'chat-event',
|
||||
|
Loading…
Reference in New Issue
Block a user