diff options
| author | Christophe Matthieu <chm@openerp.com> | 2013-09-06 10:35:00 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@openerp.com> | 2013-09-06 10:35:00 +0200 |
| commit | 8a3f1742e0e9c7acaae726e5c7106d2d7df7e970 (patch) | |
| tree | 78ae5d981fcd25677caea5c8b3999b1e77bf4547 /addons/website/static/src/js/website.js | |
| parent | 6f6c59ec1de1881a70e4bf728ea5d8b56bd609f9 (diff) | |
| parent | c80cf7d0646463b290137c26fbada568a6942b00 (diff) | |
[MERGE] from website-al
bzr revid: chm@openerp.com-20130906083500-4n5knaxiqt4cg2ht
Diffstat (limited to 'addons/website/static/src/js/website.js')
| -rw-r--r-- | addons/website/static/src/js/website.js | 795 |
1 files changed, 22 insertions, 773 deletions
diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js index 2969e52ff63..c6d6f6c9f20 100644 --- a/addons/website/static/src/js/website.js +++ b/addons/website/static/src/js/website.js @@ -5,7 +5,7 @@ // The following line can be removed in 2017 openerp.website = website; - var templates = [ + var templates = website.templates = [ '/website/static/src/xml/website.xml' ]; @@ -31,301 +31,26 @@ return def; }; - website.init_editor = function () { - var editor = new website.EditorBar(); - editor.prependTo($('body')); - $('body').css('padding-top', '50px'); // Not working properly: editor.$el.outerHeight()); - }; - - /* ----- TOP EDITOR BAR FOR ADMIN ---- */ - website.EditorBar = openerp.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', - 'click a[data-action=show-mobile-preview]': 'mobilePreview', - }, - container: 'body', - customize_setup: function() { - var self = this; - var view_name = $('html').data('view-xmlid'); - var menu = $('#customize-menu'); - this.$('#customize-menu-button').click(function(event) { - menu.empty(); - openerp.jsonRpc('/website/customize_template_get', 'call', { 'xml_id': view_name }).then( - function(result) { - _.each(result, function (item) { - if (item.header) { - menu.append('<li class="nav-header">' + item.name + '</li>'); - } else { - menu.append(_.str.sprintf('<li><a href="#" data-view-id="%s"><strong class="icon-check%s"></strong> %s</a></li>', - item.id, item.active ? '' : '-empty', item.name)); - } - }); - } - ); - }); - menu.on('click', 'a', function (event) { - var view_id = $(event.target).data('view-id'); - openerp.jsonRpc('/website/customize_template_toggle', 'call', { - 'view_id': view_id - }).then( function(result) { - window.location.reload(); - }); - }); - $('#mobile-preview').on('hidden', function () { - $('body').removeClass('oe_stop_scrolling'); - }); - }, - start: function() { - var self = this; - - this.saving_mutex = new openerp.Mutex(); - - this.$('#website-top-edit').hide(); - this.$('#website-top-view').show(); - - $('.dropdown-toggle').dropdown(); - this.customize_setup(); - - this.$buttons = { - edit: this.$('button[data-action=edit]'), - save: this.$('button[data-action=save]'), - cancel: this.$('button[data-action=cancel]'), - snippet: this.$('button[data-action=snippet]'), - }; - - this.rte = new website.RTE(this); - this.rte.on('change', this, this.proxy('rte_changed')); - - this.snippets = new website.Snippets(); - this.snippets.appendTo($("body")); - window.snippets = this.snippets; - - return $.when( - this._super.apply(this, arguments), - this.rte.insertBefore(this.$buttons.snippet.parent()) - ); - }, - edit: function () { - this.$buttons.edit.prop('disabled', true); - this.$('#website-top-view').hide(); - this.$('#website-top-edit').show(); - - // this.$buttons.cancel.add(this.$buttons.snippet).prop('disabled', false) - // .add(this.$buttons.save) - // .parent().show(); - // - // TODO: span edition changing edition state (save button) - var $editables = $('[data-oe-model]') - .not('link, script') - // FIXME: propagation should make "meta" blocks non-editable in the first place... - .not('.oe_snippets,.oe_snippet, .oe_snippet *') - .prop('contentEditable', true) - .addClass('oe_editable'); - var $rte_ables = $editables.not('[data-oe-type]'); - var $raw_editables = $editables.not($rte_ables); - - // temporary fix until we fix ckeditor - $raw_editables.each(function () { - $(this).parents().add($(this).find('*')).on('click', function(ev) { - ev.preventDefault(); - ev.stopPropagation(); - }); - }); - - this.rte.start_edition($rte_ables); - $raw_editables.on('keydown keypress cut paste', function (e) { - var $target = $(e.target); - if ($target.hasClass('oe_dirty')) { - return; - } - - $target.addClass('oe_dirty'); - this.$buttons.save.prop('disabled', false); - }.bind(this)); - }, - rte_changed: function () { - this.$buttons.save.prop('disabled', false); - }, - 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('oe_dirty'); - _.each(['model', 'id', 'field', 'xpath'], function(d) {$w.removeAttr('data-oe-' + d);}); - $w - .removeClass('oe_editable') - .prop('contentEditable', false); - html = $w.wrap('<div>').parent().html(); - } - return openerp.jsonRpc('/web/dataset/call', 'call', { - model: 'ir.ui.view', - method: 'save', - args: [data.oeModel, data.oeId, data.oeField, html, xpath] - }); - }, - cancel: function () { - window.location.reload(); - }, - snippet: function (ev) { - this.snippets.toggle(); - }, - mobilePreview: function () { - $('body').addClass('oe_stop_scrolling'); - document.getElementById("mobile-viewport").src = window.location.href + "?mobile-preview=true"; - - }, - }); - - /* ----- RICH TEXT EDITOR ---- */ - website.RTE = openerp.Widget.extend({ - tagName: 'li', - id: 'oe_rte_toolbar', - className: 'oe_right oe_rte_toolbar', - // editor.ui.items -> possible commands &al - // editor.applyStyle(new CKEDITOR.style({element: "span",styles: {color: "#(color)"},overrides: [{element: "font",attributes: {color: null}}]}, {color: '#ff0000'})); - - start_edition: function ($elements) { - var self = this; - this.snippet_carousel(); - $elements - .not('span, [data-oe-type]') - .each(function () { - var $this = $(this); - CKEDITOR.inline(this, self._config()).on('change', function () { - $this.addClass('oe_dirty'); - self.trigger('change', this, null); - }); - }); - }, - - _current_editor: function () { - return CKEDITOR.currentInstance; - }, - _config: function () { - var removed_plugins = [ - // remove custom context menu - 'contextmenu,tabletools,liststyle', - // magicline captures mousein/mouseout => draggable does not work - 'magicline' - ]; - return { - // Disable auto-generated titles - // FIXME: accessibility, need to generate user-sensible title, used for @title and @aria-label - title: false, - removePlugins: removed_plugins.join(','), - uiColor: '', - // Ensure no config file is loaded - customConfig: '', - // Disable ACF - allowedContent: true, - // Don't insert paragraphs around content in e.g. <li> - autoParagraph: false, - filebrowserImageUploadUrl: "/website/attach", - // Support for sharedSpaces in 4.x - extraPlugins: 'sharedspace', - // Place toolbar in controlled location - sharedSpaces: { top: 'oe_rte_toolbar' }, - toolbar: [ - {name: 'basicstyles', items: [ - "Bold", "Italic", "Underline", "Strike", "Subscript", - "Superscript", "TextColor", "BGColor", "RemoveFormat" - ]},{ - name: 'span', items: [ - "Link", "Unlink", "Blockquote", "BulletedList", - "NumberedList", "Indent", "Outdent" - ]},{ - name: 'justify', items: [ - "JustifyLeft", "JustifyCenter", "JustifyRight", "JustifyBlock" - ]},{ - name: 'special', items: [ - "Image", "Table" - ]},{ - name: 'styles', items: [ - "Format", "Styles" - ]} - ], - // styles dropdown in toolbar - stylesSet: [ - // emphasis - {name: "Muted", element: 'span', attributes: {'class': 'text-muted'}}, - {name: "Primary", element: 'span', attributes: {'class': 'text-primary'}}, - {name: "Warning", element: 'span', attributes: {'class': 'text-warning'}}, - {name: "Danger", element: 'span', attributes: {'class': 'text-danger'}}, - {name: "Success", element: 'span', attributes: {'class': 'text-success'}}, - {name: "Info", element: 'span', attributes: {'class': 'text-info'}} - ], - }; - }, - // TODO clean - snippet_carousel: function () { - var self = this; - $('.carousel .js_carousel_options .label').on('click', function (e) { - e.preventDefault(); - var $button = $(e.currentTarget); - var $c = $button.parents(".carousel:first"); - - if($button.hasClass("js_add")) { - var cycle = $c.find(".carousel-inner .item").size(); - $c.find(".carousel-inner").append(openerp.qweb.render("website.carousel")); - $c.carousel(cycle); - } - else { - var cycle = $c.find(".carousel-inner .item.active").remove(); - $c.find(".carousel-inner .item:first").addClass("active"); - $c.carousel(0); - self.trigger('change', self, null); - } - }); - $('.carousel .js_carousel_options').show(); - } - }); - website.mutations = { darken: function($el){ - if($el.parent().hasClass('dark')){ - $el.parent().replaceWith($el); + var $parent = $el.parent(); + if($parent.hasClass('dark')){ + $parent.replaceWith($el); }else{ $el.replaceWith($("<div class='dark'></div>").append($el.clone())); } }, vomify: function($el){ - var hue=0; + var hue=0; var beat = false; - var a = setInterval(function(){ + var a = setInterval(function(){ $el.css({'-webkit-filter':'hue-rotate('+hue+'deg)'}); hue += 5; }, 10); setTimeout(function(){ clearInterval(a); - setInterval(function(){ + setInterval(function(){ var filter = 'hue-rotate('+hue+'deg)'+ (beat ? ' invert()' : ''); - $('html').css({'-webkit-filter': filter}); hue += 5; + $(document.documentElement).css({'-webkit-filter': filter}); hue += 5; if(hue % 35 === 0){ beat = !beat; } @@ -335,477 +60,8 @@ }, }; - /* ----- SNIPPET SELECTOR ---- */ - website.Snippets = openerp.Widget.extend({ - template: 'website.snippets', - init: function () { - this._super.apply(this, arguments); - if(!$('#oe_manipulators').length){ - $("<div id='oe_manipulators'></div>").appendTo('body'); - } - }, - start: function() { - var self = this; - - $.ajax({ - type: "GET", - url: "/page/website.snippets", - dataType: "text", - success: function(snippets){ - self.$el.html(snippets); - self.$('.oe_snippet').each(function(index,snippet){ - self.make_snippet_draggable($(snippet)); - }); - }, - }); - - }, - path_eval: function(path){ - var obj = window; - path = path.split('.'); - do{ - obj = obj[path.shift()]; - }while(path.length && obj); - return obj; - }, - - // activate drag and drop for the snippets in the snippet toolbar - make_snippet_draggable: function($snippet){ - var self = this; - - $snippet.draggable({ - helper: 'clone', - zIndex: '1000', - appendTo: 'body', - start: function(){ - var action = $snippet.data('action'); - - self.deactivate_snippet_manipulators(); - if( action === 'insert'){ - self.activate_insertion_zones({ - siblings: $snippet.data('selector-siblings'), - childs: $snippet.data('selector-childs') - }); - }else if( action === 'mutate' ){ - self.activate_overlay_zones($snippet.data('selector')); - } - - $('.oe_drop_zone').droppable({ - over: function(){ - // FIXME: stupid hack to prevent multiple droppable to activate at once ... - // it's not even working properly but it's better than nothing. - $(".oe_drop_zone.oe_hover").removeClass("oe_hover"); - $(this).addClass("oe_hover"); - }, - out: function(){ - $(this).removeClass("oe_hover"); - }, - drop: function(){ - if( action === 'insert' ){ - var $toInsert = $snippet.find('.oe_snippet_body').clone(); - $toInsert.removeClass('oe_snippet_body'); - $toInsert.addClass('oe_snippet_instance'); - $toInsert.data('snippet-id',$snippet.data('snippet-id')); - $(".oe_drop_zone.oe_hover").replaceWith($toInsert); - }else if( action === 'mutate' ){ - self.path_eval($snippet.data('action-function'))( $(".oe_drop_zone.oe_hover").data('target') ); - } - }, - }); - }, - stop: function(){ - self.deactivate_zones(); - self.activate_snippet_manipulators(); - }, - }); - }, - - // return the original snippet in the editor bar from a snippet id (string) - get_snippet_from_id: function(id){ - return $('.oe_snippet').filter(function(){ - return $(this).data('snippet-id') === id; - }).first(); - }, - // WIP - make_draggable_instance: function($instance){ - var self = this; - var $snippet = get_snippet_from_id($instance.data('snippet-id')); - - $instance.draggable({ - helper: 'clone', - zIndex: '1000', - appendTo: 'body', - start: function(){ - var action = $snippet.data('action'); - if(action === 'insert'){ - - self.deactivate_snippet_manipulators(); - self.activate_insertion_zones({ - siblings: $snippet.data('selector-siblings'), - child: $snippet.data('selector-childs') - }); - - } - } - }); - }, - - // Create element insertion drop zones. two css selectors can be provided - // selector.childs -> will insert drop zones as direct child of the selected elements - // in case the selected elements have children themselves, dropzones will be interleaved - // with them. - // selector.siblings -> will insert drop zones after and before selected elements - activate_insertion_zones: function(selector){ - var self = this; - var child_selector = selector.childs || ''; - var sibling_selector = selector.siblings || ''; - var zone_template = "<div class='oe_drop_zone oe_insert'></div>"; - - $('.oe_drop_zone').remove(); - - if(child_selector){ - var $zones = $(child_selector); - for( var i = 0, len = $zones.length; i < len; i++ ){ - $zones.eq(i).find('> *:not(.oe_drop_zone)').after(zone_template); - $zones.eq(i).prepend(zone_template); - } - } - - if(sibling_selector){ - var $zones = $(sibling_selector); - for( var i = 0, len = $zones.length; i < len; i++ ){ - if($zones.eq(i).prev('.oe_drop_zone').length === 0){ - $zones.eq(i).before(zone_template); - } - if($zones.eq(i).next('.oe_drop_zone').length === 0){ - $zones.eq(i).after(zone_template); - } - } - } - - // Cleaning up unnecessary zones - $('.oe_snippets .oe_drop_zone').remove(); // no zone in the snippet selector ... - $('#website-top-view .oe_drop_zone').remove(); // no zone in the top bars ... - $('#website-top-edit .oe_drop_zone').remove(); - var count; - do { - count = 0; - var $zones = $('.oe_drop_zone + .oe_drop_zone'); // no two consecutive zones - count += $zones.length; - $zones.remove(); - - $zones = $('.oe_drop_zone > .oe_drop_zone').remove(); // no recusrive zones - count += $zones.length; - $zones.remove(); - }while(count > 0); - - // Cleaning up zones placed between floating or inline elements. We do not like these kind of zones. - var $zones = $('.oe_drop_zone'); - for( var i = 0, len = $zones.length; i < len; i++ ){ - var zone = $zones.eq(i); - var prev = zone.prev(); - var next = zone.next(); - var float_prev = zone.prev().css('float') || 'none'; - var float_next = zone.next().css('float') || 'none'; - var disp_prev = zone.prev().css('display') || null; - var disp_next = zone.next().css('display') || null; - if( (float_prev === 'left' || float_prev === 'right') - && (float_next === 'left' || float_next === 'right') ){ - zone.remove(); - continue; - }else if( !( disp_prev === null - || disp_next === null - || disp_prev === 'block' - || disp_next === 'block' )){ - zone.remove(); - continue; - } - } - }, - deactivate_zones: function(){ - $('.oe_drop_zone').remove(); - }, - - // generate drop zones covering the elements selected by the selector - activate_overlay_zones: function(selector){ - var $targets = $(selector); - - function is_visible($el){ - return $el.css('display') != 'none' - && $el.css('opacity') != '0' - && $el.css('visibility') != 'hidden'; - } - - // filter out invisible elements - $targets = $targets.filter(function(){ return is_visible($(this)); }); - - // filter out elements with invisible parents - $targets = $targets.filter(function(){ - var parents = $(this).parents().filter(function(){ return !is_visible($(this)); }); - return parents.length === 0; - }); - - var zone_template = "<div class='oe_drop_zone oe_overlay'></div>"; - $('.oe_drop_zone').remove(); - - for(var i = 0, len = $targets.length; i < len; i++){ - var $target = $targets.eq(i); - var $zone = $(zone_template); - this.cover_target($zone,$target); - $zone.appendTo('#oe_manipulators'); - $zone.data('target',$target); - } - }, - - // puts $el at the same absolute position as $target - cover_target: function($el, $target){ - $el.css({ - 'position': 'absolute', - 'width': $target.outerWidth(), - 'height': $target.outerHeight(), - }); - $el.css($target.offset()); - }, - - // activates the manipulator boxes (with resizing handles) for all snippets - activate_snippet_manipulators: function(){ - var self = this; - // we generate overlay drop zones only to get an idea of where the snippet are, the drop - // zones are replaced by manipulators - this.activate_overlay_zones('#wrap .container'); - - var $active_manipulator = null; - var locked = false; - - $('.oe_drop_zone').each(function(){; - - var $zone = $(this); - var $snippet = $zone.data('target'); - var $manipulator = $(openerp.qweb.render('website.snippet_manipulator')); - - self.cover_target($manipulator, $zone); - $manipulator.data('target',$snippet); - $manipulator.appendTo('#oe_manipulators'); - $zone.remove(); - - $manipulator.mouseover(function(){ - if(!locked && $active_manipulator != $manipulator){ - if($active_manipulator){ - $active_manipulator.removeClass('oe_selected'); - } - $active_manipulator = $manipulator; - $manipulator.addClass('oe_selected'); - } - }); - /*$manipulator.mouseleave(function(){ - if(!locked && $active_manipulator){ - $active_manipulator.removeClass('oe_selected'); - $active_manipulator = null; - } - });*/ - /* - $manipulator.click(function(){ - if($active_manipulator === $manipulator){ - selected = !selected; - $manipulator.toggleClass('oe_selected',selected); - } - }); - */ - - $manipulator.find('.oe_handle').mousedown(function(event){ - locked = true; - var $handle = $(this); - var x = event.pageX; - var y = event.pageY; - - var pt = $snippet.css('padding-top'); - var pb = $snippet.css('padding-bottom'); - pt = Number(pt.slice(0,pt.length - 2)) || 0; //FIXME something cleaner to remove 'px' - pb = Number(pb.slice(0,pb.length - 2)) || 0; - - $manipulator.addClass('oe_hover'); - event.preventDefault(); - - $('body').mousemove(function(event){ - var dx = event.pageX - x; - var dy = event.pageY - y; - event.preventDefault(); - if($handle.hasClass('n') || $handle.hasClass('nw') || $handle.hasClass('ne')){ - $snippet.css('padding-top',pt-dy+'px'); - self.cover_target($manipulator,$snippet); - }else if($handle.hasClass('s') || $handle.hasClass('sw') || $handle.hasClass('se')){ - $snippet.css('padding-bottom',pb+dy+'px'); - self.cover_target($manipulator,$snippet); - } - }); - - $('body').mouseup(function(){ - locked = false; - $('body').unbind('mousemove'); - $('body').unbind('mouseup'); - self.deactivate_snippet_manipulators(); - self.activate_snippet_manipulators(); - }); - }); - - }); - }, - deactivate_snippet_manipulators: function(){ - $('.oe_snippet_manipulator').remove(); - }, - toggle: function(){ - if(this.$el.hasClass('oe_hidden')){ - this.$el.removeClass('oe_hidden'); - this.activate_snippet_manipulators(); - }else{ - this.$el.addClass('oe_hidden'); - this.deactivate_snippet_manipulators(); - } - }, - }); - - function noop() {} - var alter_dialog = { - image: function (definition) { - definition.removeContents('Link'); - definition.removeContents('advanced'); - - var upload = definition.getContents('Upload'); - upload.add({ - type: 'select', - label: 'Existing attachments', - id: 'ir_attachment', - items: [['']], - /** - * On dialog load, fetch all attachments (on ir.ui.view => - * previously uploaded images) and add them to the select's - * options (items array & add method) - */ - onLoad: function () { - var field = this; - - // FIXME: fuck this garbage, also fuck openerp.Model - return openerp.jsonRpc('/web/dataset/call_kw', 'call', { - model: 'ir.attachment', - method: 'search_read', - args: [], - kwargs: { - fields: ['name'], - domain: [['res_model', '=', 'ir.ui.view']], - order: 'name', - } - }).then(function (results) { - _(results).each(function (result) { - field.add(result.name, result.id); - }); - }); - }, - /** - * The image widgets uses "txtUrl" to do most of its stuff. - * Synchronize select & txtUrl by generating the correct URL - * and setting it there - */ - onChange: function () { - var id = this.getValue(); - var url = this.getDialog().getContentElement('info', 'txtUrl'); - if (!id) { - url.setValue(''); - return; - } - - url.setValue('/website/attachment/' + id); - }, - }); - // Override uploadButton to send its information to the select - // created above instead of directly to txtUrl. The select will - // propagate to txtUrl - upload.get('uploadButton').filebrowser = { - onSelect: function (url) { - var id = url.split('/').pop(); - var attachments = this.getDialog().getContentElement('Upload', 'ir_attachment'); - // TODO: return supplementary info to get image/attachment name? - attachments.add(id, id); - attachments.setValue(id); - } - }; - - var old_show = definition.onShow; - definition.onShow = function () { - // CKEDITOR does not *override* onShow, is smashes the existing - // one instead, so override "by hand" - if (old_show) { - old_show.call(this); - } - // Assloads of code in the image plugin just go and tear into - // the info tab without a care, so can't just remove the tab or - // its content. Hide the tab instead, the effect is roughly the - // same. - this.hidePage('info'); - // Force the dialog to always and only display the Upload tab - this.selectPage('Upload'); - this.on('selectPage', function (e) { - setTimeout(function () { - if (e.data.page !== 'Upload') { - this.selectPage('Upload'); - } - }.bind(this), 0); - }); - } - }, - link: function (definition) { - definition.removeContents('target'); - definition.removeContents('advanced'); - - var info = definition.getContents('info'); - info.remove('linkType'); - info.remove('anchorOptions'); - info.remove('emailOptions'); - - info.get('urlOptions').children[0].widths = [ '0%', '100%' ]; - info.get('protocol').style = 'display: none'; - // TODO: sync edition of url to website_pages? - info.add({ - type: 'select', - label: "Existing page", - id: 'website_pages', - items: [['']], - /** - * onload fetch all the pages existing in the website, then - * display that. - */ - onLoad: function () { - var field = this; - - return openerp.jsonRpc('/web/dataset/call_kw', 'call', { - model: 'website', - method: 'list_pages', - args: [], - kwargs: {} - }).then(function (results) { - _(results).each(function (result) { - field.add(result.name, result.url); - }); - }); - }, - onChange: function () { - var url = this.getValue(); - var url_field = this.getDialog().getContentElement('info', 'url'); - if (!url) { - url_field.setValue(''); - return; - } - - url_field.setValue(url); - } - }) - } - }; - CKEDITOR.on('dialogDefinition', function (ev) { - (alter_dialog[ev.data.name] || noop)(ev.data.definition); - }); - var all_ready = null; - var dom_ready = $.Deferred(); + var dom_ready = website.dom_ready = $.Deferred(); $(dom_ready.resolve); website.init_kanban = function ($kanban) { @@ -880,28 +136,21 @@ }; dom_ready.then(function () { - website.is_editable = $('html').attr('data-editable') === '1'; - var is_smartphone = $('body')[0].clientWidth < 767; - - if (website.is_editable && !is_smartphone) { - website.ready().then(website.init_editor); - } - /* ----- PUBLISHING STUFF ---- */ - $(document).on('click', '.js_publish, .js_unpublish', function (e) { + $('[data-publish]:has([data-publish])').each(function () { + var $pub = $("[data-publish]", this); + if($pub.size()) + $(this).attr("data-publish", $pub.attr("data-publish")); + else + $(this).removeAttr("data-publish"); + }); + + $(document).on('click', '.js_publish', function (e) { e.preventDefault(); - var $link = $(this).parent(); - $link.find('.js_publish, .js_unpublish').addClass("hidden"); - var $unp = $link.find(".js_unpublish"); - var $p = $link.find(".js_publish"); - $.post('/website/publish', {'id': $link.data('id'), 'object': $link.data('object')}, function (result) { - if (+result) { - $p.addClass("hidden"); - $unp.removeClass("hidden"); - } else { - $p.removeClass("hidden"); - $unp.addClass("hidden"); - } + var $data = $(":first", this).parents("[data-publish]"); + $data.attr("data-publish", $data.first().attr("data-publish") == 'off' ? 'on' : 'off'); + $.post('/website/publish', {'id': $(this).data('id'), 'object': $(this).data('object')}, function (result) { + $data.attr("data-publish", +result ? 'on' : 'off'); }); }); |
