From 5a425dda78897cc3d16477661aee8076d473229a Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 6 Nov 2013 09:38:33 +0100 Subject: [PATCH 1/9] [IMP] More explicit; where is the Edit button [IMP] remove "Create a free website if logged", see usertesting [IMP] Advanced view editor -> "HTML Editor" [IMP] Footer: editable zone grouped in a
for efficient distribute branding bzr revid: fp@tinyerp.com-20131106083833-cz4xc2ast5d9ao19 --- addons/website/static/src/css/website.css | 2 +- addons/website/static/src/css/website.sass | 2 +- .../website/static/src/js/website.editor.js | 2 +- addons/website/views/website_templates.xml | 30 ++++++++++--------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/addons/website/static/src/css/website.css b/addons/website/static/src/css/website.css index dd7d1f3183b..a14e9e8a3f8 100644 --- a/addons/website/static/src/css/website.css +++ b/addons/website/static/src/css/website.css @@ -239,7 +239,7 @@ footer { } .oe_structure.oe_empty:empty:before, [data-oe-type=html]:empty:before, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child:before, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child:before { - content: "Click Edit To Create Content"; + content: "Press The Top-Left Edit Button"; text-align: center; display: block; padding-top: 160px; diff --git a/addons/website/static/src/css/website.sass b/addons/website/static/src/css/website.sass index 8ef6407e08c..f34cb9d5b67 100644 --- a/addons/website/static/src/css/website.sass +++ b/addons/website/static/src/css/website.sass @@ -164,7 +164,7 @@ footer position: static .oe_structure.oe_empty:empty:before, [data-oe-type=html]:empty:before, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child:before, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child:before - content: 'Click Edit To Create Content' + content: 'Press The Top-Left Edit Button' text-align: center display: block padding-top: 160px diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index 45120030da3..a3cad21c680 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -361,7 +361,7 @@ }); // Adding Static Menus menu.append('
  • Change Theme
  • '); - menu.append('
  • Advanced view editor
  • '); + menu.append('
  • HTML Editor
  • '); self.trigger('rte:customize_menu_ready'); } ); diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 97953db691b..4a8971edca9 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -176,19 +176,21 @@
    -

    - Your Company - - About us -

    -

    - We are a team of passionated people whose goal is to improve everyone's - life through disruptive products. We build great products to solve your - business problems. -

    -

    - Our products are designed for small to medium companies willing to optimize - their performance. -

    +
    +

    + Your Company + - About us +

    +

    + We are a team of passionated people whose goal is to improve everyone's + life through disruptive products. We build great products to solve your + business problems. +

    +

    + Our products are designed for small to medium companies willing to optimize + their performance. +

    +
    -
    +
    Create a free website with OpenERP
    From b754d4999cdca353d02e5bfa37c11042e9a573d7 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 5 Nov 2013 17:13:45 +0100 Subject: [PATCH 2/9] [FIX] enable auth'd crawling of CMS bzr revid: xmo@openerp.com-20131105161345-257bebtxce4wa217 --- addons/website/tests/test_requests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/website/tests/test_requests.py b/addons/website/tests/test_requests.py index e354442dcde..97de424262b 100644 --- a/addons/website/tests/test_requests.py +++ b/addons/website/tests/test_requests.py @@ -110,6 +110,6 @@ class CrawlSuite(unittest2.TestSuite): def load_tests(loader, base, _): base.addTest(CrawlSuite()) # blog duplicate (&al?) are on links - #base.addTest(CrawlSuite('admin', tools.config['admin_passwd'])) - #base.addTest(CrawlSuite('demo', 'demo')) + base.addTest(CrawlSuite('admin', tools.config['admin_passwd'])) + base.addTest(CrawlSuite('demo', 'demo')) return base From f385e3af012186f683a68ac0925b3e9db4165f7e Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 6 Nov 2013 12:08:19 +0100 Subject: [PATCH 3/9] [IMP] Text for translate dialog bzr revid: fp@tinyerp.com-20131106110819-yflp80pdqehwp9gy --- .../static/src/xml/website.translator.xml | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/addons/website/static/src/xml/website.translator.xml b/addons/website/static/src/xml/website.translator.xml index 4a3432cd9f8..dc5f93e87bf 100644 --- a/addons/website/static/src/xml/website.translator.xml +++ b/addons/website/static/src/xml/website.translator.xml @@ -18,22 +18,23 @@ You are about to enter the translation mode.

    - In this mode you can not change the structure of the document, you can only translate text. -

    -

    - Here are the visuals used in order to help you in your translation flow: + Here are the visuals used to help you translate efficiently:

      -
    • - Normal translatable content -
    • -
    • - ERP translatable object data -
    • - Translation TODO + Content to translate +
    • +
    • + Translated content

    +

    + In this mode, you can only translate texts. To + change the structure of the page, you must edit the + master page. Each modification on the master page + is automatically applied to all translated + versions. +


    From 937fa8ab995ce0d94036cef12a10860b1c696e66 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 6 Nov 2013 12:48:27 +0100 Subject: [PATCH 4/9] [ADD] Added custom bootstrap version Temporary using a custom branch of bootstrap until the feature is merged upstream. The pull request is pending : https://github.com/twbs/bootstrap/pull/11373/files bzr revid: fme@openerp.com-20131106114827-gdlb53k4l42h5vq4 --- .../static/lib/bootstrap/js/bootstrap.js | 2720 ++++++++++++----- 1 file changed, 1998 insertions(+), 722 deletions(-) diff --git a/addons/website/static/lib/bootstrap/js/bootstrap.js b/addons/website/static/lib/bootstrap/js/bootstrap.js index ab217ed9cf1..b22be6fce1d 100644 --- a/addons/website/static/lib/bootstrap/js/bootstrap.js +++ b/addons/website/static/lib/bootstrap/js/bootstrap.js @@ -1,730 +1,2006 @@ -/** - * bootstrap.js v3.0.0 by @fat and @mdo - * Copyright 2013 Twitter Inc. - * http://www.apache.org/licenses/LICENSE-2.0 +/*! + * Bootstrap v3.0.1 by @fat and @mdo + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. */ -if (!jQuery) throw new Error("Bootstrap requires jQuery"); + function (a) { - "use strict"; - function b() { - var a = document.createElement("bootstrap"), - b = { - WebkitTransition: "webkitTransitionEnd", - MozTransition: "transitionend", - OTransition: "oTransitionEnd otransitionend", - transition: "transitionend" - }; - for (var c in b) - if (void 0 !== a.style[c]) return { - end: b[c] - } - } - a.fn.emulateTransitionEnd = function (b) { - var c = !1, - d = this; - a(this).one(a.support.transition.end, function () { - c = !0 - }); - var e = function () { - c || a(d).trigger(a.support.transition.end) - }; - return setTimeout(e, b), this - }, a(function () { - a.support.transition = b() - }) -}(window.jQuery), + function (a) { - "use strict"; - var b = '[data-dismiss="alert"]', - c = function (c) { - a(c).on("click", b, this.close) - }; - c.prototype.close = function (b) { - function c() { - f.trigger("closed.bs.alert").remove() - } - var d = a(this), - e = d.attr("data-target"); - e || (e = d.attr("href"), e = e && e.replace(/.*(?=#[^\s]*$)/, "")); - var f = a(e); - b && b.preventDefault(), f.length || (f = d.hasClass("alert") ? d : d.parent()), f.trigger(b = a.Event("close.bs.alert")), b.isDefaultPrevented() || (f.removeClass("in"), a.support.transition && f.hasClass("fade") ? f.one(a.support.transition.end, c).emulateTransitionEnd(150) : c()) - }; - var d = a.fn.alert; - a.fn.alert = function (b) { - return this.each(function () { - var d = a(this), - e = d.data("bs.alert"); - e || d.data("bs.alert", e = new c(this)), "string" == typeof b && e[b].call(d) - }) - }, a.fn.alert.Constructor = c, a.fn.alert.noConflict = function () { - return a.fn.alert = d, this - }, a(document).on("click.bs.alert.data-api", b, c.prototype.close) -}(window.jQuery), + function (a) { - "use strict"; - var b = function (c, d) { - this.$element = a(c), this.options = a.extend({}, b.DEFAULTS, d) - }; - b.DEFAULTS = { - loadingText: "loading..." - }, b.prototype.setState = function (a) { - var b = "disabled", - c = this.$element, - d = c.is("input") ? "val" : "html", - e = c.data(); - a += "Text", e.resetText || c.data("resetText", c[d]()), c[d](e[a] || this.options[a]), setTimeout(function () { - "loadingText" == a ? c.addClass(b).attr(b, b) : c.removeClass(b).removeAttr(b) - }, 0) - }, b.prototype.toggle = function () { - var a = this.$element.closest('[data-toggle="buttons"]'); - if (a.length) { - var b = this.$element.find("input").prop("checked", !this.$element.hasClass("active")).trigger("change"); - "radio" === b.prop("type") && a.find(".active").removeClass("active") - } - this.$element.toggleClass("active") - }; - var c = a.fn.button; - a.fn.button = function (c) { - return this.each(function () { - var d = a(this), - e = d.data("bs.button"), - f = "object" == typeof c && c; - e || d.data("bs.button", e = new b(this, f)), "toggle" == c ? e.toggle() : c && e.setState(c) - }) - }, a.fn.button.Constructor = b, a.fn.button.noConflict = function () { - return a.fn.button = c, this - }, a(document).on("click.bs.button.data-api", "[data-toggle^=button]", function (b) { - var c = a(b.target); - c.hasClass("btn") || (c = c.closest(".btn")), c.button("toggle"), b.preventDefault() - }) -}(window.jQuery), + function (a) { - "use strict"; - var b = function (b, c) { - this.$element = a(b), this.$indicators = this.$element.find(".carousel-indicators"), this.options = c, this.paused = this.sliding = this.interval = this.$active = this.$items = null, "hover" == this.options.pause && this.$element.on("mouseenter", a.proxy(this.pause, this)).on("mouseleave", a.proxy(this.cycle, this)) - }; - b.DEFAULTS = { - interval: 5e3, - pause: "hover", - wrap: !0 - }, b.prototype.cycle = function (b) { - return b || (this.paused = !1), this.interval && clearInterval(this.interval), this.options.interval && !this.paused && (this.interval = setInterval(a.proxy(this.next, this), this.options.interval)), this - }, b.prototype.getActiveIndex = function () { - return this.$active = this.$element.find(".item.active"), this.$items = this.$active.parent().children(), this.$items.index(this.$active) - }, b.prototype.to = function (b) { - var c = this, - d = this.getActiveIndex(); - return b > this.$items.length - 1 || 0 > b ? void 0 : this.sliding ? this.$element.one("slid", function () { - c.to(b) - }) : d == b ? this.pause().cycle() : this.slide(b > d ? "next" : "prev", a(this.$items[b])) - }, b.prototype.pause = function (b) { - return b || (this.paused = !0), this.$element.find(".next, .prev").length && a.support.transition.end && (this.$element.trigger(a.support.transition.end), this.cycle(!0)), this.interval = clearInterval(this.interval), this - }, b.prototype.next = function () { - return this.sliding ? void 0 : this.slide("next") - }, b.prototype.prev = function () { - return this.sliding ? void 0 : this.slide("prev") - }, b.prototype.slide = function (b, c) { - var d = this.$element.find(".item.active"), - e = c || d[b](), - f = this.interval, - g = "next" == b ? "left" : "right", - h = "next" == b ? "first" : "last", - i = this; - if (!e.length) { - if (!this.options.wrap) return; - e = this.$element.find(".item")[h]() - } - this.sliding = !0, f && this.pause(); - var j = a.Event("slide.bs.carousel", { - relatedTarget: e[0], - direction: g - }); - if (!e.hasClass("active")) { - if (this.$indicators.length && (this.$indicators.find(".active").removeClass("active"), this.$element.one("slid", function () { - var b = a(i.$indicators.children()[i.getActiveIndex()]); - b && b.addClass("active") - })), a.support.transition && this.$element.hasClass("slide")) { - if (this.$element.trigger(j), j.isDefaultPrevented()) return; - e.addClass(b), e[0].offsetWidth, d.addClass(g), e.addClass(g), d.one(a.support.transition.end, function () { - e.removeClass([b, g].join(" ")).addClass("active"), d.removeClass(["active", g].join(" ")), i.sliding = !1, setTimeout(function () { - i.$element.trigger("slid") - }, 0) - }).emulateTransitionEnd(600) - } else { - if (this.$element.trigger(j), j.isDefaultPrevented()) return; - d.removeClass("active"), e.addClass("active"), this.sliding = !1, this.$element.trigger("slid") - } - return f && this.cycle(), this - } - }; - var c = a.fn.carousel; - a.fn.carousel = function (c) { - return this.each(function () { - var d = a(this), - e = d.data("bs.carousel"), - f = a.extend({}, b.DEFAULTS, d.data(), "object" == typeof c && c), - g = "string" == typeof c ? c : f.slide; - e || d.data("bs.carousel", e = new b(this, f)), "number" == typeof c ? e.to(c) : g ? e[g]() : f.interval && e.pause().cycle() - }) - }, a.fn.carousel.Constructor = b, a.fn.carousel.noConflict = function () { - return a.fn.carousel = c, this - }, a(document).on("click.bs.carousel.data-api", "[data-slide], [data-slide-to]", function (b) { - var c, d = a(this), - e = a(d.attr("data-target") || (c = d.attr("href")) && c.replace(/.*(?=#[^\s]+$)/, "")), - f = a.extend({}, e.data(), d.data()), - g = d.attr("data-slide-to"); - g && (f.interval = !1), e.carousel(f), (g = d.attr("data-slide-to")) && e.data("bs.carousel").to(g), b.preventDefault() - }), a(window).on("load", function () { - a('[data-ride="carousel"]').each(function () { - var b = a(this); - b.carousel(b.data()) - }) - }) -}(window.jQuery), + function (a) { - "use strict"; - var b = function (c, d) { - this.$element = a(c), this.options = a.extend({}, b.DEFAULTS, d), this.transitioning = null, this.options.parent && (this.$parent = a(this.options.parent)), this.options.toggle && this.toggle() - }; - b.DEFAULTS = { - toggle: !0 - }, b.prototype.dimension = function () { - var a = this.$element.hasClass("width"); - return a ? "width" : "height" - }, b.prototype.show = function () { - if (!this.transitioning && !this.$element.hasClass("in")) { - var b = a.Event("show.bs.collapse"); - if (this.$element.trigger(b), !b.isDefaultPrevented()) { - var c = this.$parent && this.$parent.find("> .panel > .in"); - if (c && c.length) { - var d = c.data("bs.collapse"); - if (d && d.transitioning) return; - c.collapse("hide"), d || c.data("bs.collapse", null) - } - var e = this.dimension(); - this.$element.removeClass("collapse").addClass("collapsing")[e](0), this.transitioning = 1; - var f = function () { - this.$element.removeClass("collapsing").addClass("in")[e]("auto"), this.transitioning = 0, this.$element.trigger("shown.bs.collapse") - }; - if (!a.support.transition) return f.call(this); - var g = a.camelCase(["scroll", e].join("-")); - this.$element.one(a.support.transition.end, a.proxy(f, this)).emulateTransitionEnd(350)[e](this.$element[0][g]) - } - } - }, b.prototype.hide = function () { - if (!this.transitioning && this.$element.hasClass("in")) { - var b = a.Event("hide.bs.collapse"); - if (this.$element.trigger(b), !b.isDefaultPrevented()) { - var c = this.dimension(); - this.$element[c](this.$element[c]())[0].offsetHeight, this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"), this.transitioning = 1; - var d = function () { - this.transitioning = 0, this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse") - }; - return a.support.transition ? (this.$element[c](0).one(a.support.transition.end, a.proxy(d, this)).emulateTransitionEnd(350), void 0) : d.call(this) - } - } - }, b.prototype.toggle = function () { - this[this.$element.hasClass("in") ? "hide" : "show"]() - }; - var c = a.fn.collapse; - a.fn.collapse = function (c) { - return this.each(function () { - var d = a(this), - e = d.data("bs.collapse"), - f = a.extend({}, b.DEFAULTS, d.data(), "object" == typeof c && c); - e || d.data("bs.collapse", e = new b(this, f)), "string" == typeof c && e[c]() - }) - }, a.fn.collapse.Constructor = b, a.fn.collapse.noConflict = function () { - return a.fn.collapse = c, this - }, a(document).on("click.bs.collapse.data-api", "[data-toggle=collapse]", function (b) { - var c, d = a(this), - e = d.attr("data-target") || b.preventDefault() || (c = d.attr("href")) && c.replace(/.*(?=#[^\s]+$)/, ""), - f = a(e), - g = f.data("bs.collapse"), - h = g ? "toggle" : d.data(), - i = d.attr("data-parent"), - j = i && a(i); - g && g.transitioning || (j && j.find('[data-toggle=collapse][data-parent="' + i + '"]').not(d).addClass("collapsed"), d[f.hasClass("in") ? "addClass" : "removeClass"]("collapsed")), f.collapse(h) - }) -}(window.jQuery), + function (a) { - "use strict"; +if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") } - function b() { - a(d).remove(), a(e).each(function (b) { - var d = c(a(this)); - d.hasClass("open") && (d.trigger(b = a.Event("hide.bs.dropdown")), b.isDefaultPrevented() || d.removeClass("open").trigger("hidden.bs.dropdown")) - }) +/* ======================================================================== + * Bootstrap: transition.js v3.0.1 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' } - function c(b) { - var c = b.attr("data-target"); - c || (c = b.attr("href"), c = c && /#/.test(c) && c.replace(/.*(?=#[^\s]*$)/, "")); - var d = c && a(c); - return d && d.length ? d : b.parent() + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } } - var d = ".dropdown-backdrop", - e = "[data-toggle=dropdown]", - f = function (b) { - a(b).on("click.bs.dropdown", this.toggle) - }; - f.prototype.toggle = function (d) { - var e = a(this); - if (!e.is(".disabled, :disabled")) { - var f = c(e), - g = f.hasClass("open"); - if (b(), !g) { - if ("ontouchstart" in document.documentElement && !f.closest(".navbar-nav").length && a('