summaryrefslogtreecommitdiff
path: root/addons/mrp/static/src/js
diff options
context:
space:
mode:
authorjpr-odoo <jpr@openerp.com>2019-02-19 06:41:37 +0000
committerSimon Lejeune <sle@openerp.com>2019-08-01 13:34:58 +0000
commit8bf1486da56d3afe459eb97e5e2f100b63c54b90 (patch)
treeb25f78378ebd7d7c5ec164692e3fc0c47634158d /addons/mrp/static/src/js
parent1a33056557be7b5696854d3056ea79204f36eae4 (diff)
[IMP] mrp: added support embedded google slide on work center
This commit adds new `embed_viewer` widget which will be used display URLs via embedded iframes. You can add any valid URL to display page via iframe, although widget automatically converts raw google slide URL into embedded URL. Task ID: 1909010 closes odoo/odoo#29404 Signed-off-by: Simon Lejeune (sle) <sle@openerp.com> Co-authored-by: pga-odoo <pga@odoo.com>
Diffstat (limited to 'addons/mrp/static/src/js')
-rw-r--r--addons/mrp/static/src/js/mrp.js126
1 files changed, 125 insertions, 1 deletions
diff --git a/addons/mrp/static/src/js/mrp.js b/addons/mrp/static/src/js/mrp.js
index 8843d9ab3cd..22abd2b0d91 100644
--- a/addons/mrp/static/src/js/mrp.js
+++ b/addons/mrp/static/src/js/mrp.js
@@ -3,6 +3,7 @@ odoo.define('mrp.mrp_state', function (require) {
var AbstractField = require('web.AbstractField');
var core = require('web.core');
+var fields = require('web.basic_fields');
var field_registry = require('web.field_registry');
var time = require('web.time');
@@ -125,8 +126,131 @@ var TimeCounter = AbstractField.extend({
},
});
+var FieldEmbedURLViewer = fields.FieldChar.extend({
+
+ //--------------------------------------------------------------------------
+ // Public
+ //--------------------------------------------------------------------------
+
+ /**
+ * @override
+ */
+ init: function () {
+ this._super.apply(this, arguments);
+ this.page = 1;
+ this.srcDirty = false;
+ },
+
+ /**
+ * force to set 'src' for embed iframe viewer when its value has changed
+ *
+ * @override
+ *
+ */
+ reset: function () {
+ this._super.apply(this, arguments);
+ this._updateIframePreview();
+ },
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * Initializes and returns an iframe for the viewer
+ *
+ * @private
+ * @returns {jQueryElement}
+ */
+ _prepareIframe: function () {
+ return $('<iframe>', {
+ class: 'o_embed_iframe d-none',
+ allowfullscreen: true,
+ });
+ },
+
+ /**
+ * @override
+ * @private
+ */
+ _renderEdit: function () {
+ if (!this.$('iframe.o_embed_iframe').length) {
+ this.$input = this.$el;
+ this.setElement(this.$el.wrap('<div class="o_embed_url_viewer o_field_widget"/>').parent());
+ this.$el.append(this._prepareIframe());
+ }
+ this._prepareInput(this.$input);
+
+ // Do not set iframe src if widget is invisible
+ if (!this.record.evalModifiers(this.attrs.modifiers).invisible) {
+ this._updateIframePreview();
+ } else {
+ this.srcDirty = true;
+ }
+ },
+ /**
+ * @override
+ * @private
+ */
+ _renderReadonly: function () {
+ if (!this.$('iframe.o_embed_iframe').length) {
+ this.$el.addClass('o_embed_url_viewer');
+ this.$el.append(this._prepareIframe());
+ }
+ this._updateIframePreview();
+ },
+ /**
+ * Set the associated src for embed iframe viewer
+ *
+ * @private
+ * @returns {string} source of the google slide
+ */
+ _getEmbedSrc: function () {
+ var src = false;
+ if (this.value) {
+ // check given google slide url is valid or not
+ var googleRegExp = /(^https:\/\/docs.google.com).*(\/d\/e\/|\/d\/)([A-Za-z0-9-_]+)/;
+ var google = this.value.match(googleRegExp);
+ if (google && google[3]) {
+ src = 'https://docs.google.com/presentation' + google[2] + google[3] + '/preview?slide=' + this.page;
+ }
+ }
+ return src || this.value;
+ },
+ /**
+ * update iframe attrs
+ *
+ * @private
+ */
+ _updateIframePreview: function () {
+ var $iframe = this.$('iframe.o_embed_iframe');
+ var src = this._getEmbedSrc();
+ $iframe.toggleClass('d-none', !src);
+ if (src) {
+ $iframe.attr('src', src);
+ } else {
+ $iframe.removeAttr('src');
+ }
+ },
+ /**
+ * Listen to modifiers updates to and only render iframe when it is necessary
+ *
+ * @override
+ */
+ updateModifiersValue: function () {
+ this._super.apply(this, arguments);
+ if (!this.attrs.modifiersValue.invisible && this.srcDirty) {
+ this._updateIframePreview();
+ this.srcDirty = false;
+ }
+ },
+});
+
+
field_registry
.add('bullet_state', SetBulletStatus)
- .add('mrp_time_counter', TimeCounter);
+ .add('mrp_time_counter', TimeCounter)
+ .add('embed_viewer', FieldEmbedURLViewer);
+return FieldEmbedURLViewer;
});