summaryrefslogtreecommitdiff
path: root/addons/mrp/static/src/js/mrp.js
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/mrp/static/src/js/mrp.js
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mrp/static/src/js/mrp.js')
-rw-r--r--addons/mrp/static/src/js/mrp.js268
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;
+});