summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2018-12-28 17:49:21 +0000
committerChristophe Matthieu <chm@odoo.com>2019-01-17 08:40:21 +0000
commitde444335b7da30a2ab3a4c5b92c9731a023f3f07 (patch)
tree40ceda25aa7157ae0923cf567a448d685798e911 /addons/web/static/src
parent17c6d00531c55d0c392ddb6916bf1957bc490c1c (diff)
[REF] web_editor,*: Move and rename files to prepare refactoring
The refactoring of the wysiwyg editor and 'html' field allows us to move some of the code that was in web_editor but only used in website or in mass_mailing. Some parts are still in web_editor but will be moved at a later time.
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/widgets/colorpicker.js497
-rw-r--r--addons/web/static/src/xml/colorpicker.xml62
2 files changed, 0 insertions, 559 deletions
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/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>