openerp.website = function(instance) { instance.website.EditorBar = instance.web.Widget.extend({ template: 'Website.EditorBar', events: { 'click button[data-action=edit]': 'edit', 'click button[data-action=save]': 'save', 'click button[data-action=cancel]': 'cancel', 'click button[data-action=snippet]': 'snippet', }, container: 'body', start: function() { var self = this; this.saving_mutex = new $.Mutex(); self.$('button[data-action]').prop('disabled', true); self.$('button[data-action=edit],button[data-action=snippet]').prop('disabled', false); self.snippet_start(); $('body').on("keypress", ".oe_editable", function(e) { var $e = $(e.currentTarget); if (!$e.is('.oe_dirty')) { $e.addClass('oe_dirty'); self.$('button[data-action=save],button[data-action=cancel]').prop('disabled', false); // TODO: Are we going to use a meta-data flag in order to know if the field shall be text or html ? } if (e.which == 13) { $e.blur(); e.preventDefault(); } }); return this._super.apply(this, arguments); }, edit: function () { this.$('button[data-action=edit]').prop('disabled', true); $('[data-oe-model]').prop('contentEditable', true).addClass('oe_editable'); }, save: function () { var self = this; var defs = []; $('.oe_dirty').each(function (i, v) { var $el = $(this); // TODO: Add a queue with concurrency limit in webclient // https://github.com/medikoo/deferred/blob/master/lib/ext/function/gate.js var def = self.saving_mutex.exec(function () { return self.saveElement($el).then(function () { $el.removeClass('oe_dirty'); }).fail(function () { var data = $el.data(); console.error(_.str.sprintf('Could not save %s#%d#%s', data.oeModel, data.oeId, data.oeField)); }); }); defs.push(def); }); return $.when.apply(null, defs).then(function () { window.location.reload(); }); }, saveElement: function ($el) { var data = $el.data(); var html = $el.html(); var xpath = data.oeXpath; if (xpath) { var $w = $el.clone(); $w.removeClass('aloha-editable aloha-editable-highlight oe_dirty'); _.each(['model', 'id', 'field', 'xpath'], function(d) {$w.removeAttr('data-oe-' + d);}); $w.prop('contentEditable', false).removeClass('oe_editable'); html = $w.wrap('
').parent().html(); } return (new instance.web.DataSet(this, 'ir.ui.view')).call('save', [data.oeModel, data.oeId, data.oeField, html, xpath]); }, cancel: function () { window.location.reload(); }, snippet_start: function () { var self = this; $('.oe_snippet').click(function(ev) { $('.oe_selected').removeClass('oe_selected'); var $snippet = $(ev.currentTarget); $snippet.addClass('oe_selected'); $snippet.draggable(); var selector = $snippet.data("selector"); var $zone = $(".oe_website_body " + selector); var droppable = '
.
.
.
.
.
'; $zone.before(droppable); $zone.after(droppable); $(".oe_snippet_drop").droppable({ drop: function( event, ui ) { console.log(event, ui, "DROP"); var $target = $(event.target); $target.before($snippet.html()); $('.oe_selected').remove(); $('.oe_snippet_drop').remove(); } }); }); }, snippet: function (ev) { $('.oe_snippet_editor').toggle(); }, }); $(function(){ function make_static(){ $('.oe_snippet_demo').removeClass('oe_new'); $('.oe_page *').off('mouseover mouseleave'); $('.oe_page .oe_selected').removeClass('oe_selected'); } var selected_snippet = null; function snippet_click(event){ if(selected_snippet){ selected_snippet.removeClass('oe_selected'); if(selected_snippet[0] === $(this)[0]){ selected_snippet = null; event.preventDefault(); make_static(); return; } } $(this).addClass('oe_selected'); selected_snippet = $(this); make_editable(); event.preventDefault(); } //$('.oe_snippet').click(snippet_click); var hover_element = null; function make_editable( constraint_after, constraint_inside ){ if(selected_snippet && selected_snippet.hasClass('oe_new')){ $('.oe_snippet_demo').addClass('oe_new'); }else{ $('.oe_snippet_demo').removeClass('oe_new'); } $('.oe_page *').off('mouseover'); $('.oe_page *').off('mouseleave'); $('.oe_page *').mouseover(function(event){ console.log('hover:',this); if(hover_element){ hover_element.removeClass('oe_selected'); hover_element.off('click'); } $(this).addClass('oe_selected'); $(this).click(append_snippet); hover_element = $(this); event.stopPropagation(); }); $('.oe_page *').mouseleave(function(){ if(hover_element && $(this) === hover_element){ hover_element = null; $(this).removeClass('oe_selected'); } }); } function append_snippet(event){ console.log('click',this,event.button); if(event.button === 0){ if(selected_snippet){ if(selected_snippet.hasClass('oe_new')){ var new_snippet = $("
"); new_snippet.append($(this).clone()); new_snippet.click(snippet_click); $('.oe_snippet.oe_selected').before(new_snippet); }else{ $(this).after($('.oe_snippet.oe_selected').contents().clone()); } selected_snippet.removeClass('oe_selected'); selected_snippet = null; make_static(); } }else if(event.button === 1){ $(this).remove(); } event.preventDefault(); } }); instance.web.ActionRedirect = function(parent, action) { var url = $.deparam(window.location.href).url; if (url) { window.location.href = url; } }; instance.web.client_actions.add("redirect", "instance.web.ActionRedirect"); };