values, context=request.context)
obj = _object.browse(request.cr, request.uid, _id)
- return obj.website_published and True or False
+ return bool(obj.website_published)
@website.route(['/website/kanban/'], type='http', auth="public")
def kanban(self, **post):
}
/* ---- PUBLISH ---- */
-a[data-publish] {
- text-decoration: none !important;
-}
-a[data-publish] .css_unpublish, a[data-publish] .css_publish, a[data-publish] .css_unpublished, a[data-publish] .css_published {
- display: none;
-}
-a[data-publish][data-publish='off'] .css_unpublished, a[data-publish][data-publish='off']:hover .css_publish {
- display: inline;
-}
-a[data-publish][data-publish='off']:hover .css_unpublished {
- display: none;
-}
-a[data-publish][data-publish='on'] .css_published, a[data-publish][data-publish='on']:hover .css_unpublish {
- display: inline;
-}
-a[data-publish][data-publish='on']:hover .css_published {
- display: none;
-}
-
-.dropdown .css_unpublish, .dropdown .css_publish {
+.css_unpublish, .css_publish {
display: none;
}
-.dropdown.css_publish .css_unpublish, .dropdown.css_unpublish .css_publish {
+.css_published .css_unpublish, .css_unpublished .css_publish {
display: block;
}
-.unpublish {
+[data-publish='off'] {
opacity: 0.5;
}
-[data-publish='off']:not(a) > :not(.js_publish) {
- opacity: 0.5;
-}
-
-[data-publish]:not(a) {
- position: relative;
- overflow: visible;
- /*&:hover .js_publish */
- /* display: block */
-}
-[data-publish]:not(a) .js_publish {
- position: absolute;
- right: -6px;
- top: -10px;
- display: none;
-}
-
+/* ---- END of PUBLISH ---- */
::selection {
background: rgba(150, 150, 220, 0.3);
}
text-transform: uppercase
/* ---- PUBLISH ---- */
-a[data-publish]
- text-decoration: none !important
- .css_unpublish, .css_publish, .css_unpublished, .css_published
- display: none
- &[data-publish='off']
- .css_unpublished, &:hover .css_publish
- display: inline
- &:hover .css_unpublished
- display: none
- &[data-publish='on']
- .css_published, &:hover .css_unpublish
- display: inline
- &:hover .css_published
- display: none
-
-.dropdown .css_unpublish, .dropdown .css_publish
+.css_unpublish, .css_publish
display: none
-.dropdown.css_publish .css_unpublish, .dropdown.css_unpublish .css_publish
+.css_published .css_unpublish, .css_unpublished .css_publish
display: block
-.unpublish
+[data-publish='off']
opacity: 0.5
-[data-publish='off']:not(a)
- >:not(.js_publish)
- opacity: 0.5
-[data-publish]:not(a)
- position: relative
- overflow: visible
- .js_publish
- position: absolute
- right: -6px
- top: -10px
- display: none
- /*&:hover .js_publish*/
- /* display: block*/
+
+/* ---- END of PUBLISH ---- */
+
+
::selection
background: rgba(150, 150, 220, 0.3)
$('.js_tooltip').bstooltip();
/* ----- PUBLISHING STUFF ---- */
- $('[data-publish]:has(.js_publish)').each(function () {
- var $pub = $("[data-publish]", this);
- if($pub.size())
- $(this).attr("data-publish", $pub.attr("data-publish"));
- else
- $(this).removeAttr("data-publish");
- });
-
- $('[data-publish]:has(.js_publish_management)').each(function () {
- $(this).attr("data-publish", $(".js_publish_management .btn-success", this).size() ? "on" : 'off');
- $(this).attr("data-publish", $(".js_publish_management .btn-success", this).size() ? "on" : 'off');
- });
-
- $(document).on('click', '.js_publish', function (e) {
- e.preventDefault();
- var $a = $(this);
- var $data = $a.find(":first").parents("[data-publish]");
- openerp.jsonRpc($a.data('controller') || '/website/publish', 'call', {'id': +$a.data('id'), 'object': $a.data('object')})
- .then(function (result) {
- $data.attr("data-publish", +result ? 'on' : 'off');
- }).fail(function (err, data) {
- website.error(data, '/web#model='+$a.data('object')+'&id='+$a.data('id'));
- });
- return false;
- });
-
$(document).on('click', '.js_publish_management .js_publish_btn', function () {
- var $data = $(this).parents(".js_publish_management:first");
- var $btn = $data.find('.btn:first');
- var publish = $btn.hasClass("btn-success");
-
- $data.toggleClass("css_unpublish css_publish");
- $btn.removeClass("btn-default btn-success");
-
+ var $data = $(this).parent(".js_publish_management");
+ var self=this;
openerp.jsonRpc($data.data('controller') || '/website/publish', 'call', {'id': +$data.data('id'), 'object': $data.data('object')})
.then(function (result) {
- $btn.toggleClass("btn-default", !result).toggleClass("btn-success", result);
- $data.toggleClass("css_unpublish", !result).toggleClass("css_publish", result);
+ $data.toggleClass("css_unpublished css_published");
+ $(self).toggleClass("btn-success btn-danger");
$data.parents("[data-publish]").attr("data-publish", +result ? 'on' : 'off');
}).fail(function (err, data) {
website.error(data, '/web#model='+$data.data('object')+'&id='+$data.data('id'));
</template>
<template id="publish_management">
- <div t-if="has_access_write" t-ignore="true" class="pull-right hidden-xs" t-att-style="style or ''">
- <div t-attf-class="btn-group dropdown js_publish_management #{object.id and object.website_published and 'css_publish' or 'css_unpublish'}" t-att-data-id="object.id" t-att-data-object="object._name" t-att-data-controller="publish_controller">
- <a t-attf-class="btn btn-sm btn-#{object.id and object.website_published and 'success' or 'default'}" t-att-id="'dopprod-%s' % object.id" role="button" data-toggle="dropdown">Options <span class="caret"></span></a>
+ <div t-if="has_access_write" t-ignore="true" class="pull-right" t-att-style="style or ''">
+ <div t-attf-class="btn-group js_publish_management #{object.website_published and 'css_published' or 'css_unpublished'}" t-att-data-id="object.id" t-att-data-object="object._name" t-att-data-controller="publish_controller">
+ <button t-attf-class="btn btn-#{object.website_published and 'success' or 'danger'} js_publish_btn">
+ <span class="css_publish">Not Published</span>
+ <span class="css_unpublish">Published</span>
+ </button>
+ <button type="button" t-attf-class="btn btn-default dropdown-toggle" t-att-id="'dopprod-%s' % object.id" data-toggle="dropdown">
+ <span class="caret"></span>
+ </button>
<ul class="dropdown-menu" role="menu" t-att-aria-labelledby="'dopprod-%s' % object.id">
<t t-raw="0"/>
- <li>
- <a href="#" class="js_publish_btn css_unpublish">Unpublish</a>
- <a href="#" class="js_publish_btn css_publish">Publish</a>
- </li>
<li t-if="publish_edit">
<a t-att-href="'/web#model=%s&id=%s' % (object._name, object.id)"
title='Edit in backend'>Edit</a>
</xpath>
<xpath expr="//div[@id='blog_right_column']" position="inside">
<section class="mt32">
- <h4>Follow us</h4>
+ <h4>Follow us<small t-if="category">: <t t-esc="category.name"/></small></h4>
<t t-if="category">
- <p class="text-muted">
- Subscribe to: <t t-esc="category.name"/>
- </p>
<t t-call="website_mail.follow">
<t t-set="email" t-value="user_id.email"/>
<t t-set="object" t-value="category"/>
+++ /dev/null
-sass:
- sass -t expanded --unix-newlines --watch website_mail.sass:website_mail.css&
+++ /dev/null
-/* ---- FOLLOW ---- */
-a[data-follow] {
- text-decoration: none !important;
- z-index: 2;
-}
-a[data-follow] .label {
- padding: 5px 8px;
-}
-a[data-follow] .css_unfollow, a[data-follow] .css_follow, a[data-follow] .css_unfollowed, a[data-follow] .css_followed {
- display: none;
-}
-a[data-follow][data-follow='off'] .css_unfollowed, a[data-follow][data-follow='off']:hover .css_follow {
- display: inline;
-}
-a[data-follow][data-follow='off']:hover .css_unfollowed {
- display: none;
-}
-a[data-follow][data-follow='on'] .css_followed, a[data-follow][data-follow='on']:hover .css_unfollow {
- display: inline;
-}
-a[data-follow][data-follow='on']:hover .css_followed {
- display: none;
-}
-
-[data-follow='off']:not(a) > :not([data-follow]) {
- opacity: 0.5;
-}
-
-[data-follow]:not(a) {
- position: relative;
- overflow: visible;
- /*&:hover > [data-follow] */
- /* display: block */
-}
-[data-follow]:not(a) > [data-follow] {
- position: absolute;
- right: -6px;
- top: -10px;
- display: none;
-}
+++ /dev/null
-
-/* ---- FOLLOW ---- */
-a[data-follow]
- text-decoration: none !important
- z-index: 2
- .label
- padding: 5px 8px
- .css_unfollow, .css_follow, .css_unfollowed, .css_followed
- display: none
- &[data-follow='off']
- .css_unfollowed, &:hover .css_follow
- display: inline
- &:hover .css_unfollowed
- display: none
- &[data-follow='on']
- .css_followed, &:hover .css_unfollow
- display: inline
- &:hover .css_followed
- display: none
-
-[data-follow='off']:not(a)
- >:not([data-follow])
- opacity: 0.5
-[data-follow]:not(a)
- position: relative
- overflow: visible
- >[data-follow]
- position: absolute
- right: -6px
- top: -10px
- display: none
- /*&:hover > [data-follow]*/
- /* display: block*/
$(document).ready(function () {
- /* ----- FOLLOWING STUFF ---- */
- $('[data-follow]:has([data-follow])').each(function () {
- var $pub = $("[data-follow]", this);
- if($pub.size())
- $(this).attr("data-follow", $pub.attr("data-follow"));
- else
- $(this).removeAttr("data-follow");
- });
-
- $(document).on('click', '.js_follow', function (ev) {
+ $(document).on('click', '.js_follow_btn', function (ev) {
ev.preventDefault();
- var $data = $(":first", this).parents("[data-follow]");
- var $email = $data.first().siblings(".js_follow_email");
- var message_is_follower = $data.first().attr("data-follow");
+
+ var self = this;
+ var $data = $(this).parents("div.js_follow");
+ var $email = $(".js_follow_email", $data);
+ var message_is_follower = $data.attr("data-follow");
$data.attr("data-follow", message_is_follower == 'off' ? 'on' : 'off');
+
openerp.jsonRpc('/website_mail/follow', 'call', {
- 'id': $(this).data('id'),
- 'object': $(this).data('object'),
+ 'id': $data.data('id'),
+ 'object': $data.data('object'),
'message_is_follower': message_is_follower,
'email': $email && $email.val() || false,
}).then(function (result) {
- $data.attr("data-follow", + result ? 'on' : 'off');
+ if (result) {
+ $data.html('<div class="alert alert-success mb0">Thanks for your subscription!</div>')
+ } else {
+ $data.attr("data-follow", + result ? 'on' : 'off');
+ $(self).text('Subscribe')
+ }
});
});
<data>
<template id="follow">
- <div name="follow" t-if="editable">
- <a href="#" t-att-data-id="object.id"
- t-att-data-object="object._name"
- t-att-data-follow="object.id and object.message_is_follower and 'on' or 'off'"
- class="pull-right js_follow" t-ignore="true">
- <span t-attf-class="label label-success css_follow">Follow</span>
- <span t-attf-class="label label-danger css_unfollow">Unfollow</span>
- <span t-attf-class="label label-success css_followed">Following</span>
- <span t-attf-class="label label-danger css_unfollowed">Not Following</span>
- </a>
+ <div class="input-group js_follow" t-att-data-id="object.id"
+ t-att-data-object="object._name"
+ t-att-data-follow="object.id and object.message_is_follower and 'on' or 'off'">
<input type="email" name="email"
- class="js_follow_email css_unfollowed_email"
- t-att-value="email"
- t-att-placeholder="email or 'Email Address'"/>
+ class="js_follow_email form-control"
+ t-att-value="email or ''"
+ placeholder="your email..."/>
+ <span class="input-group-btn">
+ <button href="#"
+ class="btn btn-default js_follow_btn">
+ <t t-if="object.message_is_follower">Unsubscribe</t>
+ <t t-if="not object.message_is_follower">Subscribe</t>
+ </button>
+ </span>
</div>
</template>
<template id="website.layout" name="Mail customization" inherit_id="website.layout">
- <!-- Load stylesheets before scripts to avoid blocking -->
- <xpath expr="//head/link" position="after">
- <link rel='stylesheet' href='/website_mail/static/src/css/website_mail.css'/>
- </xpath>
<xpath expr="//head" position="inside">
<script type="text/javascript" src="/website_mail/static/src/js/website_mail.js"></script>
</xpath>