odoo.define('sms.sms_widget', function (require) { "use strict"; var core = require('web.core'); var fieldRegistry = require('web.field_registry'); var FieldTextEmojis = require('mail.field_text_emojis'); var _t = core._t; /** * 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 = FieldTextEmojis.extend({ className: 'o_field_text', enableEmojis: false, /** * @constructor */ init: function () { this._super.apply(this, arguments); this.nbrChar = 0; this.nbrSMS = 0; this.encoding = 'GSM7'; this.enableEmojis = !!this.nodeOptions.enable_emojis; }, /** * @override *"This will add the emoji dropdown to a target field (controlled by the "enableEmojis" attribute) */ on_attach_callback: function () { if (this.enableEmojis) { this._super.apply(this, arguments); } }, //-------------------------------------------------------------------------- // Private: override widget //-------------------------------------------------------------------------- /** * @private * @override */ _renderEdit: function () { var def = this._super.apply(this, arguments); this._compute(); $('.o_sms_container').remove(); var $sms_container = $('
'); $sms_container.append(this._renderSMSInfo()); $sms_container.append(this._renderIAPButton()); this.$el = this.$el.add($sms_container); return def; }, //-------------------------------------------------------------------------- // Private: SMS //-------------------------------------------------------------------------- /** * 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); }, /** * 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); }, /** * 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 IAP button to redirect to IAP pricing * @private */ _renderIAPButton: function () { return $('', { 'href': 'https://iap-services.odoo.com/iap/sms/pricing', 'target': '_blank', 'title': _t('SMS Pricing'), 'aria-label': _t('SMS Pricing'), 'class': 'fa fa-lg fa-info-circle', }); }, /** * Render the number of characters, sms and the encoding. * @private */ _renderSMSInfo: function () { var string = _.str.sprintf(_t('%s characters, fits in %s SMS (%s) '), this.nbrChar, this.nbrSMS, this.encoding); var $span = $('', { 'class': 'text-muted o_sms_count', }); $span.text(string); return $span; }, /** * Update widget SMS information with re-computed info about length, ... * @private */ _updateSMSInfo: function () { this._compute(); var string = _.str.sprintf(_t('%s characters, fits in %s SMS (%s) '), this.nbrChar, this.nbrSMS, this.encoding); this.$('.o_sms_count').text(string); }, //-------------------------------------------------------------------------- // Handlers //-------------------------------------------------------------------------- /** * @override * @private */ _onBlur: function () { var content = this._getValue(); if( !content.trim().length && content.length > 0) { this.do_warn(_t("Your SMS Text Message must include at least one non-whitespace character")); this.$input.val(content.trim()); this._updateSMSInfo(); } }, /** * @override * @private */ _onChange: function () { this._super.apply(this, arguments); this._updateSMSInfo(); }, /** * @override * @private */ _onInput: function () { this._super.apply(this, arguments); this._updateSMSInfo(); }, }); fieldRegistry.add('sms_widget', SmsWidget); return SmsWidget; });