summaryrefslogtreecommitdiff
path: root/addons/website/static/src/js/website.js
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@openerp.com>2013-09-06 10:35:00 +0200
committerChristophe Matthieu <chm@openerp.com>2013-09-06 10:35:00 +0200
commit8a3f1742e0e9c7acaae726e5c7106d2d7df7e970 (patch)
tree78ae5d981fcd25677caea5c8b3999b1e77bf4547 /addons/website/static/src/js/website.js
parent6f6c59ec1de1881a70e4bf728ea5d8b56bd609f9 (diff)
parentc80cf7d0646463b290137c26fbada568a6942b00 (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.js795
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');
});
});