summaryrefslogtreecommitdiff
path: root/addons/website/static/src
diff options
context:
space:
mode:
authorqsm-odoo <qsm@odoo.com>2018-07-27 12:42:10 +0200
committerqsm-odoo <qsm@odoo.com>2018-07-27 12:42:10 +0200
commit2b3017974bc7cd4b3a74f83c956224cfe4e5a918 (patch)
treeff6aab8dc6bfa7afbe9ef714ca157ebc0185d2fd /addons/website/static/src
parent8ed8b46f6434a2a3adea69e0134317e30bf9b936 (diff)
parent519594e9cab9a6362ef7c3e911605e4507a0a008 (diff)
[MERGE] *: migrate Bootstrap 3.3.7 to 4.1.3
See sub-commits for details. task-49280 Closes https://github.com/odoo/odoo/pull/25045
Diffstat (limited to 'addons/website/static/src')
-rw-r--r--addons/website/static/src/js/backend/dashboard.js8
-rw-r--r--addons/website/static/src/js/content/menu.js75
-rw-r--r--addons/website/static/src/js/content/snippets.animation.js4
-rw-r--r--addons/website/static/src/js/editor/rte.summernote.js2
-rw-r--r--addons/website/static/src/js/editor/snippets.options.js70
-rw-r--r--addons/website/static/src/js/menu/content.js24
-rw-r--r--addons/website/static/src/js/menu/customize.js40
-rw-r--r--addons/website/static/src/js/menu/navbar.js8
-rw-r--r--addons/website/static/src/js/menu/new_content.js2
-rw-r--r--addons/website/static/src/js/menu/seo.js8
-rw-r--r--addons/website/static/src/js/tours/rte.js2
-rw-r--r--addons/website/static/src/scss/website.backend.scss46
-rw-r--r--addons/website/static/src/scss/website.edit_mode.scss16
-rw-r--r--addons/website/static/src/scss/website.scss45
-rw-r--r--addons/website/static/src/scss/website.ui.scss62
-rw-r--r--addons/website/static/src/xml/website.backend.xml18
-rw-r--r--addons/website/static/src/xml/website.contentMenu.xml10
-rw-r--r--addons/website/static/src/xml/website.editor.xml4
-rw-r--r--addons/website/static/src/xml/website.facebook_page.xml32
-rw-r--r--addons/website/static/src/xml/website.gallery.xml4
-rw-r--r--addons/website/static/src/xml/website.pageProperties.xml80
-rw-r--r--addons/website/static/src/xml/website.seo.xml38
-rw-r--r--addons/website/static/src/xml/website.share.xml2
-rw-r--r--addons/website/static/src/xml/website.xml30
24 files changed, 285 insertions, 345 deletions
diff --git a/addons/website/static/src/js/backend/dashboard.js b/addons/website/static/src/js/backend/dashboard.js
index 09881b4ec1b..9ece194ab1e 100644
--- a/addons/website/static/src/js/backend/dashboard.js
+++ b/addons/website/static/src/js/backend/dashboard.js
@@ -200,7 +200,7 @@ var Dashboard = AbstractAction.extend(ControlPanelMixin, {
$analytics_components.empty();
// 1. Authorize component
- var $analytics_auth = $('<div>').addClass('col-md-12');
+ var $analytics_auth = $('<div>').addClass('col-lg-12');
window.onOriginError = function () {
$analytics_components.find('.js_unauthorized_message').remove();
self.display_unauthorized_message($analytics_components, 'not_initialized');
@@ -350,7 +350,7 @@ var Dashboard = AbstractAction.extend(ControlPanelMixin, {
$analytics_users.appendTo($analytics_components);
// 3. View Selector
- var $analytics_view_selector = $('<div>').addClass('col-md-12 o_properties_selection');
+ var $analytics_view_selector = $('<div>').addClass('col-lg-12 o_properties_selection');
var viewSelector = new gapi.analytics.ViewSelector({
container: $analytics_view_selector[0],
});
@@ -364,7 +364,7 @@ var Dashboard = AbstractAction.extend(ControlPanelMixin, {
} else if (this.date_range === 'year') {
start_date = '365daysAgo';
}
- var $analytics_chart_2 = $('<div>').addClass('col-md-6 col-xs-12');
+ var $analytics_chart_2 = $('<div>').addClass('col-lg-6 col-12');
var breakdownChart = new gapi.analytics.googleCharts.DataChart({
query: {
'dimensions': 'ga:date',
@@ -384,7 +384,7 @@ var Dashboard = AbstractAction.extend(ControlPanelMixin, {
$analytics_chart_2.appendTo($analytics_components);
// 5. Chart table
- var $analytics_chart_1 = $('<div>').addClass('col-md-6 col-xs-12');
+ var $analytics_chart_1 = $('<div>').addClass('col-lg-6 col-12');
var mainChart = new gapi.analytics.googleCharts.DataChart({
query: {
'dimensions': 'ga:medium',
diff --git a/addons/website/static/src/js/content/menu.js b/addons/website/static/src/js/content/menu.js
index 5f8c337802f..ba6cc107000 100644
--- a/addons/website/static/src/js/content/menu.js
+++ b/addons/website/static/src/js/content/menu.js
@@ -2,6 +2,7 @@ odoo.define('website.content.menu', function (require) {
'use strict';
var config = require('web.config');
+var dom = require('web.dom');
var sAnimation = require('website.content.snippets.animation');
sAnimation.registry.affixMenu = sAnimation.Class.extend({
@@ -66,7 +67,7 @@ sAnimation.registry.affixMenu = sAnimation.Class.extend({
this.$headerClone.toggleClass('affixed', wOffset > (hOffset + 300));
// Reset opened menus
- this.$dropdowns.removeClass('open');
+ this.$dropdowns.removeClass('show');
this.$navbarCollapses.removeClass('in').attr('aria-expanded', false);
},
});
@@ -81,19 +82,13 @@ sAnimation.registry.affixMenu = sAnimation.Class.extend({
* the backend in enterprise...
*/
sAnimation.registry.autohideMenu = sAnimation.Class.extend({
- selector: 'header:not(.o_no_autohide_menu) > .navbar > *',
+ selector: 'header:not(.o_no_autohide_menu) #top_menu',
/**
* @override
*/
start: function () {
- var $allItems = this.$('#top_menu').children();
- this.$unfoldableItems = $allItems.filter('.divider, .divider ~ li');
- this.$items = $allItems.not(this.$unfoldableItems);
-
- $(window).on('resize', _.debounce(this._adapt.bind(this), 500));
- this._adapt();
-
+ dom.initAutoMoreMenu(this.$el, {unfoldable: '.divider, .divider ~ li'});
return this._super.apply(this, arguments);
},
/**
@@ -101,65 +96,7 @@ sAnimation.registry.autohideMenu = sAnimation.Class.extend({
*/
destroy: function () {
this._super.apply(this, arguments);
- this._restore();
- },
-
- //--------------------------------------------------------------------------
- // Private
- //--------------------------------------------------------------------------
-
- /**
- * @private
- */
- _adapt: function () {
- this._restore();
- if (config.device.isMobile) {
- return;
- }
-
- this.maxWidth = this.$el.width();
- var $unfoldable = this.$unfoldableItems.add(this.$el.children().not('.navbar-collapse'));
- this.maxWidth -= _.reduce($unfoldable, function (sum, el) {
- return sum + computeFloatOuterWidthWithMargins(el);
- }, 0);
-
- var nbItems = this.$items.length;
- var menuItemsWidth = _.reduce(this.$items, function (sum, el) {
- return sum + computeFloatOuterWidthWithMargins(el);
- }, 0);
-
- if (menuItemsWidth > this.maxWidth) {
- this.$extraItemsToggle = $('<li/>', {class: 'o_extra_menu_items'});
- this.$extraItemsToggle.append($('<a/>', {href: '#', class: 'dropdown-toggle', 'data-toggle': 'dropdown'})
- .append($('<i/>', {class: 'fa fa-plus'})));
- this.$extraItemsToggle.append($('<ul/>', {class: 'dropdown-menu'}));
- this.$extraItemsToggle.insertAfter(this.$items.last());
-
- menuItemsWidth += computeFloatOuterWidthWithMargins(this.$extraItemsToggle[0]);
- do {
- menuItemsWidth -= computeFloatOuterWidthWithMargins(this.$items.eq(--nbItems)[0]);
- } while (menuItemsWidth > this.maxWidth);
-
- var $extraItems = this.$items.slice(nbItems).detach();
- this.$extraItemsToggle.children('ul').append($extraItems);
- this.$extraItemsToggle.toggleClass('active', $extraItems.hasClass('active'));
- }
-
- function computeFloatOuterWidthWithMargins(el) {
- var rect = el.getBoundingClientRect();
- var style = window.getComputedStyle(el);
- return rect.right - rect.left + parseFloat(style.marginLeft) + parseFloat(style.marginRight);
- }
- },
- /**
- * @private
- */
- _restore: function () {
- if (this.$extraItemsToggle) {
- this.$extraItemsToggle.find("> ul > *").insertBefore(this.$extraItemsToggle);
- this.$extraItemsToggle.remove();
- delete this.$extraItemsToggle;
- }
+ dom.destroyAutoMoreMenu(this.$el);
},
});
@@ -179,7 +116,7 @@ sAnimation.registry.menuDirection = sAnimation.Class.extend({
* @override
*/
start: function () {
- this.defaultAlignment = this.$el.is('.navbar-right') ? 'right' : 'left';
+ this.defaultAlignment = this.$el.is('.ml-auto, .ml-auto ~ *') ? 'right' : 'left';
return this._super.apply(this, arguments);
},
diff --git a/addons/website/static/src/js/content/snippets.animation.js b/addons/website/static/src/js/content/snippets.animation.js
index 602556c03cc..5a31ff943db 100644
--- a/addons/website/static/src/js/content/snippets.animation.js
+++ b/addons/website/static/src/js/content/snippets.animation.js
@@ -771,7 +771,7 @@ registry.gallerySlider = Animation.extend({
function hide() {
$lis.each(function (i) {
- $(this).toggleClass('hidden', !(i >= page*nbPerPage && i < (page+1)*nbPerPage));
+ $(this).toggleClass('d-none', !(i >= page*nbPerPage && i < (page+1)*nbPerPage));
});
if (self.editableMode) { // do not remove DOM in edit mode
return;
@@ -863,7 +863,7 @@ registry.socialShare = Animation.extend({
var self = this;
setTimeout(function () {
if (!$(".popover:hover").length) {
- $(self).popover("destroy");
+ $(self).popover('dispose');
}
}, 200);
});
diff --git a/addons/website/static/src/js/editor/rte.summernote.js b/addons/website/static/src/js/editor/rte.summernote.js
index 95dc0cfc321..36cadca7a8d 100644
--- a/addons/website/static/src/js/editor/rte.summernote.js
+++ b/addons/website/static/src/js/editor/rte.summernote.js
@@ -54,6 +54,6 @@ eventHandler.modules.popover.button.update = function ($container, oStyle) {
fn_boutton_update.call(this, $container, oStyle);
$container.find('button[data-event="transform"]')
.toggleClass('active', $(oStyle.image).is('[style*="transform"]'))
- .toggleClass('hidden', !$(oStyle.image).is('img'));
+ .toggleClass('d-none', !$(oStyle.image).is('img'));
};
});
diff --git a/addons/website/static/src/js/editor/snippets.options.js b/addons/website/static/src/js/editor/snippets.options.js
index 0e8080299b5..14f1b6f0a4f 100644
--- a/addons/website/static/src/js/editor/snippets.options.js
+++ b/addons/website/static/src/js/editor/snippets.options.js
@@ -188,7 +188,7 @@ options.registry.carousel = options.Class.extend({
var cycle = this.$inner.find('.item').length;
var $active = this.$inner.find('.item.active, .item.prev, .item.next').first();
var index = $active.index();
- this.$('.carousel-control, .carousel-indicators').removeClass('hidden');
+ this.$('.carousel-control, .carousel-indicators').removeClass('d-none');
this.$indicators.append('<li data-target="#' + this.id + '" data-slide-to="' + cycle + '"></li>');
var $clone = this.$('.item:first').clone(true);
$clone.removeClass('active').insertAfter($active);
@@ -223,7 +223,7 @@ options.registry.carousel = options.Class.extend({
self._rebindEvents();
self.remove_process = false;
if (cycle === 1) {
- self.$target.find('.carousel-control, .carousel-indicators').addClass('hidden');
+ self.$target.find('.carousel-control, .carousel-indicators').addClass('d-none');
}
});
_.defer(function () {
@@ -248,8 +248,8 @@ options.registry.carousel = options.Class.extend({
* @override
*/
_setActive: function () {
- this.$el.find('li[data-interval]').removeClass('active')
- .filter('li[data-interval=' + this.$target.attr('data-interval') + ']').addClass('active');
+ this.$el.find('[data-interval]').removeClass('active')
+ .filter('[data-interval=' + this.$target.attr('data-interval') + ']').addClass('active');
},
/**
* Rebinds carousel events on indicators.
@@ -279,7 +279,7 @@ options.registry.sizing_x = options.registry.sizing.extend({
// Below condition is added to remove offset of target element only
// and not its children to avoid design alteration of a container/block.
if (options.isCurrent) {
- var _class = this.$target.attr('class').replace(/\s*(col-lg-offset-|col-md-offset-)([0-9-]+)/g, '');
+ var _class = this.$target.attr('class').replace(/\s*(offset-xl-|offset-lg-)([0-9-]+)/g, '');
this.$target.attr('class', _class);
}
},
@@ -296,8 +296,8 @@ options.registry.sizing_x = options.registry.sizing.extend({
var gridE = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var gridW = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
this.grid = {
- e: [_.map(gridE, function (v) { return 'col-md-' + v; }), _.map(gridE, function (v) { return width/12*v; }), 'width'],
- w: [_.map(gridW, function (v) { return 'col-md-offset-' + v; }), _.map(gridW, function (v) { return width/12*v; }), 'margin-left'],
+ e: [_.map(gridE, function (v) { return 'col-lg-' + v; }), _.map(gridE, function (v) { return width/12*v; }), 'width'],
+ w: [_.map(gridW, function (v) { return 'offset-lg-' + v; }), _.map(gridW, function (v) { return width/12*v; }), 'margin-left'],
};
return this.grid;
},
@@ -307,9 +307,9 @@ options.registry.sizing_x = options.registry.sizing.extend({
_onResize: function (compass, beginClass, current) {
if (compass === 'w') {
// don't change the right border position when we change the offset (replace col size)
- var beginCol = Number(beginClass.match(/col-md-([0-9]+)|$/)[1] || 0);
- var beginOffset = Number(beginClass.match(/col-md-offset-([0-9-]+)|$/)[1] || beginClass.match(/col-lg-offset-([0-9-]+)|$/)[1] || 0);
- var offset = Number(this.grid.w[0][current].match(/col-md-offset-([0-9-]+)|$/)[1] || 0);
+ var beginCol = Number(beginClass.match(/col-lg-([0-9]+)|$/)[1] || 0);
+ var beginOffset = Number(beginClass.match(/offset-lg-([0-9-]+)|$/)[1] || beginClass.match(/offset-xl-([0-9-]+)|$/)[1] || 0);
+ var offset = Number(this.grid.w[0][current].match(/offset-lg-([0-9-]+)|$/)[1] || 0);
if (offset < 0) {
offset = 0;
}
@@ -318,11 +318,11 @@ options.registry.sizing_x = options.registry.sizing.extend({
colSize = 1;
offset = beginOffset + beginCol - 1;
}
- this.$target.attr('class',this.$target.attr('class').replace(/\s*(col-lg-offset-|col-md-offset-|col-md-)([0-9-]+)/g, ''));
+ this.$target.attr('class',this.$target.attr('class').replace(/\s*(offset-xl-|offset-lg-|col-lg-)([0-9-]+)/g, ''));
- this.$target.addClass('col-md-' + (colSize > 12 ? 12 : colSize));
+ this.$target.addClass('col-lg-' + (colSize > 12 ? 12 : colSize));
if (offset > 0) {
- this.$target.addClass('col-md-offset-' + offset);
+ this.$target.addClass('offset-lg-' + offset);
}
}
this._super.apply(this, arguments);
@@ -340,7 +340,7 @@ options.registry.layout_column = options.Class.extend({
*
* @see this.selectClass for parameters
*/
- selectCount: function (previewMode, value, $li) {
+ selectCount: function (previewMode, value, $opt) {
this._updateColumnCount(value - this.$target.children().length);
},
@@ -387,14 +387,14 @@ options.registry.layout_column = options.Class.extend({
var colsLength = $columns.length;
var colSize = Math.floor(12 / colsLength) || 1;
var colOffset = Math.floor((12 - colSize * colsLength) / 2);
- var colClass = 'col-md-' + colSize;
+ var colClass = 'col-lg-' + colSize;
_.each($columns, function (column) {
var $column = $(column);
- $column.attr('class', $column.attr('class').replace(/\bcol-md-(offset-)?\d+\b/g, ''));
+ $column.attr('class', $column.attr('class').replace(/\bcol-lg-(offset-)?\d+\b/g, ''));
$column.addClass(colClass);
});
if (colOffset) {
- $columns.first().addClass('col-md-offset-' + colOffset);
+ $columns.first().addClass('offset-lg-' + colOffset);
}
},
/**
@@ -402,8 +402,8 @@ options.registry.layout_column = options.Class.extend({
*/
_setActive: function () {
this._super.apply(this, arguments);
- this.$el.find('li[data-select-count]').removeClass('active')
- .filter('li[data-select-count=' + this.$target.children().length + ']').addClass('active');
+ this.$el.find('[data-select-count]').removeClass('active')
+ .filter('[data-select-count=' + this.$target.children().length + ']').addClass('active');
},
});
@@ -555,7 +555,7 @@ var FacebookPageDialog = weWidgets.Dialog.extend({
this.trigger_up('animation_stop_demand', {
$target: this.$previewPage,
});
- this.$('.facebook_page_warning').toggleClass('hidden', toggle);
+ this.$('.facebook_page_warning').toggleClass('d-none', toggle);
this.$footer.find('.btn-primary').prop('disabled', !toggle);
},
@@ -758,7 +758,7 @@ options.registry.collapse = options.Class.extend({
*/
onClone: function () {
this.$target.find('[data-toggle="collapse"]').removeAttr('data-target').removeData('target');
- this.$target.find('.panel-collapse').removeAttr('id');
+ this.$target.find('.collapse').removeAttr('id');
this._createIDs();
},
/**
@@ -766,9 +766,9 @@ options.registry.collapse = options.Class.extend({
*/
onMove: function () {
this._createIDs();
- var $panel = this.$target.find('.panel-collapse').removeData('bs.collapse');
+ var $panel = this.$target.find('.collapse').removeData('bs.collapse');
if ($panel.attr('aria-expanded') === 'true') {
- $panel.closest('.panel-group').find('.panel-collapse[aria-expanded="true"]')
+ $panel.closest('.accordion').find('.collapse[aria-expanded="true"]')
.filter(function () {return this !== $panel[0];})
.collapse('hide')
.one('hidden.bs.collapse', function () {
@@ -791,7 +791,7 @@ options.registry.collapse = options.Class.extend({
var $tab = this.$target.find('[data-toggle="collapse"]');
// link to the parent group
- var $tablist = this.$target.closest('.panel-group');
+ var $tablist = this.$target.closest('.accordion');
var tablist_id = $tablist.attr('id');
if (!tablist_id) {
tablist_id = 'myCollapse' + time;
@@ -878,7 +878,7 @@ options.registry.gallery = options.Class.extend({
dialog.on('save', this, function (attachments) {
for (var i = 0 ; i < attachments.length; i++) {
$('<img/>', {
- class: 'img img-responsive',
+ class: 'img img-fluid',
src: attachments[i].src,
'data-index': ++index,
}).appendTo($container);
@@ -907,7 +907,7 @@ options.registry.gallery = options.Class.extend({
var imgs = this._getImages();
var $row = $('<div/>', {class: 'row'});
var columns = this._getColumns();
- var colClass = 'col-md-' + (12 / columns);
+ var colClass = 'col-lg-' + (12 / columns);
var $container = this._replaceContent($row);
_.each(imgs, function (img, index) {
@@ -934,7 +934,7 @@ options.registry.gallery = options.Class.extend({
masonry: function () {
var imgs = this._getImages();
var columns = this._getColumns();
- var colClass = 'col-md-' + (12 / columns);
+ var colClass = 'col-lg-' + (12 / columns);
var cols = [];
var $row = $('<div/>', {class: 'row'});
@@ -968,7 +968,7 @@ options.registry.gallery = options.Class.extend({
*
* @see this.selectClass for parameters
*/
- mode: function (previewMode, value, $li) {
+ mode: function (previewMode, value, $opt) {
this.$target.css('height', '');
this[value]();
this.$target
@@ -985,9 +985,9 @@ options.registry.gallery = options.Class.extend({
this._replaceContent($row);
_.each(imgs, function (img) {
- var wrapClass = 'col-md-3';
+ var wrapClass = 'col-lg-3';
if (img.width >= img.height * 2 || img.width > 600) {
- wrapClass = 'col-md-6';
+ wrapClass = 'col-lg-6';
}
var $wrap = $('<div/>', {class: wrapClass}).append(img);
$row.append($wrap);
@@ -1017,7 +1017,7 @@ options.registry.gallery = options.Class.extend({
* Displays the images with a "slideshow" layout.
*/
slideshow: function () {
- var imgStyle = this.$el.find('li.active[data-styling]').data('styling') || '';
+ var imgStyle = this.$el.find('.active[data-styling]').data('styling') || '';
var urls = _.map(this._getImages(), function (img) {
return $(img).attr('src');
});
@@ -1050,8 +1050,8 @@ options.registry.gallery = options.Class.extend({
* @see this.selectClass for parameters
*/
styling: function (previewMode, value) {
- var classes = _.map(this.$el.find('li[data-styling]'), function (li) {
- return $(li).data('styling');
+ var classes = _.map(this.$el.find('[data-styling]'), function (el) {
+ return $(el).data('styling');
}).join(' ');
this.$('img').removeClass(classes).addClass(value);
},
@@ -1163,8 +1163,8 @@ options.registry.gallery = options.Class.extend({
.removeClass('active')
.filter('[data-styling="' + classes.join('"], [data-styling="') + '"]').addClass('active');
- this.$el.find('li[data-interval]').removeClass('active')
- .filter('li[data-interval='+this.$target.find('.carousel:first').attr('data-interval')+']')
+ this.$el.find('[data-interval]').removeClass('active')
+ .filter('[data-interval='+this.$target.find('.carousel:first').attr('data-interval')+']')
.addClass('active');
var interval = this.$target.find('.carousel:first').attr('data-interval');
diff --git a/addons/website/static/src/js/menu/content.js b/addons/website/static/src/js/menu/content.js
index 1ff050b1b97..d051a62c46a 100644
--- a/addons/website/static/src/js/menu/content.js
+++ b/addons/website/static/src/js/menu/content.js
@@ -49,7 +49,7 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
buttons.push({
text: _t("Go To Page"),
icon: 'fa-globe',
- classes: 'btn-link pull-right',
+ classes: 'btn-link float-right',
click: function (e) {
window.location.href = '/' + self.page.url;
},
@@ -58,7 +58,7 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
buttons.push({
text: _t("Delete Page"),
icon: 'fa-trash',
- classes: 'btn-link pull-right',
+ classes: 'btn-link float-right',
click: function (e) {
_deletePage.call(this, self.page_id, options.fromPageManagement);
},
@@ -105,9 +105,9 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
var defs = [this._super.apply(this, arguments)];
- this.$('.ask_for_redirect').addClass('hidden');
- this.$('.redirect_type').addClass('hidden');
- this.$('.warn_about_call').addClass('hidden');
+ this.$('.ask_for_redirect').addClass('d-none');
+ this.$('.redirect_type').addClass('d-none');
+ this.$('.warn_about_call').addClass('d-none');
defs.push(this._getPageDependencies(this.page_id, context)
.then(function (dependencies) {
@@ -192,12 +192,12 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
var url = this.$('#page_url').val();
var $date_publish = this.$("#date_publish");
- $date_publish.closest(".form-group").removeClass('has-error');
+ $date_publish.closest(".form-group").removeClass('o_has_error').find('.form-control, .custom-select').removeClass('is-invalid');
var date_publish = $date_publish.val();
if (date_publish !== "") {
date_publish = this._parse_date(date_publish);
if (!date_publish) {
- $date_publish.closest(".form-group").addClass('has-error');
+ $date_publish.closest(".form-group").addClass('o_has_error').find('.form-control, .custom-select').addClass('is-invalid');
return;
}
}
@@ -326,7 +326,7 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
*/
_onUrlChanged: function () {
var url = this.$('input#page_url').val();
- this.$('.ask_for_redirect').toggleClass('hidden', url === this.page.url);
+ this.$('.ask_for_redirect').toggleClass('d-none', url === this.page.url);
},
/**
* @private
@@ -338,7 +338,7 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
// check only for url and not key
var ext = '.' + this.page.name.split('.').pop();
if (ext in this.supportedMimetype && ext !== '.html') {
- this.$('.warn_about_call').toggleClass('hidden', name === this.page.name);
+ this.$('.warn_about_call').toggleClass('d-none', name === this.page.name);
}
},
/**
@@ -346,7 +346,7 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
*/
_onCreateRedirectChanged: function () {
var createRedirect = this.$('input#create_redirect').prop('checked');
- this.$('.redirect_type').toggleClass('hidden', !createRedirect);
+ this.$('.redirect_type').toggleClass('d-none', !createRedirect);
},
});
@@ -374,7 +374,7 @@ var MenuEntryDialog = weWidgets.LinkDialog.extend({
this.$('.o_link_dialog_preview').remove();
this.$('input[name="is_new_window"], .link-style').closest('.form-group').remove();
this.$modal.find('.modal-lg').removeClass('modal-lg')
- .find('.col-md-8').removeClass('col-md-8').addClass('col-xs-12');
+ .find('.col-lg-8').removeClass('col-lg-8').addClass('col-12');
// Adapt URL label
this.$('label[for="o_link_dialog_label_input"]').text(_t("Menu Label"));
@@ -394,7 +394,7 @@ var MenuEntryDialog = weWidgets.LinkDialog.extend({
save: function () {
var $e = this.$('#o_link_dialog_label_input');
if (!$e.val() || !$e[0].checkValidity()) {
- $e.closest('.form-group').addClass('has-error');
+ $e.closest('.form-group').addClass('o_has_error').find('.form-control, .custom-select').addClass('is-invalid')
$e.focus();
return;
}
diff --git a/addons/website/static/src/js/menu/customize.js b/addons/website/static/src/js/menu/customize.js
index 2d525ac903e..0eac78cc90f 100644
--- a/addons/website/static/src/js/menu/customize.js
+++ b/addons/website/static/src/js/menu/customize.js
@@ -12,22 +12,21 @@ var qweb = core.qweb;
var CustomizeMenu = Widget.extend({
xmlDependencies: ['/web_editor/static/src/xml/editor.xml'],
events: {
- 'click > ul a[data-view-id]': '_onCustomizeOptionClick',
+ 'show.bs.dropdown': '_onDropdownShow',
+ 'click .dropdown-item[data-view-id]': '_onCustomizeOptionClick',
},
/**
* @override
*/
start: function () {
- var viewName = $(document.documentElement).data('view-xmlid');
- if (!viewName) {
+ this.viewName = $(document.documentElement).data('view-xmlid');
+ if (!this.viewName) {
_.defer(this.destroy.bind(this));
}
- if (this.$el.is('.open')) {
- this._loadCustomizeOptions(viewName);
- } else {
- this.$el.one('mousedown', '> a.dropdown-toggle', this._loadCustomizeOptions.bind(this, viewName));
+ if (this.$el.is('.show')) {
+ this._loadCustomizeOptions();
}
},
@@ -61,15 +60,19 @@ var CustomizeMenu = Widget.extend({
* the current page and shows them as switchable elements in the menu.
*
* @private
- * @param {string} viewName - xml id
* @return {Deferred}
*/
- _loadCustomizeOptions: function (viewName) {
- var $menu = this.$el.children('ul');
+ _loadCustomizeOptions: function () {
+ if (this.__customizeOptionsLoaded) {
+ return $.when();
+ }
+ this.__customizeOptionsLoaded = true;
+
+ var $menu = this.$el.children('.dropdown-menu');
return this._rpc({
route: '/website/get_switchable_related_views',
params: {
- key: viewName,
+ key: this.viewName,
},
}).then(function (result) {
var currentGroup = '';
@@ -78,11 +81,10 @@ var CustomizeMenu = Widget.extend({
currentGroup = item.inherit_id[1];
$menu.append('<li class="dropdown-header">' + currentGroup + '</li>');
}
- var $li = $('<li/>', {role: 'presentation'})
- .append($('<a/>', {href: '#', 'data-view-id': item.id, role: 'menuitem'})
- .append(qweb.render('web_editor.components.switch', {id: 'switch-' + item.id, label: item.name})));
- $li.find('input').prop('checked', !!item.active);
- $menu.append($li);
+ var $a = $('<a/>', {href: '#', class: 'dropdown-item', 'data-view-id': item.id, role: 'menuitem'})
+ .append(qweb.render('web_editor.components.switch', {id: 'switch-' + item.id, label: item.name}));
+ $a.find('input').prop('checked', !!item.active);
+ $menu.append($a);
});
});
},
@@ -103,6 +105,12 @@ var CustomizeMenu = Widget.extend({
var viewID = parseInt($(ev.currentTarget).data('view-id'), 10);
this._doCustomize(viewID);
},
+ /**
+ * @private
+ */
+ _onDropdownShow: function () {
+ this._loadCustomizeOptions();
+ },
});
var AceEditorMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
diff --git a/addons/website/static/src/js/menu/navbar.js b/addons/website/static/src/js/menu/navbar.js
index 9a25d50c3ed..ed8cf1ffa31 100644
--- a/addons/website/static/src/js/menu/navbar.js
+++ b/addons/website/static/src/js/menu/navbar.js
@@ -11,7 +11,7 @@ var websiteNavbarRegistry = new rootWidget.RootWidgetRegistry();
var WebsiteNavbar = rootWidget.RootWidget.extend({
events: _.extend({}, rootWidget.RootWidget.prototype.events || {}, {
'click [data-action]': '_onActionMenuClick',
- 'mouseover > ul > li.dropdown:not(.open)': '_onMenuHovered',
+ 'mouseover > ul > li.dropdown:not(.show)': '_onMenuHovered',
'click .o_mobile_menu_toggle': '_onMobileMenuToggleClick',
}),
custom_events: _.extend({}, rootWidget.RootWidget.prototype.custom_events || {}, {
@@ -121,10 +121,10 @@ var WebsiteNavbar = rootWidget.RootWidget.extend({
* @param {Event} ev
*/
_onMenuHovered: function (ev) {
- var $opened = this.$('> ul > li.dropdown.open');
+ var $opened = this.$('> ul > li.dropdown.show');
if ($opened.length) {
- $opened.removeClass('open');
- $(ev.currentTarget).find('.dropdown-toggle').mousedown().focus().mouseup().click();
+ $opened.find('.dropdown-toggle').dropdown('toggle');
+ $(ev.currentTarget).find('.dropdown-toggle').dropdown('toggle');
}
},
/**
diff --git a/addons/website/static/src/js/menu/new_content.js b/addons/website/static/src/js/menu/new_content.js
index c577858f3eb..314ecec51b4 100644
--- a/addons/website/static/src/js/menu/new_content.js
+++ b/addons/website/static/src/js/menu/new_content.js
@@ -46,7 +46,7 @@ var NewContentMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
$group.removeClass('mb0');
var $add = $('<div/>', {'class': 'form-group mb0'})
- .append($('<span/>', {'class': 'col-sm-offset-3 col-sm-9 text-left'})
+ .append($('<span/>', {'class': 'offset-md-3 col-md-9 text-left'})
.append(qweb.render('web_editor.components.switch', {id: 'switch_addTo_menu', label: _t("Add page in menu")})));
$add.find('input').prop('checked', true);
$group.after($add);
diff --git a/addons/website/static/src/js/menu/seo.js b/addons/website/static/src/js/menu/seo.js
index 71d4297cd89..180bd561df1 100644
--- a/addons/website/static/src/js/menu/seo.js
+++ b/addons/website/static/src/js/menu/seo.js
@@ -18,16 +18,16 @@ var WORD_SEPARATORS_REGEX = '([\\u2000-\\u206F\\u2E00-\\u2E7F\'!"#\\$%&\\(\\)\\*
function analyzeKeyword(htmlPage, keyword) {
return htmlPage.isInTitle(keyword) ? {
- title: 'label label-success',
+ title: 'badge badge-success',
description: "This keyword is used in the page title",
} : htmlPage.isInDescription(keyword) ? {
- title: 'label label-primary',
+ title: 'badge badge-primary',
description: "This keyword is used in the page description",
} : htmlPage.isInBody(keyword) ? {
- title: 'label label-info',
+ title: 'badge badge-info',
description: "This keyword is used in the page content."
} : {
- title: 'label label-default',
+ title: 'badge badge-secondary',
description: "This keyword is not used anywhere on the page."
};
}
diff --git a/addons/website/static/src/js/tours/rte.js b/addons/website/static/src/js/tours/rte.js
index 7ce549a0346..46fbbff3fce 100644
--- a/addons/website/static/src/js/tours/rte.js
+++ b/addons/website/static/src/js/tours/rte.js
@@ -72,7 +72,7 @@ tour.register('rte_translator', {
trigger: 'html:not(:has(#wrap p span)) .o_menu_systray a[data-action="translate"]',
}, {
content: "close modal",
- trigger: '.modal-footer .btn-default',
+ trigger: '.modal-footer .btn-secondary',
}, {
content: "check if translation is activate",
trigger: '[data-oe-translation-id]',
diff --git a/addons/website/static/src/scss/website.backend.scss b/addons/website/static/src/scss/website.backend.scss
index 373af1ec647..16dbe353ed2 100644
--- a/addons/website/static/src/scss/website.backend.scss
+++ b/addons/website/static/src/scss/website.backend.scss
@@ -15,12 +15,12 @@
h2, h4 {
text-transform: uppercase;
margin-top: 0;
- color: $o-brand-primary;
+ color: $o-brand-odoo;
}
h4 { margin: 0 0 0 8px; }
- .col-md-7, .col-xs-12 {
+ .col-lg-7, .col-12 {
padding: 15px;
.js_field_selection {
@@ -75,7 +75,7 @@
float: left;
g.nvd3.nv-wrap.nv-lineChart {
- @include translate(45, 30); // FIXME was marked important before scss convertion
+ transform: translate(45, 30); // FIXME was marked important before scss convertion
}
g.nv-x.nv-axis .tick > line {
@@ -86,10 +86,10 @@
.nv-series-0 {
stroke-width: 3 !important;
.nv-point {
- stroke: $o-brand-optional;
+ stroke: $o-brand-primary;
stroke-opacity: 1 !important;
&.hover {
- stroke: darken($o-brand-optional, 10%);
+ stroke: darken($o-brand-primary, 10%);
}
}
}
@@ -107,14 +107,14 @@
.nvtooltip {
border-radius: 0;
- border: 1px solid $gray-lighter;
+ border: 1px solid gray('200');
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
.legend-color-guide > div {
border: none;
}
tr:first-child .legend-color-guide > div {
- background-color: $o-brand-optional !important;
+ background-color: $o-brand-primary !important;
}
tr:last-child .legend-color-guide > div {
background-color: darken($o-brand-lightsecondary, 10%) !important;
@@ -129,11 +129,11 @@
flex-flow: row wrap;
justify-content: flex-start;
> .o_inner_box {
- @media (max-width: $screen-sm-min) {
+ @include media-breakpoint-down(sm) {
flex: 1 1 200px;
display: block !important;
}
- @media (min-width: $screen-sm-min) {
+ @include media-breakpoint-up(md) {
flex: 0 0 16.6%;
}
}
@@ -148,15 +148,15 @@
white-space: nowrap;
cursor: pointer;
color: white;
- background-color: $o-brand-optional;
+ background-color: $o-brand-primary;
&:hover {
- background-color: darken($o-brand-optional, 10%);
+ background-color: darken($o-brand-primary, 10%);
}
&.o_primary {
- background-color: $o-brand-primary;
+ background-color: $o-brand-odoo;
color: white;
&:hover {
- background-color: darken($o-brand-primary, 10%);
+ background-color: darken($o-brand-odoo, 10%);
}
}
.o_highlight {
@@ -167,7 +167,7 @@
.o_graph_sales {
.o_legend0 {
- background-color: $o-brand-optional;
+ background-color: $o-brand-primary;
}
.o_legend1 {
background-color: $o-main-color-muted;
@@ -209,8 +209,8 @@
.o_properties_selection {
- @media (min-width: $screen-md-min) {
- @include o-flex-display;
+ @include media-breakpoint-up(lg) {
+ display: flex;
}
margin-top: 10px;
@@ -226,7 +226,7 @@
float: right;
top: -60px;
right: 10px;
- border: 1px solid $gray-lighter;
+ border: 1px solid gray('200');
font-weight: 300;
white-space: nowrap;
padding: .5em 1.5em;
@@ -249,17 +249,17 @@
@keyframes increase {
10% {
- background-color: lighten($o-brand-optional, 30%);
- border-color: $o-brand-optional;
- color: $o-brand-optional;
+ background-color: lighten($o-brand-primary, 30%);
+ border-color: $o-brand-primary;
+ color: $o-brand-primary;
}
}
@keyframes decrease {
10% {
- background-color: lighten($o-brand-optional, 30%);
- border-color: $o-brand-optional;
- color: $o-brand-optional;
+ background-color: lighten($o-brand-primary, 30%);
+ border-color: $o-brand-primary;
+ color: $o-brand-primary;
}
}
}
diff --git a/addons/website/static/src/scss/website.edit_mode.scss b/addons/website/static/src/scss/website.edit_mode.scss
index c315e493e08..2480ed74b26 100644
--- a/addons/website/static/src/scss/website.edit_mode.scss
+++ b/addons/website/static/src/scss/website.edit_mode.scss
@@ -5,8 +5,8 @@
font-family: Roboto, $font-family-sans-serif;
.o_tooltip_container {
- @include o-inline-flex-display;
- @include o-align-items(center);
+ display: inline-flex;
+ align-items: center;
> .o_tooltip {
@include o-position-absolute;
@@ -22,7 +22,7 @@
.o_editable {
&:not(:empty), &[data-oe-type] {
&:not([data-oe-model="ir.ui.view"]):not([data-oe-type="html"]):hover {
- box-shadow: $o-brand-primary 0 0 5px 2px inset;
+ box-shadow: $o-brand-odoo 0 0 5px 2px inset;
}
}
&:focus, &[data-oe-type] {
@@ -33,7 +33,7 @@
display: inline-block;
}
.btn, &.btn {
- @include user-select(auto);
+ user-select: auto;
cursor: text!important;
}
/* Summernote not Support for placeholder text https://github.com/summernote/summernote/issues/581 */
@@ -44,14 +44,14 @@
&.oe_structure.oe_empty, &[data-oe-type=html] {
&:empty {
- border: 2px dashed $gray-lighter-darker;
+ border: 2px dashed gray('400');
margin: 20px;
padding: 112px 0px;
text-align: center;
&:before {
content: attr(data-editor-message);
font-size: 20px;
- color: $gray-lighter-darker;
+ color: gray('400');
}
}
> p:empty:only-child {
@@ -65,7 +65,7 @@
/* Prevent the text contents of draggable elements from being selectable. */
[draggable] {
- @include user-select(none);
+ user-select: none;
}
.oe_editable:focus,
@@ -105,7 +105,7 @@ table.editorbar-panel {
margin: 0 5px;
}
}
- .col-sm-2 > * {
+ .col-md-2 > * {
line-height: 2em;
}
}
diff --git a/addons/website/static/src/scss/website.scss b/addons/website/static/src/scss/website.scss
index 37f979f7e34..fa35b6dbc58 100644
--- a/addons/website/static/src/scss/website.scss
+++ b/addons/website/static/src/scss/website.scss
@@ -112,11 +112,11 @@ table.table_desc tr td {
overflow: auto;
}
-.s_comparisons .panel .list-group-item:not(.active) {
+.s_comparisons .card .list-group-item:not(.active) {
color: #666;
}
.s_comparisons {
- .panel small {
+ .card small {
color: inherit;
}
.text-muted {
@@ -124,13 +124,13 @@ table.table_desc tr td {
}
}
-.s_faq_collapse .container .panel {
+.s_faq_collapse .container .card {
background-color: inherit;
border : 1px solid rgba(0, 0, 0, 0.15);
- .panel-body {
+ .card-body {
border-top: none;
- border-bottom-left-radius: ($panel-border-radius - 1);
- border-bottom-right-radius: ($panel-border-radius - 1);
+ border-bottom-left-radius: ($card-border-radius - 1);
+ border-bottom-right-radius: ($card-border-radius - 1);
}
}
@@ -149,37 +149,37 @@ table.table_desc tr td {
&.o_margin_s {
margin-bottom: 4px;
}
- &.o_margin_s.pull-right {
+ &.o_margin_s.float-right {
margin-left: 8px;
}
- &.o_margin_s.pull-left {
+ &.o_margin_s.float-left {
margin-right: 8px;
}
&.o_margin_m {
margin-bottom: 8px;
}
- &.o_margin_m.pull-right {
+ &.o_margin_m.float-right {
margin-left: 12px;
}
- &.o_margin_m.pull-left {
+ &.o_margin_m.float-left {
margin-right: 12px;
}
&.o_margin_l {
margin-bottom: 12px;
}
- &.o_margin_l.pull-right {
+ &.o_margin_l.float-right {
margin-left: 16px;
}
- &.o_margin_l.pull-left {
+ &.o_margin_l.float-left {
margin-right: 16px;
}
&.o_margin_xl {
margin-bottom: 24px;
}
- &.o_margin_xl.pull-right {
+ &.o_margin_xl.float-right {
margin-left: 32px;
}
- &.o_margin_xl.pull-left {
+ &.o_margin_xl.float-left {
margin-right: 32px;
}
}
@@ -493,7 +493,7 @@ div.carousel {
// Company Team
.s_company_team {
- @media (max-width: $screen-sm-max) {
+ @include media-breakpoint-down(md) {
img {
max-width: 50%;
}
@@ -504,11 +504,10 @@ div.carousel {
@include o-position-absolute(0, 0, auto, 0);
position: fixed;
z-index: $zindex-modal - 20;
- background: $navbar-default-bg;
- border-bottom: $navbar-default-border;
+ background: $light;
margin-top: -200px;
- @include o-transition(margin-top, 500ms);
+ transition: margin-top 500ms ease 0s;
&.affixed {
margin-top: 0px;
@@ -518,13 +517,13 @@ div.carousel {
top: $o-navbar-height;
}
-.navbar .o_extra_menu_items.open > ul {
+.navbar .o_extra_menu_items.show > ul {
> li {
+ li {
- border-top: 1px solid $gray-lighter;
+ border-top: 1px solid gray('200');
}
> a.dropdown-toggle {
- background-color: $gray-lighter;
+ background-color: gray('200');
color: inherit; // Useful when the toggle is active
pointer-events: none; // hack to prevent clicking on it because dropdown always opened
}
@@ -547,9 +546,9 @@ div.carousel {
.js_language_selector {
display: inline-block;
}
- @media (min-width: $screen-sm-min) {
+ @include media-breakpoint-up(md) {
.row {
- @include o-flex-display;
+ display: flex;
> div {
margin: auto 0;
}
diff --git a/addons/website/static/src/scss/website.ui.scss b/addons/website/static/src/scss/website.ui.scss
index 3f2e65f7fb3..91e6675c82f 100644
--- a/addons/website/static/src/scss/website.ui.scss
+++ b/addons/website/static/src/scss/website.ui.scss
@@ -45,7 +45,7 @@ body.o_connected_user {
}
&[data-action="edit"], &[data-action="translate"], &.css_edit_dynamic {
- @include button-variant(white, $o-brand-optional, $o-brand-optional);
+ @include button-variant($o-brand-primary, $o-brand-primary);
}
> .fa-plus, > .fa-pencil {
@@ -58,7 +58,7 @@ body.o_connected_user {
font-size: 20px;
}
}
- @media only screen and (max-width: $screen-xs-max) {
+ @include media-breakpoint-down(sm) {
#oe_applications {
position: inherit;
z-index: 1002;
@@ -71,7 +71,8 @@ body.o_connected_user {
position: relative;
display: inline-block;
opacity: $opacity;
- @include square($size);
+ width: $size;
+ height: $size;
&:hover, &:focus {
outline: none;
@@ -88,11 +89,11 @@ body.o_connected_user {
background: $color;
@include size(100%, $thickness);
@include o-position-absolute(50%, $left:0);
- @include o-transform(rotate(45deg));
+ transform: rotate(45deg);
}
&:after {
- @include o-transform(rotate(-45deg));
+ transform: rotate(-45deg);
}
}
@@ -104,14 +105,9 @@ body .modal {
@include o-w-preserve-forms;
@include o-w-preserve-links;
@include o-w-preserve-btn;
- @include o-w-preserve-wells;
+ @include o-w-preserve-cards;
@include o-w-preserve-modals;
@include o-w-preserve-tabs;
-
- &:not(.oe_mobile_preview) button.close {
- @include o-w-close-icon(12px);
- margin-right: -2px;
- }
}
// MOBILE PREVIEW
@@ -122,13 +118,6 @@ body .modal {
display: inline-block;
width: auto;
- .close {
- color: lightgray;
- opacity: 1;
- font-size: 25px;
- font-weight: normal;
- }
-
.modal-content {
background-color: black!important;
border: 3px outset gray;
@@ -158,10 +147,10 @@ body .modal {
$mobile-preview-width: 320px;
$mobile-preview-height: 530px;
- @include o-flex-display;
+ display: flex;
width: $mobile-preview-width + 15;
height: $mobile-preview-height;
- @include o-transition(all, 400ms);
+ transition: all 400ms ease 0s;
&.o_invert_orientation {
width: $mobile-preview-height + 15;
@@ -233,7 +222,7 @@ body .modal {
text-align: right;
background-color: $o-we-color-paper;
- @media screen and (min-width: $screen-md-min) {
+ @include media-breakpoint-up(lg) {
width: 38%;
}
}
@@ -243,7 +232,7 @@ body .modal {
visibility: visible;
padding-left: 15px;
- @media screen and (min-width: $screen-md-min) {
+ @include media-breakpoint-up(lg) {
padding-left: 50px;
}
}
@@ -252,7 +241,7 @@ body .modal {
tbody {
td {
padding: 5px;
- @include o-transition(padding, .3s);
+ transition: padding .3s ease 0s;
&:first-child {
border-width: 0 1px;
@@ -265,7 +254,7 @@ body .modal {
font-weight: normal;
.oe_remove {
- @include o-w-close-icon(10px, white, $o-we-color-danger, 2px);
+ @include o-w-close-icon(10px, white, $o-we-color-danger, 2px); // FIXME
@include o-position-absolute(5px, 5px);
}
}
@@ -287,7 +276,7 @@ body .modal {
}
tr {
- @include o-animation(fadeInDownSmall, .3s);
+ animation: fadeInDownSmall .3s ease 0s 1 normal none running;
&:first-child {
td:first-child {
@@ -354,9 +343,9 @@ body .modal {
#o_new_content_menu_choices {
@include o-position-absolute($o-navbar-height, 0, 0, 0);
position: fixed;
- @include o-flex-display;
- @include o-justify-content(center);
- @include o-align-items(center);
+ display: flex;
+ justify-content: center;
+ align-items: center;
font-family: $o-we-font-family;
&::before {
@@ -369,9 +358,9 @@ body .modal {
}
> ul {
- @include o-flex-display;
- @include o-flex-flow(row, wrap);
- @include o-justify-content(space-around);
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: space-around;
width: auto;
max-width: 60%;
max-height: 100%;
@@ -382,7 +371,7 @@ body .modal {
li {
display: block;
opacity: 0;
- @include animation(fadeInDownSmall 1s forwards);
+ animation: fadeInDownSmall 1s forwards;
margin: 2em 32px;
padding: 0 15px;
@@ -401,7 +390,7 @@ body .modal {
background-color: #2C2C36;
color: white;
- @include o-transition(all, 0.5s, cubic-bezier(0.19, 1, 0.22, 1));
+ transition: all 0.5s cubic-bezier(0.19, 1, 0.22, 1) 0s;
}
p {
color: white;
@@ -523,15 +512,14 @@ body .modal {
}
#edit_website_pages {
th {
- background-color: $o-brand-primary;
+ background-color: $o-brand-odoo;
color: white;
}
td > a.fa {
margin-left: 5px;
- color: $o-brand-primary;
+ color: $o-brand-odoo;
}
.fa-check, .fa-eye-slash {
- color: $o-brand-optional;
+ color: $o-brand-primary;
}
}
-
diff --git a/addons/website/static/src/xml/website.backend.xml b/addons/website/static/src/xml/website.backend.xml
index a5e14c2c0bc..b61d4503e95 100644
--- a/addons/website/static/src/xml/website.backend.xml
+++ b/addons/website/static/src/xml/website.backend.xml
@@ -21,19 +21,19 @@
<t t-name="website.dashboard_content">
<div class="o_website_dashboard_content">
<div class="row o_dashboard_visits" t-if="widget.groups.website_designer">
- <div class="col-xs-12 o_box">
+ <div class="col-12 o_box">
<h2>Visits</h2>
<div t-if="widget.dashboards_data.visits &amp;&amp; widget.dashboards_data.visits.ga_client_id">
<div class="row js_analytics_components"/>
<a href="#" class="js_link_analytics_settings">Edit my Analytics Client ID</a>
</div>
- <div t-if="!(widget.dashboards_data.visits &amp;&amp; widget.dashboards_data.visits.ga_client_id)" class="col-md-12">
+ <div t-if="!(widget.dashboards_data.visits &amp;&amp; widget.dashboards_data.visits.ga_client_id)" class="col-lg-12">
<div class="o_demo_background">
<div class="o_layer">
</div>
<div class="o_buttons text-center">
<h3>There is no data currently available.</h3>
- <button class="btn btn-sm btn-primary js_link_analytics_settings center-block mb8">Link my Analytics Account</button>
+ <button class="btn btn-primary js_link_analytics_settings d-block mx-auto mb8">Link my Analytics Account</button>
</div>
</div>
</div>
@@ -42,7 +42,7 @@
</div>
</t>
- <div t-name="website.unauthorized_analytics" class="col-xs-12 js_unauthorized_message mb16">
+ <div t-name="website.unauthorized_analytics" class="col-12 js_unauthorized_message mb16">
<span t-if="reason === 'not_connected'">You need to log in to your Google Account before: </span>
<span t-if="reason === 'no_right'">You do not seem to have access to this Analytics Account.</span>
<span t-if="reason === 'not_initialized'">Google Analytics initialization failed. Maybe this domain is not whitelisted in your Google Analytics project for this client ID.</span>
@@ -61,11 +61,11 @@
</div>
<t t-name="website.DateRangeButtons">
- <!-- TODO: Applied hidden-xs class as it is going to push in control panel and it breaks UI, maybe we will improve it in future -->
- <div class="btn-group btn-group-sm o_date_range_buttons hidden-xs pull-right">
- <button class="btn btn-sm btn-default js_date_range active" data-date="week">Last Week</button>
- <button class="btn btn-sm btn-default js_date_range" data-date="month">Last Month</button>
- <button class="btn btn-sm btn-default js_date_range" data-date="year">Last Year</button>
+ <!-- TODO: Hide in mobile as it is going to push in control panel and it breaks UI, maybe we will improve it in future -->
+ <div class="btn-group o_date_range_buttons d-none d-md-inline-flex float-right">
+ <button class="btn btn-secondary js_date_range active" data-date="week">Last Week</button>
+ <button class="btn btn-secondary js_date_range" data-date="month">Last Month</button>
+ <button class="btn btn-secondary js_date_range" data-date="year">Last Year</button>
</div>
</t>
diff --git a/addons/website/static/src/xml/website.contentMenu.xml b/addons/website/static/src/xml/website.contentMenu.xml
index 9cabe61a861..abcd94d5764 100644
--- a/addons/website/static/src/xml/website.contentMenu.xml
+++ b/addons/website/static/src/xml/website.contentMenu.xml
@@ -3,14 +3,16 @@
<t t-name="website.contentMenu.dialog.submenu">
<li t-att-data-menu-id="submenu.id">
<div class="input-group">
- <span class="input-group-addon fa fa-bars" role="img" aria-label="Dropdown menu" title="Dropdown menu"/>
+ <div class="input-group-prepend">
+ <span class="input-group-text fa fa-bars" role="img" aria-label="Dropdown menu" title="Dropdown menu"/>
+ </div>
<span class="form-control">
<span class="js_menu_label">
<t t-esc="submenu.name"/>
</span>
- <i t-if="submenu.is_homepage" class="pull-right fa fa-home" style="margin-top: 3px" role="img" aria-label="Home" title="Home"/>
+ <i t-if="submenu.is_homepage" class="float-right fa fa-home" style="margin-top: 3px" role="img" aria-label="Home" title="Home"/>
</span>
- <span class="input-group-btn">
+ <span class="input-group-append">
<button type="button" class="btn btn-primary js_edit_menu fa fa-pencil-square-o" aria-label="Edit menu" title="Edit menu"/>
<button type="button" class="btn btn-danger js_delete_menu fa fa-trash-o" aria-label="Delete menu" title="Delete menu"/>
</span>
@@ -42,7 +44,7 @@
</t>
</ul>
<div class="mt32">
- <small class="pull-right text-muted">
+ <small class="float-right text-muted">
Drag a menu to the right to create a sub-menu
</small>
<a href="#" class="js_add_menu">
diff --git a/addons/website/static/src/xml/website.editor.xml b/addons/website/static/src/xml/website.editor.xml
index ad7d326a43b..20045478c8c 100644
--- a/addons/website/static/src/xml/website.editor.xml
+++ b/addons/website/static/src/xml/website.editor.xml
@@ -2,8 +2,8 @@
<templates id="template" xml:space="preserve">
<div t-name="website.homepage_editor_welcome_message" class="container text-center o_homepage_editor_welcome_message">
<h2 class="mt0">Welcome to your <b>Homepage</b>!</h2>
- <p class="lead hidden-xs">Let's start designing.</p>
- <div class="o_tooltip_container hidden-xs">Follow all the <div class="o_tooltip bottom"/> signs to get your website ready in no time.</div>
+ <p class="lead d-none d-md-block">Let's start designing.</p>
+ <div class="o_tooltip_container d-none d-md-block">Follow all the <div class="o_tooltip bottom"/> signs to get your website ready in no time.</div>
</div>
<div t-name="website.leaving_current_page_edition">
diff --git a/addons/website/static/src/xml/website.facebook_page.xml b/addons/website/static/src/xml/website.facebook_page.xml
index 4d362582a7b..7f16b568aec 100644
--- a/addons/website/static/src/xml/website.facebook_page.xml
+++ b/addons/website/static/src/xml/website.facebook_page.xml
@@ -2,43 +2,43 @@
<templates>
<div t-name="website.facebook_page_dialog">
<div class="row">
- <form class="col-md-6 form-horizontal">
- <div class="form-group">
- <label class="control-label col-sm-3">Page URL</label>
- <div class="col-sm-9">
+ <form class="col-lg-6">
+ <div class="form-group row">
+ <label class="col-form-label col-md-3">Page URL</label>
+ <div class="col-md-9">
<input class="form-control o_facebook_page_url" required="required" t-att-value="widget.fbData.href"/>
</div>
</div>
- <div class="form-group o_facebook_tabs">
+ <div class="form-group row o_facebook_tabs">
<t t-set="fb_tabs" t-value="widget.fbData.tabs and widget.fbData.tabs.split(',') or []"/>
- <label class="control-label col-sm-3">Tabs</label>
- <div class="col-sm-3 checkbox">
+ <label class="col-form-label col-md-3">Tabs</label>
+ <div class="col-md-3 checkbox">
<label><input type="checkbox" name="timeline" t-att-checked="_.contains(fb_tabs, 'timeline') or None"/>Timeline</label>
</div>
- <div class="col-sm-3 checkbox">
+ <div class="col-md-3 checkbox">
<label><input type="checkbox" name="events" t-att-checked="_.contains(fb_tabs, 'events') or None"/>Events</label>
</div>
- <div class="col-sm-3 checkbox">
+ <div class="col-md-3 checkbox">
<label><input type="checkbox" name="messages" t-att-checked="_.contains(fb_tabs, 'messages') or None"/>Messages</label>
</div>
</div>
- <div class="form-group o_facebook_options">
- <label class="control-label col-sm-3">Options</label>
- <div class="col-sm-9 mt8">
+ <div class="form-group row o_facebook_options">
+ <label class="col-form-label col-md-3">Options</label>
+ <div class="col-md-9 mt8">
<label class="o_switch">
<input name="small_header" type="checkbox" t-att-checked="widget.fbData.small_header or None"/>
<span/>
Use Small Header
</label>
</div>
- <div class="col-sm-offset-3 mt16 col-sm-9">
+ <div class="offset-md-3 mt16 col-md-9">
<label class="o_switch">
<input name="hide_cover" type="checkbox" t-att-checked="widget.fbData.hide_cover or None"/>
<span/>
Hide Cover Photo
</label>
</div>
- <div class="col-sm-offset-3 mt16 col-sm-9">
+ <div class="offset-md-3 mt16 col-md-9">
<label class="o_switch">
<input name="show_facepile" type="checkbox" t-att-checked="widget.fbData.show_facepile or None"/>
<span/>
@@ -47,10 +47,10 @@
</div>
</div>
</form>
- <div class="col-md-6" style="border-left: 1px solid #eeeeee;">
+ <div class="col-lg-6" style="border-left: 1px solid #eeeeee;">
<div class="form-group text-center">
<label>Preview</label>
- <div class="alert alert-warning hidden facebook_page_warning text-center" role="alert">
+ <div class="alert alert-warning d-none facebook_page_warning text-center" role="alert">
<div>
<i class="fa fa-exclamation-triangle fa-3x" role="img" aria-label="Warning" title="Warning"></i>
</div>
diff --git a/addons/website/static/src/xml/website.gallery.xml b/addons/website/static/src/xml/website.gallery.xml
index 08226cb911b..0ac854554d7 100644
--- a/addons/website/static/src/xml/website.gallery.xml
+++ b/addons/website/static/src/xml/website.gallery.xml
@@ -13,8 +13,8 @@
<div t-attf-id="#{id}" class="carousel slide" data-ride="carousel" t-attf-data-interval="#{interval}" style="margin: 0 12px;">
<div class="carousel-inner container" style="padding: 0;">
<t t-foreach="srcs" t-as="src">
- <div t-attf-class="item #{src_index == index and 'active' or ''}">
- <img t-attf-class="img img-responsive #{userStyle}" t-att-src="src" alt="Slide image"/>
+ <div t-attf-class="carousel-item #{src_index == index and 'active' or ''}">
+ <img t-attf-class="img img-fluid #{userStyle}" t-att-src="src" alt="Slide image"/>
</div>
</t>
</div>
diff --git a/addons/website/static/src/xml/website.pageProperties.xml b/addons/website/static/src/xml/website.pageProperties.xml
index 61c0c507cf4..7f3b4cbfc64 100644
--- a/addons/website/static/src/xml/website.pageProperties.xml
+++ b/addons/website/static/src/xml/website.pageProperties.xml
@@ -18,7 +18,7 @@
</t>
</t>
<t t-name="website.show_page_key_dependencies">
- <div class="col-sm-9 col-sm-offset-3">
+ <div class="col-md-9 offset-md-3">
<span class="text-muted" id="warn_about_call_message">
<t t-set="depTooltip">
<t t-call="website.get_tooltip_dependencies"/>
@@ -39,32 +39,34 @@
<!-- Page Properties -->
<div t-name="website.pagesMenu.page_info" class="o_page_management_info">
- <form class="form-horizontal">
+ <form>
<ul class="nav nav-tabs" role="tablist">
- <li class="active"><a aria-controls="basic_page_info" data-toggle="tab" href="#basic_page_info" role="tab">Name</a></li>
- <li><a aria-controls="advances_page_info" data-toggle="tab" href="#advances_page_info" role="tab">Publish</a></li>
+ <li class="nav-item"><a aria-controls="basic_page_info" role="tab" data-toggle="tab" class="nav-link active" href="#basic_page_info">Name</a></li>
+ <li class="nav-item"><a aria-controls="advances_page_info" role="tab" data-toggle="tab" class="nav-link" href="#advances_page_info">Publish</a></li>
</ul>
<div class="tab-content mt16">
<div role="tabpanel" id="basic_page_info" class="tab-pane fade in active">
- <div class="form-group">
- <label class="control-label col-sm-3" for="page_name">Page Name</label>
- <div class="col-sm-9">
- <input type="text" class="form-control input-sm" id="page_name" t-att-value="widget.page.name" />
+ <div class="form-group row">
+ <label class="col-form-label col-md-3" for="page_name">Page Name</label>
+ <div class="col-md-9">
+ <input type="text" class="form-control form-control-sm" id="page_name" t-att-value="widget.page.name" />
</div>
</div>
<div class="form-group warn_about_call"></div>
- <div class="form-group">
- <label class="control-label col-sm-3" for="page_url">Page URL</label>
- <div class="col-sm-9">
+ <div class="form-group row">
+ <label class="col-form-label col-md-3" for="page_url">Page URL</label>
+ <div class="col-md-9">
<div class="input-group">
- <span class="input-group-addon" t-att-title="widget.serverUrl"><small><t t-esc="widget.serverUrlTrunc"/></small></span>
- <input type="text" class="form-control input-sm" id="page_url" t-att-value="widget.page.url" />
+ <div class="input-group-prepend">
+ <span class="input-group-text" t-att-title="widget.serverUrl"><small><t t-esc="widget.serverUrlTrunc"/></small></span>
+ </div>
+ <input type="text" class="form-control form-control-sm" id="page_url" t-att-value="widget.page.url" />
</div>
</div>
</div>
- <div class="form-group ask_for_redirect">
- <label class="control-label col-sm-3" for="create_redirect">Redirect Old URL</label>
- <div class="col-sm-2">
+ <div class="form-group row ask_for_redirect">
+ <label class="col-form-label col-md-3" for="create_redirect">Redirect Old URL</label>
+ <div class="col-md-2">
<a>
<label class="o_switch" for="create_redirect" >
<input type="checkbox" id="create_redirect"/>
@@ -72,13 +74,13 @@
</label>
</a>
</div>
- <div class="col-sm-7 mt4">
+ <div class="col-md-7 mt4">
<span class="text-muted" id="dependencies_redirect"></span>
</div>
</div>
- <div class="form-group ask_for_redirect">
- <label class="control-label col-sm-3 redirect_type" for="redirect_type">Type</label>
- <div class="col-sm-6 redirect_type">
+ <div class="form-group row ask_for_redirect">
+ <label class="col-form-label col-md-3 redirect_type" for="redirect_type">Type</label>
+ <div class="col-md-6 redirect_type">
<select class="form-control" id="redirect_type">
<option t-foreach="widget.fields.type.selection" t-as="field" t-att-value="field[0]"><t t-esc="field[0] + ': ' + field[1]" /></option>
</select>
@@ -86,53 +88,55 @@
</div>
</div>
<div role="tabpanel" id="advances_page_info" class="tab-pane fade">
- <div class="form-group">
- <label class="control-label col-sm-3" for="is_menu">Show in Top Menu</label>
- <div class="col-sm-2">
+ <div class="form-group row">
+ <label class="col-form-label col-md-3" for="is_menu">Show in Top Menu</label>
+ <div class="col-md-2">
<label class="o_switch" for="is_menu" >
<input type="checkbox" t-att-checked="widget.page.menu_ids.length > 0 ? true : undefined" id="is_menu"/>
<span/>
</label>
</div>
</div>
- <div class="form-group">
- <label class="control-label col-sm-3" for="is_homepage">Use as Homepage</label>
- <div class="col-sm-2">
+ <div class="form-group row">
+ <label class="col-form-label col-md-3" for="is_homepage">Use as Homepage</label>
+ <div class="col-md-2">
<label class="o_switch" for="is_homepage" >
<input type="checkbox" t-att-checked="widget.page.is_homepage ? true : undefined" id="is_homepage"/>
<span/>
</label>
</div>
</div>
- <div class="form-group">
- <label class="control-label col-sm-3" for="is_indexed">
+ <div class="form-group row">
+ <label class="col-form-label col-md-3" for="is_indexed">
Indexed
<i class="fa fa-question-circle-o" title="Hide this page from search results" role="img" aria-label="Info"></i>
</label>
- <div class="col-sm-2">
+ <div class="col-md-2">
<label class="o_switch" for="is_indexed" >
<input type="checkbox" t-att-checked="widget.page.website_indexed ? true : undefined" id="is_indexed"/>
<span/>
</label>
</div>
</div>
- <div class="form-group">
- <label class="control-label col-sm-3" for="is_published">Publish</label>
- <div class="col-sm-2">
+ <div class="form-group row">
+ <label class="col-form-label col-md-3" for="is_published">Publish</label>
+ <div class="col-md-2">
<label class="o_switch js_publish_btn" for="is_published">
<input type="checkbox" t-att-checked="widget.page.website_published ? true : undefined" id="is_published"/>
<span/>
</label>
</div>
</div>
- <div class="form-group">
- <label class="control-label col-sm-3" for="date_publish">Publishing Date</label>
- <div class="col-sm-9">
+ <div class="form-group row">
+ <label class="col-form-label col-md-3" for="date_publish">Publishing Date</label>
+ <div class="col-md-9">
<div class='input-group date' id='date_publish_container'>
<input type='text' class="form-control" name="date_publish" id="date_publish" />
- <span class="input-group-addon">
- <span class="fa fa-calendar" role="img" aria-label="Publish date" title="Publish date"></span>
- </span>
+ <div class="input-group-append">
+ <span class="input-group-text">
+ <span class="fa fa-calendar" role="img" aria-label="Publish date" title="Publish date"></span>
+ </span>
+ </div>
</div>
</div>
</div>
diff --git a/addons/website/static/src/xml/website.seo.xml b/addons/website/static/src/xml/website.seo.xml
index 08137872596..d9cb1f38f80 100644
--- a/addons/website/static/src/xml/website.seo.xml
+++ b/addons/website/static/src/xml/website.seo.xml
@@ -8,27 +8,27 @@
<div t-name="website.seo_configuration">
<section class="row">
- <div class="col-md-6">
- <div class="form-horizontal mt16" role="form">
- <div class="form-group">
- <label for="seo_page_title" class="col-xs-3 control-label">Page Title</label>
- <div class="col-xs-9">
+ <div class="col-lg-6">
+ <div class="mt16" role="form">
+ <div class="form-group row">
+ <label for="seo_page_title" class="col-3 col-form-label">Page Title</label>
+ <div class="col-9">
<input type="text" name="seo_page_title" class="form-control" maxlength="70" size="70"/>
</div>
</div>
- <div class="form-group">
- <label for="seo_page_description" class="col-xs-3 control-label">Description</label>
- <div class="col-xs-9">
+ <div class="form-group row">
+ <label for="seo_page_description" class="col-3 col-form-label">Description</label>
+ <div class="col-9">
<textarea name="seo_page_description" class="form-control" style="max-width: 100%;height:145px;max-height:145px" t-att-maxlength="widget.maxDescriptionSize"/>
</div>
</div>
</div>
</div>
- <div class="col-md-6">
+ <div class="col-lg-6">
<h5 class="mt16">Preview <small>how your page will be listed on Google</small></h5>
- <div class="well">
- <div class="panel mb0">
- <div class="panel-body">
+ <div>
+ <div class="card mb0">
+ <div class="card-body">
<div class="js_seo_preview"/>
</div>
</div>
@@ -46,10 +46,10 @@
<div class="form-inline" role="form">
<div class="input-group">
<input type="text" style="min-width:170px" name="seo_page_keywords" class="form-control" placeholder="Keyword" maxlength="30"/>
- <span class="input-group-btn">
+ <span class="input-group-append">
<select name="seo_page_language" id="language-box" class="btn form-control"/>
</span>
- <span class="input-group-btn">
+ <span class="input-group-append">
<button data-action="add" class="btn btn-success" type="button">Add</button>
</span>
</div>
@@ -63,10 +63,10 @@
<td/>
<td><hr/>
<small class="text-muted">Legend:</small>
- <span class="label label-default">Not used</span>
- <span class="label label-success">In title</span>
- <span class="label label-primary">In description</span>
- <span class="label label-info">In page's content</span>
+ <span class="badge badge-secondary">Not used</span>
+ <span class="badge badge-success">In title</span>
+ <span class="badge badge-primary">In description</span>
+ <span class="badge badge-info">In page's content</span>
</td>
</tr>
</tfoot>
@@ -106,7 +106,7 @@
</t>
<t t-name="website.seo_suggestion">
- <li class="oe_seo_suggestion">
+ <li class="list-inline-item oe_seo_suggestion">
<span t-attf-title="#{ widget.tooltip() }" t-attf-class="oe_seo_keyword #{ widget.highlight() } js_seo_suggestion" t-att-data-keyword="widget.keyword">
<t t-raw="widget.keyword"/>
</span>
diff --git a/addons/website/static/src/xml/website.share.xml b/addons/website/static/src/xml/website.share.xml
index b534f6e9cc7..d78c1babc46 100644
--- a/addons/website/static/src/xml/website.share.xml
+++ b/addons/website/static/src/xml/website.share.xml
@@ -2,7 +2,7 @@
<templates id="template" xml:space="preserve">
<t t-name="website.social_hover">
<div class="row clearfix" style='font-size:16px'>
- <div class="col-xs-12 css_editable_mode_hidden">
+ <div class="col-12 css_editable_mode_hidden">
<t t-foreach="medias" t-as="media">
<a style="cursor: pointer" t-attf-class="fa-stack fa-lg share #{media}" t-att-aria-label="media" t-att-title="media">
<span class="fa fa-square fa-stack-2x"></span>
diff --git a/addons/website/static/src/xml/website.xml b/addons/website/static/src/xml/website.xml
index bdd5aa42941..e391fcfd5f8 100644
--- a/addons/website/static/src/xml/website.xml
+++ b/addons/website/static/src/xml/website.xml
@@ -9,12 +9,12 @@
<h3 class="modal-title"><t t-esc="window_title"/></h3>
</header>
<main class="modal-body">
- <form class="form-horizontal" role="form" t-att-id="id">
- <div class="form-group mb0">
- <label for="page-name" class="col-sm-3 control-label">
+ <form role="form" t-att-id="id">
+ <div class="form-group row mb0">
+ <label for="page-name" class="col-md-3 col-form-label">
<t t-esc="field_name"/>:
</label>
- <div class="col-sm-8">
+ <div class="col-md-8">
<input t-if="field_type == 'input'" type="text" class="form-control" required="required"/>
<textarea t-if="field_type == 'textarea'" class="form-control" required="required" rows="5"></textarea>
<select t-if="field_type == 'select'" class="form-control"></select>
@@ -23,8 +23,8 @@
</form>
</main>
<footer class="modal-footer">
- <button type="button" class="btn btn-sm btn-primary btn-continue">Continue</button>
- <button type="button" class="btn btn-sm btn-default" data-dismiss="modal" aria-label="Cancel">Cancel</button>
+ <button type="button" class="btn btn-primary btn-continue">Continue</button>
+ <button type="button" class="btn btn-secondary" data-dismiss="modal" aria-label="Cancel">Cancel</button>
</footer>
</div>
</div>
@@ -62,15 +62,17 @@
</div>
<div t-name="website.rename_page">
- <div class="well">
- <form class="form-horizontal">
- <div class="form-group mb0">
- <label for="new_name" class="control-label col-sm-4">Rename Page To:</label>
- <div class="col-sm-8">
- <input type="text" class="form-control" id="new_name" placeholder="e.g. About Us"/>
+ <div class="card">
+ <div class="card-body">
+ <form>
+ <div class="form-group row mb0">
+ <label for="new_name" class="col-form-label col-md-4">Rename Page To:</label>
+ <div class="col-md-8">
+ <input type="text" class="form-control" id="new_name" placeholder="e.g. About Us"/>
+ </div>
</div>
- </div>
- </form>
+ </form>
+ </div>
</div>
<t t-call="website.dependencies"/>
</div>