Commit 57b4dec5 authored by JC Brand's avatar JC Brand

Bugfix. Validation messages wasn't being shown

due to Awesomplete doing things to the DOM and then confusing Snabbdom.
parent 7ee71b01
This diff is collapsed.
...@@ -2855,12 +2855,11 @@ ...@@ -2855,12 +2855,11 @@
} }
}, },
"backbone.vdomview": { "backbone.vdomview": {
"version": "1.0.1", "version": "github:jcbrand/backbone.vdomview#8222ff0c12462846fd3a5d915923e42da49c417f",
"resolved": "https://registry.npmjs.org/backbone.vdomview/-/backbone.vdomview-1.0.1.tgz",
"integrity": "sha512-KBrzWTa3Cyd/PVq4kxcnaF653z9W5zQkP4FYGdgDa2Du4TDbMwbjaGTJa302y34oX1iOvO/BmBrLgYM+RF3F8Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"backbone": "1.3.3" "backbone": "1.3.3",
"snabbdom": "0.7.1"
} }
}, },
"balanced-match": { "balanced-match": {
......
...@@ -142,26 +142,31 @@ ...@@ -142,26 +142,31 @@
toHTML () { toHTML () {
const label_nickname = _converse.xhr_user_search_url ? __('Contact name') : __('Optional nickname'); const label_nickname = _converse.xhr_user_search_url ? __('Contact name') : __('Optional nickname');
return tpl_add_contact_modal(_.extend(this.model.toJSON(), { return tpl_add_contact_modal(_.extend(this.model.toJSON(), {
'_converse': _converse, '_converse': _converse,
'heading_new_contact': __('Add a Contact'), 'heading_new_contact': __('Add a Contact'),
'label_xmpp_address': __('XMPP Address'), 'label_xmpp_address': __('XMPP Address'),
'label_nickname': label_nickname, 'label_nickname': label_nickname,
'contact_placeholder': __('name@example.org'), 'contact_placeholder': __('name@example.org'),
'label_add': __('Add'), 'label_add': __('Add'),
'error_message': __('Please enter a valid XMPP address')
})); }));
}, },
afterRender () { afterRender () {
if (_converse.xhr_user_search_url && _.isString(_converse.xhr_user_search_url)) { if (_converse.xhr_user_search_url && _.isString(_converse.xhr_user_search_url)) {
this.initXHRAutoComplete(); this.initXHRAutoComplete(this.el);
} else { } else {
this.initJIDAutoComplete(); this.initJIDAutoComplete(this.el);
} }
const jid_input = this.el.querySelector('input[name="jid"]');
this.el.addEventListener('shown.bs.modal', () => {
jid_input.focus();
}, false);
}, },
initJIDAutoComplete () { initJIDAutoComplete (root) {
const jid_input = this.el.querySelector('input[name="jid"]'); const jid_input = root.querySelector('input[name="jid"]');
const list = _.uniq(_converse.roster.map((item) => Strophe.getDomainFromJid(item.get('jid')))); const list = _.uniq(_converse.roster.map((item) => Strophe.getDomainFromJid(item.get('jid'))));
new Awesomplete(jid_input, { new Awesomplete(jid_input, {
'list': list, 'list': list,
...@@ -170,12 +175,9 @@ ...@@ -170,12 +175,9 @@
}, },
'filter': Awesomplete.FILTER_STARTSWITH 'filter': Awesomplete.FILTER_STARTSWITH
}); });
this.el.addEventListener('shown.bs.modal', () => {
jid_input.focus();
}, false);
}, },
initXHRAutoComplete () { initXHRAutoComplete (root) {
const name_input = this.el.querySelector('input[name="name"]'); const name_input = this.el.querySelector('input[name="name"]');
const jid_input = this.el.querySelector('input[name="jid"]'); const jid_input = this.el.querySelector('input[name="jid"]');
const awesomplete = new Awesomplete(name_input, { const awesomplete = new Awesomplete(name_input, {
...@@ -200,9 +202,6 @@ ...@@ -200,9 +202,6 @@
jid_input.value = ev.text.value; jid_input.value = ev.text.value;
name_input.value = ev.text.label; name_input.value = ev.text.label;
}); });
this.el.addEventListener('shown.bs.modal', () => {
name_input.focus();
}, false);
}, },
addContactFromForm (ev) { addContactFromForm (ev) {
...@@ -210,14 +209,14 @@ ...@@ -210,14 +209,14 @@
const data = new FormData(ev.target), const data = new FormData(ev.target),
jid = data.get('jid'), jid = data.get('jid'),
name = data.get('name'); name = data.get('name');
ev.target.reset();
if (!jid || _.compact(jid.split('@')).length < 2) { if (!jid || _.compact(jid.split('@')).length < 2) {
this.model.set({ // XXX: we have to do this manually, instead of via
'error_message': __('Please enter a valid XMPP address'), // toHTML because Awesomplete messes things up and
'jid': jid // confuses Snabbdom
}) u.addClass('is-invalid', this.el.querySelector('input[name="jid"]'));
u.addClass('d-block', this.el.querySelector('.invalid-feedback'));
} else { } else {
ev.target.reset();
_converse.roster.addAndSubscribe(jid, name); _converse.roster.addAndSubscribe(jid, name);
this.model.clear(); this.model.clear();
this.modal.hide(); this.modal.hide();
......
...@@ -11,16 +11,14 @@ ...@@ -11,16 +11,14 @@
<div class="form-group {[ if (o._converse.xhr_user_search_url) { ]} hidden {[ } ]}"> <div class="form-group {[ if (o._converse.xhr_user_search_url) { ]} hidden {[ } ]}">
<label class="clearfix" for="jid">{{{o.label_xmpp_address}}}:</label> <label class="clearfix" for="jid">{{{o.label_xmpp_address}}}:</label>
<input type="text" name="jid" required="required" value="{{{o.jid}}}" <input type="text" name="jid" required="required" value="{{{o.jid}}}"
class="form-control {[ if (o.error_message) { ]} is-invalid {[ } ]}" class="form-control"
placeholder="{{{o.contact_placeholder}}}"/> placeholder="{{{o.contact_placeholder}}}"/>
{[ if (o.error_message) { ]} <div class="invalid-feedback">{{{o.error_message}}}</div>
<div class="invalid-feedback">{{{o.error_message}}}</div>
{[ } ]}
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="clearfix" for="name">{{{o.label_nickname}}}:</label> <label class="clearfix" for="name">{{{o.label_nickname}}}:</label>
<input type="text" name="name" value="{{{o.nickname}}}" <input type="text" name="name" value="{{{o.nickname}}}"
class="form-control {[ if (o.error_message) { ]} is-invalid {[ } ]}" class="form-control"
placeholder="{{{o.nickname_placeholder}}}"/> placeholder="{{{o.nickname_placeholder}}}"/>
</div> </div>
</div> </div>
......
...@@ -16,15 +16,15 @@ const config = { ...@@ -16,15 +16,15 @@ const config = {
module: { module: {
rules: [ rules: [
{ {
test: path.resolve(__dirname, "node_modules/backbone.overview/dist/backbone.orderedlistview"), test: path.resolve(__dirname, "node_modules/backbone.overview/backbone.orderedlistview"),
use: 'imports-loader?backbone.nativeview' use: 'imports-loader?backbone.nativeview'
}, },
{ {
test: path.resolve(__dirname, "node_modules/backbone.overview/dist/backbone.overview"), test: path.resolve(__dirname, "node_modules/backbone.overview/backbone.overview"),
use: 'imports-loader?backbone.nativeview' use: 'imports-loader?backbone.nativeview'
}, },
{ {
test: path.resolve(__dirname, "node_modules/backbone.vdomview/dist/backbone.vdomview"), test: path.resolve(__dirname, "node_modules/backbone.vdomview/backbone.vdomview"),
use: 'imports-loader?backbone.nativeview' use: 'imports-loader?backbone.nativeview'
}, },
{ {
...@@ -83,9 +83,9 @@ const config = { ...@@ -83,9 +83,9 @@ const config = {
"backbone": path.resolve(__dirname, "node_modules/backbone/backbone"), "backbone": path.resolve(__dirname, "node_modules/backbone/backbone"),
"backbone.browserStorage": path.resolve(__dirname, "node_modules/backbone.browserStorage/backbone.browserStorage"), "backbone.browserStorage": path.resolve(__dirname, "node_modules/backbone.browserStorage/backbone.browserStorage"),
"backbone.nativeview": path.resolve(__dirname, "node_modules/backbone.nativeview/backbone.nativeview"), "backbone.nativeview": path.resolve(__dirname, "node_modules/backbone.nativeview/backbone.nativeview"),
"backbone.orderedlistview": path.resolve(__dirname, "node_modules/backbone.overview/dist/backbone.orderedlistview"), "backbone.orderedlistview": path.resolve(__dirname, "node_modules/backbone.overview/backbone.orderedlistview"),
"backbone.overview": path.resolve(__dirname, "node_modules/backbone.overview/dist/backbone.overview"), "backbone.overview": path.resolve(__dirname, "node_modules/backbone.overview/backbone.overview"),
"backbone.vdomview": path.resolve(__dirname, "node_modules/backbone.vdomview/dist/backbone.vdomview"), "backbone.vdomview": path.resolve(__dirname, "node_modules/backbone.vdomview/backbone.vdomview"),
"bootstrap": path.resolve(__dirname, "node_modules/bootstrap.native/dist/bootstrap-native-v4"), "bootstrap": path.resolve(__dirname, "node_modules/bootstrap.native/dist/bootstrap-native-v4"),
"crypto": path.resolve(__dirname, "node_modules/otr/build/dep/crypto"), "crypto": path.resolve(__dirname, "node_modules/otr/build/dep/crypto"),
"emojione": path.resolve(__dirname, "node_modules/emojione/lib/js/emojione"), "emojione": path.resolve(__dirname, "node_modules/emojione/lib/js/emojione"),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment