diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/mrp/static/src/js/mrp.js | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/mrp/static/src/js/mrp.js')
| -rw-r--r-- | addons/mrp/static/src/js/mrp.js | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/addons/mrp/static/src/js/mrp.js b/addons/mrp/static/src/js/mrp.js new file mode 100644 index 00000000..f895aef9 --- /dev/null +++ b/addons/mrp/static/src/js/mrp.js @@ -0,0 +1,268 @@ +odoo.define('mrp.mrp_state', function (require) { +"use strict"; + +var AbstractField = require('web.AbstractField'); +var core = require('web.core'); +var fields = require('web.basic_fields'); +var fieldUtils = require('web.field_utils'); +var field_registry = require('web.field_registry'); +var time = require('web.time'); + +var _t = core._t; + +/** + * This widget is used to display the availability on a workorder. + */ +var SetBulletStatus = AbstractField.extend({ + // as this widget is based on hardcoded values, use it in another context + // probably won't work + // supportedFieldTypes: ['selection'], + /** + * @override + */ + init: function () { + this._super.apply(this, arguments); + this.classes = this.nodeOptions && this.nodeOptions.classes || {}; + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @private + * @override + */ + _renderReadonly: function () { + this._super.apply(this, arguments); + var bullet_class = this.classes[this.value] || 'default'; + if (this.value) { + var title = this.value === 'waiting' ? _t('Waiting Materials') : ''; + this.$el.attr({'title': title, 'style': 'display:inline'}); + this.$el.removeClass('text-success text-danger text-default'); + this.$el.html($('<span>' + title + '</span>').addClass('badge badge-' + bullet_class)); + } + } +}); + +var TimeCounter = fields.FieldFloatTime.extend({ + + init: function () { + this._super.apply(this, arguments); + this.duration = this.record.data.duration; + }, + + willStart: function () { + var self = this; + var def = this._rpc({ + model: 'mrp.workcenter.productivity', + method: 'search_read', + domain: [ + ['workorder_id', '=', this.record.data.id], + ['date_end', '=', false], + ], + }).then(function (result) { + var currentDate = new Date(); + var duration = 0; + if (result.length > 0) { + duration += self._getDateDifference(time.auto_str_to_date(result[0].date_start), currentDate); + } + var minutes = duration / 60 >> 0; + var seconds = duration % 60; + self.duration += minutes + seconds / 60; + if (self.mode === 'edit') { + self.value = self.duration; + } + }); + return Promise.all([this._super.apply(this, arguments), def]); + }, + + destroy: function () { + this._super.apply(this, arguments); + clearTimeout(this.timer); + }, + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * @override + */ + isSet: function () { + return true; + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * Compute the difference between two dates. + * + * @private + * @param {string} dateStart + * @param {string} dateEnd + * @returns {integer} the difference in millisecond + */ + _getDateDifference: function (dateStart, dateEnd) { + return moment(dateEnd).diff(moment(dateStart), 'seconds'); + }, + /** + * @override + */ + _renderReadonly: function () { + if (this.record.data.is_user_working) { + this._startTimeCounter(); + } else { + this._super.apply(this, arguments); + } + }, + /** + * @private + */ + _startTimeCounter: function () { + var self = this; + clearTimeout(this.timer); + if (this.record.data.is_user_working) { + this.timer = setTimeout(function () { + self.duration += 1/60; + self._startTimeCounter(); + }, 1000); + } else { + clearTimeout(this.timer); + } + this.$el.text(fieldUtils.format.float_time(this.duration)); + }, +}); + +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('embed_viewer', FieldEmbedURLViewer); + +fieldUtils.format.mrp_time_counter = fieldUtils.format.float_time; + +return FieldEmbedURLViewer; +}); |
