diff options
| author | Xavier Morel <xmo@openerp.com> | 2013-10-14 10:54:59 +0200 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2013-10-14 10:54:59 +0200 |
| commit | 2e352ce187d2685df64ebd36f669a8abd88d5f65 (patch) | |
| tree | 529af9c967929ca13896e8464abdc8fe9d02710c /addons/website/static/src | |
| parent | 3e349a2bf7c76f5136935b531c5b3fb65833e8be (diff) | |
| parent | 063a698313e522596a0f784206a9d17b9f31dafa (diff) | |
[MERGE] from trunk
bzr revid: xmo@openerp.com-20131014085459-dhbypq0hg3lzzf3j
Diffstat (limited to 'addons/website/static/src')
| -rw-r--r-- | addons/website/static/src/css/editor.css | 123 | ||||
| -rw-r--r-- | addons/website/static/src/css/editor.sass | 103 | ||||
| -rw-r--r-- | addons/website/static/src/css/website.css | 25 | ||||
| -rw-r--r-- | addons/website/static/src/css/website.sass | 22 | ||||
| -rw-r--r-- | addons/website/static/src/img/big_picture.png | bin | 126534 -> 642710 bytes | |||
| -rw-r--r-- | addons/website/static/src/img/drag_here.png | bin | 1969 -> 1295 bytes | |||
| -rw-r--r-- | addons/website/static/src/img/edit_here.png | bin | 0 -> 1626 bytes | |||
| -rw-r--r-- | addons/website/static/src/img/parallax/quote.png | bin | 0 -> 9429 bytes | |||
| -rw-r--r-- | addons/website/static/src/js/website.editor.js | 28 | ||||
| -rw-r--r-- | addons/website/static/src/js/website.seo.js | 2 | ||||
| -rw-r--r-- | addons/website/static/src/js/website.snippets.js | 216 | ||||
| -rw-r--r-- | addons/website/static/src/js/website.tour.js | 256 | ||||
| -rw-r--r-- | addons/website/static/src/xml/website.editor.xml | 2 | ||||
| -rw-r--r-- | addons/website/static/src/xml/website.tour.xml | 27 | ||||
| -rw-r--r-- | addons/website/static/src/xml/website.xml | 6 |
15 files changed, 604 insertions, 206 deletions
diff --git a/addons/website/static/src/css/editor.css b/addons/website/static/src/css/editor.css index 5604c62af75..d0b0b34d180 100644 --- a/addons/website/static/src/css/editor.css +++ b/addons/website/static/src/css/editor.css @@ -1,4 +1,3 @@ -@charset "utf-8"; /* ---- CKEditor Minimal Reset ---- */ .navbar.navbar-inverse .cke_chrome { border: none; @@ -169,7 +168,7 @@ table.editorbar-panel td.selected { position: fixed; left: 0px; right: 0px; - top: 50px; + top: 51px; background: #282828; -webkit-box-shadow: 0px 10px 10px -10px black inset; -moz-box-shadow: 0px 10px 10px -10px black inset; @@ -182,17 +181,21 @@ table.editorbar-panel td.selected { } #oe_snippets .scroll { white-space: nowrap; - overflow-y: auto; + overflow-y: none; } #oe_snippets .nav { - position: fixed; + display: inline-block; + border-bottom: none !important; + vertical-align: middle; + min-width: 120px; z-index: 1; - border: 0; } #oe_snippets .nav > li { - display: inline-block; + display: block; float: none; - font-size: 13px; +} +#oe_snippets .nav > li.active { + background: black !important; } #oe_snippets .nav > li > a { padding: 2px 10px !important; @@ -200,18 +203,19 @@ table.editorbar-panel td.selected { display: block; border: 0; } +#oe_snippets .pill-content { + border: 0; +} #oe_snippets .tab-content { - margin-top: 24px; display: inline-block; white-space: nowrap; + background: black; } #oe_snippets .tab-content > div { background: black; - padding: 5px; } #oe_snippets .tab-content > div label { width: 44px; - height: 100%; color: white; padding-left: 10px; } @@ -231,11 +235,10 @@ table.editorbar-panel td.selected { } .oe_snippet { - display: inline-block; + float: left; vertical-align: top; - width: 100px; - height: 100px; - margin: 1px; + width: 93px; + margin-left: 1px; margin-top: 0px; position: relative; overflow: hidden; @@ -253,14 +256,32 @@ table.editorbar-panel td.selected { color: white; position: relative; } +.oe_snippet .oe_snippet_thumbnail:hover .oe_snippet_thumbnail_img { + -webkit-transform: scale(0.95, 0.95); + -moz-transform: scale(0.95, 0.95); + -ms-transform: scale(0.95, 0.95); + -o-transform: scale(0.95, 0.95); + transform: scale(0.95, 0.95); +} .oe_snippet .oe_snippet_thumbnail .oe_snippet_thumbnail_title { font-size: 12px; display: block; + text-shadow: 0 0 2px black; } .oe_snippet .oe_snippet_thumbnail .oe_snippet_thumbnail_img { + height: 74px; + -webkit-transition: all 150ms linear; + -moz-transition: all 150ms linear; + -o-transition: all 150ms linear; + transition: all 150ms linear; -webkit-box-shadow: inset 0px 0px 0px 3px #333333; -moz-box-shadow: inset 0px 0px 0px 3px #333333; box-shadow: inset 0px 0px 0px 3px #333333; + -webkit-transform: scale(1, 1); + -moz-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); } .oe_snippet .oe_snippet_thumbnail span, .oe_snippet .oe_snippet_thumbnail div { line-height: 18px; @@ -309,20 +330,21 @@ table.editorbar-panel td.selected { margin: 0px -24px !important; } .oe_drop_zone.oe_insert.oe_overlay { - background: rgba(153, 0, 255, 0.17); border-radius: 3px; + background: rgba(153, 0, 255, 0.5); } .oe_drop_zone, .oe_drop_zone_style { - background: rgba(153, 0, 255, 0.17); - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -ms-border-radius: 3px; - -o-border-radius: 3px; - border-radius: 3px; + border: none; + background: rgba(153, 0, 255, 0.3); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; } .oe_drop_zone.oe_hover, .oe_drop_zone_style.oe_hover { - background: rgba(0, 255, 133, 0.22); + background: rgba(0, 255, 133, 0.3); z-index: 1001; } @@ -359,7 +381,7 @@ table.editorbar-panel td.selected { -webkit-box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.3), 0px 0px 0px 1px rgba(255, 255, 255, 0.3) inset; -moz-box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.3), 0px 0px 0px 1px rgba(255, 255, 255, 0.3) inset; box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.3), 0px 0px 0px 1px rgba(255, 255, 255, 0.3) inset; - border-color: rgba(153, 0, 255, 0.5); + border-color: rgba(0, 0, 0, 0.5); } .oe_overlay.oe_active .oe_handle { display: block !important; @@ -371,39 +393,43 @@ table.editorbar-panel td.selected { left: 50%; display: block; background: white; - border: solid 1px #9900ff; - -webkit-border-radius: 8px; - -moz-border-radius: 8px; - -ms-border-radius: 8px; - -o-border-radius: 8px; - border-radius: 8px; - width: 16px; - height: 16px; - margin: -8px; + border: solid 1px rgba(0, 0, 0, 0.2); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + width: 18px; + height: 18px; + margin: -9px; padding-left: 1px; font-size: 14px; line-height: 14px; - color: #9900ff; + font-family: FontAwesome; + color: rgba(0, 0, 0, 0.5); -webkit-transition: background 100ms linear; -moz-transition: background 100ms linear; -o-transition: background 100ms linear; transition: background 100ms linear; } .oe_overlay.oe_active .oe_handle:hover:before { - background: #9900ff; + background: rgba(0, 0, 0, 0.5); color: white; + -webkit-box-shadow: 0 0 5px 3px rgba(255, 255, 255, 0.7); + -moz-box-shadow: 0 0 5px 3px rgba(255, 255, 255, 0.7); + box-shadow: 0 0 5px 3px rgba(255, 255, 255, 0.7); } .oe_overlay.oe_active .oe_handle.e:before { - content: "⇨"; + content: "\F061"; } .oe_overlay.oe_active .oe_handle.s:before { - content: "⇩"; + content: "\F063"; } .oe_overlay.oe_active .oe_handle.w:before { - content: "⇦"; + content: "\F060"; } .oe_overlay.oe_active .oe_handle.n:before { - content: "⇧"; + content: "\F062"; } .oe_overlay .icon.btn { display: inline-block; @@ -568,18 +594,6 @@ table.editorbar-panel td.selected { -o-border-radius: 0.4em; border-radius: 0.4em; } -.oe_seo_configuration .keyword-in-title { - background-color: #5cb85cpointer; - color: white; -} -.oe_seo_configuration .keyword-in-description { - background-color: #428bca; - color: white; -} -.oe_seo_configuration .keyword-in-body { - background-color: #5bc0de; - color: white; -} /* ---- ACE EDITOR ---- */ .oe_ace_view_editor { @@ -636,3 +650,12 @@ table.editorbar-panel td.selected { filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); opacity: 0; } + +/* ---- EDITOR TOUR ---- */ +div.tour-backdrop { + z-index: 2009; +} + +.popover.tour { + z-index: 2010; +} diff --git a/addons/website/static/src/css/editor.sass b/addons/website/static/src/css/editor.sass index 7b2800bd849..51bae3dcf3a 100644 --- a/addons/website/static/src/css/editor.sass +++ b/addons/website/static/src/css/editor.sass @@ -4,6 +4,17 @@ @import "compass/css3/user-interface" @import "compass/css3/transition" +//smartphones, iPhone, portrait 480x320 phones +$smart_phone: 320px +//portrait e-readers (Nook/Kindle), smaller tablets @ 600 or @ 640 wide.*/ +$small-tablet: 481px +//portrait tablets, portrait iPad, landscape e-readers, landscape 800x480 or 854x480 phones +$portrait-tablet: 641px +//tablet, landscape iPad, lo-res laptops ands desktops +$tablet: 961px +//big landscape tablets, laptops, and desktops +$desktop: 1025px + /* ---- CKEditor Minimal Reset ---- */ .navbar.navbar-inverse .cke_chrome @@ -141,7 +152,7 @@ table.editorbar-panel position: fixed left: 0px right: 0px - top: 50px + top: 51px background: rgb(40,40,40) +box-shadow(0px 10px 10px -10px black inset) z-index: 1010 @@ -150,44 +161,47 @@ table.editorbar-panel height: auto .scroll white-space: nowrap - overflow-y: auto + overflow-y: none .nav + display: inline-block + border-bottom: none !important + vertical-align: middle + min-width: 120px > li - display: inline-block + display: block float: none - font-size: 13px + &.active + background: black !important > a padding: 2px 10px !important - width: 100% + width: 100% display: block border: 0 - position: fixed z-index: 1 + .pill-content border: 0 .tab-content - margin-top: 24px display: inline-block white-space: nowrap - > div + background: black + > div background: rgb(0,0,0) - padding: 5px label width: 44px - height: 100% color: #fff padding-left: 10px + div width: 100px text-align: center - @include transform( translate(-39px, 44px) , rotate(-90deg) ) + @include transform( translate(-39px, 44px) , rotate(-90deg) ) @include transform-origin(50% 50%) .oe_snippet - display: inline-block + float: left vertical-align: top - width: 100px - height: 100px - margin: 1px + width: 93px + margin-left: 1px margin-top: 0px position: relative overflow: hidden @@ -201,11 +215,18 @@ table.editorbar-panel background: transparent color: white position: relative + &:hover + .oe_snippet_thumbnail_img + @include transform( scale(.95,.95)) .oe_snippet_thumbnail_title font-size: 12px display: block + +text-shadow(0 0 2px rgb(0,0,0)) .oe_snippet_thumbnail_img + height: 74px + @include transition(all 150ms linear) +box-shadow(inset 0px 0px 0px 3px #333333) + @include transform( scale(1,1)) span, div line-height: 18px & > :not(.oe_snippet_thumbnail) @@ -240,14 +261,19 @@ table.editorbar-panel position: relative margin: 0px -24px !important &.oe_overlay - background: rgba(153, 0, 255, 0.17) border-radius: 3px - + //@include background-image( repeating-linear-gradient(45deg, rgba(255,255,255,.1) ,rgba(255,255,255,.1) 35px, rgba(0,0,0,.1) 35px, rgba(0,0,0,.1) 75px)) + //background-size: 100px 100px + background: rgba(153, 0, 255,.5) + .oe_drop_zone, .oe_drop_zone_style - background: rgba(153, 0, 255, 0.17) - +border-radius(3px) + border: none + //@include background-image( repeating-linear-gradient(45deg, rgba(255,255,255,.1) ,rgba(255,255,255,.1) 35px, rgba(0,0,0,.1) 35px, rgba(0,0,0,.1) 75px)) + //background-size: 100px 100px + background: rgba(153, 0, 255, .3) + +border-radius(4px) &.oe_hover - background: rgba(0, 255, 133, 0.22) + background: rgba(0, 255, 133, .3) z-index: 1001 .oe_drop_zone_style @@ -262,6 +288,7 @@ table.editorbar-panel display: none position: absolute background: transparent + //@include background-image( repeating-linear-gradient(45deg, rgba(255,255,255,.02) ,rgba(255,255,255,.02) 35px, rgba(0,0,0,.02) 35px, rgba(0,0,0,.02) 75px)) +border-radius(3px) @include transition(opacity 100ms linear) +box-sizing(border-box) @@ -271,7 +298,7 @@ table.editorbar-panel border-style: dashed border-width: 1px +box-shadow(0px 0px 0px 1px rgba(255,255,255,0.3), 0px 0px 0px 1px rgba(255,255,255,0.3) inset) - border-color: rgba(153, 0, 255, 0.5) + border-color: rgba(0, 0, 0, 0.5) .oe_handle display: block !important pointer-events: auto @@ -281,27 +308,29 @@ table.editorbar-panel left: 50% display: block background: rgba(255, 255, 255, 1) - border: solid 1px rgba(153, 0, 255, 1) - +border-radius(8px) - width: 16px - height: 16px - margin: -8px + border: solid 1px rgba(0, 0, 0, .2) + +border-radius(5px) + width: 18px + height: 18px + margin: -9px padding-left: 1px font-size: 14px line-height: 14px - color: rgba(153, 0, 255, 1) + font-family: FontAwesome + color: rgba(0,0,0,.5) @include transition(background 100ms linear) &:hover:before - background: rgba(153, 0, 255, 1) + background: rgba(0, 0, 0, .5) color: #fff + +box-shadow(0 0 5px 3px rgba(255,255,255,.7)) .oe_handle.e:before - content: "⇨" + content: "\F061" .oe_handle.s:before - content: "⇩" + content: "\F063" .oe_handle.w:before - content: "⇦" + content: "\F060" .oe_handle.n:before - content: "⇧" + content: "\F062" .icon.btn display: inline-block @@ -436,10 +465,6 @@ $ace_width: 720px $editorbar_height: 40px // TODO Fix => might break with themes $navbar_height: 51px -@mixin pointer-events($type: none) - $type: unquote($type) - @include experimental(pointer-events, $type,-moz, -webkit, not -o, not -ms, -khtml, official) - @mixin editor-font font-size: 14px @@ -481,4 +506,10 @@ $navbar_height: 51px &.oe_ace_closed width: 0 +opacity(0) + +/* ---- EDITOR TOUR ---- */ +div.tour-backdrop + z-index: 2009 +.popover.tour + z-index: 2010 // vim:tabstop=4:shiftwidth=4:softtabstop=4:fdm=marker: diff --git a/addons/website/static/src/css/website.css b/addons/website/static/src/css/website.css index 6af2e7485fe..ce87e592136 100644 --- a/addons/website/static/src/css/website.css +++ b/addons/website/static/src/css/website.css @@ -223,11 +223,15 @@ footer { } /* ---- HACK FOR COVERING UP CK EDITOR BOGUS P INSERTION --- */ -.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { +.oe_structure.oe_editable.oe_empty:empty, .oe_editable[data-oe-type=html]:empty, .oe_structure.oe_editable.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { background-image: url("/website/static/src/img/drag_here.png"); +} + +.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { + background-image: url("/website/static/src/img/edit_here.png"); background-repeat: no-repeat; - background-position: center top; - height: 200px !important; + background-position: center; + height: 220px !important; } .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child { @@ -238,8 +242,8 @@ footer { content: "Click Edit To Create Content"; text-align: center; display: block; - padding-top: 100px; - padding-bottom: 50px; + padding-top: 160px; + padding-bottom: 30px; color: grey; font-size: 24px; } @@ -345,6 +349,17 @@ footer { } /* Parallax Theme */ +.parallax_quote { + background: url("/website/static/src/img/parallax/quote.png") center center no-repeat fixed; + background-size: contain; +} +.parallax_quote .carousel-indicators li { + border: 1px solid grey; +} +.parallax_quote .carousel-indicators .active { + background-color: grey; +} + .parallax_full { background: #eeeeee bottom center repeat fixed; min-height: 650px; diff --git a/addons/website/static/src/css/website.sass b/addons/website/static/src/css/website.sass index 997b45a0253..5197653429c 100644 --- a/addons/website/static/src/css/website.sass +++ b/addons/website/static/src/css/website.sass @@ -151,11 +151,14 @@ footer /* ---- HACK FOR COVERING UP CK EDITOR BOGUS P INSERTION --- */ -.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child +.oe_structure.oe_editable.oe_empty:empty, .oe_editable[data-oe-type=html]:empty, .oe_structure.oe_editable.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child background-image: url('/website/static/src/img/drag_here.png') + +.oe_structure.oe_empty:empty, [data-oe-type=html]:empty, .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child + background-image: url('/website/static/src/img/edit_here.png') background-repeat: no-repeat - background-position: center top - height: 200px !important + background-position: center + height: 220px !important .oe_structure.oe_empty > .oe_drop_zone.oe_insert:only-child, [data-oe-type=html] > .oe_drop_zone.oe_insert:only-child position: static @@ -164,8 +167,8 @@ footer content: 'Click Edit To Create Content' text-align: center display: block - padding-top: 100px - padding-bottom: 50px + padding-top: 160px + padding-bottom: 30px color: grey font-size: 24px @@ -263,6 +266,15 @@ footer /* Parallax Theme */ +.parallax_quote + background: url('/website/static/src/img/parallax/quote.png') center center no-repeat fixed + background-size: contain + .carousel-indicators + li + border: 1px solid grey + .active + background-color: grey + .parallax_full background: #eee bottom center repeat fixed min-height: 650px diff --git a/addons/website/static/src/img/big_picture.png b/addons/website/static/src/img/big_picture.png Binary files differindex cecb39679d5..519e713ff7f 100644 --- a/addons/website/static/src/img/big_picture.png +++ b/addons/website/static/src/img/big_picture.png diff --git a/addons/website/static/src/img/drag_here.png b/addons/website/static/src/img/drag_here.png Binary files differindex f2e3d38b2df..0dfeb1bc5da 100644 --- a/addons/website/static/src/img/drag_here.png +++ b/addons/website/static/src/img/drag_here.png diff --git a/addons/website/static/src/img/edit_here.png b/addons/website/static/src/img/edit_here.png Binary files differnew file mode 100644 index 00000000000..b53f56e2ac8 --- /dev/null +++ b/addons/website/static/src/img/edit_here.png diff --git a/addons/website/static/src/img/parallax/quote.png b/addons/website/static/src/img/parallax/quote.png Binary files differnew file mode 100644 index 00000000000..769cb6b5e0f --- /dev/null +++ b/addons/website/static/src/img/parallax/quote.png diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index 30514b25780..ffb0f9b86a3 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -3,13 +3,12 @@ var website = openerp.website; // $.fn.data automatically parses value, '0'|'1' -> 0|1 - website.is_editable = $(document.documentElement).data('editable'); website.templates.push('/website/static/src/xml/website.editor.xml'); website.dom_ready.done(function () { var is_smartphone = $(document.body)[0].clientWidth < 767; - if (website.is_editable && !is_smartphone) { + if (!is_smartphone) { website.ready().then(website.init_editor); } }); @@ -21,16 +20,15 @@ return new website.editor.RTEImageDialog(editor).appendTo(document.body); } - if (website.is_editable) { - // only enable editors manually - CKEDITOR.disableAutoInline = true; - // EDIT ALL THE THINGS - CKEDITOR.dtd.$editable = $.extend( - {}, CKEDITOR.dtd.$block, CKEDITOR.dtd.$inline); - // Disable removal of empty elements on CKEDITOR activation. Empty - // elements are used for e.g. support of FontAwesome icons - CKEDITOR.dtd.$removeEmpty = {}; - } + // only enable editors manually + CKEDITOR.disableAutoInline = true; + // EDIT ALL THE THINGS + CKEDITOR.dtd.$editable = $.extend( + {}, CKEDITOR.dtd.$block, CKEDITOR.dtd.$inline); + // Disable removal of empty elements on CKEDITOR activation. Empty + // elements are used for e.g. support of FontAwesome icons + CKEDITOR.dtd.$removeEmpty = {}; + website.init_editor = function () { CKEDITOR.plugins.add('customdialogs', { // requires: 'link,image', @@ -211,8 +209,9 @@ } }); // Adding Static Menus - menu.append('<li class="divider"></li><li><a href="/page/website.themes">Change Theme</a></li>'); + menu.append('<li class="divider"></li><li class="js_change_theme"><a href="/page/website.themes">Change Theme</a></li>'); menu.append('<li class="divider"></li><li><a data-action="ace" href="#">Advanced view editor</a></li>'); + self.trigger('rte:customize_menu_ready'); } ); }); @@ -616,7 +615,7 @@ } else if ($e.hasClass('pages')) { // Create the page, get the URL back done = $.get(_.str.sprintf( - '/pagenew/%s?noredirect', encodeURIComponent(val))) + '/pagenew/%s?noredirect', encodeURI(val))) .then(function (response) { self.make_link(response, false, val); }); @@ -813,6 +812,7 @@ var element, editor = this.editor; if (!(element = this.element)) { element = editor.document.createElement('img'); + element.addClass('img'); // focus event handler interactions between bootstrap (modal) // and ckeditor (RTE) lead to blowing the stack in Safari and // Chrome (but not FF) when this is done synchronously => diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js index 635b80bb192..945b0ed353d 100644 --- a/addons/website/static/src/js/website.seo.js +++ b/addons/website/static/src/js/website.seo.js @@ -1,6 +1,6 @@ (function () { 'use strict'; - + var website = openerp.website; website.templates.push('/website/static/src/xml/website.seo.xml'); diff --git a/addons/website/static/src/js/website.snippets.js b/addons/website/static/src/js/website.snippets.js index d85b2a814eb..96f153bf86e 100644 --- a/addons/website/static/src/js/website.snippets.js +++ b/addons/website/static/src/js/website.snippets.js @@ -243,12 +243,10 @@ // activate drag and drop for the snippets in the snippet toolbar make_snippet_draggable: function($snippets){ var self = this; - var $toInsert = false; var $tumb = $snippets.find(".oe_snippet_thumbnail:first"); var left = $tumb.outerWidth()/2; var top = $tumb.outerHeight()/2; - var dropped = false; - var $snippet = false; + var $toInsert, dropped, $snippet, action, snipped_id; $snippets.draggable({ greedy: true, @@ -265,8 +263,8 @@ self.hide(); dropped = false; $snippet = $(this); - var snipped_id = $snippet.data('snippet-id'); - var action = $snippet.find('.oe_snippet_body').size() ? 'insert' : 'mutate'; + snipped_id = $snippet.data('snippet-id'); + action = $snippet.find('.oe_snippet_body').size() ? 'insert' : 'mutate'; if( action === 'insert'){ if (!$snippet.data('selector-siblings') && !$snippet.data('selector-children') && !$snippet.data('selector-vertical-children')) { console.debug($snippet.data("snippet-id") + " have oe_snippet_body class and have not for insert action"+ @@ -312,38 +310,46 @@ }, drop: function(){ dropped = true; + }, + }); + }, + stop: function(ev, ui){ + if (action === 'insert' && ! dropped) { + var el = $('.oe_drop_zone').nearest({x: ui.position.left, y: ui.position.top}).first() + if (el) { + el.after($toInsert) + dropped = true; + } + } - var $target = false; - if(action === 'insert'){ - $target = $toInsert; + $('.oe_drop_zone').droppable('destroy').remove(); + if (dropped) { + var $target = false; + if(action === 'insert'){ + $target = $toInsert; - if (website.snippet.animationRegistry[snipped_id]) { - new website.snippet.animationRegistry[snipped_id]($target); - } + if (website.snippet.animationRegistry[snipped_id]) { + new website.snippet.animationRegistry[snipped_id]($target); + } - self.create_overlay($target); - $target.data("snippet-editor").build_snippet($target); + self.create_overlay($target); + $target.data("snippet-editor").build_snippet($target); - } else { - $target = $(this).data('target'); + } else { + $target = $(this).data('target'); - self.create_overlay($target); - if (website.snippet.editorRegistry[snipped_id]) { - var snippet = new website.snippet.editorRegistry[snipped_id](self, $target); - snippet.build_snippet($target); - } + self.create_overlay($target); + if (website.snippet.editorRegistry[snipped_id]) { + var snippet = new website.snippet.editorRegistry[snipped_id](self, $target); + snippet.build_snippet($target); } - - $('.oe_drop_zone').remove(); - - setTimeout(function () {self.make_active($target);},0); - }, - }); - }, - stop: function(){ - $('.oe_drop_zone').droppable('destroy').remove(); - if (!dropped && self.$modal.find('input:not(:checked)').length) { - self.$modal.modal('toggle'); + } + setTimeout(function () {self.make_active($target);},0); + } else { + $toInsert.remove(); + if (self.$modal.find('input:not(:checked)').length) { + self.$modal.modal('toggle'); + } } }, }); @@ -488,7 +494,6 @@ $zone.appendTo('#oe_manipulators'); $zone.data('target',$target); $target.data('overlay',$zone); - console.log($target[0], $zone); $target.on("DOMNodeInserted DOMNodeRemoved DOMSubtreeModified", function () { self.cover_target($zone, $target); @@ -746,16 +751,8 @@ change_background: function (bg, ul_options) { var self = this; + this.set_options_background(bg, ul_options); var $ul = this.$editor.find(ul_options); - var bg_value = (typeof bg === 'string' ? self.$target.find(bg) : $(bg)).css("background-image").replace(/url\(['"]*|['"]*\)/g, ""); - - // select in ul options - $ul.find("li").removeClass("active"); - var selected = $ul.find('[data-value="' + bg_value + '"], [data-value="' + bg_value.replace(/.*:\/\/[^\/]+/, '') + '"]'); - selected.addClass('active'); - if (!selected.length) { - $ul.find('.oe_custom_bg b').html(bg_value); - } // bind envent on options var $li = $ul.find("li"); @@ -787,6 +784,19 @@ $bg.css("background-image", "url(" + src + ")"); }); }, + + set_options_background: function (bg, ul_options) { + var $ul = this.$editor.find(ul_options); + var bg_value = (typeof bg === 'string' ? this.$target.find(bg) : $(bg)).css("background-image").replace(/url\(['"]*|['"]*\)/g, ""); + + // select in ul options + $ul.find("li").removeClass("active"); + var selected = $ul.find('[data-value="' + bg_value + '"], [data-value="' + bg_value.replace(/.*:\/\/[^\/]+/, '') + '"]'); + selected.addClass('active'); + if (!selected.length) { + $ul.find('.oe_custom_bg b').html(bg_value); + } + }, }); @@ -974,50 +984,95 @@ }); website.snippet.editorRegistry.carousel = website.snippet.editorRegistry.resize.extend({ - build_snippet: function($target) { - var id = "myCarousel" + $("body .carousel").length; - $target.attr("id", id); - $target.find(".carousel-control").attr("href", "#"+id); + build_snippet: function() { + var id = 0; + $("body .carousel").each(function () { + var _id = +$(this).attr("id").replace(/^myCarousel/, ''); + if (id <= _id) { + id = _id + 1; + } + }); + this.$target.attr("id", "myCarousel" + id); + this.$target.find(".carousel-control").attr("href", "#myCarousel" + id); + this.$target.find("[data-target='#myCarousel']").attr("data-target", "#myCarousel" + id); + this.rebind_event(); + }, + onFocus: function () { + this._super(); + this.$target.carousel('pause'); + }, + onBlur: function () { + this._super(); + this.$target.carousel('cycle'); }, start : function () { this._super(); + this.id = this.$target.attr("id"); + + this.$inner = this.$target.find('.carousel-inner'); + this.$indicators = this.$target.find('.carousel-indicators'); + this.$editor.find(".js_add").on('click', _.bind(this.on_add, this)); this.$editor.find(".js_remove").on('click', _.bind(this.on_remove, this)); this.change_background(".item.active", 'ul[name="carousel-background"]'); this.change_style(); - this.set_options_style(); this.change_size(); + this.set_options_style(); + this.$target.carousel(); + + var self = this; + this.$target.on('slide.bs.carousel', function () { + self.set_options_style(); + self.set_options_background(".item.active", 'ul[name="carousel-background"]'); + self.$target.carousel(); + }); + + this.rebind_event(); + }, + // rebind event to active carousel on edit mode + rebind_event: function () { + var self = this; + this.$target.on('click', '.carousel-control', function () { + self.$target.carousel($(this).data('slide')); }); + this.$target.on('click', '.carousel-indicators [data-target]', function () { + self.$target.carousel(+$(this).data('slide-to')); }); }, on_add: function (e) { e.preventDefault(); - this.$target.find('.carousel-control').removeClass("hidden"); - var $inner = this.$target.find('.carousel-inner'); - var cycle = $inner.find('.item').length; - $inner.find('.item.active').clone().removeClass('active').appendTo($inner); - this.$target.carousel(cycle); - this.set_options_background(); - this.set_options_style(); + var cycle = this.$inner.find('.item').length; + var $active = this.$inner.find('.item.active'); + var index = $active.index(); + this.$target.find('.carousel-control, .carousel-indicators').removeClass("hidden"); + this.$indicators.append('<li data-target="#' + this.id + '" data-slide-to="' + cycle + '"></li>'); + $active.clone().removeClass('active').insertAfter($active); + this.$target.carousel().carousel(++index); }, on_remove: function (e) { e.preventDefault(); - var $inner = this.$target.find('.carousel-inner'); - var nb = $inner.find('.item').length; - if (nb > 1) { - $inner - .find('.item.active').remove().end() - .find('.item:first').addClass('active'); - this.$target.carousel(0); - this.set_options_style(); - } - if (nb <= 1) { - this.$target.find('.carousel-control').addClass("hidden"); + var self = this; + var new_index = 0; + var cycle = this.$inner.find('.item').length - 1; + var index = this.$inner.find('.item.active').index(); + if (cycle > 0) { + this.$inner.find('.item.active').fadeOut(1000, function () { + $(this).remove(); + self.$indicators.find('[data-target]:last').remove(); + self.$indicators.find("[data-slide-to]").removeClass("active"); + self.$indicators.find("[data-slide-to='" + new_index + "']").addClass("active"); + }); + setTimeout(function () { + new_index = index % cycle; + self.$target.carousel( new_index + 1 ); + }, 500); + } else { + this.$target.find('.carousel-control, .carousel-indicators').addClass("hidden"); } }, set_options_style: function () { var style = false; - var $el = this.$target.find('.carousel-inner .item.active'); + var $el = this.$inner.find('.item.active'); var $ul = this.$editor.find('ul[name="carousel-style"]'); var $li = $ul.find("li"); @@ -1040,12 +1095,12 @@ $(this).addClass("active"); }) .on('mouseover', function (event) { - var $el = self.$target.find('.carousel-inner .item.active'); + var $el = self.$inner.find('.item.active'); $el.removeClass('image_text text_image text_only'); $el.addClass($(event.currentTarget).data("value")); }) .on('mouseout', function (event) { - var $el = self.$target.find('.carousel-inner .item.active'); + var $el = self.$inner.find('.item.active'); $el.removeClass('image_text text_image text_only'); $el.addClass($ul.find('li.active').data("value")); }); @@ -1087,33 +1142,6 @@ }, }); - website.snippet.animationRegistry.surprise = website.snippet.Animation.extend({ - start: function() { - this._super(); - var hue=0; - var beat = false; - var self = this; - self.$target.append('<iframe width="1px" height="1px" src="http://www.youtube.com/embed/WY24YNsOefk?autoplay=1" frameborder="0"></iframe>'); - - var a = setInterval(function(){ - self.$target.next().css({'-webkit-filter':'hue-rotate('+hue+'deg)'}); - self.$target.prev().css({'-webkit-filter':'hue-rotate('+(-hue)+'deg)'}); - hue -= 5; - }, 10); - - setTimeout(function(){ - clearInterval(a); - setInterval(function(){ - var filter = 'hue-rotate('+hue+'deg)'+ (beat ? ' invert()' : ''); - $(document.documentElement).css({'-webkit-filter': filter}); hue += 5; - if(hue % 35 === 0){ - beat = !beat; - } - }, 10); - },5000); - } - }); - /* * data-snippet-id automatically setted * Don't need to add data-snippet-id="..." into the views diff --git a/addons/website/static/src/js/website.tour.js b/addons/website/static/src/js/website.tour.js new file mode 100644 index 00000000000..09e222acf64 --- /dev/null +++ b/addons/website/static/src/js/website.tour.js @@ -0,0 +1,256 @@ +(function () { + 'use strict'; + + var website = openerp.website; + website.templates.push('/website/static/src/xml/website.tour.xml'); + + function render (template, dict) { + return openerp.qweb.render(template, dict); + } + + website.EditorTour = openerp.Class.extend({ + tour: undefined, + steps: [], + tourStorage: window.localStorage, + init: function () { + this.tour = new Tour({ + name: this.id, + storage: this.tourStorage, + keyboard: false, + }); + this.tour.addSteps(_.map(this.steps, function (step) { + step.title = render('website.tour_popover_title', { title: step.title }); + return step; + })); + this.monkeyPatchTour(); + }, + monkeyPatchTour: function () { + var self = this; + // showStep should wait for 'element' to appear instead of moving to the next step + self.tour.showStep = function (i) { + var step = self.tour.getStep(i); + return (function proceed () { + if (step.orphan || $(step.element).length > 0) { + return Tour.prototype.showStep.call(self.tour, i); + } else { + setTimeout(proceed, 50); + } + }()); + }; + }, + reset: function () { + this.tourStorage.removeItem(this.id+'_current_step'); + this.tourStorage.removeItem(this.id+'_end'); + this.tour._current = 0; + $('.popover.tour').remove(); + }, + start: function () { + if (this.canResume()) { + this.tour.start(); + } + }, + canResume: function () { + return (this.currentStepIndex() === 0) && !this.tour.ended(); + }, + currentStepIndex: function () { + var index = this.tourStorage.getItem(this.id+'_current_step') || 0; + return parseInt(index, 10); + }, + indexOfStep: function (stepId) { + var index = -1; + _.each(this.steps, function (step, i) { + if (step.stepId === stepId) { + index = i; + } + }); + return index; + }, + movetoStep: function (stepId) { + $('.popover.tour').remove(); + var index = this.indexOfStep(stepId); + if (index > -1) { + this.tour.goto(index); + } + }, + saveStep: function (stepId) { + var index = this.indexOfStep(stepId); + this.tourStorage.setItem(this.id+'_current_step', index); + }, + stop: function () { + this.tour.end(); + }, + }); + + website.EditorBasicTour = website.EditorTour.extend({ + id: 'add_banner_tour', + name: "Insert a banner", + init: function (editor) { + var self = this; + self.steps = [ + { + stepId: 'welcome', + orphan: true, + backdrop: true, + title: "Welcome to your website!", + content: "This tutorial will guide you to build your first page. We will start by adding a banner.", + template: render('website.tour_popover', { next: "Start Tutorial", end: "Skip It" }), + }, + { + stepId: 'edit-page', + element: 'button[data-action=edit]', + placement: 'bottom', + reflex: true, + title: "Edit this page", + content: "Every page of your website can be modified through the <i>Edit</i> button.", + template: render('website.tour_popover'), + }, + { + stepId: 'add-block', + element: 'button[data-action=snippet]', + placement: 'bottom', + title: "Insert building blocks", + content: "To add content in a page, you can insert building blocks.", + template: render('website.tour_popover'), + onShow: function () { + function refreshAddBlockStep () { + self.tour.showStep(self.indexOfStep('add-block')); + editor.off('rte:ready', editor, refreshAddBlockStep); + } + editor.on('rte:ready', editor, refreshAddBlockStep); + $('button[data-action=snippet]').click(function () { + self.movetoStep('drag-banner'); + }); + } + }, + { + stepId: 'drag-banner', + element: '#website-top-navbar [data-snippet-id=carousel]', + placement: 'bottom', + title: "Drag & Drop a Banner", + content: "Drag the <em>Banner</em> block and drop it in your page. <p class='text-muted'>Tip: release the mouse button when you are in a valid zone, with a preview of the banner.</p>", + template: render('website.tour_popover'), + onShow: function () { + function beginDrag () { + $('.popover.tour').remove(); + $('body').off('mousedown', beginDrag); + function goToNextStep () { + $('#oe_snippets').hide(); + self.movetoStep('edit-title'); + $('body').off('mouseup', goToNextStep); + } + $('body').on('mouseup', goToNextStep); + } + $('body').on('mousedown', beginDrag); + }, + }, + { + stepId: 'edit-title', + element: '#wrap [data-snippet-id=carousel]:first .carousel-caption', + placement: 'left', + title: "Customize banner's text", + content: "Click in the text and start editing it. Click continue once it's done.", + template: render('website.tour_popover', { next: "Continue" }), + onHide: function () { + var $banner = $("#wrap [data-snippet-id=carousel]:first"); + if ($banner.length) { + $banner.click(); + } + }, + }, + { + stepId: 'customize-banner', + element: '.oe_overlay_options .oe_options', + placement: 'left', + title: "Customize the banner", + content: "You can customize components of your page through the <em>Customize</em> menu. Try to change the background of your banner.", + template: render('website.tour_popover', { next: "Continue" }), + onShow: function () { + $('.dropdown-menu [name=carousel-background]').click(function () { + self.movetoStep('save-changes'); + }); + }, + }, + { + stepId: 'save-changes', + element: 'button[data-action=save]', + placement: 'right', + reflex: true, + title: "Save your modifications", + content: "Once you click on save, your website page is updated.", + template: render('website.tour_popover'), + onHide: function () { + self.saveStep('part-2'); + }, + + }, + { + stepId: 'part-2', + orphan: true, + title: "Congratulation!", + content: "Your homepage have been updated. Now, we suggest you to insert others building blocks like texts and images to structure your page.", + template: render('website.tour_popover', { next: "Continue" }), + }, + { + stepId: 'show-tutorials', + element: '#help-menu-button', + placement: 'left', + title: "Help is always available", + content: "But you can always click here if you want more tutorials.", + template: render('website.tour_popover', { end: "Close" }), + }, + ]; + return this._super(); + }, + startOfPart2: function () { + var currentStepIndex = this.currentStepIndex(); + var secondPartIndex = this.indexOfStep('part-2'); + var showTutorialsIndex = this.indexOfStep('show-tutorials'); + return (currentStepIndex === secondPartIndex || currentStepIndex === showTutorialsIndex) && !this.tour.ended(); + }, + canResume: function () { + return this.startOfPart2() || this._super(); + }, + }); + + website.UrlParser = openerp.Class.extend({ + init: function (url) { + var a = document.createElement('a'); + a.href = url; + this.href = a.href; + this.host = a.host; + this.protocol = a.protocol; + this.port = a.port; + this.hostname = a.hostname; + this.pathname = a.pathname; + this.origin = a.origin; + this.search = a.search; + }, + }); + + website.EditorBar.include({ + start: function () { + website.tutorials = { + basic: new website.EditorBasicTour(this), + }; + var menu = $('#help-menu'); + _.each(website.tutorials, function (tutorial) { + var $menuItem = $($.parseHTML('<li><a href="#">'+tutorial.name+'</a></li>')); + $menuItem.click(function () { + tutorial.reset(); + tutorial.start(); + }) + menu.append($menuItem); + }); + var url = new website.UrlParser(window.location.href); + if (url.search.indexOf('?tutorial=true') === 0 || website.tutorials.basic.startOfPart2()) { + website.tutorials.basic.start(); + } + $('.tour-backdrop').click(function (e) { + e.stopImmediatePropagation(); + e.preventDefault(); + }); + return this._super(); + }, + }); + +}()); diff --git a/addons/website/static/src/xml/website.editor.xml b/addons/website/static/src/xml/website.editor.xml index 157d19b56c0..685712d3411 100644 --- a/addons/website/static/src/xml/website.editor.xml +++ b/addons/website/static/src/xml/website.editor.xml @@ -56,7 +56,7 @@ </label> </h3> <input type="text" class="form-control pages url-source" - id="link-new" pattern="[\\w/-]+"/> + id="link-new" placeholder="Page Name"/> </li> <li class="list-group-item form-group clearfix"> <div class="pull-right"> diff --git a/addons/website/static/src/xml/website.tour.xml b/addons/website/static/src/xml/website.tour.xml new file mode 100644 index 00000000000..d2f562dec61 --- /dev/null +++ b/addons/website/static/src/xml/website.tour.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<templates id="template" xml:space="preserve"> + <t t-name="website.tour_popover"> + <div class="popover tour"> + <div class="arrow"></div> + <h3 class="popover-title"></h3> + <div class="popover-content"></div> + <t t-if="next or end"> + <nav class="popover-navigation"> + <t t-if="next"> + <button class="btn btn-sm btn-default" data-role="next"><t t-esc="next"/></button> + </t> + <small t-if="next && end"> + <span class="text-muted"> or </span> + <button class="btn-link" data-role="end" style="float: none; padding: 0"><t t-esc="end"/></button> + </small> + <t t-if="end && ! next"> + <button class="btn btn-sm btn-default" data-role="end"><t t-esc="end"/></button> + </t> + </nav> + </t> + </div> + </t> + <t t-name="website.tour_popover_title"> + <t t-esc="title"/><button title="Close Tutorial" type="button" class="close" data-role="end">×</button> + </t> +</templates> diff --git a/addons/website/static/src/xml/website.xml b/addons/website/static/src/xml/website.xml index c2f7abe6ed2..b3e4cacd32a 100644 --- a/addons/website/static/src/xml/website.xml +++ b/addons/website/static/src/xml/website.xml @@ -28,6 +28,12 @@ <!-- filled in JS --> </ul> </li> + <li class="dropdown"> + <a id="help-menu-button" class="dropdown-toggle" data-toggle="dropdown" href="#">Help <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu" id="help-menu"> + <!-- filled in JS --> + </ul> + </li> <li> <a href="/admin#action=website.action_module_website">Apps</a> </li> |
