Commit bfab4fb8 authored by JC Brand's avatar JC Brand

Better error handling, some handling of legacy forms and css fixes.

updates #117
parent ca552f34
...@@ -127,8 +127,8 @@ ...@@ -127,8 +127,8 @@
} else { } else {
audio = new Audio("/sounds/msg_received.mp3"); audio = new Audio("/sounds/msg_received.mp3");
audio.play(); audio.play();
}
} }
}
}; };
var converse = { var converse = {
...@@ -162,6 +162,10 @@ ...@@ -162,6 +162,10 @@
converse.initialize = function (settings, callback) { converse.initialize = function (settings, callback) {
var converse = this; var converse = this;
// Logging
Strophe.log = function (level, msg) { console.log(level+' '+msg); };
Strophe.error = function (msg) { console.log('ERROR: '+msg); };
// Add Strophe Namespaces // Add Strophe Namespaces
Strophe.addNamespace('REGISTER', 'jabber:iq:register'); Strophe.addNamespace('REGISTER', 'jabber:iq:register');
Strophe.addNamespace('XFORM', 'jabber:x:data'); Strophe.addNamespace('XFORM', 'jabber:x:data');
...@@ -619,12 +623,6 @@ ...@@ -619,12 +623,6 @@
if (this.debug) { if (this.debug) {
this.connection.xmlInput = function (body) { console.log(body); }; this.connection.xmlInput = function (body) { console.log(body); };
this.connection.xmlOutput = function (body) { console.log(body); }; this.connection.xmlOutput = function (body) { console.log(body); };
Strophe.log = function (level, msg) {
console.log(level+' '+msg);
};
Strophe.error = function (msg) {
console.log('ERROR: '+msg);
};
} }
// When reconnecting, there might be some open chat boxes. We don't // When reconnecting, there might be some open chat boxes. We don't
// know whether these boxes are of the same account or not, so we // know whether these boxes are of the same account or not, so we
...@@ -4483,12 +4481,11 @@ ...@@ -4483,12 +4481,11 @@
render: function () { render: function () {
this.$parent.append(this.$el.html( this.$parent.append(this.$el.html(
converse.templates.register_panel({ converse.templates.register_panel({
'label_domain': __('XMPP Provider'), // TODO: make this a dropdown of servers... 'label_domain': __("Give your XMPP provider's domain:"),
'label_register': __('Request Registration Form') 'label_register': __('Request registration form')
}) })
)); ));
this.$tabs.append(converse.templates.register_tab({label_register: __('Register')})); this.$tabs.append(converse.templates.register_tab({label_register: __('Register')}));
this.$el.find('input#jid').focus();
return this; return this;
}, },
...@@ -4533,7 +4530,9 @@ ...@@ -4533,7 +4530,9 @@
return false; return false;
} }
if (register.length === 0) { if (register.length === 0) {
conn._changeConnectStatus(Strophe.Status.REGIFAIL, null); conn._changeConnectStatus(
Strophe.Status.REGIFAIL,
'Sorry, the given provider does not support in band account registration. Please try with a different provider.');
return true; return true;
} }
// Send an IQ stanza to get all required data fields // Send an IQ stanza to get all required data fields
...@@ -4564,7 +4563,8 @@ ...@@ -4564,7 +4563,8 @@
instructions: "", instructions: "",
registered: false, registered: false,
_registering: false, _registering: false,
domain: null domain: null,
form_type: null
}; };
_.extend(this, defaults); _.extend(this, defaults);
if (settings) { if (settings) {
...@@ -4588,7 +4588,11 @@ ...@@ -4588,7 +4588,11 @@
$domain_input.addClass('error'); $domain_input.addClass('error');
return; return;
} }
$form.find('input[type=submit]').hide().after('<span class="spinner login-submit"/>'); $form.find('input[type=submit]').hide()
.after('<button class="cancel hor_centered">Cancel form lookup</button>')
.after('<span class="spinner login-submit"/>')
.after('<p class="info hor_centered">Requesting a registration form from the XMPP server</p>');
$form.find('button.cancel').on('click', $.proxy(this.cancelRegistration, this));
this.reset({ this.reset({
domain: Strophe.getDomainFromJid(domain), domain: Strophe.getDomainFromJid(domain),
_registering: true _registering: true
...@@ -4598,10 +4602,9 @@ ...@@ -4598,10 +4602,9 @@
}, },
giveFeedback: function (message, klass) { giveFeedback: function (message, klass) {
// TODO: need to add feedback element... this.$('.reg-feedback').attr('class', 'reg-feedback').text(message);
this.$('.conn-feedback').attr('class', 'conn-feedback').text(message);
if (klass) { if (klass) {
$('.conn-feedback').addClass(klass); $('.reg-feedback').addClass(klass);
} }
}, },
...@@ -4618,8 +4621,9 @@ ...@@ -4618,8 +4621,9 @@
this.giveFeedback(__('Disconnecting'), 'error'); this.giveFeedback(__('Disconnecting'), 'error');
} }
} else if (status == Strophe.Status.REGIFAIL) { } else if (status == Strophe.Status.REGIFAIL) {
// TODO
converse.log('REGIFAIL'); converse.log('REGIFAIL');
this.cancelRegistration();
if (error) this.giveFeedback(error, 'error');
} else if (status == Strophe.Status.CONFLICT) { } else if (status == Strophe.Status.CONFLICT) {
// TODO // TODO
converse.log('CONFLICT'); converse.log('CONFLICT');
...@@ -4662,16 +4666,29 @@ ...@@ -4662,16 +4666,29 @@
*/ */
var $form= this.$('form'), var $form= this.$('form'),
$stanza = $(stanza), $stanza = $(stanza),
$fields = $stanza.find('field'); $fields;
$form.empty().append($('<p class="title">').text(this.title)); $form.empty().append($('<p class="title">').text(this.title));
$form.append($('<p class="instructions">').text(this.instructions)); $form.append($('<p class="instructions">').text(this.instructions));
_.each($fields, function (field) {
$form.append(utils.xForm2webForm(field)); if (this.form_type == 'xform') {
}); $fields = $stanza.find('field');
$form.append('<input type="submit" class="submit" value="'+__('Register')+'"/>'); _.each($fields, function (field) {
$form.append(utils.xForm2webForm(field));
});
} else {
_.each(Object.keys(this.fields), $.proxy(function (key) {
// TODO:
$form.append('<p>'+key+'</p>');
console.log('need to add form input here...');
}, this));
}
if (this.fields.length) {
$form.append('<input type="submit" class="submit" value="'+__('Register')+'"/>');
$form.on('submit', $.proxy(this.submitRegistrationForm, this));
}
$form.append('<input type="button" class="submit" value="'+__('Cancel')+'"/>'); $form.append('<input type="button" class="submit" value="'+__('Cancel')+'"/>');
$form.on('submit', $.proxy(this.submitRegistrationForm, this));
$form.find('input[type=button]').on('click', $.proxy(this.cancelRegistration, this)); $form.find('input[type=button]').on('click', $.proxy(this.cancelRegistration, this));
}, },
...@@ -4712,7 +4729,8 @@ ...@@ -4712,7 +4729,8 @@
/* Handler, when the user cancels the registration form. /* Handler, when the user cancels the registration form.
*/ */
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
this.render(); // XXX: check if this works. converse.connection.reset();
this.render();
}, },
submitRegistrationForm : function (ev) { submitRegistrationForm : function (ev) {
...@@ -4749,18 +4767,42 @@ ...@@ -4749,18 +4767,42 @@
* Parameters: * Parameters:
* (XMLElement) stanza - the IQ stanza that will be sent to the XMPP server. * (XMLElement) stanza - the IQ stanza that will be sent to the XMPP server.
*/ */
var $query = $(stanza).find('x[xmlns="'+Strophe.NS.XFORM+'"]'); var $query = $(stanza).find('query'), $xform;
if ($query.length > 0) { if ($query.length > 0) {
this.title = $query.find('title').text(); $xform = $query.find('x[xmlns="'+Strophe.NS.XFORM+'"]');
this.instructions = $query.find('instructions').text(); if ($xform.length > 0) {
$query.find('field').each($.proxy(function (idx, field) { this._setFieldsFromXForm($xform);
var name = field.getAttribute('var').toLowerCase(); } else {
var value = $(field).children('value').text(); this._setFieldsFromLegacy($query);
this.fields[name] = value; }
}, this));
} }
}, },
_setFieldsFromLegacy: function ($query) {
$query.children().each($.proxy(function (idx, field) {
if (field.tagName.toLowerCase() === 'instructions') {
this.instructions = Strophe.getText(field);
return;
} else if (field.tagName.toLowerCase() === 'x') {
// TODO:
return;
}
this.fields[field.tagName.toLowerCase()] = Strophe.getText(field);
}, this));
this.form_type = 'legacy';
},
_setFieldsFromXForm: function ($xform) {
this.title = $xform.find('title').text();
this.instructions = $xform.find('instructions').text();
$xform.find('field').each($.proxy(function (idx, field) {
var name = field.getAttribute('var').toLowerCase();
var value = $(field).children('value').text();
this.fields[name] = value;
}, this));
this.form_type = 'xform';
},
_onRegisterIQ: function (stanza) { _onRegisterIQ: function (stanza) {
/* Callback method that gets called when a return IQ stanza /* Callback method that gets called when a return IQ stanza
* is received from the XMPP server, after attempting to * is received from the XMPP server, after attempting to
......
...@@ -481,12 +481,12 @@ ...@@ -481,12 +481,12 @@
transform: rotate(359deg); transform: rotate(359deg);
} }
} }
span.spinner:before { #conversejs .spinner:before {
font-size: 24px; font-size: 24px;
font-family: 'Converse-js' !important; font-family: 'Converse-js' !important;
content: "\231b"; content: "\231b";
} }
span.spinner { #conversejs .spinner {
-webkit-animation: spin 2s infinite linear; -webkit-animation: spin 2s infinite linear;
-moz-animation: spin 2s infinite linear; -moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear; -o-animation: spin 2s infinite linear;
...@@ -495,12 +495,15 @@ span.spinner { ...@@ -495,12 +495,15 @@ span.spinner {
display: block; display: block;
text-align: center; text-align: center;
} }
span.spinner.centered { #conversejs .centered {
text-align: center; text-align: center;
padding-top: 5em; display: block;
margin: 5em auto;
} }
span.spinner.hor_centered { #conversejs .hor_centered {
text-align: center; text-align: center;
display: block;
margin: 0 auto;
} }
#conversejs #minimized-chats .box-flyout { #conversejs #minimized-chats .box-flyout {
position: absolute; position: absolute;
...@@ -737,12 +740,28 @@ span.spinner.hor_centered { ...@@ -737,12 +740,28 @@ span.spinner.hor_centered {
#conversejs div.delayed .chat-message-me { #conversejs div.delayed .chat-message-me {
color: #7EABBB; color: #7EABBB;
} }
input.error { #conversejs input.error {
border: 1px solid red; border: 1px solid red;
} }
#conversejs .conn-feedback.error { #conversejs .error {
color: red; color: red;
} }
#conversejs .form-help {
padding-top: 5px;
font-size: 85%;
color: grey;
}
#converse-register label {
font-weight: bold;
}
#converse-register .form-help .url {
font-weight: bold;
color: #2D617A;
}
#conversejs .reg-feedback {
font-size: 85%;
}
#conversejs .reg-feedback,
#converse-login .conn-feedback { #converse-login .conn-feedback {
width: 100%; width: 100%;
text-align: center; text-align: center;
...@@ -1131,6 +1150,11 @@ dl.add-converse-contact { ...@@ -1131,6 +1150,11 @@ dl.add-converse-contact {
font-weight: bold; font-weight: bold;
font-size: 110%; font-size: 110%;
} }
#conversejs form#converse-register .info {
font-style: italic;
color: green;
font-size: 85%;
}
#conversejs form#converse-register .instructions { #conversejs form#converse-register .instructions {
font-style: italic; font-style: italic;
color: gray; color: gray;
......
...@@ -509,13 +509,13 @@ ...@@ -509,13 +509,13 @@
} }
} }
span.spinner:before { #conversejs .spinner:before {
font-size: 24px; font-size: 24px;
font-family: 'Converse-js' !important; font-family: 'Converse-js' !important;
content: "\231b"; content: "\231b";
} }
span.spinner { #conversejs .spinner {
-webkit-animation: spin 2s infinite linear; -webkit-animation: spin 2s infinite linear;
-moz-animation: spin 2s infinite linear; -moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear; -o-animation: spin 2s infinite linear;
...@@ -525,13 +525,16 @@ span.spinner { ...@@ -525,13 +525,16 @@ span.spinner {
text-align: center; text-align: center;
} }
span.spinner.centered { #conversejs .centered {
text-align: center; text-align: center;
padding-top: 5em; display: block;
margin: 5em auto;
} }
span.spinner.hor_centered { #conversejs .hor_centered {
text-align: center; text-align: center;
display: block;
margin: 0 auto;
} }
#conversejs #minimized-chats .box-flyout { #conversejs #minimized-chats .box-flyout {
...@@ -811,14 +814,35 @@ span.spinner.hor_centered { ...@@ -811,14 +814,35 @@ span.spinner.hor_centered {
color: #7EABBB; color: #7EABBB;
} }
input.error { #conversejs input.error {
border: 1px solid red; border: 1px solid red;
} }
#conversejs .conn-feedback.error { #conversejs .error {
color: red; color: red;
} }
#conversejs .form-help {
padding-top: 5px;
font-size: 85%;
color: grey;
}
#converse-register label {
font-weight: bold;
}
#converse-register .form-help .url {
font-weight: bold;
color: #2D617A;
}
#conversejs .reg-feedback {
font-size: 85%;
}
#conversejs .reg-feedback,
#converse-login .conn-feedback { #converse-login .conn-feedback {
width: 100%; width: 100%;
text-align: center; text-align: center;
...@@ -1275,6 +1299,12 @@ dl.add-converse-contact { ...@@ -1275,6 +1299,12 @@ dl.add-converse-contact {
font-size: 110%; font-size: 110%;
} }
#conversejs form#converse-register .info {
font-style: italic;
color: green;
font-size: 85%;
}
#conversejs form#converse-register .instructions { #conversejs form#converse-register .instructions {
font-style: italic; font-style: italic;
color: gray; color: gray;
......
<form id="converse-register"> <form id="converse-register">
<legend class="form-errors"></legend> <span class="reg-feedback"></span>
<label>{{label_domain}}</label> <label>{{label_domain}}</label>
<input type="text" name="domain" placeholder="e.g. conversejs.org"> <input type="text" name="domain" placeholder="e.g. conversejs.org">
<p class="form-help">Tip: A list of public XMPP providers is available <a href="https://xmpp.net/directory.php" class="url" target="_blank">here</a>.</p>
<input class="submit" type="submit" value="{{label_register}}"> <input class="submit" type="submit" value="{{label_register}}">
<span class="conn-feedback"></span>
</form> </form>
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