From d632ccfd512453e8ee35e054477246458d8a369b Mon Sep 17 00:00:00 2001 From: etienne-bauger Date: Mon, 26 Nov 2012 11:10:51 -0500 Subject: [PATCH] [ADD] web_color module provides a widget to display the color of an hexadecimal code --- web_color/__init__.py | 22 ++ web_color/__openerp__.py | 45 +++ web_color/i18n/fr_CA.po | 10 + .../lib/really-simple-color-picker/LICENSE | 22 ++ .../lib/really-simple-color-picker/README.md | 98 ++++++ .../lib/really-simple-color-picker/arrow.gif | Bin 0 -> 111 bytes .../lib/really-simple-color-picker/arrow.png | Bin 0 -> 27296 bytes .../colorPicker.css | 34 ++ .../lib/really-simple-color-picker/demo.html | 93 +++++ .../jquery.colorPicker.js | 328 ++++++++++++++++++ .../jquery.colorPicker.min.js | 26 ++ .../really-simple-color-picker/screenshot.png | Bin 0 -> 2078 bytes .../lib/really-simple-color-picker/test.html | 85 +++++ web_color/static/src/css/color.css | 9 + web_color/static/src/img/icon.png | Bin 0 -> 3454 bytes web_color/static/src/js/lib.js | 49 +++ web_color/static/src/xml/lib.xml | 18 + 17 files changed, 839 insertions(+) create mode 100644 web_color/__init__.py create mode 100644 web_color/__openerp__.py create mode 100644 web_color/i18n/fr_CA.po create mode 100644 web_color/static/lib/really-simple-color-picker/LICENSE create mode 100644 web_color/static/lib/really-simple-color-picker/README.md create mode 100644 web_color/static/lib/really-simple-color-picker/arrow.gif create mode 100644 web_color/static/lib/really-simple-color-picker/arrow.png create mode 100644 web_color/static/lib/really-simple-color-picker/colorPicker.css create mode 100644 web_color/static/lib/really-simple-color-picker/demo.html create mode 100644 web_color/static/lib/really-simple-color-picker/jquery.colorPicker.js create mode 100644 web_color/static/lib/really-simple-color-picker/jquery.colorPicker.min.js create mode 100644 web_color/static/lib/really-simple-color-picker/screenshot.png create mode 100644 web_color/static/lib/really-simple-color-picker/test.html create mode 100644 web_color/static/src/css/color.css create mode 100644 web_color/static/src/img/icon.png create mode 100644 web_color/static/src/js/lib.js create mode 100644 web_color/static/src/xml/lib.xml diff --git a/web_color/__init__.py b/web_color/__init__.py new file mode 100644 index 00000000..7618af68 --- /dev/null +++ b/web_color/__init__.py @@ -0,0 +1,22 @@ +# -*- encoding: utf-8 -*- +############################################################################ +# +# OpenERP, Open Source Web Color +# Copyright (C) 2012 Savoir-faire Linux (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# @author Étienne Beaudry Auger +# +############################################################################## \ No newline at end of file diff --git a/web_color/__openerp__.py b/web_color/__openerp__.py new file mode 100644 index 00000000..c0c197dc --- /dev/null +++ b/web_color/__openerp__.py @@ -0,0 +1,45 @@ +# -*- encoding: utf-8 -*- +############################################################################ +# +# OpenERP, Open Source Web Color +# Copyright (C) 2012 Savoir-faire Linux (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# @author Étienne Beaudry Auger +# +############################################################################## +{ + 'name': "Web Color", + 'author': "Savoir-faire Linux", + 'category' : "Hidden", + 'description': """ + This module provides a color widget to display the color from + the hexadecimal value of your field. + """, + 'version': "1.0", + 'depends': ['web'], + 'js': [ + 'static/src/js/lib.js', + 'static/lib/really-simple-color-picker/jquery.colorPicker.js', + ], + 'css': [ + 'static/src/css/color.css', + 'static/lib/really-simple-color-picker/colorPicker.css', + ], + 'qweb' : ['static/src/xml/lib.xml'], + 'installable': True, + 'auto_install': True, + 'web_preload': False, +} diff --git a/web_color/i18n/fr_CA.po b/web_color/i18n/fr_CA.po new file mode 100644 index 00000000..870445ba --- /dev/null +++ b/web_color/i18n/fr_CA.po @@ -0,0 +1,10 @@ +# French (Canada) translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# Etienne Beaudry Auger , 2012. +# + +#. openerp-web +#: addons/web_color/static/src/xml/lib.xml +msgid "Select color" +msgstr "Choix de couleur" diff --git a/web_color/static/lib/really-simple-color-picker/LICENSE b/web_color/static/lib/really-simple-color-picker/LICENSE new file mode 100644 index 00000000..d717c4ba --- /dev/null +++ b/web_color/static/lib/really-simple-color-picker/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 Lakshan Perera + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/web_color/static/lib/really-simple-color-picker/README.md b/web_color/static/lib/really-simple-color-picker/README.md new file mode 100644 index 00000000..bdd07298 --- /dev/null +++ b/web_color/static/lib/really-simple-color-picker/README.md @@ -0,0 +1,98 @@ +## Really Simple Color Picker + +This is a very minimal, yet robust Color Picker based on jQuery. + +For more details check the introductory blog post - http://laktek.com/2008/10/27/really-simple-color-picker-in-jquery/ + +### Usage + +You can either clone [this repo](https://github.com/laktek/really-simple-color-picker) or download the latest build as a zip from here - http://github.com/laktek/really-simple-color-picker/zipball/master + +Color Picker requires jQuery 1.2.6 or higher. Make sure to load it before Color Picker (there's no other dependencies!). +For default styles of the color picker load the CSS file that comes with the plugin. + + ```html + + + + + ``` + +Add a text field to take the color input. + + ```html +
+ ``` + +Then call 'colorPicker' method on the text field when document loads. + + ```html + + ``` + +### Options + +There are several options you can set at the time of binding. + +**Selected color** + +Color Picker will use the value of the input field, which the picker is attached to as the selected color. If not, it will use the color passed with `pickerDefault` property. + + ```javascript + $('#color1').colorPicker({pickerDefault: "ffffff"}); + ``` + +**Color Palette** + +Overrides the default color palette by passing an array of color values. + + ```javascript + $('#color1').colorPicker({colors: ["333333", "111111"]}); + ``` + +**Transparency** + +Enable transparency value as an option. + + ```javascript + $('#color1').colorPicker({transparency: true}); + ``` + +**Color Change Callback** + +Registers a callback that can be used to notify the calling code of a color change. + + ```javascript + $('#color1').colorPicker( { onColorChange : function(id, newValue) { console.log("ID: " + id + " has been changed to " + newValue); } } ); + ``` + +If you want to set an option gloablly (to apply for all color pickers), use: + + ```javascript + $.fn.colorPicker.defaults.colors = ['151337', '111111'] + ``` +### Demo + +Demo can be found at http://laktek.github.com/really-simple-color-picker/demo.html + +### Real-world Examples + +* [CurdBee](http://demo.curdbee.com/settings/branding) +* [Readability](https://www.readability.com/publishers/tools) + +Let us know how you are using Really Simple Color Picker... + +### Contributors + +* Lakshan Perera - http://laktek.com +* Daniel Lacy - http://daniellacy.com + +### Issues & Suggestions + +Please report any bugs or feature requests here: +https://github.com/laktek/really-simple-color-picker/issues + diff --git a/web_color/static/lib/really-simple-color-picker/arrow.gif b/web_color/static/lib/really-simple-color-picker/arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9bdca92f8947235cb599742587af5cc43847b58 GIT binary patch literal 111 zcmZ?wbhEHb6krfw*v!Ci>(;Gv=gyrvb!zY4y<4|#UAuPe(xpr1%$f85|9=K-K=CIF wBRc~JgAPa%WCjC^jKE3H)q5>opWXdGL8H&(A+Ni-$TKm44{SWli7pJ*0Q^NHd;kCd literal 0 HcmV?d00001 diff --git a/web_color/static/lib/really-simple-color-picker/arrow.png b/web_color/static/lib/really-simple-color-picker/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..876968dd5633cc8239429793b1d54bc2489b48c5 GIT binary patch literal 27296 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 literal 0 HcmV?d00001 diff --git a/web_color/static/lib/really-simple-color-picker/colorPicker.css b/web_color/static/lib/really-simple-color-picker/colorPicker.css new file mode 100644 index 00000000..580abc51 --- /dev/null +++ b/web_color/static/lib/really-simple-color-picker/colorPicker.css @@ -0,0 +1,34 @@ +div.colorPicker-picker { + height: 16px; + width: 16px; + padding: 0 !important; + border: 1px solid #ccc; + background: url(arrow.gif) no-repeat top right; + cursor: pointer; + line-height: 16px; +} + +div.colorPicker-palette { + width: 110px; + position: absolute; + border: 1px solid #ccc; + background-color: #FFFFFF; + padding: 5px; + z-index: 9999; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + div.colorPicker_hexWrap {width: 100%; float:left } + div.colorPicker_hexWrap label {font-size: 95%; color: #2F2F2F; margin: 5px 2px; width: 25%} + div.colorPicker_hexWrap input {margin: 5px 2px; padding: 0; font-size: 95%; border: 1px solid #000; width: 65%; } + +div.colorPicker-swatch { + height: 12px; + width: 12px; + border: 1px solid #000; + margin: 2px; + float: left; + cursor: pointer; + line-height: 12px; +} diff --git a/web_color/static/lib/really-simple-color-picker/demo.html b/web_color/static/lib/really-simple-color-picker/demo.html new file mode 100644 index 00000000..5937e04b --- /dev/null +++ b/web_color/static/lib/really-simple-color-picker/demo.html @@ -0,0 +1,93 @@ + + + + +Really Simple Color Picker + + + + + + + + + + + + + +
+ +

Really Simple Color Picker (jQuery)

+ +

More information about this can be found in this blog article.

+
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+ + + + + diff --git a/web_color/static/lib/really-simple-color-picker/jquery.colorPicker.js b/web_color/static/lib/really-simple-color-picker/jquery.colorPicker.js new file mode 100644 index 00000000..02ba9b03 --- /dev/null +++ b/web_color/static/lib/really-simple-color-picker/jquery.colorPicker.js @@ -0,0 +1,328 @@ +/** + * Really Simple Color Picker in jQuery + * + * Licensed under the MIT (MIT-LICENSE.txt) licenses. + * + * Copyright (c) 2008-2012 + * Lakshan Perera (www.laktek.com) & Daniel Lacy (daniellacy.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +(function ($) { + /** + * Create a couple private variables. + **/ + var selectorOwner, + activePalette, + cItterate = 0, + templates = { + control : $('
 
'), + palette : $('
'), + swatch : $('
 
'), + hexLabel: $(''), + hexField: $('') + }, + transparent = "transparent", + lastColor; + + /** + * Create our colorPicker function + **/ + $.fn.colorPicker = function (options) { + + return this.each(function () { + // Setup time. Clone new elements from our templates, set some IDs, make shortcuts, jazzercise. + var element = $(this), + opts = $.extend({}, $.fn.colorPicker.defaults, options), + defaultColor = $.fn.colorPicker.toHex( + (element.val().length > 0) ? element.val() : opts.pickerDefault + ), + newControl = templates.control.clone(), + newPalette = templates.palette.clone().attr('id', 'colorPicker_palette-' + cItterate), + newHexLabel = templates.hexLabel.clone(), + newHexField = templates.hexField.clone(), + paletteId = newPalette[0].id, + swatch; + + + /** + * Build a color palette. + **/ + $.each(opts.colors, function (i) { + swatch = templates.swatch.clone(); + + if (opts.colors[i] === transparent) { + swatch.addClass(transparent).text('X'); + $.fn.colorPicker.bindPalette(newHexField, swatch, transparent); + } else { + swatch.css("background-color", "#" + this); + $.fn.colorPicker.bindPalette(newHexField, swatch); + } + swatch.appendTo(newPalette); + }); + + newHexLabel.attr('for', 'colorPicker_hex-' + cItterate); + + newHexField.attr({ + 'id' : 'colorPicker_hex-' + cItterate, + 'value' : defaultColor + }); + + newHexField.bind("keydown", function (event) { + if (event.keyCode === 13) { + var hexColor = $.fn.colorPicker.toHex($(this).val()); + $.fn.colorPicker.changeColor(hexColor ? hexColor : element.val()); + } + if (event.keyCode === 27) { + $.fn.colorPicker.hidePalette(); + } + }); + + newHexField.bind("keyup", function (event) { + var hexColor = $.fn.colorPicker.toHex($(event.target).val()); + $.fn.colorPicker.previewColor(hexColor ? hexColor : element.val()); + }); + + $('
').append(newHexLabel).appendTo(newPalette); + + newPalette.find('.colorPicker_hexWrap').append(newHexField); + + $("body").append(newPalette); + + newPalette.hide(); + + + /** + * Build replacement interface for original color input. + **/ + newControl.css("background-color", defaultColor); + + newControl.bind("click", function () { + $.fn.colorPicker.togglePalette($('#' + paletteId), $(this)); + }); + + if( options && options.onColorChange ) { + newControl.data('onColorChange', options.onColorChange); + } else { + newControl.data('onColorChange', function() {} ); + } + element.after(newControl); + + element.bind("change", function () { + element.next(".colorPicker-picker").css( + "background-color", $.fn.colorPicker.toHex($(this).val()) + ); + }); + + // Hide the original input. + element.val(defaultColor).hide(); + + cItterate++; + }); + }; + + /** + * Extend colorPicker with... all our functionality. + **/ + $.extend(true, $.fn.colorPicker, { + /** + * Return a Hex color, convert an RGB value and return Hex, or return false. + * + * Inspired by http://code.google.com/p/jquery-color-utils + **/ + toHex : function (color) { + // If we have a standard or shorthand Hex color, return that value. + if (color.match(/[0-9A-F]{6}|[0-9A-F]{3}$/i)) { + return (color.charAt(0) === "#") ? color : ("#" + color); + + // Alternatively, check for RGB color, then convert and return it as Hex. + } else if (color.match(/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/)) { + var c = ([parseInt(RegExp.$1, 10), parseInt(RegExp.$2, 10), parseInt(RegExp.$3, 10)]), + pad = function (str) { + if (str.length < 2) { + for (var i = 0, len = 2 - str.length; i < len; i++) { + str = '0' + str; + } + } + + return str; + }; + + if (c.length === 3) { + var r = pad(c[0].toString(16)), + g = pad(c[1].toString(16)), + b = pad(c[2].toString(16)); + + return '#' + r + g + b; + } + + // Otherwise we wont do anything. + } else { + return false; + + } + }, + + /** + * Check whether user clicked on the selector or owner. + **/ + checkMouse : function (event, paletteId) { + var selector = activePalette, + selectorParent = $(event.target).parents("#" + selector.attr('id')).length; + + if (event.target === $(selector)[0] || event.target === selectorOwner[0] || selectorParent > 0) { + return; + } + + $.fn.colorPicker.hidePalette(); + }, + + /** + * Hide the color palette modal. + **/ + hidePalette : function () { + $(document).unbind("mousedown", $.fn.colorPicker.checkMouse); + + $('.colorPicker-palette').hide(); + }, + + /** + * Show the color palette modal. + **/ + showPalette : function (palette) { + var hexColor = selectorOwner.prev("input").val(); + + palette.css({ + top: selectorOwner.offset().top + (selectorOwner.outerHeight()), + left: selectorOwner.offset().left + }); + + $("#color_value").val(hexColor); + + palette.show(); + + $(document).bind("mousedown", $.fn.colorPicker.checkMouse); + }, + + /** + * Toggle visibility of the colorPicker palette. + **/ + togglePalette : function (palette, origin) { + // selectorOwner is the clicked .colorPicker-picker. + if (origin) { + selectorOwner = origin; + } + + activePalette = palette; + + if (activePalette.is(':visible')) { + $.fn.colorPicker.hidePalette(); + + } else { + $.fn.colorPicker.showPalette(palette); + + } + }, + + /** + * Update the input with a newly selected color. + **/ + changeColor : function (value) { + selectorOwner.css("background-color", value); + selectorOwner.prev("input").val(value).change(); + + $.fn.colorPicker.hidePalette(); + + selectorOwner.data('onColorChange').call(selectorOwner, $(selectorOwner).prev("input").attr("id"), value); + }, + + + /** + * Preview the input with a newly selected color. + **/ + previewColor : function (value) { + selectorOwner.css("background-color", value); + }, + + /** + * Bind events to the color palette swatches. + */ + bindPalette : function (paletteInput, element, color) { + color = color ? color : $.fn.colorPicker.toHex(element.css("background-color")); + + element.bind({ + click : function (ev) { + lastColor = color; + + $.fn.colorPicker.changeColor(color); + }, + mouseover : function (ev) { + lastColor = paletteInput.val(); + + $(this).css("border-color", "#598FEF"); + + paletteInput.val(color); + + $.fn.colorPicker.previewColor(color); + }, + mouseout : function (ev) { + $(this).css("border-color", "#000"); + + paletteInput.val(selectorOwner.css("background-color")); + + paletteInput.val(lastColor); + + $.fn.colorPicker.previewColor(lastColor); + } + }); + } + }); + + /** + * Default colorPicker options. + * + * These are publibly available for global modification using a setting such as: + * + * $.fn.colorPicker.defaults.colors = ['151337', '111111'] + * + * They can also be applied on a per-bound element basis like so: + * + * $('#element1').colorPicker({pickerDefault: 'efefef', transparency: true}); + * $('#element2').colorPicker({pickerDefault: '333333', colors: ['333333', '111111']}); + * + **/ + $.fn.colorPicker.defaults = { + // colorPicker default selected color. + pickerDefault : "FFFFFF", + + // Default color set. + colors : [ + '000000', '993300', '333300', '000080', '333399', '333333', '800000', 'FF6600', + '808000', '008000', '008080', '0000FF', '666699', '808080', 'FF0000', 'FF9900', + '99CC00', '339966', '33CCCC', '3366FF', '800080', '999999', 'FF00FF', 'FFCC00', + 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0', 'FF99CC', 'FFCC99', + 'FFFF99', 'CCFFFF', '99CCFF', 'FFFFFF' + ], + + // If we want to simply add more colors to the default set, use addColors. + addColors : [] + }; + +})(jQuery); diff --git a/web_color/static/lib/really-simple-color-picker/jquery.colorPicker.min.js b/web_color/static/lib/really-simple-color-picker/jquery.colorPicker.min.js new file mode 100644 index 00000000..65b3fb33 --- /dev/null +++ b/web_color/static/lib/really-simple-color-picker/jquery.colorPicker.min.js @@ -0,0 +1,26 @@ +/** + * Really Simple Color Picker in jQuery + * + * Licensed under the MIT (MIT-LICENSE.txt) licenses. + * + * Copyright (c) 2008-2012 + * Lakshan Perera (www.laktek.com) & Daniel Lacy (daniellacy.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */(function(a){var b,c,d=0,e={control:a('
 
'),palette:a('
'),swatch:a('
 
'),hexLabel:a(''),hexField:a('')},f="transparent",g;a.fn.colorPicker=function(b){return this.each(function(){var c=a(this),g=a.extend({},a.fn.colorPicker.defaults,b),h=a.fn.colorPicker.toHex(c.val().length>0?c.val():g.pickerDefault),i=e.control.clone(),j=e.palette.clone().attr("id","colorPicker_palette-"+d),k=e.hexLabel.clone(),l=e.hexField.clone(),m=j[0].id,n;a.each(g.colors,function(b){n=e.swatch.clone(),g.colors[b]===f?(n.addClass(f).text("X"),a.fn.colorPicker.bindPalette(l,n,f)):(n.css("background-color","#"+this),a.fn.colorPicker.bindPalette(l,n)),n.appendTo(j)}),k.attr("for","colorPicker_hex-"+d),l.attr({id:"colorPicker_hex-"+d,value:h}),l.bind("keydown",function(b){if(b.keyCode===13){var d=a.fn.colorPicker.toHex(a(this).val());a.fn.colorPicker.changeColor(d?d:c.val())}b.keyCode===27&&a.fn.colorPicker.hidePalette()}),l.bind("keyup",function(b){var d=a.fn.colorPicker.toHex(a(b.target).val());a.fn.colorPicker.previewColor(d?d:c.val())}),a('
').append(k).appendTo(j),j.find(".colorPicker_hexWrap").append(l),a("body").append(j),j.hide(),i.css("background-color",h),i.bind("click",function(){a.fn.colorPicker.togglePalette(a("#"+m),a(this))}),b&&b.onColorChange?i.data("onColorChange",b.onColorChange):i.data("onColorChange",function(){}),c.after(i),c.bind("change",function(){c.next(".colorPicker-picker").css("background-color",a.fn.colorPicker.toHex(a(this).val()))}),c.val(h).hide(),d++})},a.extend(!0,a.fn.colorPicker,{toHex:function(a){if(a.match(/[0-9A-F]{6}|[0-9A-F]{3}$/i))return a.charAt(0)==="#"?a:"#"+a;if(!a.match(/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/))return!1;var b=[parseInt(RegExp.$1,10),parseInt(RegExp.$2,10),parseInt(RegExp.$3,10)],c=function(a){if(a.length<2)for(var b=0,c=2-a.length;b0)return;a.fn.colorPicker.hidePalette()},hidePalette:function(){a(document).unbind("mousedown",a.fn.colorPicker.checkMouse),a(".colorPicker-palette").hide()},showPalette:function(c){var d=b.prev("input").val();c.css({top:b.offset().top+b.outerHeight(),left:b.offset().left}),a("#color_value").val(d),c.show(),a(document).bind("mousedown",a.fn.colorPicker.checkMouse)},togglePalette:function(d,e){e&&(b=e),c=d,c.is(":visible")?a.fn.colorPicker.hidePalette():a.fn.colorPicker.showPalette(d)},changeColor:function(c){b.css("background-color",c),b.prev("input").val(c).change(),a.fn.colorPicker.hidePalette(),b.data("onColorChange").call(b,a(b).prev("input").attr("id"),c)},previewColor:function(a){b.css("background-color",a)},bindPalette:function(c,d,e){e=e?e:a.fn.colorPicker.toHex(d.css("background-color")),d.bind({click:function(b){g=e,a.fn.colorPicker.changeColor(e)},mouseover:function(b){g=c.val(),a(this).css("border-color","#598FEF"),c.val(e),a.fn.colorPicker.previewColor(e)},mouseout:function(d){a(this).css("border-color","#000"),c.val(b.css("background-color")),c.val(g),a.fn.colorPicker.previewColor(g)}})}}),a.fn.colorPicker.defaults={pickerDefault:"FFFFFF",colors:["000000","993300","333300","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","999999","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFFF","99CCFF","FFFFFF"],addColors:[]}})(jQuery) \ No newline at end of file diff --git a/web_color/static/lib/really-simple-color-picker/screenshot.png b/web_color/static/lib/really-simple-color-picker/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..56637876732e58cd849e5ba1bb8d2ab4d8afa157 GIT binary patch literal 2078 zcmZ`)2{hDQ8~@K(XKbS>TVtuWg+lVtt6nCg#tab4aw-8Z#t*r`_B2!xzD}N?>W!C&vu`CV~q?^0#FGk0007LT^$qF z8pfhmyxgpLEYtKlYXSM1ptOMsD&jK>K)iG@z5u`n{||wH>>M$ckjD>gaGhrqdYqR- zX`ex5oyJpz*3mKz9AC}7>k7w+J)0VfAHCY)kj_TrCOITGn zR|%m%nx4xO-5Kt>EzNj%22vIB-BVVM@)QOhc0KCoSh#|Dk(ZSoWtJ;upKB@MogZ3v zCWPCS-kqS&vqbfgWLwmAs0rKO-$%EG+l$5hgUj3GwV+Jo!;UJma3V@M!2|ONk+#pN zg`b0=2YVOUys=_6lvV{QIP3)k=QllZ-zQ*>ZcC6?!Eo_Y`atC zrHj;&t{Ir7ERYZAm2j%afMlZsicL2GURh2M+y_uGrvxz zoCv$j(vJeepzMvmm{Y6hB@%F+@SfoeDZ3)$?49;?Xd51OOpSr-Ji!hurVPP`sc9HZ z_rE4IyvFGqA{3%^-9u7aS(CVMN}Qwdf%H-`9=?&?wg#c3-~1d-xmB+A|3fpOf!X%X zmE{gFMdJrl3Q zOlX4)4UH;!D4H;Lp4-(I3*DRYz8Plg(r+hJd>I}>?gu^RJOb5J4iJ&4sd+d4THc)H zALp^j3GxGXTM+}}_>{%mXW%L@*~VLqlbuoHbPhI5QRaiC@O5P`7z7o)U7nXRN_0Y0 z2IVB7);=IXlPw2V5rX>Nr6ncPKkN6a48NEzXsH`0oA_d@1Xn1VWMP0PCxu{+VCc89 z0YZDV1ws(SRyAE@@3r?yLyX9(w$8PB&*Ys-|PP-;LIVaN`7{Vz8 zd8lPSGHQO)71ICgP-gzSU5Ye(j%nef@Xn;V3zDeexz{bYb9gX|RGf<~pj>ub39YkU zyoax=tR;``rBsEOeic*0W0G%IJ1HVM_aw?hV}IIc@0n-`g1fyZXqlUfEcRz{v`r=c z?)jmJFsa198;qP^Ty$8QXyoONoaZ%b!iAa>+Zh6!J zP*2q;`?x7<#mtdqBAwRxE!k!8&sZW+`9u_qM-Tz~NX>=AH$T5Uo1C7WPGq#Ss0+vH zI6M&&62fn7Z8gxHK{D@Nwbe_!S^49jPEHz(4Be0E>ACT6vLccpY*aFtW7dW#uxGN2s8vh?7r5K4zKO)ZA=r zW0SD9=8=|>VJN%xeP_Mea|$^!GEzifj+EY3;^+ACaS-M0eG!Ml85tSD0Z#6HpAtI3Y5tehQ*xs8HC|BLlr-Iw zoFMsWeVzPq@a07{wV1`ldj#u7W#?5aW2Ix6Rw*2RV|Z*Vwli9&u(De}CJTI!Gm@FjS({%#pQqSNtj-e}j>*5;Lz@ERBxY + + + +Really Simple Color Picker + + + + + + + + + + + + + +
+ +

Test Really Simple Color Picker (jQuery)

+ +

More information about this can be found in this blog article.

+
+
+
+
+ +
+
+
+ + + + + diff --git a/web_color/static/src/css/color.css b/web_color/static/src/css/color.css new file mode 100644 index 00000000..74d6f517 --- /dev/null +++ b/web_color/static/src/css/color.css @@ -0,0 +1,9 @@ +div.colorviewer { + display: inline; + float: left; + height: 16px; + width: 16px; + padding: 0 !important; + border: 1px solid #ccc; + line-height: 16px; +} \ No newline at end of file diff --git a/web_color/static/src/img/icon.png b/web_color/static/src/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..540f72db957725439a21eb0e7815690944fdc319 GIT binary patch literal 3454 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 literal 0 HcmV?d00001 diff --git a/web_color/static/src/js/lib.js b/web_color/static/src/js/lib.js new file mode 100644 index 00000000..a14e3434 --- /dev/null +++ b/web_color/static/src/js/lib.js @@ -0,0 +1,49 @@ +/*############################################################################ +# +# OpenERP, Open Source Web Color +# Copyright (C) 2012 Savoir-faire Linux (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# @author Étienne Beaudry Auger +# +##############################################################################*/ + +openerp.web_color = function(instance) { + var _t = openerp.web._t; + var QWeb = openerp.web.qweb; + + widget_name = 'color'; + //Add in the widgets list + instance.web.form.widgets.add(widget_name, 'openerp.web_color'); + //Add object in the column list + instance.web.list.columns.add('field.color', 'instance.web.list.Color'); + //instance of the widget itself + instance.web.list.Color = instance.web.list.Column.extend({ + /** + * Return a formatted div colored and display the hexa color code + * from row_data + * + * @private + */ + _format: function (row_data, options) { + return _.template( + '
\ + ', { + colorCode: row_data[this.id].value + }); + + } + }); +} \ No newline at end of file diff --git a/web_color/static/src/xml/lib.xml b/web_color/static/src/xml/lib.xml new file mode 100644 index 00000000..b9e48e78 --- /dev/null +++ b/web_color/static/src/xml/lib.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file