summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/core/ajax.js58
-rw-r--r--addons/web/static/src/js/core/domain.js5
-rw-r--r--addons/web/static/src/js/report/client_action.js63
-rw-r--r--addons/web/static/src/js/report/report.editor.js81
-rw-r--r--addons/web/static/src/js/report/report.js44
-rw-r--r--addons/web/static/src/js/widgets/colorpicker.js497
-rw-r--r--addons/web/static/src/scss/fields.scss2
-rw-r--r--addons/web/static/src/scss/report.editor.scss26
-rw-r--r--addons/web/static/src/scss/report_backend.scss2
-rw-r--r--addons/web/static/src/xml/colorpicker.xml62
-rw-r--r--addons/web/static/src/xml/report.xml11
11 files changed, 89 insertions, 762 deletions
diff --git a/addons/web/static/src/js/core/ajax.js b/addons/web/static/src/js/core/ajax.js
index f844cbdaed4..1821d5a3be4 100644
--- a/addons/web/static/src/js/core/ajax.js
+++ b/addons/web/static/src/js/core/ajax.js
@@ -1,6 +1,7 @@
odoo.define('web.ajax', function (require) {
"use strict";
+var config = require('web.config');
var core = require('web.core');
var utils = require('web.utils');
var time = require('web.time');
@@ -503,6 +504,55 @@ var loadXML = (function () {
};
})();
+/**
+ * Loads a template file according to the given xmlId.
+ *
+ * @param {string} [xmlId] - the template xmlId
+ * @returns {Deferred} resolved with an object
+ * cssLibs: list of css files
+ * cssContents: list of style tag contents
+ * jsLibs: list of JS files
+ * jsContents: list of script tag contents
+ */
+var loadAsset = (function () {
+ var cache = {};
+
+ var load = function loadAsset(xmlId) {
+ if (cache[xmlId]) {
+ return $.when(cache[xmlId]);
+ }
+ var params = {
+ args: [xmlId, {
+ debug: config.debug
+ }],
+ kwargs: {
+ context: odoo.session_info.user_context,
+ },
+ method: 'render_template',
+ model: 'ir.ui.view',
+ };
+ return rpc('/web/dataset/call_kw/ir.ui.view/render_template', params).then(function (xml) {
+ var $xml = $(xml);
+ cache[xmlId] = {
+ cssLibs: $xml.filter('link[href]:not([type="image/x-icon"])').map(function () {
+ return $(this).attr('href');
+ }).get(),
+ cssContents: $xml.filter('style').map(function () {
+ return $(this).html();
+ }).get(),
+ jsLibs: $xml.filter('script[src]').map(function () {
+ return $(this).attr('src');
+ }).get(),
+ jsContents: $xml.filter('script:not([src])').map(function () {
+ return $(this).html();
+ }).get(),
+ };
+ return cache[xmlId];
+ });
+ };
+
+ return load;
+})();
/**
* Loads the given js and css libraries. Note that the ajax loadJS and loadCSS methods
@@ -515,6 +565,8 @@ var loadXML = (function () {
* parallel.
* @param {Array<string>} [libs.cssLibs=[]] A list of css files, to be loaded in
* parallel
+ * @param {Array<string>} [libs.assetLibs=[]] A list of xmlId. The loaded template
+ * contains the script and link to be loaded
*
* @returns {Deferred}
*/
@@ -534,6 +586,11 @@ function loadLibs (libs) {
_.each(libs.cssLibs || [], function (url) {
defs.push(ajax.loadCSS(url));
});
+ _.each(libs.assetLibs || [], function (xmlId) {
+ defs.push(loadAsset(xmlId).then(function (asset) {
+ return loadLibs(asset);
+ }));
+ });
return $.when.apply($, defs);
}
@@ -544,6 +601,7 @@ var ajax = {
loadCSS: loadCSS,
loadJS: loadJS,
loadXML: loadXML,
+ loadAsset: loadAsset,
loadLibs: loadLibs,
get_file: get_file,
post: post,
diff --git a/addons/web/static/src/js/core/domain.js b/addons/web/static/src/js/core/domain.js
index c31feb61a8f..97642f8e438 100644
--- a/addons/web/static/src/js/core/domain.js
+++ b/addons/web/static/src/js/core/domain.js
@@ -104,8 +104,13 @@ var Domain = collections.Tree.extend({
);
case "like":
return (fieldValue.toLowerCase().indexOf(this._data[2].toLowerCase()) >= 0);
+ case "=like":
+ var regExp = new RegExp(this._data[2].toLowerCase().replace(/([.\[\]\{\}\+\*])/g, '\\\$1').replace(/%/g, '.*'));
+ return regExp.test(fieldValue.toLowerCase());
case "ilike":
return (fieldValue.indexOf(this._data[2]) >= 0);
+ case "=ilike":
+ return new RegExp(this._data[2].replace(/%/g, '.*'), 'i').test(fieldValue);
default:
throw new Error(_.str.sprintf(
"Domain %s uses an unsupported operator",
diff --git a/addons/web/static/src/js/report/client_action.js b/addons/web/static/src/js/report/client_action.js
index 3a520e3d6b5..099ee77a527 100644
--- a/addons/web/static/src/js/report/client_action.js
+++ b/addons/web/static/src/js/report/client_action.js
@@ -2,7 +2,6 @@ odoo.define('report.client_action', function (require) {
'use strict';
var AbstractAction = require('web.AbstractAction');
-var config = require('web.config');
var core = require('web.core');
var session = require('web.session');
var utils = require('report.utils');
@@ -11,8 +10,6 @@ var QWeb = core.qweb;
var AUTHORIZED_MESSAGES = [
- 'report.editor:save_ok',
- 'report.editor:discard_ok',
'report:do_action',
];
@@ -28,8 +25,6 @@ var ReportAction = AbstractAction.extend({
this.action_manager = parent;
this._title = options.display_name || options.name;
- this.edit_mode_available = false;
- this.in_edit_mode = false;
this.report_url = options.report_url;
// Extra info that will be useful to build a qweb-pdf action.
@@ -49,20 +44,12 @@ var ReportAction = AbstractAction.extend({
self.trusted_origin = utils.build_origin(trusted_protocol, trusted_host);
self.$buttons = $(QWeb.render('report.client_action.ControlButtons', {}));
- self.$buttons.on('click', '.o_report_edit', self.on_click_edit);
self.$buttons.on('click', '.o_report_print', self.on_click_print);
- self.$buttons.on('click', '.o_report_save', self.on_click_save);
- self.$buttons.on('click', '.o_report_discard', self.on_click_discard);
self._update_control_panel();
// Load the report in the iframe. Note that we use a relative URL.
self.iframe.src = self.report_url;
-
- // Once the iframe is loaded, check if we can edit the report.
- self.iframe.onload = function () {
- self._on_iframe_loaded();
- };
});
},
@@ -82,31 +69,12 @@ var ReportAction = AbstractAction.extend({
$(window).off('message', this.on_message_received);
},
- _on_iframe_loaded: function () {
- var editable = $(this.iframe).contents().find('html').data('editable');
- if (editable === 1) {
- this.edit_mode_available = true;
- this._update_control_panel();
- }
- },
-
_update_control_panel: function () {
this.updateControlPanel({
cp_content: {
$buttons: this.$buttons,
},
});
- this._update_control_panel_buttons();
- },
-
- /**
- * Helper allowing to toggle groups of buttons in the control panel
- * according to the `this.in_edit_mode` flag.
- */
- _update_control_panel_buttons: function () {
- this.$buttons.filter('div.o_report_edit_mode').toggle(this.in_edit_mode);
- this.$buttons.filter('div.o_report_no_edit_mode').toggle(! this.in_edit_mode);
- this.$buttons.filter('div.o_edit_mode_available').toggle(config.debug && this.edit_mode_available && ! this.in_edit_mode);
},
/**
@@ -128,18 +96,6 @@ var ReportAction = AbstractAction.extend({
}
switch(message) {
- case 'report.editor:save_ok':
- // Reload the iframe in order to disable the editor.
- this.iframe.src = this.report_url;
- this.in_edit_mode = false;
- this._update_control_panel_buttons();
- break;
- case 'report.editor:discard_ok':
- // Reload the iframe in order to disable the editor.
- this.iframe.src = this.report_url;
- this.in_edit_mode = false;
- this._update_control_panel_buttons();
- break;
case 'report:do_action':
return this.do_action(ev.originalEvent.data.action);
default:
@@ -157,25 +113,6 @@ var ReportAction = AbstractAction.extend({
this.iframe.contentWindow.postMessage(message, this.trusted_origin);
},
- on_click_edit: function () {
- // We reload the iframe with a special query string to enable the editor.
- if (this.report_url.indexOf('?') === -1) {
- this.iframe.src = this.report_url + '?enable_editor=1';
- } else {
- this.iframe.src = this.report_url + '&enable_editor=1';
- }
- this.in_edit_mode = true;
- this._update_control_panel_buttons();
- },
-
- on_click_discard: function () {
- this._post_message('report.editor:ask_discard');
- },
-
- on_click_save: function () {
- this._post_message('report.editor:ask_save');
- },
-
on_click_print: function () {
var action = {
'type': 'ir.actions.report',
diff --git a/addons/web/static/src/js/report/report.editor.js b/addons/web/static/src/js/report/report.editor.js
deleted file mode 100644
index 4955417a759..00000000000
--- a/addons/web/static/src/js/report/report.editor.js
+++ /dev/null
@@ -1,81 +0,0 @@
-odoo.define('report.editor', function (require) {
-'use strict';
-
-require('web.dom_ready')
-var core = require('web.core');
-var utils = require('report.utils');
-var editor = require('web_editor.editor');
-var options = require('web_editor.snippets.options');
-
-var web_base_url = $('html').attr('web-base-url');
-var trusted_host = utils.get_host_from_url(web_base_url);
-var trusted_protocol = utils.get_protocol_from_url(web_base_url);
-var trusted_origin = utils.build_origin(trusted_protocol, trusted_host);
-
-// Patch the editor's behavior when it is launched inside an iframe.
-if (window.self !== window.top) {
-
- // And now we chain some deferred to `save` and `cancel` in order to inform
- // the report's client action that the actions are done.
- editor.Class.include({
- save: function () {
- // Force to not reload
- return this._super(false).then(function () {
- window.parent.postMessage('report.editor:save_ok', trusted_origin);
- });
- },
- cancel: function () {
- // Force to not reload
- return this._super(false).then(function () {
- window.parent.postMessage('report.editor:discard_ok', trusted_origin);
- });
- },
- });
-
- // postMessage logic.
- var AUTHORIZED_MESSAGES = [
- 'report.editor:ask_discard',
- 'report.editor:ask_save',
- ];
-
- window.addEventListener('message', function (ev) {
- // Check the origin of the received message.
- var message_origin = utils.build_origin(ev.source.location.protocol, ev.source.location.host);
- if (message_origin === trusted_origin) {
- // Check the syntax of the received message.
- var message = ev.data;
- if (! _.isString(message) || (_.isString(message) && ! _.contains(AUTHORIZED_MESSAGES, message))) {
- return;
- }
-
- switch (message) {
- case 'report.editor:ask_save':
- core.bus.trigger('editor_save_request');
- break;
- case 'report.editor:ask_discard':
- core.bus.trigger('editor_discard_request');
- break;
- default:
- }
- }
- }, false);
-}
-
-options.registry.many2one.include({
- _selectRecord: function ($li) {
- this._super.apply(this, arguments);
- if (this.$target.data('oe-field') !== 'partner_id') {
- return;
- }
-
- var $img = $('.header .row img:first');
- var css = window.getComputedStyle($img[0]);
- $img.css('max-height', css.height+'px');
- $img.attr('src', '/web/image/res.partner/' + this.ID + '/image');
- _.defer(function () {
- $img.removeClass('o_dirty');
- });
- }
-});
-
-});
diff --git a/addons/web/static/src/js/report/report.js b/addons/web/static/src/js/report/report.js
index 50d78a9d151..9072966b19e 100644
--- a/addons/web/static/src/js/report/report.js
+++ b/addons/web/static/src/js/report/report.js
@@ -15,26 +15,26 @@ var trusted_host = utils.get_host_from_url(web_base_url);
var trusted_protocol = utils.get_protocol_from_url(web_base_url);
var trusted_origin = utils.build_origin(trusted_protocol, trusted_host);
-// Allow to send commands to the webclient when the editor is disabled.
-if (window.location.search.indexOf('enable_editor') === -1) {
- // `do_action` command
- $('[res-id][res-model][view-type]')
- .wrap('<a/>')
- .attr('href', '#')
- .on('click', function (ev) {
- ev.preventDefault();
- var action = {
- 'type': 'ir.actions.act_window',
- 'view_type': $(this).attr('view-type'),
- 'view_mode': $(this).attr('view-mode') || $(this).attr('view-type'),
- 'res_id': Number($(this).attr('res-id')),
- 'res_model': $(this).attr('res-model'),
- 'views': [[$(this).attr('view-id') || false, $(this).attr('view-type')]],
- };
- window.parent.postMessage({
- 'message': 'report:do_action',
- 'action': action,
- }, trusted_origin);
- });
-}
+// Allow sending commands to the webclient
+// `do_action` command
+$('[res-id][res-model][view-type]')
+ .wrap('<a/>')
+ .attr('href', '#')
+ .on('click', function (ev) {
+ ev.preventDefault();
+ var action = {
+ 'type': 'ir.actions.act_window',
+ 'view_type': $(this).attr('view-type'),
+ 'view_mode': $(this).attr('view-mode') || $(this).attr('view-type'),
+ 'res_id': Number($(this).attr('res-id')),
+ 'res_model': $(this).attr('res-model'),
+ 'views': [
+ [$(this).attr('view-id') || false, $(this).attr('view-type')],
+ ],
+ };
+ window.parent.postMessage({
+ 'message': 'report:do_action',
+ 'action': action,
+ }, trusted_origin);
+ });
});
diff --git a/addons/web/static/src/js/widgets/colorpicker.js b/addons/web/static/src/js/widgets/colorpicker.js
deleted file mode 100644
index e8ed888e1af..00000000000
--- a/addons/web/static/src/js/widgets/colorpicker.js
+++ /dev/null
@@ -1,497 +0,0 @@
-odoo.define('web.colorpicker', function (require) {
-'use strict';
-
-var core = require('web.core');
-var utils = require('web.utils');
-var Dialog = require('web.Dialog');
-
-var _t = core._t;
-
-var Colorpicker = Dialog.extend({
- xmlDependencies: (Dialog.prototype.xmlDependencies || [])
- .concat(['/web/static/src/xml/colorpicker.xml']),
-
- template: 'web.colorpicker',
- events: _.extend({}, Dialog.prototype.events || {}, {
- 'mousedown .o_color_pick_area': '_onMouseDownPicker',
- 'mousedown .o_color_slider': '_onMouseDownSlider',
- 'mousedown .o_opacity_slider': '_onMouseDownOpacitySlider',
- 'change .o_color_picker_inputs' : '_onChangeInputs',
- }),
-
- /**
- * @constructor
- * @param {Widget} parent
- * @param {Object} [options]
- * @param {string} [options.defaultColor='#FF0000']
- */
- init: function (parent, options) {
- options = options || {};
-
- this._super(parent, _.extend({
- size: 'medium',
- title: _t('Pick a color'),
- buttons: [
- {text: _t('Choose'), classes: 'btn-primary', close: true, click: this._onFinalPick.bind(this)},
- {text: _t('Discard'), close: true},
- ],
- }, options));
-
- this.pickerFlag = false;
- this.sliderFlag = false;
- this.opacitySliderFlag = false;
- this.colorComponents = {};
-
- var self = this;
- var $body = $(document.body);
- $body.on('mousemove.colorpicker', _.throttle(function (ev) {
- self._onMouseMovePicker(ev);
- self._onMouseMoveSlider(ev);
- self._onMouseMoveOpacitySlider(ev);
- }, 10));
- $body.on('mouseup.colorpicker', _.throttle(function (ev) {
- self.pickerFlag = false;
- self.sliderFlag = false;
- self.opacitySliderFlag = false;
- }, 10));
-
- this.options = _.clone(options);
- },
- /**
- * @override
- */
- start: function () {
- this.$colorpickerArea = this.$('.o_color_pick_area');
- this.$colorpickerPointer = this.$('.o_picker_pointer');
- this.$colorSlider = this.$('.o_color_slider');
- this.$colorSliderPointer = this.$('.o_slider_pointer');
- this.$opacitySlider = this.$('.o_opacity_slider');
- this.$opacitySliderPointer = this.$('.o_opacity_pointer');
-
- var defaultColor = this.options.defaultColor || '#FF0000';
- var rgba = defaultColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)$/);
- if (rgba) {
- if (rgba[4] === undefined) {
- rgba[4] = 1;
- }
- this._updateRgba(parseInt(rgba[1]), parseInt(rgba[2]), parseInt(rgba[3]), Math.round(parseFloat(rgba[4] * 100)));
- } else {
- this._updateHex(defaultColor);
- this._updateOpacity(100);
- }
- this.opened().then(this._updateUI.bind(this));
-
- return this._super.apply(this, arguments);
- },
- /**
- * @override
- */
- destroy: function () {
- this._super.apply(this, arguments);
- $(document.body).off('.colorpicker');
- },
-
- //--------------------------------------------------------------------------
- // Private
- //--------------------------------------------------------------------------
-
- /**
- * Updates input values, color preview, picker and slider pointer positions.
- *
- * @private
- */
- _updateUI: function () {
- var self = this;
-
- // Update inputs
- _.each(this.colorComponents, function (value, color) {
- self.$(_.str.sprintf('.o_%s_input', color)).val(value);
- });
-
- // Update preview
- this.$('.o_color_preview').css('background-color', this.colorComponents.cssColor);
-
- // Update picker area and picker pointer position
- this.$colorpickerArea.css('background-color', _.str.sprintf('hsl(%s, 100%%, 50%%)', this.colorComponents.hue));
- var top = (100 - this.colorComponents.lightness) * this.$colorpickerArea.height() / 100;
- var left = this.colorComponents.saturation * this.$colorpickerArea.width() / 100;
- this.$colorpickerPointer.css({
- top: (top - 5) + 'px',
- left: (left - 5) + 'px',
- });
-
- // Update color slider position
- var height = this.$colorSlider.height();
- var y = this.colorComponents.hue * height / 360;
- this.$colorSliderPointer.css('top', Math.round(y - 2));
-
- // Update opacity slider position
- var heightOpacity = this.$opacitySlider.height();
- var z = heightOpacity * (1 - this.colorComponents.opacity / 100.0);
- this.$opacitySliderPointer.css('top', Math.round(z - 2));
-
- // Add gradient color on opacity slider
- this.$opacitySlider.css('background', 'linear-gradient(' + this.colorComponents.hex + ' 0%, transparent 100%)');
- },
- /**
- * Updates colors according to given hex value. Opacity is left unchanged.
- *
- * @private
- * @param {string} hex - hexadecimal code
- */
- _updateHex: function (hex) {
- var rgb = Colorpicker.prototype.convertHexToRgb(hex);
- if (!rgb) {
- return;
- }
- _.extend(this.colorComponents,
- {hex: hex},
- rgb,
- Colorpicker.prototype.convertRgbToHsl(rgb.red, rgb.green, rgb.blue)
- );
- this._updateCssColor();
- },
- /**
- * Updates colors according to given RGB values.
- *
- * @private
- * @param {integer} r
- * @param {integer} g
- * @param {integer} b
- * @param {integer} [a]
- */
- _updateRgba: function (r, g, b, a) {
- var hex = Colorpicker.prototype.convertRgbToHex(r, g, b);
- if (!hex) {
- return;
- }
- _.extend(this.colorComponents,
- {red: r, green: g, blue: b},
- a === undefined ? {} : {opacity: a},
- hex,
- Colorpicker.prototype.convertRgbToHsl(r, g, b)
- );
- this._updateCssColor();
- },
- /**
- * Updates colors according to given HSL values.
- *
- * @private
- * @param {integer} h
- * @param {integer} s
- * @param {integer} l
- */
- _updateHsl: function (h, s, l) {
- var rgb = Colorpicker.prototype.convertHslToRgb(h, s, l);
- if (!rgb) {
- return;
- }
- _.extend(this.colorComponents,
- {hue: h, saturation: s, lightness: l},
- rgb,
- Colorpicker.prototype.convertRgbToHex(rgb.red, rgb.green, rgb.blue)
- );
- this._updateCssColor();
- },
- /**
- * Updates color opacity.
- *
- * @private
- * @param {integer} a
- */
- _updateOpacity: function (a) {
- if (a < 0 || a > 100) {
- return;
- }
- _.extend(this.colorComponents,
- {opacity: a}
- );
- this._updateCssColor();
- },
- /**
- * Updates css color representation.
- *
- * @private
- */
- _updateCssColor: function () {
- var cssColor = this.colorComponents.hex;
- if (this.colorComponents.opacity !== 100) {
- cssColor = _.str.sprintf('rgba(%s, %s, %s, %s)',
- this.colorComponents.red,
- this.colorComponents.green,
- this.colorComponents.blue,
- this.colorComponents.opacity / 100
- );
- }
- _.extend(this.colorComponents,
- {cssColor: cssColor}
- );
- },
-
- //--------------------------------------------------------------------------
- // Handlers
- //--------------------------------------------------------------------------
-
- /**
- * Updates color when the user starts clicking on the picker.
- *
- * @private
- * @param {Event} ev
- */
- _onMouseDownPicker: function (ev) {
- this.pickerFlag = true;
- this._onMouseMovePicker(ev);
- },
- /**
- * Updates saturation and lightness values on mouse drag over picker.
- *
- * @private
- * @param {Event} ev
- */
- _onMouseMovePicker: function (ev) {
- if (!this.pickerFlag) {
- return;
- }
-
- var offset = this.$colorpickerArea.offset();
- var top = ev.pageY - offset.top;
- var left = ev.pageX - offset.left;
- var saturation = Math.round(100 * left / this.$colorpickerArea.width());
- var lightness = Math.round(100 * (this.$colorpickerArea.height() - top) / this.$colorpickerArea.height());
- saturation = utils.confine(saturation, 0, 100);
- lightness = utils.confine(lightness, 0, 100);
-
- this._updateHsl(this.colorComponents.hue, saturation, lightness);
- this._updateUI();
- },
- /**
- * Updates color when user starts clicking on slider.
- *
- * @private
- * @param {Event} ev
- */
- _onMouseDownSlider: function (ev) {
- this.sliderFlag = true;
- this._onMouseMoveSlider(ev);
- },
- /**
- * Updates hue value on mouse drag over slider.
- *
- * @private
- * @param {Event} ev
- */
- _onMouseMoveSlider: function (ev) {
- if (!this.sliderFlag) {
- return;
- }
-
- var y = ev.pageY - this.$colorSlider.offset().top;
- var hue = Math.round(360 * y / this.$colorSlider.height());
- hue = utils.confine(hue, 0, 360);
-
- this._updateHsl(hue, this.colorComponents.saturation, this.colorComponents.lightness);
- this._updateUI();
- },
- /**
- * Updates opacity when user starts clicking on opacity slider.
- *
- * @private
- * @param {Event} ev
- */
- _onMouseDownOpacitySlider: function (ev) {
- this.opacitySliderFlag = true;
- this._onMouseMoveOpacitySlider(ev);
- },
- /**
- * Updates opacity value on mouse drag over opacity slider.
- *
- * @private
- * @param {Event} ev
- */
- _onMouseMoveOpacitySlider: function (ev) {
- if (!this.opacitySliderFlag) {
- return;
- }
-
- var y = ev.pageY - this.$opacitySlider.offset().top;
- var opacity = Math.round(100 * (1 - y / this.$opacitySlider.height()));
- opacity = utils.confine(opacity, 0, 100);
-
- this._updateOpacity(opacity);
- this._updateUI();
- },
- /**
- * Called when input value is changed -> Updates UI: Set picker and slider
- * position and set colors.
- *
- * @private
- * @param {Event} ev
- */
- _onChangeInputs: function (ev) {
- switch ($(ev.target).data('colorMethod')) {
- case 'hex':
- this._updateHex(this.$('.o_hex_input').val());
- break;
- case 'rgb':
- this._updateRgba(
- parseInt(this.$('.o_red_input').val()),
- parseInt(this.$('.o_green_input').val()),
- parseInt(this.$('.o_blue_input').val())
- );
- break;
- case 'hsl':
- this._updateHsl(
- parseInt(this.$('.o_hue_input').val()),
- parseInt(this.$('.o_saturation_input').val()),
- parseInt(this.$('.o_lightness_input').val())
- );
- break;
- case 'opacity':
- this._updateOpacity(parseInt(this.$('.o_opacity_input').val()));
- break;
- }
- this._updateUI();
- },
- /**
- * @private
- */
- _onFinalPick: function () {
- this.trigger_up('colorpicker:saved', this.colorComponents);
- },
-
- //--------------------------------------------------------------------------
- // Static
- //--------------------------------------------------------------------------
-
- /**
- * Converts Hexadecimal code to RGB.
- *
- * @static
- * @param {string} hex - hexadecimal code
- * @returns {Object|false} contains red, green and blue
- */
- convertHexToRgb: function (hex) {
- if (!/^#[0-9A-F]{6}$/i.test(hex)) {
- return false;
- }
-
- return {
- red: parseInt(hex.substr(1, 2), 16),
- green: parseInt(hex.substr(3, 2), 16),
- blue: parseInt(hex.substr(5, 2), 16),
- };
- },
- /**
- * Converts RGB color to HSL.
- *
- * @static
- * @param {integer} r
- * @param {integer} g
- * @param {integer} b
- * @returns {Object|false} contains hue, saturation and lightness
- */
- convertRgbToHsl: function (r, g, b) {
- if (typeof(r) !== 'number' || isNaN(r) || r < 0 || r > 255 ||
- typeof(g) !== 'number' || isNaN(g) || g < 0 || g > 255 ||
- typeof(b) !== 'number' || isNaN(b) || b < 0 || b > 255) {
- return false;
- }
-
- var red = r / 255;
- var green = g / 255;
- var blue = b / 255;
- var maxColor = Math.max(red, green, blue);
- var minColor = Math.min(red, green, blue);
- var delta = maxColor - minColor;
- var hue = 0;
- var saturation = 0;
- var lightness = (maxColor + minColor) / 2;
- if (delta) {
- if (maxColor === red) {
- hue = (green - blue) / delta;
- }
- if (maxColor === green) {
- hue = 2 + (blue - red) / delta;
- }
- if (maxColor === blue) {
- hue = 4 + (red - green) / delta;
- }
- if (maxColor) {
- saturation = delta / (1 - Math.abs(2 * lightness - 1));
- }
- }
- hue = 60 * hue | 0;
- return {
- hue: hue < 0 ? hue += 360 : hue,
- saturation: (saturation * 100) | 0,
- lightness: (lightness * 100) | 0,
- };
- },
- /**
- * Converts HSL color to RGB.
- *
- * @static
- * @param {integer} h
- * @param {integer} s
- * @param {integer} l
- * @returns {Object|false} contains red, green and blue
- */
- convertHslToRgb: function (h, s, l) {
- if (typeof(h) !== 'number' || isNaN(h) || h < 0 || h > 360 ||
- typeof(s) !== 'number' || isNaN(s) || s < 0 || s > 100 ||
- typeof(l) !== 'number' || isNaN(l) || l < 0 || l > 100) {
- return false;
- }
- var huePrime = h / 60;
- var saturation = s / 100;
- var lightness = l / 100;
- var chroma = saturation * (1 - Math.abs(2 * lightness - 1));
- var secondComponent = chroma * (1 - Math.abs(huePrime % 2 - 1));
- var lightnessAdjustment = lightness - chroma/2;
- var precision = 255;
- chroma = (chroma + lightnessAdjustment) * precision | 0;
- secondComponent = (secondComponent + lightnessAdjustment) * precision | 0;
- lightnessAdjustment = lightnessAdjustment * precision | 0;
- if (huePrime >= 0 && huePrime < 1) {
- return {red: chroma, green: secondComponent, blue: lightnessAdjustment};
- }
- if (huePrime >= 1 && huePrime < 2) {
- return {red: secondComponent, green: chroma, blue: lightnessAdjustment};
- }
- if (huePrime >= 2 && huePrime < 3) {
- return {red: lightnessAdjustment, green: chroma, blue: secondComponent};
- }
- if (huePrime >= 3 && huePrime < 4) {
- return {red: lightnessAdjustment, green: secondComponent, blue: chroma};
- }
- if (huePrime >= 4 && huePrime < 5) {
- return {red: secondComponent, green: lightnessAdjustment, blue: chroma};
- }
- if (huePrime >= 5 && huePrime <= 6) {
- return {red: chroma, green: lightnessAdjustment, blue: secondComponent};
- }
- },
- /**
- * Converts RGB color to Hexadecimal code.
- *
- * @static
- * @param {integer} r
- * @param {integer} g
- * @param {integer} b
- * @returns {Object|false} contains hexadecimal code
- */
- convertRgbToHex: function (r, g, b) {
- if (typeof(r) !== 'number' || isNaN(r) || r < 0 || r > 255 ||
- typeof(g) !== 'number' || isNaN(g) || g < 0 || g > 255 ||
- typeof(b) !== 'number' || isNaN(b) || b < 0 || b > 255) {
- return false;
- }
- var red = r < 16 ? '0' + r.toString(16) : r.toString(16);
- var green = g < 16 ? '0' + g.toString(16) : g.toString(16);
- var blue = b < 16 ? '0' + b.toString(16) : b.toString(16);
- return {hex: _.str.sprintf('#%s%s%s', red, green, blue)};
- },
-});
-
-return Colorpicker;
-});
diff --git a/addons/web/static/src/scss/fields.scss b/addons/web/static/src/scss/fields.scss
index 81a59743788..27d0d13770e 100644
--- a/addons/web/static/src/scss/fields.scss
+++ b/addons/web/static/src/scss/fields.scss
@@ -33,7 +33,7 @@
}
// Block fields
- &.note-editor, &.oe_form_field_html, &.oe_form_field_html_text, &.oe_form_field_text, &.o_field_domain, &.o_graph_linechart, &.o_graph_barchart {
+ &.note-editor, &.oe_form_field_html, &.oe_form_field_text, &.o_field_domain, &.o_graph_linechart, &.o_graph_barchart {
display: block;
}
diff --git a/addons/web/static/src/scss/report.editor.scss b/addons/web/static/src/scss/report.editor.scss
deleted file mode 100644
index 544787ff6b2..00000000000
--- a/addons/web/static/src/scss/report.editor.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-.o_editable {
- &:not(:empty), &[data-oe-type] {
- &[date-oe-model="ir.ui.view"] {
- &, th, td {
- &:hover {
- -moz-box-shadow: #DDCC33 0 0 5px 2px inset;
- -webkit-box-shadow: #DDCC33 0 0 5px 2px inset;
- box-shadow: #DDCC33 0 0 5px 2px inset;
- }
- }
- }
- }
-}
-
-body.o_in_iframe {
- margin-top: 40px!important;
- div#web_editor-top-edit {
- > form {
- display: none;
- }
- }
-
- .header, .footer {
- display: none;
- }
-}
diff --git a/addons/web/static/src/scss/report_backend.scss b/addons/web/static/src/scss/report_backend.scss
index 62252c2d9f7..18ea620ce67 100644
--- a/addons/web/static/src/scss/report_backend.scss
+++ b/addons/web/static/src/scss/report_backend.scss
@@ -9,6 +9,6 @@
border: none;
}
-.o_report_no_edit_mode, .o_edit_mode_available, .o_report_edit_mode {
+.o_report_buttons {
display: inline-block;
}
diff --git a/addons/web/static/src/xml/colorpicker.xml b/addons/web/static/src/xml/colorpicker.xml
deleted file mode 100644
index 4d85f3172a1..00000000000
--- a/addons/web/static/src/xml/colorpicker.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<templates>
- <t t-name="web.colorpicker">
- <div class="o_colorpicker_widget">
- <div class="row">
- <div class="col-auto">
- <div class="o_color_pick_area d-inline-block border">
- <div class="o_picker_pointer rounded-circle"/>
- </div>
- <div class="o_color_slider d-inline-block ml-2 border">
- <div class="o_slider_pointer"/>
- </div>
- <div class="o_opacity_slider d-inline-block ml-2 border">
- <div class="o_opacity_pointer"/>
- </div>
- </div>
- <form class="col o_color_picker_inputs">
- <div class="input-group">
- <div class="input-group-prepend o_color_preview_parent">
- <span class="input-group-text rounded-0 o_color_preview"/>
- </div>
- <input type="text" class="form-control o_hex_input" data-color-method="hex"/>
- </div>
- <div class="form-row mt-2">
- <div class="col">
- <div class="form-group">
- <label for="red">Red</label>
- <input type="text" class="form-control o_red_input" data-color-method="rgb" id="red"/>
- </div>
- <div class="form-group">
- <label for="green">Green</label>
- <input type="text" class="form-control o_green_input" data-color-method="rgb" id="green"/>
- </div>
- <div class="form-group">
- <label for="blue">Blue</label>
- <input type="text" class="form-control o_blue_input" data-color-method="rgb" id="blue"/>
- </div>
- </div>
- <div class="col">
- <div class="form-group">
- <label for="hue">Hue</label>
- <input type="text" class="form-control o_hue_input" data-color-method="hsl" id="hue"/>
- </div>
- <div class="form-group">
- <label for="saturation">Saturation %</label>
- <input type="text" class="form-control o_saturation_input" data-color-method="hsl" id="saturation"/>
- </div>
- <div class="form-group">
- <label for="lightness">Lightness %</label>
- <input type="text" class="form-control o_lightness_input" data-color-method="hsl" id="lightness"/>
- </div>
- </div>
- </div>
- <div class="form-group">
- <label for="opacity">Opacity %</label>
- <input type="text" class="form-control o_opacity_input" data-color-method="opacity" id="opacity"/>
- </div>
- </form>
- </div>
- </div>
- </t>
-</templates>
diff --git a/addons/web/static/src/xml/report.xml b/addons/web/static/src/xml/report.xml
index 49313e8de5a..7f08d009d53 100644
--- a/addons/web/static/src/xml/report.xml
+++ b/addons/web/static/src/xml/report.xml
@@ -7,15 +7,8 @@
<!-- Buttons of the Control Panel -->
<t t-name="report.client_action.ControlButtons">
- <div class="o_report_no_edit_mode">
+ <div class="o_report_buttons">
<button type="button" class="btn btn-primary o_report_print" title="Print">Print</button>
</div>
- <div class="o_edit_mode_available">
- <button type="button" class="btn btn-secondary o_report_edit" title="Edit">Edit</button>
- </div>
- <div class="o_report_edit_mode">
- <button type="button" class="btn btn-primary o_report_save" title="Save">Save</button>
- <button type="button" class="btn btn-secondary o_report_discard" title="Discard">Discard</button>
- </div>
</t>
-</template> \ No newline at end of file
+</template>