summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js51
-rw-r--r--addons/web/static/src/js/fields/field_registry.js1
-rw-r--r--addons/web/static/tests/fields/basic_fields_tests.js41
-rw-r--r--odoo/addons/base/res/res_company.py12
-rw-r--r--odoo/addons/base/res/res_company_view.xml52
5 files changed, 111 insertions, 46 deletions
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 7e6a330120e..911afea36e5 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -2391,6 +2391,56 @@ var AceEditor = DebouncedField.extend({
},
});
+var ImageSelection = AbstractField.extend({
+ supportedFieldTypes: ['selection'],
+ events: _.extend({}, AbstractField.prototype.events, {
+ 'click img': '_onImgClicked',
+ }),
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * @override
+ * @private
+ */
+ _render: function () {
+ var self = this;
+ this.$el.empty();
+ _.each(this.nodeOptions, function (val, key) {
+ var $container = $('<div>').addClass('col-xs-3 text-center');
+ var $img = $('<img>')
+ .addClass('img img-responsive img-thumbnail ml16')
+ .toggleClass('btn-info', key === self.value)
+ .attr('src', val.image_link)
+ .data('key', key);
+ $container.append($img);
+ if (val.preview_link) {
+ var $previewLink = $('<a>')
+ .text('Preview')
+ .attr('href', val.preview_link)
+ .attr('target', '_blank');
+ $container.append($previewLink);
+ }
+ self.$el.append($container);
+ });
+ },
+
+ //--------------------------------------------------------------------------
+ // Handlers
+ //--------------------------------------------------------------------------
+
+ /**
+ * @override
+ * @private
+ * @param {MouseEvent} event
+ */
+ _onImgClicked: function (event) {
+ this._setValue($(event.currentTarget).data('key'));
+ },
+});
+
return {
TranslatableFieldMixin: TranslatableFieldMixin,
DebouncedField: DebouncedField,
@@ -2416,6 +2466,7 @@ return {
HandleWidget: HandleWidget,
InputField: InputField,
AttachmentImage: AttachmentImage,
+ ImageSelection: ImageSelection,
LabelSelection: LabelSelection,
StateSelectionWidget: StateSelectionWidget,
FavoriteWidget: FavoriteWidget,
diff --git a/addons/web/static/src/js/fields/field_registry.js b/addons/web/static/src/js/fields/field_registry.js
index 019a98e51f1..61e371d867a 100644
--- a/addons/web/static/src/js/fields/field_registry.js
+++ b/addons/web/static/src/js/fields/field_registry.js
@@ -37,6 +37,7 @@ registry
.add('monetary', basic_fields.FieldMonetary)
.add('priority', basic_fields.PriorityWidget)
.add('attachment_image', basic_fields.AttachmentImage)
+ .add('image_selection', basic_fields.ImageSelection)
.add('label_selection', basic_fields.LabelSelection)
.add('state_selection', basic_fields.StateSelectionWidget)
.add('kanban_state_selection', basic_fields.StateSelectionWidget)
diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js
index 9d0d0807199..91029cf9cfc 100644
--- a/addons/web/static/tests/fields/basic_fields_tests.js
+++ b/addons/web/static/tests/fields/basic_fields_tests.js
@@ -38,6 +38,8 @@ QUnit.module('basic_fields', {
selection: {string: "Selection", type: "selection", searchable:true,
selection: [['normal', 'Normal'],['blocked', 'Blocked'],['done', 'Done']]},
document: {string: "Binary", type: "binary"},
+ image_selection: {string: "Image Selection", type: "selection", searchable:true,
+ selection: [['background', 'Background'],['boxed', 'Boxed'],['clean', 'Clean'],['standard', 'Standard']]},
},
records: [{
id: 1,
@@ -3995,6 +3997,45 @@ QUnit.module('basic_fields', {
form.destroy();
});
+
+ QUnit.module('FieldImageSelection');
+
+ QUnit.test('image selection widget in form view', function (assert) {
+ assert.expect(3);
+
+ var nodeOptions = {
+ background: {
+ image_link: '/base/static/img/preview_background.png',
+ preview_link: '/base/static/pdf/preview_background.pdf',
+ },
+ boxed: {
+ image_link: '/base/static/img/preview_boxed.png',
+ preview_link: '/base/static/pdf/preview_boxed.pdf',
+ },
+ };
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form>' +
+ '<field name="image_selection" widget="image_selection"' +
+ ' options=\'' + JSON.stringify(nodeOptions) + '\'/> '+
+ '</form>',
+ res_id: 2,
+ });
+
+ assert.strictEqual(form.$('.img.img-responsive').length, 2,
+ "Two images should be rendered");
+ assert.strictEqual(form.$('.img.btn-info').length, 0,
+ "No image should be selected");
+
+ // select first image
+ form.$(".img.img-responsive:first").click();
+ assert.ok(form.$(".img.img-responsive:first").hasClass('btn-info'),
+ "First image should be selected");
+
+ form.destroy();
+ });
});
});
});
diff --git a/odoo/addons/base/res/res_company.py b/odoo/addons/base/res/res_company.py
index 6aeeba4d4e1..e9f1b1efda9 100644
--- a/odoo/addons/base/res/res_company.py
+++ b/odoo/addons/base/res/res_company.py
@@ -244,15 +244,3 @@ class Company(models.Model):
def open_company_edit_report(self):
self.ensure_one()
return self.env['res.config.settings'].open_company()
-
- @api.multi
- def set_report_template(self):
- self.ensure_one()
- if self.env.context.get('report_template', False):
- self.external_report_layout = self.env.context['report_template']
- if self.env.context.get('default_report_name'):
- document = self.env.get(self.env.context['active_model']).browse(self.env.context['active_id'])
- report_name = self.env.context['default_report_name']
- report_action = self.env['ir.actions.report'].search([('report_name', '=', report_name)], limit=1)
- return report_action.report_action(document, config=False)
- return False
diff --git a/odoo/addons/base/res/res_company_view.xml b/odoo/addons/base/res/res_company_view.xml
index 6fe8b1e20bc..a84539e7dc4 100644
--- a/odoo/addons/base/res/res_company_view.xml
+++ b/odoo/addons/base/res/res_company_view.xml
@@ -135,40 +135,24 @@
<xpath expr="//sheet" position="inside">
<hr />
<div class="row mt16">
- <field name="external_report_layout" invisible="1"/>
- <div class="col-xs-3 text-center">
- <button type="object" name="set_report_template" context="{'report_template': 'background'}" attrs="{'invisible': [('external_report_layout', '=', 'background')]}">
- <img src="/base/static/img/preview_background.png" class="img img-responsive img-thumbnail" alt="Preview Background Template"/>
- </button>
- <button class="btn-info" type="object" name="set_report_template" context="{'report_template': 'background'}" attrs="{'invisible': [('external_report_layout', '!=', 'background')]}">
- <img src="/base/static/img/preview_background.png" class="img img-responsive img-thumbnail" alt="Preview Background Template"/>
- </button>
- <a href="/base/static/pdf/preview_background.pdf" target="_blank">preview</a>
- </div><div class="col-xs-3 text-center">
- <button type="object" name="set_report_template" context="{'report_template': 'boxed'}" attrs="{'invisible': [('external_report_layout', '=', 'boxed')]}">
- <img src="/base/static/img/preview_boxed.png" class="img img-responsive img-thumbnail" alt="Preview Boxed Template"/>
- </button>
- <button class="btn-info" type="object" name="set_report_template" context="{'report_template': 'boxed'}" attrs="{'invisible': [('external_report_layout', '!=', 'boxed')]}">
- <img src="/base/static/img/preview_boxed.png" class="img img-responsive img-thumbnail" alt="Preview Boxed Template"/>
- </button>
- <a href="/base/static/pdf/preview_boxed.pdf" target="_blank">preview</a>
- </div><div class="col-xs-3 text-center">
- <button type="object" name="set_report_template" context="{'report_template': 'clean'}" attrs="{'invisible': [('external_report_layout', '=', 'clean')]}">
- <img src="/base/static/img/preview_clean.png" class="img img-responsive img-thumbnail" alt="Preview Clean Template"/>
- </button>
- <button class="btn-info" type="object" name="set_report_template" context="{'report_template': 'clean'}" attrs="{'invisible': [('external_report_layout', '!=', 'clean')]}">
- <img src="/base/static/img/preview_clean.png" class="img img-responsive img-thumbnail" alt="Preview Clean Template"/>
- </button>
- <a href="/base/static/pdf/preview_clean.pdf" target="_blank">preview</a>
- </div><div class="col-xs-3 text-center">
- <button type="object" name="set_report_template" context="{'report_template': 'standard'}" attrs="{'invisible': [('external_report_layout', '=', 'standard')]}">
- <img src="/base/static/img/preview_standard.png" class="img img-responsive img-thumbnail" alt="Preview Minimalist Template"/>
- </button>
- <button class="btn-info" type="object" name="set_report_template" context="{'report_template': 'standard'}" attrs="{'invisible': [('external_report_layout', '!=', 'standard')]}">
- <img src="/base/static/img/preview_standard.png" class="img img-responsive img-thumbnail" alt="Preview Minimalist Template"/>
- </button>
- <a href="/base/static/pdf/preview_standard.pdf" target="_blank">preview</a>
- </div>
+ <field name="external_report_layout" widget="image_selection" options="{
+ 'background': {
+ 'image_link': '/base/static/img/preview_background.png',
+ 'preview_link': '/base/static/pdf/preview_background.pdf'
+ },
+ 'boxed': {
+ 'image_link': '/base/static/img/preview_boxed.png',
+ 'preview_link': '/base/static/pdf/preview_boxed.pdf'
+ },
+ 'clean': {
+ 'image_link': '/base/static/img/preview_clean.png',
+ 'preview_link': '/base/static/pdf/preview_clean.pdf'
+ },
+ 'standard': {
+ 'image_link': '/base/static/img/preview_standard.png',
+ 'preview_link': '/base/static/pdf/preview_standard.pdf'
+ }
+ }"/>
</div>
<footer>
<button string="Save" type="object" class="oe_highlight" name="write"/>