summaryrefslogtreecommitdiff
path: root/addons/web/static
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-04-17 19:47:37 +0200
committerChristophe Simonis <chs@odoo.com>2019-04-17 19:47:37 +0200
commit15b8d353c7bcee7279a06a1dc4d03e8c259cc2f2 (patch)
treeb8018bfee69bd053674451f6eb0cfedaf0021e88 /addons/web/static
parent2b63b7e8edfd052682bb01be7a2b4f66c1f6e8fb (diff)
parent2830b93a3a7ca575bd6a29c34c50c902bb5c8913 (diff)
[MERGE] forward port branch 12.0 up to 2830b93a3a7
Diffstat (limited to 'addons/web/static')
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js2
-rw-r--r--addons/web/static/src/scss/bootstrap_overridden.scss2
-rw-r--r--addons/web/static/src/scss/fonts.scss30
-rw-r--r--addons/web/static/src/scss/layout_clean.scss2
-rw-r--r--addons/web/static/tests/views/list_tests.js44
-rw-r--r--addons/web/static/tests/views/search_view_tests.js31
6 files changed, 108 insertions, 3 deletions
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 8faa6e97ea8..219e3f4e0e7 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -805,7 +805,7 @@ var FieldBoolean = AbstractField.extend({
* @returns {jQuery} the focusable checkbox input
*/
getFocusableElement: function () {
- return this.$input || $();
+ return this.mode === 'readonly' ? $() : this.$input;
},
/**
* A boolean field is always set since false is a valid value.
diff --git a/addons/web/static/src/scss/bootstrap_overridden.scss b/addons/web/static/src/scss/bootstrap_overridden.scss
index 13d1a306ec4..4e728fc99f1 100644
--- a/addons/web/static/src/scss/bootstrap_overridden.scss
+++ b/addons/web/static/src/scss/bootstrap_overridden.scss
@@ -61,7 +61,7 @@ $component-active-bg: $gray-200;
//
// Font, line-height, and color for body text, headings, and more.
-$font-family-sans-serif: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
+$font-family-sans-serif: "Noto", "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
$font-size-base: $o-font-size-base;
$line-height-base: $o-line-height-base;
diff --git a/addons/web/static/src/scss/fonts.scss b/addons/web/static/src/scss/fonts.scss
index bfabf4fe6fc..0a8793c9a18 100644
--- a/addons/web/static/src/scss/fonts.scss
+++ b/addons/web/static/src/scss/fonts.scss
@@ -4,6 +4,36 @@
$lato-font-path: '../fonts/lato';
@mixin lato-font($type, $weight, $style) {
+ // Cyrillic: U+0400-04FF, U+0500-052F
+ @font-face {
+ font-family: 'Noto';
+ src: url('https://fonts.odoocdn.com/fonts/noto/NotoSans-#{$type}.woff2') format('woff2'),
+ url('https://fonts.odoocdn.com/fonts/noto/NotoSans-#{$type}.woff') format('woff'),
+ url('https://fonts.odoocdn.com/fonts/noto/NotoSans-#{$type}.ttf') format('truetype');
+ font-weight: $weight;
+ font-style: $style;
+ unicode-range: U+0400-04FF, U+0500-052F;
+ }
+ // Hebrew: U+0590-05FF, U+FB1D-FB4F
+ @font-face {
+ font-family: 'Noto';
+ src: url('https://fonts.odoocdn.com/fonts/noto/NotoSansHebrew-#{$type}.woff2') format('woff2'),
+ url('https://fonts.odoocdn.com/fonts/noto/NotoSansHebrew-#{$type}.woff') format('woff'),
+ url('https://fonts.odoocdn.com/fonts/noto/NotoSansHebrew-#{$type}.ttf') format('truetype');
+ font-weight: $weight;
+ font-style: $style;
+ unicode-range: U+0590-05FF, U+FB1D-FB4F;
+ }
+ // Arabic: U+0600-06FF, U+0750-077F
+ @font-face {
+ font-family: 'Noto';
+ src: url('https://fonts.odoocdn.com/fonts/noto/NotoSansArabic-#{$type}.woff2') format('woff2'),
+ url('https://fonts.odoocdn.com/fonts/noto/NotoSansArabic-#{$type}.woff') format('woff'),
+ url('https://fonts.odoocdn.com/fonts/noto/NotoSansArabic-#{$type}.ttf') format('truetype');
+ font-weight: $weight;
+ font-style: $style;
+ unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF;
+ }
@font-face {
font-family: 'Lato';
src: url('#{$lato-font-path}/Lato-#{$type}-webfont.eot');
diff --git a/addons/web/static/src/scss/layout_clean.scss b/addons/web/static/src/scss/layout_clean.scss
index 910abc763a4..0a8f4b065af 100644
--- a/addons/web/static/src/scss/layout_clean.scss
+++ b/addons/web/static/src/scss/layout_clean.scss
@@ -1,5 +1,5 @@
.o_clean_footer, .o_clean_header, .o_report_layout_clean {
- font-family: 'Lato';
+ font-family: 'Lato', 'Noto';
color: #000;
}
.o_clean_header {
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 9be3e427d98..e5a461190d2 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -4219,6 +4219,50 @@ QUnit.module('Views', {
list.destroy();
});
+
+ QUnit.test('readonly boolean in editable list is readonly', function (assert) {
+ assert.expect(6);
+
+ var list = createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree editable="bottom">' +
+ '<field name="foo"/>' +
+ '<field name="bar" attrs="{\'readonly\': [(\'foo\', \'!=\', \'yop\')]}"/>' +
+ '</tree>',
+ });
+
+ // clicking on disabled checkbox with active row does not work
+ var $disabledCell = list.$('.o_data_row:eq(1) .o_data_cell:last-child');
+ testUtils.dom.click($disabledCell.prev());
+ assert.containsOnce($disabledCell, ':disabled:checked');
+ var $disabledLabel = $disabledCell.find('.custom-control-label');
+ testUtils.dom.click($disabledLabel);
+ assert.containsOnce($disabledCell, ':checked',
+ "clicking disabled checkbox did not work"
+ );
+ assert.ok(
+ $(document.activeElement).is('input[type="text"]'),
+ "disabled checkbox is not focused after click"
+ );
+
+ // clicking on enabled checkbox with active row toggles check mark
+ var $enabledCell = list.$('.o_data_row:eq(0) .o_data_cell:last-child');
+ testUtils.dom.click($enabledCell.prev());
+ assert.containsOnce($enabledCell, ':checked:not(:disabled)');
+ var $enabledLabel = $enabledCell.find('.custom-control-label');
+ testUtils.dom.click($enabledLabel);
+ assert.containsNone($enabledCell, ':checked',
+ "clicking enabled checkbox worked and unchecked it"
+ );
+ assert.ok(
+ $(document.activeElement).is('input[type="checkbox"]'),
+ "enabled checkbox is focused after click"
+ );
+
+ list.destroy();
+ });
});
});
diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js
index 39a48cf0204..cbc9fe2d0ef 100644
--- a/addons/web/static/tests/views/search_view_tests.js
+++ b/addons/web/static/tests/views/search_view_tests.js
@@ -734,6 +734,37 @@ QUnit.module('Search View', {
actionManager.destroy();
});
+ QUnit.test('Filter with JSON-parsable domain works', function (assert) {
+ assert.expect(1);
+
+ var domain = [['foo' ,'=', 'Gently Weeps']];
+ var xml_domain = JSON.stringify(domain);
+
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ if (route === '/web/dataset/search_read') {
+ assert.deepEqual(args.domain, domain,
+ 'A JSON parsable xml domain should be handled just like any other');
+ }
+ return this._super.apply(this, arguments);
+ }
+ });
+
+ this.archs['partner,5,search'] =
+ '<search>'+
+ '<filter string="Foo" name="gently_weeps" domain="' + _.escape(xml_domain) + '" />' +
+ '</search>';
+ this.actions[0].search_view_id = [5, 'search'];
+ this.actions[0].context = {search_default_gently_weeps: true};
+
+ actionManager.doAction(1);
+
+ actionManager.destroy();
+ });
+
QUnit.module('Favorites Menu');
QUnit.test('dynamic filters are saved dynamic', function (assert) {