odoo.define('website.editor', function (require) { 'use strict'; var ajax = require('web.ajax'); var core = require('web.core'); var Widget = require('web.Widget'); var base = require('web_editor.base'); var editor = require('web_editor.editor'); var widget = require('web_editor.widget'); var website = require('website.website'); var qweb = core.qweb; var _t = core._t; ajax.loadXML('/website/static/src/xml/website.editor.xml', qweb); /** * Object who contains all method and bind for the top bar, the template is create server side. */ website.TopBar.include({ events: { 'click [data-action="edit"]': 'edit', }, start: function () { $("#wrapwrap").find("[data-oe-model] .oe_structure.oe_empty, [data-oe-model].oe_structure.oe_empty, [data-oe-type=html]:empty") .filter(".oe_not_editable") .filter(".oe_no_empty") .addClass("oe_empty"); if (location.search.indexOf("enable_editor") >= 0 && $('html').attr('lang').match(/en[-_]US/)) { this.$el.addClass('editing_mode'); this.delayed_hide(); } return this._super.apply(this, arguments); }, edit: function () { this.$('button[data-action=edit]').prop('disabled', true); this.$el.addClass('editing_mode'); editor.editor_bar = new editor.Class(this); editor.editor_bar.prependTo(document.body); $('.o_homepage_editor_welcome_message').remove(); this.delayed_hide(); }, delayed_hide: function () { _.delay((function () { this.do_hide(); }).bind(this), 800); }, }); /* ----- Customize Template ---- */ website.TopBarCustomize = Widget.extend({ events: { 'click > ul a[data-view-id]': 'do_customize', }, start: function () { this.view_name = $(document.documentElement).data('view-xmlid'); if (!this.view_name) { this.$el.hide(); } if (this.$el.is(".open")) { this.load_menu(); } else { this.$el.one("mousedown", "> a.dropdown-toggle", this.load_menu.bind(this)); } }, load_menu: function () { var $menu = this.$el.children("ul"); ajax.jsonRpc('/website/customize_template_get', 'call', { key: this.view_name, full: false }).then(function (result) { var current_group = ""; _.each(result, function (item) { if (current_group !== item.inherit_id[1]) { current_group = item.inherit_id[1]; $menu.append("
  • " + current_group + "
  • "); } var $li = $('
  • ', {role: 'presentation'}) .append($('', {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); }); }); }, do_customize: function (e) { e.preventDefault(); var view_id = $(e.currentTarget).data('view-id'); return ajax.jsonRpc('/web/dataset/call_kw', 'call', { model: 'ir.ui.view', method: 'toggle', args: [[parseInt(view_id, 10)]], kwargs: {context: base.get_context()} }).then(function () { window.location.reload(); }); }, }); website.TopBar.include({ start: function () { this.customize_menu = new website.TopBarCustomize(); var def = this.customize_menu.attachTo($('#customize-menu')); return $.when(this._super(), def); } }); /* ----- EDITOR: LINK & MEDIA ---- */ widget.LinkDialog.include({ bind_data: function () { var self = this; var href = this.data.url; var last; this.$('#link-page').select2({ minimumInputLength: 1, placeholder: _t("New or existing page"), query: function (q) { if (q.term === last) return; last = q.term; $.when( self.page_exists(q.term), self.fetch_pages(q.term) ).then(function (exists, results) { var rs = _.map(results, function (r) { return { id: r.loc, text: r.loc, }; }); if (!exists) { rs.push({ create: true, id: q.term, text: _.str.sprintf(_t("Create page '%s'"), q.term), }); } q.callback({ more: false, results: rs }); }, function () { q.callback({more: false, results: []}); }); }, }); if (href) { this.page_exists(href).then(function (exist) { if (exist) { self.$('#link-page').select2('data', {'id': href, 'text': href}).change(); } else { self.$('input.url').val(href).change(); self.$('input.window-new').closest("div").show(); } }); } return this._super(); }, get_data_buy_url: function (def, $e, isNewWindow, label, classes, test) { var val = $e.val(); if (val && val.length && $e.hasClass('page')) { var data = $e.select2('data'); if (!data.create || test) { def.resolve(data.id, isNewWindow, label || data.text, classes); } else { // Create the page, get the URL back $.get(_.str.sprintf( '/website/add/%s?noredirect=1', encodeURI(data.id))) .then(function (response) { def.resolve(response, isNewWindow, label, classes); }); } } else { return this._super.apply(this, arguments); } }, changed: function (e) { this.$('.url-source').filter(':input').not($(e.target)).val('') .filter(function () { return !!$(this).data('select2'); }) .select2('data', null); this._super(e); }, call: function (method, args, kwargs) { var self = this; var req = method + '_req'; if (this[req]) { this[req].abort(); } return this[req] = ajax.jsonRpc('/web/dataset/call_kw', 'call', { model: 'website', method: method, args: args, kwargs: kwargs, }).always(function () { self[req] = null; }); }, page_exists: function (term) { return this.call('page_exists', [null, term], { context: base.get_context(), }); }, fetch_pages: function (term) { return this.call('search_pages', [null, term], { limit: 100, context: base.get_context(), }); }, }); /** * Display a welcome message on the homepage when it is empty and that the user is connected. */ base.ready().then(function () { if (location.search.indexOf("enable_editor") < 0 && $(".editor_enable").length === 0) { var $wrap = $("#wrapwrap.homepage #wrap"); if ($wrap.length && $wrap.html().trim() === "") { var $welcome_message = $(qweb.render("website.homepage_editor_welcome_message")); $welcome_message.css("min-height", $wrap.parent("main").height() - ($wrap.outerHeight(true) - $wrap.height())); $wrap.empty().append($welcome_message); } } }); });