diff options
| author | Christophe Matthieu <chm@odoo.com> | 2018-07-26 09:55:01 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@odoo.com> | 2018-08-13 17:09:28 +0200 |
| commit | 61eef73b52c078daaae37f8d57e93830a2e53410 (patch) | |
| tree | 8b144174691de487a584bf8ac449fb55d3ad12ab /addons/web/static | |
| parent | 149eb38b07cace0ec2118d214c56995402008efc (diff) | |
[IMP] base, *: use a many2one for the company report layout
Before this rev. one could set the report layout on the company using a
hardcoded list (background, clean, standard, etc.). Other modules (typically
accounting modules) could add options in this list. The used template was built
on the layout key.
Now, the layout is a many2one field to a newly created model `report.layout`,
which is linked to a view with the layout architecture.
This gives more control to customize reports and create a new layout (without
creating a python module that extend the layout selection).
Diffstat (limited to 'addons/web/static')
| -rw-r--r-- | addons/web/static/img/preview_background.png | bin | 0 -> 10185 bytes | |||
| -rw-r--r-- | addons/web/static/img/preview_boxed.png | bin | 0 -> 5525 bytes | |||
| -rw-r--r-- | addons/web/static/img/preview_clean.png | bin | 0 -> 5257 bytes | |||
| -rw-r--r-- | addons/web/static/img/preview_standard.png | bin | 0 -> 5686 bytes | |||
| -rw-r--r-- | addons/web/static/pdf/preview_background.pdf | bin | 0 -> 197777 bytes | |||
| -rw-r--r-- | addons/web/static/pdf/preview_boxed.pdf | bin | 0 -> 42109 bytes | |||
| -rw-r--r-- | addons/web/static/pdf/preview_clean.pdf | bin | 0 -> 35495 bytes | |||
| -rw-r--r-- | addons/web/static/pdf/preview_standard.pdf | bin | 0 -> 27399 bytes | |||
| -rw-r--r-- | addons/web/static/src/js/fields/basic_fields.js | 51 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/field_registry.js | 4 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/special_fields.js | 67 | ||||
| -rw-r--r-- | addons/web/static/src/scss/form_view.scss | 3 | ||||
| -rw-r--r-- | addons/web/static/tests/fields/basic_fields_tests.js | 41 | ||||
| -rw-r--r-- | addons/web/static/tests/fields/special_fields.js | 47 |
14 files changed, 118 insertions, 95 deletions
diff --git a/addons/web/static/img/preview_background.png b/addons/web/static/img/preview_background.png Binary files differnew file mode 100644 index 00000000000..cab3eae0dd0 --- /dev/null +++ b/addons/web/static/img/preview_background.png diff --git a/addons/web/static/img/preview_boxed.png b/addons/web/static/img/preview_boxed.png Binary files differnew file mode 100644 index 00000000000..963e0b7f62b --- /dev/null +++ b/addons/web/static/img/preview_boxed.png diff --git a/addons/web/static/img/preview_clean.png b/addons/web/static/img/preview_clean.png Binary files differnew file mode 100644 index 00000000000..0318421b016 --- /dev/null +++ b/addons/web/static/img/preview_clean.png diff --git a/addons/web/static/img/preview_standard.png b/addons/web/static/img/preview_standard.png Binary files differnew file mode 100644 index 00000000000..0bd596ed9b5 --- /dev/null +++ b/addons/web/static/img/preview_standard.png diff --git a/addons/web/static/pdf/preview_background.pdf b/addons/web/static/pdf/preview_background.pdf Binary files differnew file mode 100644 index 00000000000..d33687c16b8 --- /dev/null +++ b/addons/web/static/pdf/preview_background.pdf diff --git a/addons/web/static/pdf/preview_boxed.pdf b/addons/web/static/pdf/preview_boxed.pdf Binary files differnew file mode 100644 index 00000000000..e73c1131d04 --- /dev/null +++ b/addons/web/static/pdf/preview_boxed.pdf diff --git a/addons/web/static/pdf/preview_clean.pdf b/addons/web/static/pdf/preview_clean.pdf Binary files differnew file mode 100644 index 00000000000..4f1c42b4814 --- /dev/null +++ b/addons/web/static/pdf/preview_clean.pdf diff --git a/addons/web/static/pdf/preview_standard.pdf b/addons/web/static/pdf/preview_standard.pdf Binary files differnew file mode 100644 index 00000000000..4d537376850 --- /dev/null +++ b/addons/web/static/pdf/preview_standard.pdf diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 399647d1dbe..dfcbbc71a80 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -2826,56 +2826,6 @@ 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-3 text-center'); - var $img = $('<img>') - .addClass('img img-fluid 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, @@ -2906,7 +2856,6 @@ 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 df8ffc9dd5b..c94c315cfa6 100644 --- a/addons/web/static/src/js/fields/field_registry.js +++ b/addons/web/static/src/js/fields/field_registry.js @@ -43,7 +43,6 @@ registry .add('percentage', basic_fields.FieldPercentage) .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) @@ -81,5 +80,6 @@ registry // Special fields registry - .add('timezone_mismatch', special_fields.FieldTimezoneMismatch); + .add('timezone_mismatch', special_fields.FieldTimezoneMismatch) + .add('report_layout', special_fields.FieldReportLayout); }); diff --git a/addons/web/static/src/js/fields/special_fields.js b/addons/web/static/src/js/fields/special_fields.js index 3db57c5e158..5a6aa8cfd28 100644 --- a/addons/web/static/src/js/fields/special_fields.js +++ b/addons/web/static/src/js/fields/special_fields.js @@ -102,8 +102,75 @@ var FieldTimezoneMismatch = FieldSelection.extend({ }, }); +var FieldReportLayout = relational_fields.FieldMany2One.extend({ + supportedFieldTypes: ['many2one', 'selection'], + events: _.extend({}, relational_fields.FieldMany2One.prototype.events, { + 'click img': '_onImgClicked', + }), + + willStart: function () { + var self = this; + this.previews = {}; + return this._super() + .then(function () { + return self._rpc({ + model: 'report.layout', + method: "search_read" + }).then(function (values) { + self.previews = values; + }); + }); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + * @private + */ + _render: function () { + var self = this; + this.$el.empty(); + var value = _.isObject(this.value) ? this.value.data.id : this.value; + _.each(this.previews, function (val) { + var $container = $('<div>').addClass('col-3 text-center'); + var $img = $('<img>') + .addClass('img img-fluid img-thumbnail ml16') + .toggleClass('btn-info', val.view_id[0] === value) + .attr('src', val.image) + .data('key', val.view_id[0]); + $container.append($img); + if (val.pdf) { + var $previewLink = $('<a>') + .text('Preview') + .attr('href', val.pdf) + .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 { FieldTimezoneMismatch: FieldTimezoneMismatch, + FieldReportLayout: FieldReportLayout, }; }); diff --git a/addons/web/static/src/scss/form_view.scss b/addons/web/static/src/scss/form_view.scss index 6f5e955e652..367d9854563 100644 --- a/addons/web/static/src/scss/form_view.scss +++ b/addons/web/static/src/scss/form_view.scss @@ -606,7 +606,8 @@ } } &.o_company_document_layout { - .image_selection_container { + .report_layout_container { + display: inline-block; div { display: inline-block; img { diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index 1855b032bf3..63e677f367d 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -40,8 +40,6 @@ 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, @@ -4828,45 +4826,6 @@ 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-fluid').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-fluid:first").click(); - assert.ok(form.$(".img.img-fluid:first").hasClass('btn-info'), - "First image should be selected"); - - form.destroy(); - }); }); }); }); diff --git a/addons/web/static/tests/fields/special_fields.js b/addons/web/static/tests/fields/special_fields.js index 6786f6783b7..3592f813fae 100644 --- a/addons/web/static/tests/fields/special_fields.js +++ b/addons/web/static/tests/fields/special_fields.js @@ -213,6 +213,53 @@ QUnit.module('special_fields', { form.destroy(); }); + QUnit.module('FieldReportLayout'); + + QUnit.test('report_layout widget in form view', function (assert) { + assert.expect(3); + + this.data['report.layout'] = { + fields: { + view_id: {string: "Document Template", type: "many2one", relation: "product"}, + image: {string: "Preview image src", type: "char"}, + pdf: {string: "Preview pdf src", type: "char"} + }, + records: [{ + id: 1, + view_id: 37, + image: "/web/static/toto.png", + pdf: "/web/static/toto.pdf", + }, { + id: 2, + view_id: 41, + image: "/web/static/tata.png", + pdf: "/web/static/tata.pdf", + }] + }; + this.data.partner.records[1].product_id = false; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form>' + + '<field name="product_id" widget="report_layout"/> '+ + '</form>', + res_id: 2, + }); + + assert.strictEqual(form.$('.img.img-fluid').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-fluid:first").click(); + assert.ok(form.$(".img.img-fluid:first").hasClass('btn-info'), + "First image should be selected"); + + form.destroy(); + }); }); }); }); |
