diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-02-09 16:13:08 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-02-09 16:13:08 +0100 |
| commit | 5f3301e5cbbb2c6e7bff732761eef80e8dd5a33d (patch) | |
| tree | 48ab6bd9bbda92dea713c0c52bca3396ef939d82 /addons/sms/static/src | |
| parent | 715e602bf04ae5a0c9704c599f2145b2808b31b7 (diff) | |
| parent | 20e4cd5bcd1816a478aedd441efa90a34cf63334 (diff) | |
[MERGE] forward port branch 11.0 up to 20e4cd5bcd1
Diffstat (limited to 'addons/sms/static/src')
| -rw-r--r-- | addons/sms/static/src/js/sms_widget.js | 120 | ||||
| -rw-r--r-- | addons/sms/static/src/tests/sms_widget_test.js | 67 | ||||
| -rw-r--r-- | addons/sms/static/src/xml/sms_widget.xml | 6 |
3 files changed, 193 insertions, 0 deletions
diff --git a/addons/sms/static/src/js/sms_widget.js b/addons/sms/static/src/js/sms_widget.js new file mode 100644 index 00000000000..a01ff3753cf --- /dev/null +++ b/addons/sms/static/src/js/sms_widget.js @@ -0,0 +1,120 @@ +odoo.define('sms.sms_widget', function (require) { +"use strict"; + +var basicFields = require('web.basic_fields'); +var core = require('web.core'); +var fieldRegistry = require('web.field_registry'); +var framework = require('web.framework'); + +var FieldText = basicFields.FieldText; +var QWeb = core.qweb; + +/** + * SmsWidget is a widget to display a textarea (the body) and a text representing + * the number of SMS and the number of characters. This text is computed every + * time the user changes the body. + */ +var SmsWidget = FieldText.extend({ + /** + * @constructor + */ + init: function () { + this._super.apply(this, arguments); + this.nbrChar = 0; + this.nbrSMS = 0; + this.encoding = "GSM7"; + this.tagName = 'div'; + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * Compute the number of characters and sms + * @private + */ + _compute: function () { + var content = this._getValue(); + this.encoding = this._extractEncoding(content); + this.nbrChar = content.length; + this.nbrChar += (content.match(/\n/g) || []).length; + this.nbrSMS = this._countSMS(this.nbrChar, this.encoding); + this._renderSMS(); + }, + /** + * Count the number of SMS of the content + * @private + * @returns {integer} Number of SMS + */ + _countSMS: function () { + if (this.nbrChar === 0) { + return 0; + } + if (this.encoding === 'UNICODE') { + if (this.nbrChar <= 70) { + return 1; + } + return Math.ceil(this.nbrChar / 67); + } + if (this.nbrChar <= 160) { + return 1; + } + return Math.ceil(this.nbrChar / 153); + }, + /** + * @private + * @override + */ + _renderEdit: function () { + this.$el.empty(); + this._prepareInput($('<textarea/>')).appendTo(this.$el); + this.$el.append($(QWeb.render("sms.sms_count", {}))); + this._compute(); + }, + /** + * Extract the encoding depending on the characters in the content + * @private + * @param {String} content Content of the SMS + * @returns {String} Encoding of the content (GSM7 or UNICODE) + */ + _extractEncoding: function (content) { + if (String(content).match(RegExp("^[@£$¥èéùìòÇ\\nØø\\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !\\\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà]*$"))) { + return 'GSM7'; + } + return 'UNICODE'; + }, + /** + * Render the number of characters, sms and the encoding. + * @private + */ + _renderSMS: function () { + this.$('.o_sms_count').text(this.nbrChar + ' / ' + this.nbrSMS + ' SMS (' + this.encoding + ') '); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @override + * @private + */ + _onChange: function () { + this._super.apply(this, arguments); + this._compute(); + }, + /** + * @override + * @private + */ + _onInput: function () { + this._super.apply(this, arguments); + this._compute(); + }, +}); + +fieldRegistry.add('sms_widget', SmsWidget); + +return SmsWidget; +}); diff --git a/addons/sms/static/src/tests/sms_widget_test.js b/addons/sms/static/src/tests/sms_widget_test.js new file mode 100644 index 00000000000..b346c5a6f98 --- /dev/null +++ b/addons/sms/static/src/tests/sms_widget_test.js @@ -0,0 +1,67 @@ +odoo.define('sms.sms_widget_tests', function (require) { +"use strict"; + +var FormView = require('web.FormView'); +var testUtils = require('web.test_utils'); + +var createView = testUtils.createView; + +QUnit.module('fields', { + beforeEach: function () { + this.data = { + partner: { + fields: { + message: {string: "message", type: "text"}, + }, + records: [{ + id: 1, + message: "", + }] + }, + }; + } +}, function () { + + QUnit.module('SmsWidget'); + + QUnit.test('Sms widgets are correctly rendered', function (assert) { + assert.expect(9); + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form><sheet><field name="message" widget="sms_widget"/></sheet></form>', + }); + form.$buttons.find('.o_form_button_edit').click(); + assert.ok(form.$('.o_sms_count').length, "Should have a sms counter"); + assert.strictEqual(form.$('.o_sms_count').text(), '0 / 0 SMS (GSM7) ', 'Should be "0 / 0 SMS (GSM7) " by default'); + // GSM-7 + form.$('.o_input').val("Hello from Odoo").trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '15 / 1 SMS (GSM7) ', 'Should be "15 / 1 SMS (GSM7) " for "Hello from Odoo"'); + // GSM-7 with \n => this one count as 2 characters + form.$('.o_input').val("Hello from Odoo\n").trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '17 / 1 SMS (GSM7) ', 'Should be "17 / 1 SMS (GSM7) " for "Hello from Odoo\\n"'); + // Unicode => ê + form.$('.o_input').val("Hêllo from Odoo").trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '15 / 1 SMS (UNICODE) ', 'Should be "15 / 1 SMS (UNICODE) " for "Hêllo from Odoo"'); + // GSM-7 with 160c + var text = Array(161).join('a'); + form.$('.o_input').val(text).trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '160 / 1 SMS (GSM7) ', 'Should be "160 / 1 SMS (GSM7) " for 160 x "a"'); + // GSM-7 with 161c + text = Array(162).join('a'); + form.$('.o_input').val(text).trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '161 / 2 SMS (GSM7) ', 'Should be "161 / 2 SMS (GSM7) " for 161 x "a"'); + // Unicode with 70c + text = Array(71).join('ê'); + form.$('.o_input').val(text).trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '70 / 1 SMS (UNICODE) ', 'Should be "70 / 1 SMS (UNICODE) " for 70 x "ê"'); + // Unicode with 71c + text = Array(72).join('ê'); + form.$('.o_input').val(text).trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '71 / 2 SMS (UNICODE) ', 'Should be "71 / 2 SMS (UNICODE) " for 71 x "ê"'); + + form.destroy(); + }); +}); +}); diff --git a/addons/sms/static/src/xml/sms_widget.xml b/addons/sms/static/src/xml/sms_widget.xml new file mode 100644 index 00000000000..9969cf2b3c1 --- /dev/null +++ b/addons/sms/static/src/xml/sms_widget.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<templates> + <t t-name="sms.sms_count"> + <span class="pull-right"><span class="text-muted o_sms_count"></span> <a href="https://iap-services.odoo.com/iap/sms/pricing" class="fa fa-lg fa-info"/></span> + </t> +</templates> |
