odoo/ext/clarico-addons/customize_theme/static/src/js/website.theme.js

190 lines
7.0 KiB
JavaScript
Executable File

odoo.define('clarico_layout.clarico_themecolor', function (require) {
'use strict';
var ajax = require('web.ajax');
var core = require('web.core');
var session = require('web.session');
var Widget = require('web.Widget');
var QWeb = core.qweb;
var clarico_themecolor = require('website.theme');
clarico_themecolor.include({
active_select_tags: function () {
/* Data store using json*/
var theme = []
ajax.jsonRpc('/theme_color_store', 'call', {
theme_color: theme
}).then(function (data) {
if(data){
$('#input_color').val(data);
}
});
/* Apply theme color using json */
$(".select_theme_color").click(function () {
var theme_color = $('#input_color').val();
if (theme_color != '') {
if (theme_color.match(/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/) || theme_color.match(/^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/)) {
ajax.jsonRpc('/theme_color_change', 'call', {
theme_color: theme_color
}).then(function (data) {
});
}
else {
$('.select_theme_color').find("input").remove();
$('#theme_customize_modal').find('.cus_theme_loader').css('display', 'none');
alert("Not a Valid Color");
$('#theme_customize_modal').removeClass('in');
$('#theme_customize_modal').addClass('out');
}
}
});
},
get_xml_ids: function ($inputs) {
var xml_ids = [];
$inputs.each(function () {
if ($(this).data('xmlid') && $(this).data('xmlid').length) {
xml_ids = xml_ids.concat($(this).data('xmlid').split(/\s*,\s*/));
}
if ($(this).data('tmp_xmlid') && $(this).data('tmp_xmlid').length) {
xml_ids = xml_ids.concat($(this).data('tmp_xmlid').split(/\s*,\s*/));
}
});
return xml_ids;
},
update_style: function (enable, disable, reload) {
if (this.$el.hasClass('loading')) {
return;
}
this.$el.addClass('loading');
if (this.$el.find('.cus_theme_loader').hasClass("hidden")) {
this.$el.find('.cus_theme_loader').removeClass('hidden');
}
if (!reload && session.debug !== 'assets') {
var self = this;
return this._rpc({
route: '/website/theme_customize',
params: {
enable: enable,
disable: disable,
get_bundle: true,
},
}).then(function (bundleHTML) {
var $links = $('link[href*=".assets_frontend"]');
var $newLinks = $(bundleHTML).filter('link');
var linksLoaded = $.Deferred();
var nbLoaded = 0;
$newLinks.on('load', function (e) {
if (++nbLoaded >= $newLinks.length) {
linksLoaded.resolve();
}
});
$newLinks.on('error', function (e) {
linksLoaded.reject();
window.location.hash = 'theme=true';
window.location.reload();
});
$links.last().after($newLinks);
return linksLoaded.then(function () {
$links.remove();
self.$el.removeClass('loading');
self.$el.find('.cus_theme_loader').addClass('hidden');
});
});
} else {
var href = '/website/theme_customize_reload'+
'?href='+encodeURIComponent(window.location.href)+
'&enable='+encodeURIComponent(enable.join(','))+
'&disable='+encodeURIComponent(disable.join(','));
window.location.href = href;
return $.Deferred();
}
},
change_selection: function (event, init_mode) {
var self = this;
clearTimeout(this.time_select);
if (this.$el.hasClass('loading')) return; // prevent to change selection when css is loading
var $option = $(event.target).is('input') ? $(event.target) : $('input', event.target),
$options = $option,
checked = $option.prop('checked');
if (checked) {
var $inputs;
if ($option.data('enable')) {
$inputs = this.get_inputs($option.data('enable'));
$options = $options.add($inputs.filter(':not(:checked)'));
this.enable_disable($inputs, true);
}
if ($option.data('disable')) {
$inputs = this.get_inputs($option.data('disable'));
$options = $options.add($inputs.filter(':checked'));
this.enable_disable($inputs, false);
}
$option.closest('label').addClass('checked');
} else {
$option.closest('label').removeClass('checked');
}
var $enable = this.$inputs.filter('[data-xmlid]:checked');
$enable.closest('label').addClass('checked');
var $disable = this.$inputs.filter('[data-xmlid]:not(:checked)');
$disable.closest('label').removeClass('checked');
var $sets = this.$inputs.filter('input[data-enable]:not([data-xmlid]), input[data-disable]:not([data-xmlid])');
$sets.each(function () {
var $set = $(this);
var checked = true;
if ($set.data('enable')) {
self.get_inputs($(this).data('enable')).each(function () {
if (!$(this).prop('checked')) checked = false;
});
}
if ($set.data('disable')) {
self.get_inputs($(this).data('disable')).each(function () {
if ($(this).prop('checked')) checked = false;
});
}
if (checked) {
$set.prop('checked', true).closest('label').addClass('checked');
} else {
$set.prop('checked', false).closest('label').removeClass('checked');
}
$set.trigger('update');
});
if (this.flag && $option.data('reload') && document.location.href.match(new RegExp( $option.data('reload') ))) {
this.reload = true;
}
clearTimeout(this.timer);
if (this.flag) {
this.timer = _.defer(function () {
if (!init_mode) self.on_select($options, event);
self.update_style(self.get_xml_ids($enable), self.get_xml_ids($disable), self.reload);
self.reload = true;
});
} else {
this.timer = _.defer(function () {
if (!init_mode) self.on_select($options, event);
self.reload = true;
});
}
},
});
});