Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
d99d718836
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
- Avoid `eval` (via `_.template` from lodash).
|
- Avoid `eval` (via `_.template` from lodash).
|
||||||
- Bugfix. Avatars weren't being shown.
|
- Bugfix. Avatars weren't being shown.
|
||||||
|
- Bugfix. Bookmarks list and open rooms list weren't recreated after logging in for a 2nd time (without reloading the browser).
|
||||||
|
- Don't show bookmark toggles when PEP bookmarking not supported by the XMPP server.
|
||||||
- Add LibreJS support
|
- Add LibreJS support
|
||||||
|
|
||||||
## 3.3.3 (2018-02-14)
|
## 3.3.3 (2018-02-14)
|
||||||
|
@ -87,11 +87,10 @@
|
|||||||
this.__super__.renderHeading.apply(this, arguments);
|
this.__super__.renderHeading.apply(this, arguments);
|
||||||
const { _converse } = this.__super__;
|
const { _converse } = this.__super__;
|
||||||
if (_converse.allow_bookmarks) {
|
if (_converse.allow_bookmarks) {
|
||||||
_converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then((identity) => {
|
_converse.checkBookmarksSupport().then((supported) => {
|
||||||
if (_.isNil(identity)) {
|
if (supported) {
|
||||||
return;
|
this.renderBookmarkToggle();
|
||||||
}
|
}
|
||||||
this.renderBookmarkToggle();
|
|
||||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
|
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -530,41 +529,38 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_converse.checkBookmarksSupport = function () {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
Promise.all([
|
||||||
|
_converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid),
|
||||||
|
_converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid)
|
||||||
|
]).then((args) => {
|
||||||
|
resolve(args[0] && (args[1].supported || _converse.allow_public_bookmarks));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const initBookmarks = function () {
|
const initBookmarks = function () {
|
||||||
if (!_converse.allow_bookmarks) {
|
if (!_converse.allow_bookmarks) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Promise.all([
|
_converse.checkBookmarksSupport().then((supported) => {
|
||||||
_converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid),
|
if (supported) {
|
||||||
_converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid)
|
_converse.bookmarks = new _converse.Bookmarks();
|
||||||
]).then((args) => {
|
_converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
|
||||||
const identity = args[0],
|
_converse.bookmarks.fetchBookmarks()
|
||||||
options_support = args[1];
|
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL))
|
||||||
|
.then(() => _converse.emit('bookmarksInitialized'));
|
||||||
if (_.isNil(identity) || (!options_support.supported && !_converse.allow_public_bookmarks)) {
|
} else {
|
||||||
_converse.emit('bookmarksInitialized');
|
_converse.emit('bookmarksInitialized');
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
_converse.bookmarks = new _converse.Bookmarks();
|
|
||||||
_converse.bookmarks.fetchBookmarks().then(() => {
|
|
||||||
_converse.bookmarksview = new _converse.BookmarksView(
|
|
||||||
{'model': _converse.bookmarks}
|
|
||||||
);
|
|
||||||
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR))
|
|
||||||
.then(() => {
|
|
||||||
_converse.emit('bookmarksInitialized');
|
|
||||||
});
|
|
||||||
}).catch((e) => {
|
|
||||||
_converse.log(e, Strophe.LogLevel.ERROR);
|
|
||||||
_converse.emit('bookmarksInitialized');
|
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
Promise.all([
|
u.onMultipleEvents([
|
||||||
_converse.api.waitUntil('chatBoxesFetched'),
|
{'object': _converse, 'event': 'chatBoxesFetched'},
|
||||||
_converse.api.waitUntil('roomsPanelRendered')
|
{'object': _converse, 'event': 'roomsPanelRendered'}
|
||||||
]).then(initBookmarks)
|
], initBookmarks);
|
||||||
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
|
|
||||||
|
|
||||||
_converse.on('connected', () => {
|
_converse.on('connected', () => {
|
||||||
// Add a handler for bookmarks pushed from other connected clients
|
// Add a handler for bookmarks pushed from other connected clients
|
||||||
|
@ -654,6 +654,9 @@
|
|||||||
} else {
|
} else {
|
||||||
_converse._tearDown();
|
_converse._tearDown();
|
||||||
}
|
}
|
||||||
|
// Recreate all the promises
|
||||||
|
_.each(_.keys(_converse.promises), addPromise);
|
||||||
|
|
||||||
_converse.emit('logout');
|
_converse.emit('logout');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -536,7 +536,6 @@
|
|||||||
const new_html = tpl_chatbox_minimize(
|
const new_html = tpl_chatbox_minimize(
|
||||||
{info_minimize: __('Minimize this chat box')}
|
{info_minimize: __('Minimize this chat box')}
|
||||||
);
|
);
|
||||||
|
|
||||||
const el = view.el.querySelector('.toggle-chatbox-button');
|
const el = view.el.querySelector('.toggle-chatbox-button');
|
||||||
if (el) {
|
if (el) {
|
||||||
el.outerHTML = new_html;
|
el.outerHTML = new_html;
|
||||||
@ -553,11 +552,6 @@
|
|||||||
_converse.chatboxviews.trimChats(chatbox);
|
_converse.chatboxviews.trimChats(chatbox);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const logOut = function () {
|
|
||||||
_converse.minimized_chats.remove();
|
|
||||||
};
|
|
||||||
_converse.on('logout', logOut);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
@ -118,7 +118,11 @@
|
|||||||
toHTML () {
|
toHTML () {
|
||||||
return tpl_rooms_list_item(
|
return tpl_rooms_list_item(
|
||||||
_.extend(this.model.toJSON(), {
|
_.extend(this.model.toJSON(), {
|
||||||
'allow_bookmarks': _converse.allow_bookmarks,
|
// XXX: By the time this renders, the _converse.bookmarks
|
||||||
|
// collection should already exist if bookmarks are
|
||||||
|
// supported by the XMPP server. So we can use it
|
||||||
|
// as a check for support (other ways of checking are async).
|
||||||
|
'allow_bookmarks': _converse.allow_bookmarks && _converse.bookmarks,
|
||||||
'info_leave_room': __('Leave this room'),
|
'info_leave_room': __('Leave this room'),
|
||||||
'info_remove_bookmark': __('Unbookmark this room'),
|
'info_remove_bookmark': __('Unbookmark this room'),
|
||||||
'info_add_bookmark': __('Bookmark this room'),
|
'info_add_bookmark': __('Bookmark this room'),
|
||||||
@ -237,18 +241,18 @@
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
Promise.all([
|
if (_converse.allow_bookmarks) {
|
||||||
_converse.api.waitUntil('chatBoxesFetched'),
|
u.onMultipleEvents([
|
||||||
_converse.api.waitUntil('roomsPanelRendered')
|
{'object': _converse, 'event': 'chatBoxesFetched'},
|
||||||
]).then(() => {
|
{'object': _converse, 'event': 'roomsPanelRendered'},
|
||||||
if (_converse.allow_bookmarks) {
|
{'object': _converse, 'event': 'bookmarksInitialized'}
|
||||||
_converse.api.waitUntil('bookmarksInitialized').then(
|
], initRoomsListView);
|
||||||
initRoomsListView
|
} else {
|
||||||
);
|
u.onMultipleEvents([
|
||||||
} else {
|
{'object': _converse, 'event': 'chatBoxesFetched'},
|
||||||
initRoomsListView();
|
{'object': _converse, 'event': 'roomsPanelRendered'}
|
||||||
}
|
], initRoomsListView);
|
||||||
});
|
}
|
||||||
|
|
||||||
_converse.api.listen.on('reconnected', initRoomsListView);
|
_converse.api.listen.on('reconnected', initRoomsListView);
|
||||||
}
|
}
|
||||||
|
22
src/utils.js
22
src/utils.js
@ -654,6 +654,28 @@
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
u.onMultipleEvents = function (events=[], callback) {
|
||||||
|
/* Call the callback once all the events have been triggered
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* (Array) events: An array of objects, with keys `object` and
|
||||||
|
* `event`, representing the event name and the object it's
|
||||||
|
* triggered upon.
|
||||||
|
* (Function) callback: The function to call once all events have
|
||||||
|
* been triggered.
|
||||||
|
*/
|
||||||
|
let triggered = [];
|
||||||
|
|
||||||
|
function handler (result) {
|
||||||
|
triggered.push(result)
|
||||||
|
if (events.length === triggered.length) {
|
||||||
|
callback(triggered);
|
||||||
|
triggered = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_.each(events, (map) => map.object.on(map.event, handler));
|
||||||
|
};
|
||||||
|
|
||||||
u.safeSave = function (model, attributes) {
|
u.safeSave = function (model, attributes) {
|
||||||
if (u.isPersistableModel(model)) {
|
if (u.isPersistableModel(model)) {
|
||||||
model.save(attributes);
|
model.save(attributes);
|
||||||
|
Loading…
Reference in New Issue
Block a user