diff --git a/addons/event_sale/event_demo.xml b/addons/event_sale/event_demo.xml index bb023a40ff0..cd6139b82e0 100644 --- a/addons/event_sale/event_demo.xml +++ b/addons/event_sale/event_demo.xml @@ -14,6 +14,8 @@ True + + service 2500.0 1000.0 @@ -21,5 +23,24 @@ /9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAB+AJYDAREAAhEBAxEB/8QAHAAAAQUBAQEAAAAAAAAAAAAAAAMFBgcIBAIB/8QAPxAAAQMDAgMECAMFBwUAAAAAAQIDBAAFEQYSByExE0FRcQgUIjJhgZGhUoKxFUJywdEWFyMkQ2KzJURzksL/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A2XQFAUBQFAUBQFAUBQFAUBQFAUBQFAUBQFAUBQFAUBQFAUBQFAUBQFAUCUuTHiMKfkyGWGk9VuLCUjzJoGyJqjTkuQI8a/2t50nAQiWgk+Qzz+VA8ZHiKAoCgKAoCgKAoG2RfLdHlLjPPlLiDhQ2mgEXy1K/71oeZxQLIuluX7s1k/moFky4qvdkMn84oFA62ejiD5KoPVAUBQRjiNq+Fo+wrnycOPL9iOznBcX/AEHfQZX1brG8ajnKlXSat3mShsEhDY8Ep7qBlVNb7NstuLLhz2gUOQ8MHvoLl4C8R5aLtH01eJSn40g7IrjhyppfcnP4T0+BxQaEHSgKAoCg4b1doFoiGVcJKGGgcZPUnwA76BtsesLBeJPqsScO3PutuJKSry8aCQA5oIBf9v8AaCYD+IfpQcmwGgiTkLXLIfZZmQJKFKJafdQA4kFRIBCUhJG3aOnjzNB5VcdVoffZbtdplSGmwSy3L2kKPTOeY8/hQKyJur4KWHf2cxM3MArYbdDaw7zJAVnBAAHd86D6nU2pWEFyRpu4JQhBUrs3gTy8OfX4UE94Z3V+7x2prgktokxUPJZfPtN7hnBHcedBNj0oMp+knqN2fr563doextzaWkp7txG5R+4oKldlfGgQ9b59aBysNycj3SM+wsh1t1KkEdxBGKDfSeaQSMUH2gKAoM/+k1eZMO+w4pWpLIi70+GSogn7CgpaHrN9q4NLTKUHEEbCFcxjpig2foa6LvekbXdXBhyTGQtf8WME/UUEQ1I+E6nmoJ7x+lAzyrukOuRoy0FbYJfdUf8ADYA6lR8fh9cUHXbJ9ucjbmbgw8MncvtQckHBoG24aZsF7kPTA8svqcBLjEg+ytIx3HHLwoO+PaIDBgNtvuboJ3ICnNylEoKcqz15ZoHRQGKB20Zyuj3/AIv50EvPSgxT6RUeRb+K96DoKQ+tLzZPekoHP6g0FYPyVZ60CIfJPU0FjcB9NP6q4hW2IEFUVhwSJSscg2g5IPnyHzoNyjpQFAUBQVdx40/pzUlpbjXG7xrbc2gVRluZOQeoIGTgkUGcNGcNU3HVTcSXerfFY7TBfUsjcM/ugjqe7OKDY0aRZNN2WNA9bYYjRmktNJKwVEJGBgDmT5UFF611Ym861kQ7E46e1WA64k4LKMYJJHQnuHWgkDcSPF0xMaaEVlAjOEqko3Ne6clwfvJ8fEZoI1AYhSw/siaPku9in1VLO5C1P4SfbSB7Kep5cxyoHJ7Tr0bcYuj7eoyGVJkdjcFtElQ3KA6dVJAzyOKBNGmUvxz61peTFeLpGYt2XnakFSVbs5ySSMfGgXsdhekz3y8xqK0BtxDiHFXPel1QOSNvPly5560FnaO5XZY8Wj+tBMKCqfSB4WnXltan2ottXmIkpb3HAeR+AnuPgaDHmptN6gsM9cO72mZDeSSMOtEA/EHvHxFA9aA4Z6v1fNbRbbRJTGJ9uW82UMoHjuPXyGTQbJ4R8PLXw/sPqcUh+a9hUqURguK8B4JHcKCbUBQFBzXSYzb7fInSFbWY7anFnwAGTQYk4iaouGotXSZq3VJU6sqIzyQjolI8hQJ2h07E5PMUFx6P4X6h1VZYdwl6w9RtElvIjw2Al5SQSCFr5Z5g8+dB1OaRtemtQybbamlIjtbcFatylHHMk95NBJoLSey2EApIwQe+gWRAgpd7UQ44czneGxn60HVQN94vVstHZ/tGUljtc7MgnOPKg52tUafdRuRdGCPHn/SgetHX+xquxWLtDCS2RlToTz5eNBNHLvbRDflInR3WmGy44W3QrakDJPI0GcNb8bNRXOS4zYli1w8kJUkBTqh4knp5D60Fc3PWGpZruJeoLs+euFTF4HkM4FA66Z4kawsb6Fxr5NdbSebUl0vII8MKzj5YoNWcONTtau0lDvTbXZKdBS63nOxaThQ8sigkdAUBQV16Qt2Nt4cyGkKwqY6lk+O33lfpj50GZnLGGND269vI/wAxd57qmyR/osjby81qV/6igbIqwh0p+NBrngS923C20HvR2qT8nV0DFq8gavmk/wC39KDzHfSlI50HQmU3nrQLJcQeeaCA8a0g2iC+kn2H1JOPiKDxZNIWmdZoclK32y40lSil5XM/pQdK9D23ACJUjPeS7z/SgTctUfSVkv01qU8sy7VIi7VqBG5ScpPTxT96CjQQRmgb1qCpisd1B0o6ig0j6J91L9hutmWcmI8l9H8LgIx9UE/Ogu2gKAoKO9LFco2iyx2I7zodddSkNoKtyyEgDl3+FBC+MkFdiiaXsLkd1LdstKEqUEHap1XNzB6HmPvQVU24V7nkjCAeqiBQay9HAPf3XRe1QUpMh0tE9Fp3dR8M5HyoLDXHYWoqWy2pR6koBNB5MSKesZg+bYoGd2DED91mertewz2afYGBtSSfuaDpsduiosUJpyM0pQjISpSkAknaOZPjQVvxztrKOFKlNMoDkSWkFQT7RGSOZ+YoGLhzLS9o2BhSApKNvM+BxQPNxuEWBEMmY+w02nAKldM92KCtOMmr7bJsrVst8huQt1YccUg+4B0Hmf5UFSGUlLfMjlQIwV9otTh/e50DpGYkPjczHedSORLbZUB9KC7vRVQ9D1BenZaVRmTDaSC8Nm5W9XTPXkDQaIZfZeBLLrbgHXYoHH0oFKAoPDjTbm3tEJXtO5O4ZwfEfGgo/wBKxzZEs4z0Q+f+OgzM+r/IoH4lqI/Sg3Pwst5tfDqwQVDapuC0VDwUpO4j6k0EloPh6ZoG19J/YM1eMKcadV9QcUDiykIZQkdAkAUEE4xxDI4c6kYSklXZpeQAM89wzQZitUzVkWImNbnrg2ynO1LbTmBk5/DQSXV1xud50pHgCx3IS2dq3Hi2ohwgYPLFBTt2dlBZBaWDnHMGg5ZcafGKGpkd5hx1AWlLiSklB6HB7jQdyP8ABjDu8aC3NHRHW9OQWG1rRlsOr28txVz5/LFA8pt7hVlS3D5qNBaXBBlTX7SBJx7HU+dBZlAUBmgoP0t1hMWznP8ApyP1boKB0va13vUthsiASZchtKsdySrKj8hQbzaU000ltOAlIAAHcBQejIb/ABUCUmW2lhZBydpxQIyX2RBUwFfuBH8qDoTLZwBuoG6+Nrmx3Y8Z5lCpDRaV2qNySnvBHxBxQUzA4ei43G4i2smMuFILZWxMUhLijnmARju7/GgQv+ltUWNltbs6Uhpa9iMqS7k+GQaBum6F19EYkXl1uIyiOhTynFttqcCQMk8+ZNBVHEJqcvUDci5zW5sh6MhztEbeQOcAhPIEeFBHpCCY5AFBdmhZ9vkaehqVLjoWGUIUlTgBBCQOlBIm3IbjoZaktOOlW0IQoKUSe7A76C0uF9ufhWyS8+ytpT7g2hacEgDr96CX0HO4p3ngUHM85IHROaCnPSH03ftUxICLcy1uZDiSFrxndt5/agi/CTh5d7BrmPe7k2y6I0cpjtoJ5KIwVE+WfrQX2zJeUPbYUD50C6VZ6tn60A4lKk+4rqKD0ppsjHZk/Og9pab7msfOgFJbSpKyjARlR591AwcNG/8AosiYpGVS5jrufhnb/I0CfFIhVstw24HrqMn50FB8b+Ldw1BcZNjsspUeyMktktnCpRHUqP4fAfWgqhLqFoClrGcnOTQekvx/d7VH1oFbcmMu6Q0IWklT6Bgd/MUE40q/Pd1PMeskd2TPRd2VMobSSdwXkfLlzPTFBssYzQfaD4Ug0Hktg0HJOgofSAoA4oEmbc2hSFBIymg7BGR4UB6unwFAdgMYxQfeyAoPvZjwoOG/rTGsc+QeWyOsg/lOKDm0TE9V0pbWiMK7BK1D4q9o/c0Eb45+xol1Y5FO9WfyKoMLXOYtcgoSojJ50DtpV2yt3JEa9tKLLiNwUXNoSru7qCwzYtLpSHRYt6e5RcVg0DpZGLA2pBhacjmSk5TtSpxWR3gAZoJYzP1La4i7pFs78COwk7n0RlNhIJAOenU4oLd4WNX5y1Lul9nOvLlY7BpSwQhA7+XeTQTOgKAoCgMUBQBNB5KhQeVLxQeC8PGgYNev7tLS2EKwt8oZT5qUBQPDD7TLDbSeSUJCQPIUEF47PpXoCXtPMIX/AMaqDEEKJ61eGGzzDjqUn5mgdtYWfsddXC17doRNLSR/t3YH2IoNtcJI8EaFh5YaWpTjm8qQDkhZT/8AIHyoGXQMBpnXcxaW0J7N2SeQxjc4cUFhX6CzdrJNtr2OzlMLaPwyCM0Ef4SSnH9HMMP8n4i1MOJ8Ck4P3zQS+gKAoCgKD4TQeCaBJSjQIuKOKDmdWRmgjWq5ILlujLVgLlpWfygn+lApIuhT0NBDeJkp656VlwWRudcQpKE56kpOKDLFlaXF1LEalsONrTIRuQpJB94UFkcQrC5L4pNXyCkPQpbzbjuDzbUnGcjw9kUF0cH7tIhaLjRriksSO2fcKFHmAt1Sh9jQPWmJDaNU3N9KgQrmkj44JoJi1OCse1QR3SaxbtYX63g7WpCkzGh/F733B+tBMkvg99AvQFAUBQfCM0HhQoE1JoEHE8qDleFAyXiM247HU4kK2r5ZHwoOGZCQQcHFBFtSQ1tsb0LT73fQRI2pl2UlxaGyvPvFOT9aDzcowadKxjkcCgerWVhhHtc8UDlZXltzXSCcnrQS2DLcOBk0CUx0s6qtUtPvPJcjr+IxuH6UEtZcVtoP/9k= + + + Standard + + + + 1000.0 + 20 + + + + VIP + + + + 5000.0 + 5 + + diff --git a/addons/event_sale/event_sale.py b/addons/event_sale/event_sale.py index a8f73a3055f..21682d18373 100644 --- a/addons/event_sale/event_sale.py +++ b/addons/event_sale/event_sale.py @@ -127,7 +127,7 @@ class event_event(osv.osv): string='Maximum Registrations', help="The maximum registration level is equal to the sum of the maximum registration of event ticket." + "If you have too much registrations you are not able to confirm your event. (0 to ignore this rule )", - type='integer', store=True) + type='integer') } def check_registration_limits(self, cr, uid, ids, context=None): diff --git a/addons/website/static/src/css/editor.css b/addons/website/static/src/css/editor.css index 410f4849d06..6ebb6dfea8f 100644 --- a/addons/website/static/src/css/editor.css +++ b/addons/website/static/src/css/editor.css @@ -289,18 +289,17 @@ } /* ---- SEO TOOLS ---- */ -.oe_seo_configuration { - min-width: 42em; +.oe_seo_configuration.modal { + width: 100%; + left: 0; + margin-left: 0; + top: 0 !important; + margin-top: 0 !important; + height: 100%; } .oe_seo_configuration .modal-body { - max-height: inherit; - min-height: 27em; -} -.oe_seo_configuration input { - width: 90%; -} -.oe_seo_configuration textarea { - width: 90%; + max-height: 100%; + height: 100%; } .oe_seo_configuration ul { list-style: none; @@ -309,11 +308,10 @@ color: #e00101; } -.oe_seo_keywords_list { - width: 100%; +.oe_seo_keywords_list.container { margin: 0.1em; } -.oe_seo_keywords_list li { +.oe_seo_keywords_list .oe_seo_keyword { float: left; - width: 19em; + padding-right: 0.5em; } diff --git a/addons/website/static/src/css/editor.sass b/addons/website/static/src/css/editor.sass index 74885a380ee..c32fcbc1c44 100644 --- a/addons/website/static/src/css/editor.sass +++ b/addons/website/static/src/css/editor.sass @@ -259,22 +259,24 @@ $icon_close: #E00101 $remove_color: $icon_close .oe_seo_configuration - min-width: 42em + &.modal + width: 100% + left: 0 + margin-left: 0 + top: 0!important + margin-top: 0!important + height: 100% .modal-body - max-height: inherit - min-height: 27em - input - width: 90% - textarea - width: 90% + max-height: 100% + height: 100% ul list-style: none .oe_remove color: $remove_color .oe_seo_keywords_list - width: 100% - margin: 0.1em - li + &.container + margin: 0.1em + .oe_seo_keyword float: left - width: 19em + padding-right: 0.5em diff --git a/addons/website/static/src/css/website.css b/addons/website/static/src/css/website.css index cffba17f0c5..b5cf404ca52 100644 --- a/addons/website/static/src/css/website.css +++ b/addons/website/static/src/css/website.css @@ -1,3 +1,4 @@ +@charset "utf-8"; /* THIS CSS FILE IS FOR WEBSITE THEMING CUSTOMIZATION ONLY * * css for editor buttons, openerp widget included in the website and other @@ -148,60 +149,20 @@ footer { display: block; } -/* ---- HOMEPAGE THEME CUSTOMIZATION ---- */ -header.navbar-fixed-top { - position: static; -} - #myCarousel .item { - min-height: 300px; color: white; } +/* ---- HOMEPAGE THEME CUSTOMIZATION ---- */ .dark { background: #eff8f8; } -/* ----- BOOTSTRAP HACK FOR STICKY carousel-control ----- */ -.carousel-control { - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - line-height: 30px; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; -} -/* ----- BOOTSTRAP HACK FOR STICKY header tags ----- */ -h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - font-weight: 900; -} -.navbar-form { - padding: 0; - margin-top: 0; -} -.navbar-form .btn { - margin-top: 3px; - margin-bottom: -5px; -} -header { - margin-bottom: 0px; - margin-top: -10px; - min-height: 40px; -} -header .collapse ul { - margin-top: 5px; -} -header > .navbar { - margin-bottom: 0px; -} -#website-top-view .navbar-nav>li>a { - padding:10px 15px 10px; + +/* Hacks to remove */ +div#wrap .carousel { + top: -20px; } + /* -- Hack for nav header -- */ .nav > li.nav-header { display: block; @@ -212,38 +173,46 @@ header > .navbar { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); text-transform: uppercase; } -ul.nav-stacked>li>a { - padding: 2px 15px; -} + .nav.nav-hierarchy { padding-left: 16px; } + .navbar-inverse .divider-vertical { height: 40px; margin: 0 9px; - border-right: 1px solid #ffffff; + border-right: 1px solid white; border-left: 1px solid #f2f2f2; } + .navbar-nav .divider-vertical { - border-right-color: #222; + border-right-color: #222222; border-left-color: #080808; } + .navbar-inverse { - background-image: -moz-linear-gradient(top, #222, #080808); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222), to(#080808)); - background-image: -webkit-linear-gradient(top, #222, #080808); - background-image: -o-linear-gradient(top, #222, #080808); - background-image: linear-gradient(to bottom, #222, #080808); + background-image: -moz-linear-gradient(top, #222222, #080808); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#080808)); + background-image: -webkit-linear-gradient(top, #222222, #080808); + background-image: -o-linear-gradient(top, #222222, #080808); + background-image: linear-gradient(to bottom, #222222, #080808); background-repeat: repeat-x; } + .navbar-default { border: 1px solid #d4d4d4; } -/* -- Hack for removing double scroll-bar from mobile preview -- */ + +/* -- Hack for removing double scrollbar from mobile preview -- */ .modal { overflow: hidden; overflow-y: hidden; } + +ul.nav-stacked > li > a { + padding: 2px 15px; +} + .dropdown-header { text-transform: uppercase; } diff --git a/addons/website/static/src/css/website.sass b/addons/website/static/src/css/website.sass index f8b8bab8efc..8c7b4ad8e1d 100644 --- a/addons/website/static/src/css/website.sass +++ b/addons/website/static/src/css/website.sass @@ -50,17 +50,16 @@ margin-bottom: 0px !important /* Grid of unequally tall elements */ -.grid > [class*="span"] +.grid > [class*="col-md"] display: inline-block float: none vertical-align: top - margin-right: -4px box-sizing: border-box - &.grid-align-top > [class*="span"] + &.grid-align-top > [class*="col-md"] vertical-align: top - &.grid-align-middle > [class*="span"] + &.grid-align-middle > [class*="col-md"] vertical-align: middle - &.grid-align-bottom > [class*="span"] + &.grid-align-bottom > [class*="col-md"] vertical-align: bottom /* Table with two collumns aligned on the center */ @@ -110,42 +109,18 @@ footer .nav > li a display: block -/* ---- HOMEPAGE THEME CUSTOMIZATION ---- */ - -header.navbar-fixed-top - position: static - #myCarousel .item - min-height: 300px color: white +/* ---- HOMEPAGE THEME CUSTOMIZATION ---- */ + .dark background: rgb(239, 248, 248) -.carousel-control - top: 40% - left: 15px - width: 40px - height: 40px - margin-top: -20px - font-size: 60px - line-height: 30px - background: #222222 - border: 3px solid #ffffff - -webkit-border-radius: 23px - -moz-border-radius: 23px - border-radius: 23px - -header - margin-bottom: 0px - min-height: 40px - .collapse ul - margin-top: 5px - > .navbar - margin-bottom: 0px - -.navbar-nav >li >a - padding:10px 15px 10px +/* Hacks to remove */ +div#wrap + .carousel + top: -20px /* -- Hack for nav header -- */ .nav > li.nav-header @@ -157,9 +132,6 @@ header text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) text-transform: uppercase -ul.nav-stacked>li>a - padding: 2px 15px - .nav.nav-hierarchy padding-left: 16px @@ -188,7 +160,9 @@ ul.nav-stacked>li>a .modal overflow: hidden overflow-y: hidden -ul.nav-stacked>li>a + +ul.nav-stacked > li > a padding: 2px 15px + .dropdown-header - text-transform: uppercase \ No newline at end of file + text-transform: uppercase diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index b688afd7c88..93d239492c6 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -3,7 +3,53 @@ var website = openerp.website; + website.templates.push('/website/static/src/xml/website.editor.xml'); + website.dom_ready.done(function () { + // $.fn.data automatically parses value, '0'|'1' -> 0|1 + website.is_editable = $(document.documentElement).data('editable'); + var is_smartphone = $(document.body)[0].clientWidth < 767; + + if (website.is_editable && !is_smartphone) { + website.ready().then(website.init_editor); + } + }); + + function link_dialog(editor) { + return new website.editor.LinkDialog(editor).appendTo(document.body); + } + website.init_editor = function () { + CKEDITOR.plugins.add('customdialogs', { + requires: 'link,image', + init: function (editor) { + editor.on('doubleclick', function (evt) { + if (evt.data.dialog === 'link' || evt.data.dialog === 'image') { + delete evt.data.dialog; + link_dialog(editor); + } + // priority should be smaller than dialog (999) but bigger + // than link or image (default=10) + }, null, null, 500); + + editor.addCommand('link', { + exec: function (editor, data) { + link_dialog(editor); + return true; + }, + canUndo: false, + editorFocus: true, + }); + editor.addCommand('image', { + exec: function (editor, data) { + console.log('image', editor, data); + return true; + }, + canUndo: false, + editorFocus: true, + }); + + } + }); var editor = new website.EditorBar(); var $body = $(document.body); editor.prependTo($body); @@ -215,7 +261,7 @@ autoParagraph: false, filebrowserImageUploadUrl: "/website/attach", // Support for sharedSpaces in 4.x - extraPlugins: 'sharedspace', + extraPlugins: 'sharedspace,customdialogs', // Place toolbar in controlled location sharedSpaces: { top: 'oe_rte_toolbar' }, toolbar: [ @@ -251,6 +297,158 @@ }, }); + website.editor = { }; + website.editor.Dialog = openerp.Widget.extend({ + events: { + 'hidden': 'destroy', + }, + init: function (editor) { + this._super(); + this.editor = editor; + }, + start: function () { + var sup = this._super(); + this.$el.modal(); + return sup; + }, + }); + + website.editor.LinkDialog = website.editor.Dialog.extend({ + template: 'website.editor.dialog.link', + events: _.extend({}, website.editor.Dialog.prototype.events, { + 'click button.btn-primary': 'save', + 'change .url-source': function (e) { this.changed($(e.target)); }, + }), + init: function (editor) { + this._super(editor); + this.pages = Object.create(null); + }, + start: function () { + var element; + if ((element = this.get_selected_link()) && element.hasAttribute('href')) { + this.editor.getSelection().selectElement(element); + } + this.element = element; + + return $.when( + this.fetch_pages().done(this.proxy('fill_pages')), + this._super() + ).done(this.proxy('bind_data')); + }, + /** + * Greatly simplified version of CKEDITOR's + * plugins.link.dialogs.link.onOk. + * + * @param {String} url + * @param {Boolean} [new_window=false] + * @param {String} [label=null] + */ + make_link: function (url, new_window, label) { + var attributes = {href: url, 'data-cke-saved-href': url}; + var to_remove = []; + if (new_window) { + attributes['target'] = '_blank'; + } else { + to_remove.push('target'); + } + + if (this.element) { + this.element.setAttributes(attributes); + this.element.removeAttributes(to_remove); + } else { + var selection = this.editor.getSelection(); + var range = selection.getRanges(true)[0]; + + if (range.collapsed) { + var text = new CKEDITOR.dom.text(label || url); + range.insertNode(text); + range.selectNodeContents(text); + } + + new CKEDITOR.style({ + type: CKEDITOR.STYLE_INLINE, + element: 'a', + attributes: attributes, + }).applyToRange(range); + // blows up the call stack, not sure why as original version + // seems to work OK + // range.select(); + } + }, + save: function () { + var $e = this.$('.url-source').filter(function () { return !!this.value; }); + + var val = $e.val(); + if ($e.hasClass('email-address')) { + this.make_link('mailto:' + val, false, val); + } else if ($e.hasClass('pages')) { + this.make_link(val, false, $e.find('option:selected').text()); + } else { + this.make_link(val, this.$('input.window-new').prop('checked')); + } + this.$el.modal('hide'); + }, + bind_data: function () { + var href = this.element && (this.element.data( 'cke-saved-href') + || this.element.getAttribute('href')); + if (!href) { return; } + + var match, $control; + if (match = /(mailto):(.+)/.exec(href)) { + $control = this.$('input.email-address').val(match[2]); + } else if(href in this.pages) { + $control = this.$('select.pages').val(href); + } + if (!$control) { + $control = this.$('input.url').val(href); + } + + this.changed($control); + + this.$('input.window-new').prop( + 'checked', this.element.getAttribute('target') === '_blank'); + }, + changed: function ($e) { + $e.closest('li.list-group-item').addClass('active') + .siblings().removeClass('active'); + this.$('.url-source').not($e).val(''); + }, + /** + * CKEDITOR.plugins.link.getSelectedLink ignores the editor's root, + * if the editor is set directly on a link it will thus not work. + */ + get_selected_link: function () { + var sel = this.editor.getSelection(), + el = sel.getSelectedElement(); + if (el && el.is('a')) { return el; } + + var range = sel.getRanges(true)[0]; + if (!range) { return null; } + + range.shrink(CKEDITOR.SHRINK_TEXT); + return this.editor.elementPath(range.getCommonAncestor()) + .contains('a'); + + }, + fetch_pages: function () { + return openerp.jsonRpc('/web/dataset/call_kw', 'call', { + model: 'website', + method: 'list_pages', + args: [], + kwargs: {} + }); + }, + fill_pages: function (results) { + var self = this; + var $select = this.$('select'); + $select.append(new Option()); + _(results).each(function (result) { + self.pages[result.url] = true; + $select.append(new Option(result.name, result.url)); + }); + }, + }); + var Observer = window.MutationObserver || window.WebkitMutationObserver || window.JsMutationObserver; var observer = new Observer(function (mutations) { @@ -279,14 +477,4 @@ .uniq() .each(function (node) { $(node).trigger('content_changed'); }) }); - - website.dom_ready.done(function () { - // $.fn.data automatically parses value, '0'|'1' -> 0|1 - website.is_editable = $(document.documentElement).data('editable'); - var is_smartphone = $(document.body)[0].clientWidth < 767; - - if (website.is_editable && !is_smartphone) { - website.ready().then(website.init_editor); - } - }); })(); diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js index f55ebc34bf2..8a7f396895f 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' ]; diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js index af3e30d7fcf..5564e8eac98 100644 --- a/addons/website/static/src/js/website.seo.js +++ b/addons/website/static/src/js/website.seo.js @@ -11,7 +11,25 @@ }, }); + function cleanupKeyword (word) { + return word ? word.replace(/[,;.:]+/g, " ").replace(/ +/g, " ").trim() : ""; + } + website.seo = {}; + + website.seo.Tip = openerp.Widget.extend({ + template: 'website.seo_tip', + events: { + 'click button[data-action=close]': 'destroy', + }, + init: function (parent, options) { + this._super(parent); + this.message = options.message; + // info, error or success + this.type = options.type; + }, + }); + website.seo.Keyword = openerp.Widget.extend({ template: 'website.seo_keyword', events: { @@ -29,9 +47,7 @@ this._super(); }, }); - website.seo.cleanupKeyword = function (word) { - return word ? word.replace(/[,;.:]+/g, " ").replace(/ +/g, " ").trim() : ""; - }; + website.seo.PageParser = openerp.Class.extend({ init: function () { this._url = this._currentURL(); @@ -62,7 +78,7 @@ keywordSuggestions: function () { var headers = this.headers(); return _.map(_.uniq(headers.h1.concat(headers.h2)), - website.seo.cleanupKeyword); + cleanupKeyword); }, }); website.seo.Configurator = openerp.Widget.extend({ @@ -85,17 +101,26 @@ this.$el.find('.js_seo_page_url').text(pageParser.url()); this.$el.find('input[name=seo_page_title]').val(pageParser.title()); this.$el.find('input[name=seo_page_keywords]').typeahead({ + items: 4, source: function () { var suggestions = pageParser.keywordSuggestions(); var alreadyChosen = currentKeywords(); return _.difference(suggestions, alreadyChosen); }, - items: 4 }); - + this.checkBestPractices(pageParser); $(document.body).addClass('oe_stop_scrolling'); this.$el.modal(); }, + checkBestPractices: function (parser) { + var pageParser = parser || new website.seo.PageParser(); + if (pageParser.headers()['h1'].length > 1) { + new website.seo.Tip(this, { + message: "You have more than one <h1> tag on the page.", + type: 'error' + }).appendTo(this.$el.find('.js_seo_tips')); + } + }, currentPage: function () { var url = window.location.href; var hashIndex = url.indexOf('#'); @@ -104,7 +129,7 @@ keywords: function () { return _.uniq($('.js_seo_keyword').map(function () { return $(this).text(); - }).get()); + })); }, isExistingKeyword: function (word) { return _.contains(this.keywords(), word); @@ -122,7 +147,7 @@ var $modal = this.$el; function enableNewKeywords () { $modal.find('input[name=seo_page_keywords]') - .removeAttr('readonly').attr('placeholder', "New keyword"); + .removeAttr('readonly').attr('placeholder', ""); $modal.find('button[data-action=add]') .prop('disabled', false).removeClass('disabled'); } @@ -134,7 +159,7 @@ .prop('disabled', true).addClass('disabled'); } var candidate = this.$el.find('input[name=seo_page_keywords]').val(); - var word = website.seo.cleanupKeyword(candidate); + var word = cleanupKeyword(candidate); if (word && !this.isKeywordListFull() && !this.isExistingKeyword(word)) { new website.seo.Keyword(this, { keyword: word, diff --git a/addons/website/static/src/xml/website.editor.xml b/addons/website/static/src/xml/website.editor.xml new file mode 100644 index 00000000000..b55e3bd47c5 --- /dev/null +++ b/addons/website/static/src/xml/website.editor.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + diff --git a/addons/website/static/src/xml/website.xml b/addons/website/static/src/xml/website.xml index f5f13f7bbcd..53715824c53 100644 --- a/addons/website/static/src/xml/website.xml +++ b/addons/website/static/src/xml/website.xml @@ -2,36 +2,38 @@ + -