merge trunk

bzr revid: nicolas.vanhoren@openerp.com-20120726101422-2607vesxr52z3t1j
This commit is contained in:
niv-openerp 2012-07-26 12:14:22 +02:00
commit 547e281f6f
10 changed files with 307 additions and 194 deletions

View File

@ -194,8 +194,8 @@ class WebClient(openerpweb.Controller):
if mods is not None:
path += '?mods=' + mods
return [path]
# old code to force cache reloading
#return ['%s?debug=%s' % (wp, os.path.getmtime(fp)) for fp, wp in self.manifest_glob(req, mods, extension)]
# old code to force cache reloading, this really works, sorry niv but we stop wasting time
return ['%s?debug=%s' % (wp, os.path.getmtime(fp)) for fp, wp in self.manifest_glob(req, mods, extension)]
return [el[1] for el in self.manifest_glob(req, mods, extension)]
@openerpweb.jsonrequest

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-07-25 04:52+0000\n"
"X-Launchpad-Export-Date: 2012-07-26 04:50+0000\n"
"X-Generator: Launchpad (build 15679)\n"
#. openerp-web

View File

@ -20,6 +20,50 @@
font-style: normal;
}
@-moz-keyframes bounce {
0% {
-moz-transform: scale(0);
opacity: 0;
}
50% {
-moz-transform: scale(1.3);
opacity: 0.4;
}
75% {
-moz-transform: scale(0.9);
opacity: 0.7;
}
100% {
-moz-transform: scale(1);
opacity: 1;
}
}
@-webkit-keyframes bounce {
0% {
-webkit-transform: scale(0);
opacity: 0;
}
50% {
-webkit-transform: scale(1.3);
opacity: 0.4;
}
75% {
-webkit-transform: scale(0.9);
opacity: 0.7;
}
100% {
-webkit-transform: scale(1);
opacity: 1;
}
}
.openerp.openerp_webclient_container {
height: 100%;
position: relative;
@ -186,6 +230,11 @@
.openerp .ui-menu .ui-menu-item a.ui-state-active {
background: #f0f0fa;
}
.openerp div.ui-widget-overlay {
background: black;
filter: alpha(opacity=30);
opacity: 0.3;
}
.openerp.ui-dialog {
display: none;
padding: 6px;
@ -497,6 +546,10 @@
.openerp .oe_webclient .oe_star_on {
color: gold;
}
.openerp .oe_bounce {
-moz-animation: bounce 0.4s linear;
-webkit-animation: bounce 0.4s linear;
}
.openerp .oe_tag {
border-radius: 2px;
-webkit-box-sizing: border-box;
@ -2363,6 +2416,58 @@
.openerp .oe_list_content .numeric input {
text-align: right;
}
.openerp .tree_header {
background-color: #f0f0f0;
border-bottom: 1px solid #cacaca;
color: #4c4c4c;
padding: 5px;
height: 25px;
}
.openerp .tree_header button {
float: right;
height: 27px;
margin-right: 5px;
}
.openerp .oe-treeview-table {
width: 100%;
background-color: white;
border-spacing: 0;
}
.openerp .oe-treeview-table th {
padding: 10px;
color: #4c4c4c;
font-weight: bold;
background-color: #f0f0f0;
border-bottom: 2px solid #cacaca;
}
.openerp .oe-treeview-table .treeview-tr, .openerp .oe-treeview-table .treeview-td {
cursor: pointer;
border-right: 1px dotted #afafb6;
vertical-align: top;
text-align: left;
border-bottom: 1px solid #cfcccc;
}
.openerp .oe-treeview-table tr:hover {
background-color: #e0e0f8;
}
.openerp .oe-treeview-table .oe-number {
text-align: right !important;
}
.openerp .oe-treeview-table span {
font-size: 90%;
font-weight: normal;
white-space: nowrap;
display: block;
}
.openerp .oe-treeview-table .treeview-tr.oe-treeview-first {
background: transparent url(/web/static/src/img/expand.gif) 0 50% no-repeat;
}
.openerp .oe-treeview-table .oe_open .treeview-tr.oe-treeview-first {
background-image: url(/web/static/src/img/collapse.gif);
}
.openerp .oe-treeview-table .treeview-tr.oe-treeview-first span, .openerp .oe-treeview-table .treeview-td.oe-treeview-first span {
margin-left: 16px;
}
.openerp .oe_trad_field.touched {
border: 1px solid green !important;
}
@ -2428,59 +2533,6 @@
color: #333333;
}
.openerp .tree_header {
background-color: #f0f0f0;
border-bottom: 1px solid #cacaca;
color: #4c4c4c;
padding: 5px;
height: 25px;
}
.openerp .tree_header button {
float: right;
height: 27px;
margin-right: 5px;
}
.openerp .oe-treeview-table {
width: 100%;
background-color: white;
border-spacing: 0;
}
.openerp .oe-treeview-table th {
padding: 10px;
color: #4c4c4c;
font-weight: bold;
background-color: #f0f0f0;
border-bottom: 2px solid #cacaca;
}
.openerp .oe-treeview-table .treeview-tr, .openerp .oe-treeview-table .treeview-td {
cursor: pointer;
border-right: 1px dotted #afafb6;
vertical-align: top;
text-align: left;
border-bottom: 1px solid #cfcccc;
}
.openerp .oe-treeview-table tr:hover {
background-color: #e0e0f8;
}
.openerp .oe-treeview-table .oe-number {
text-align: right !important;
}
.openerp .oe-treeview-table span {
font-size: 90%;
font-weight: normal;
white-space: nowrap;
display: block;
}
.openerp .oe-treeview-table .treeview-tr.oe-treeview-first {
background: transparent url(/web/static/src/img/expand.gif) 0 50% no-repeat;
}
.openerp .oe-treeview-table .oe_open .treeview-tr.oe-treeview-first {
background-image: url(/web/static/src/img/collapse.gif);
}
.openerp .oe-treeview-table .treeview-tr.oe-treeview-first span, .openerp .oe-treeview-table .treeview-td.oe-treeview-first span {
margin-left: 16px;
}
.kitten-mode-activated {
background-image: url(http://placekitten.com/g/1365/769);
background-size: cover;
@ -2489,9 +2541,3 @@
.kitten-mode-activated > * {
opacity: 0.7;
}
div.ui-widget-overlay {
background: black;
filter: alpha(opacity=30);
opacity: 0.3;
}

View File

@ -97,6 +97,35 @@ $sheet-max-width: 860px
color: $color
// }}}
// CSS animation bounces {{{
@-moz-keyframes bounce
0%
-moz-transform: scale(0)
opacity: 0
50%
-moz-transform: scale(1.3)
opacity: 0.4
75%
-moz-transform: scale(0.9)
opacity: 0.7
100%
-moz-transform: scale(1)
opacity: 1
@-webkit-keyframes bounce
0%
-webkit-transform: scale(0)
opacity: 0
50%
-webkit-transform: scale(1.3)
opacity: 0.4
75%
-webkit-transform: scale(0.9)
opacity: 0.7
100%
-webkit-transform: scale(1)
opacity: 1
// }}}
.openerp.openerp_webclient_container
height: 100%
@ -200,7 +229,9 @@ $sheet-max-width: 860px
width: auto
a.ui-state-active
background: #f0f0fa
div.ui-widget-overlay
background: black
@include opacity(0.3)
// Modal box
&.ui-dialog
display: none
@ -390,6 +421,9 @@ $sheet-max-width: 860px
text-decoration: none
.oe_star_on
color: gold
.oe_bounce
-moz-animation: bounce .40s linear
-webkit-animation: bounce .40s linear
// }}}
// Tags (for many2many tags, among others) {{{
.oe_tag
@ -1846,6 +1880,49 @@ $sheet-max-width: 860px
input
text-align: right
// }}}
// Tree view {{{
.tree_header
background-color: #f0f0f0
border-bottom: 1px solid #cacaca
color: #4c4c4c
padding: 5px
height: 25px
button
float: right
height: 27px
margin-right: 5px
.oe-treeview-table
width: 100%
background-color: white
border-spacing: 0
th
padding: 10px
color: #4c4c4c
font-weight: bold
background-color: #f0f0f0
border-bottom: 2px solid #cacaca
.treeview-tr, .treeview-td
cursor: pointer
border-right: 1px dotted #afafb6
vertical-align: top
text-align: left
border-bottom: 1px solid #cfcccc
tr:hover
background-color: #e0e0f8
.oe-number
text-align: right !important
span
font-size: 90%
font-weight: normal
white-space: nowrap
display: block
.treeview-tr.oe-treeview-first
background: transparent url(/web/static/src/img/expand.gif) 0 50% no-repeat
.oe_open .treeview-tr.oe-treeview-first
background-image: url(/web/static/src/img/collapse.gif)
.treeview-tr.oe-treeview-first span, .treeview-td.oe-treeview-first span
margin-left: 16px
// }}}
// Translation {{{
.oe_trad_field.touched
border: 1px solid green !important
@ -1903,49 +1980,6 @@ $sheet-max-width: 860px
float: right
color: #333
// }}}
//Tree view
.openerp
.tree_header
background-color: #f0f0f0
border-bottom: 1px solid #cacaca
color: #4c4c4c
padding: 5px
height: 25px
button
float: right
height: 27px
margin-right: 5px
.oe-treeview-table
width: 100%
background-color: white
border-spacing: 0
th
padding: 10px
color: #4c4c4c
font-weight: bold
background-color: #f0f0f0
border-bottom: 2px solid #cacaca
.treeview-tr, .treeview-td
cursor: pointer
border-right: 1px dotted #afafb6
vertical-align: top
text-align: left
border-bottom: 1px solid #cfcccc
tr:hover
background-color: #e0e0f8
.oe-number
text-align: right !important
span
font-size: 90%
font-weight: normal
white-space: nowrap
display: block
.treeview-tr.oe-treeview-first
background: transparent url(/web/static/src/img/expand.gif) 0 50% no-repeat
.oe_open .treeview-tr.oe-treeview-first
background-image: url(/web/static/src/img/collapse.gif)
.treeview-tr.oe-treeview-first span, .treeview-td.oe-treeview-first span
margin-left: 16px
// Kitten Mode {{{
.kitten-mode-activated
background-image: url(http://placekitten.com/g/1365/769)
@ -1956,8 +1990,6 @@ $sheet-max-width: 860px
// }}}
div.ui-widget-overlay
background: black
@include opacity(0.3)
// au BufWritePost,FileWritePost *.sass :!sass --style expanded --line-numbers <afile> > "%:p:r.css"
// vim:tabstop=4:shiftwidth=4:softtabstop=4:fdm=marker:

View File

@ -387,8 +387,16 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
var fields = $(form).serializeArray();
self.rpc("/web/database/create", {'fields': fields}, function(result) {
var form_obj = self.to_object(fields);
self.getParent().do_login( form_obj['db_name'], 'admin', form_obj['create_admin_pwd']);
self.destroy();
var client_action = {
type: 'ir.actions.client',
tag: 'login',
params: {
'db': form_obj['db_name'],
'login': 'admin',
'password': form_obj['create_admin_pwd'],
},
};
self.do_action(client_action);
});
},
@ -473,19 +481,22 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
});
},
do_exit: function () {
this.do_action("login");
}
});
instance.web.client_actions.add("database_manager", "instance.web.DatabaseManager");
instance.web.Login = instance.web.Widget.extend({
template: "Login",
remember_credentials: true,
_db_list: null,
init: function(parent) {
init: function(parent, params) {
this._super(parent);
this.has_local_storage = typeof(localStorage) != 'undefined';
this.selected_db = null;
this.selected_login = null;
this.params = params;
if (this.has_local_storage && this.remember_credentials) {
this.selected_db = localStorage.getItem('last_db_login_success');
@ -495,26 +506,17 @@ instance.web.Login = instance.web.Widget.extend({
}
}
},
open_db_manager: function(){
var self = this;
self.$element.find('.oe_login_bottom').hide();
self.$element.find('.oe_login_pane').hide();
self.databasemanager = new instance.web.DatabaseManager(self);
self.databasemanager.appendTo(self.$element);
self.databasemanager.do_exit.add_last(function() {
self.databasemanager.destroy();
self.$element.find('.oe_login_bottom').show();
self.$element.find('.oe_login_pane').show();
self.load_db_list(true).then(self.on_db_list_loaded);
});
},
start: function() {
var self = this;
self.$element.find("form").submit(self.on_submit);
self.$element.find('.oe_login_manage_db').click(function() {
self.open_db_manager();
self.do_action("database_manager");
});
return self.load_db_list().then(self.on_db_list_loaded).then(function() {
if(self.params) {
self.do_login(self.params.db, self.params.login, self.params.password);
}
});
return self.load_db_list().then(self.on_db_list_loaded);
},
load_db_list: function (force) {
var d = $.when(), self = this;
@ -535,7 +537,7 @@ instance.web.Login = instance.web.Widget.extend({
var dbdiv = this.$element.find('div.oe_login_dbpane');
this.$element.find("[name=db]").replaceWith(instance.web.qweb.render('Login.dblist', { db_list: list, selected_db: this.selected_db}));
if(list.length === 0) {
self.open_db_manager();
this.do_action("database_manager");
} else if(list && list.length === 1) {
dbdiv.hide();
} else {
@ -582,13 +584,24 @@ instance.web.Login = instance.web.Widget.extend({
localStorage.setItem('last_password_login_success', '');
}
}
self.trigger("login");
self.do_action("login_sucessful");
},function () {
self.$(".oe_login_pane").fadeIn("fast");
self.$element.addClass("oe_login_invalid");
});
}
});
instance.web.client_actions.add("login", "instance.web.Login");
instance.web.LoginSuccessful = instance.web.Widget.extend({
init: function(parent) {
this._super(parent);
},
start: function() {
this.getParent().getParent().show_application();
},
});
instance.web.client_actions.add("login_sucessful", "instance.web.LoginSuccessful");
instance.web.Menu = instance.web.Widget.extend({
template: 'Menu',
@ -964,19 +977,16 @@ instance.web.WebClient = instance.web.Client.extend({
data: {debug: file + ':' + line}
});
};
// TODO: deprecate and use login client action
self.login = new instance.web.Login(self);
self.login.on("login",self,self.show_application);
},
show_login: function() {
var self = this;
self.$('.oe_topbar').hide();
self.login.appendTo(self.$element);
self.action_manager.do_action("login");
//self.login.appendTo(self.$element);
},
show_application: function() {
var self = this;
self.$('.oe_topbar').show();
self.login.$element.hide();
self.menu = new instance.web.Menu(self);
self.menu.replace(this.$element.find('.oe_menu_placeholder'));
self.menu.on('menu_click', this, this.on_menu_action);
@ -1057,6 +1067,7 @@ instance.web.WebClient = instance.web.Client.extend({
},
do_push_state: function(state) {
this.set_title(state.title);
delete state.title;
var url = '#' + $.param(state);
this._current_state = _.clone(state);
$.bbq.pushState(url);
@ -1083,10 +1094,13 @@ instance.web.WebClient = instance.web.Client.extend({
}
},
set_content_full_screen: function(fullscreen) {
if (fullscreen)
if (fullscreen) {
$(".oe_webclient", this.$element).addClass("oe_content_full_screen");
else
$("body").css({'overflow-y':'hidden'});
} else {
$(".oe_webclient", this.$element).removeClass("oe_content_full_screen");
$("body").css({'overflow-y':'scroll'});
}
}
});

View File

@ -163,6 +163,15 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
{ label: _t('Set Default'), callback: function (item) { self.open_defaults_dialog(); } },
]);
}
// Add bounce effect on button 'Edit' when click on readonly page view.
this.$element.find(".oe_form_field, .oe_form_group_cell").on('click', function (e) {
if(self.get("actual_mode") == "view") {
var $button = self.options.$buttons.find(".oe_form_button_edit");
$button.wrap('<div>').css('margin-right','4px').addClass('oe_left oe_bounce');
}
});
this.has_been_loaded.resolve();
return $.when();
},
@ -1673,6 +1682,9 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({
// TODO fme: provide enter key binding to widgets
this.view.default_focus_button = this;
}
if (this.node.attrs.icon && (! /\//.test(this.node.attrs.icon))) {
this.node.attrs.icon = '/web/static/src/img/icons/' + this.node.attrs.icon + '.png';
}
this.view.on('view_content_has_changed', this, this.check_disable);
},
start: function() {

View File

@ -357,6 +357,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
{ label: _t('Delete'), callback: this.do_delete_selected },
]);
this.sidebar.add_toolbar(this.fields_view.toolbar);
this.sidebar.$element.hide();
}
},
/**
@ -493,9 +494,6 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
},
do_show: function () {
this._super();
if (this.sidebar) {
this.sidebar.$element.show();
}
if (this.$buttons) {
this.$buttons.show();
}

View File

@ -120,7 +120,9 @@ instance.web.ActionManager = instance.web.Widget.extend({
if (this.getParent() && this.getParent().do_push_state) {
if (this.inner_action) {
state['title'] = this.inner_action.name;
state['model'] = this.inner_action.res_model;
if(this.inner_action.type == 'ir.actions.act_window') {
state['model'] = this.inner_action.res_model;
}
if (this.inner_action.id) {
state['action_id'] = this.inner_action.id;
}
@ -178,7 +180,10 @@ instance.web.ActionManager = instance.web.Widget.extend({
});
},
do_action: function(action, on_close) {
if (_.isNumber(action) || _.isString(action)) {
if (_.isString(action) && instance.web.client_actions.contains(action)) {
var action_client = { type: "ir.actions.client", tag: action };
return this.do_action(action_client);
} else if (_.isNumber(action) || _.isString(action)) {
var self = this;
return self.rpc("/web/action/load", { action_id: action }, function(result) {
self.do_action(result.result, on_close);
@ -223,7 +228,7 @@ instance.web.ActionManager = instance.web.Widget.extend({
// These buttons will be overwrited by <footer> if any
this.dialog = new instance.web.Dialog(this, {
buttons: { "Close": function() { $(this).dialog("close"); }},
dialogClass: 'oe_act_window'
dialogClass: 'oe_act_window'
});
if(on_close)
this.dialog.on_close.add(on_close);
@ -270,6 +275,8 @@ instance.web.ActionManager = instance.web.Widget.extend({
widget: this.inner_widget,
title: action.name
});
this.inner_action = action;
this.do_push_state({});
this.inner_widget.appendTo(this.$element);
},
ir_actions_report_xml: function(action, on_closed) {

View File

@ -653,9 +653,7 @@
t-att-style="view.style_for(record)">
<t t-set="asData" t-value="record.toForm().data"/>
<t t-foreach="columns" t-as="column">
<td t-if="column.meta">
</td>
<td t-if="column.meta"> </td>
</t>
<th t-if="options.selectable" class="oe_list_record_selector" width="1">
<t t-set="checked" t-value="options.select_view_id == record.get('id') ? 'checked' : null"/>
@ -674,7 +672,6 @@
<button type="button" name="delete" class="oe_i">d</button>
</td>
</tr>
<t t-extend="ListView.buttons">
<t t-jquery="button.oe_list_add" t-operation="after">
<button class="oe_button oe_list_save oe_highlight"
@ -684,6 +681,15 @@
<a href="#" class="oe_bold oe_list_discard">discard</a>
</t>
</t>
<t t-extend="ListView.row">
<!-- adds back padding to row being rendered after edition, if necessary
(if not deletable add back padding), otherwise the row being added is
missing columns
-->
<t t-jquery="&gt; :last" t-operation="after">
<td t-if="edited and !options.deletable" class="oe-listview-padding"/>
</t>
</t>
<t t-name="FormView">
<div class="oe_formview">
@ -976,7 +982,6 @@
</t>
</span>
</t>
<!-- Collection of m2m tags -->
<t t-name="FieldMany2ManyTags">
<div class="oe_form_field oe_tags" t-att-style="widget.node.attrs.style">
<t t-if="! widget.get('effective_readonly')">
@ -985,7 +990,6 @@
</t>
</div>
</t>
<!-- Individual m2m tag element -->
<t t-name="FieldMany2ManyTag">
<t t-set="i" t-value="0"/>
<t t-foreach="elements" t-as="el">
@ -1133,7 +1137,7 @@
t-att-style="widget.node.attrs.style"
t-att-tabindex="widget.node.attrs.tabindex"
t-att-autofocus="widget.node.attrs.autofocus">
<img t-if="widget.node.attrs.icon" t-att-src="_s + '/web/static/src/img/icons/' + widget.node.attrs.icon + '.png'" width="16" height="16"/>
<img t-if="widget.node.attrs.icon" t-att-src="_s + widget.node.attrs.icon" width="16" height="16"/>
<span t-if="widget.string"><t t-esc="widget.string"/></span>
</button>
</t>
@ -1191,6 +1195,41 @@
</table>
</t>
<t t-name="AbstractFormPopup.render">
<div>
<table style="width:100%">
<tr style="width:100%">
<td style="width:100%">
<div class="oe_popup_search" style="width:100%"></div>
</td>
</tr>
<tr style="width:100%">
<td style="width:100%">
<div class="oe_popup_list" style="width:100%"></div>
</td>
</tr>
</table>
<div class="oe_popup_form" style="width:100%"></div>
</div>
</t>
<t t-name="SelectCreatePopup.search.buttons">
<t t-if="! widget.options.disable_multiple_selection">
<button type="button" class="oe_button oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
or
</t>
<a class="oe_button oe_selectcreatepopup-search-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Cancel</a>
</t>
<t t-name="AbstractFormPopup.buttons">
<t t-if="! multi_select">
<button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save</button>
</t>
<t t-if="multi_select">
<button type="button" class="oe_button oe_abstractformpopup-form-save-new oe_highlight">Save &amp; New</button>
<button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save &amp; Close</button>
</t>
or <a class="oe_button oe_abstractformpopup-form-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Discard</a>
</t>
<t t-name="One2Many.viewmanager" t-extend="ViewManager">
<t t-jquery=".oe-view-manager-header">
this.attr('t-if', 'views.length != 1');
@ -1243,7 +1282,6 @@
<span t-name="SearchView.FacetView.Value" class="oe_facet_value">
<t t-esc="widget.model.get('label')"/>
</span>
<t t-name="SearchView.managed-filters">
<option class="oe_search_filters_title" value="">Filters</option>
<optgroup label="-- Filters --">
@ -1268,7 +1306,6 @@
<p>(Any existing filter with the same name will be replaced)</p>
</div>
</t>
<t t-name="SearchView.render_lines">
<table class="oe_search_render_line" border="0" cellspacing="0" cellpadding="0"
t-foreach="lines" t-as="line">
@ -1465,49 +1502,6 @@
</t>
</select>
</t>
<t t-name="AbstractFormPopup.render">
<div>
<table style="width:100%">
<tr style="width:100%">
<td style="width:100%">
<div class="oe_popup_search" style="width:100%"></div>
</td>
</tr>
<tr style="width:100%">
<td style="width:100%">
<div class="oe_popup_list" style="width:100%"></div>
</td>
</tr>
</table>
<div class="oe_popup_form" style="width:100%"></div>
</div>
</t>
<t t-name="SelectCreatePopup.search.buttons">
<t t-if="! widget.options.disable_multiple_selection">
<button type="button" class="oe_button oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
or
</t>
<a class="oe_button oe_selectcreatepopup-search-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Cancel</a>
</t>
<t t-name="AbstractFormPopup.buttons">
<t t-if="! multi_select">
<button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save</button>
</t>
<t t-if="multi_select">
<button type="button" class="oe_button oe_abstractformpopup-form-save-new oe_highlight">Save &amp; New</button>
<button type="button" class="oe_button oe_abstractformpopup-form-save oe_highlight">Save &amp; Close</button>
</t>
or <a class="oe_button oe_abstractformpopup-form-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Cancel</a>
</t>
<t t-extend="ListView.row">
<!-- adds back padding to row being rendered after edition, if necessary
(if not deletable add back padding), otherwise the row being added is
missing columns
-->
<t t-jquery="&gt; :last" t-operation="after">
<td t-if="edited and !options.deletable" class="oe-listview-padding"/>
</t>
</t>
<t t-name="view_editor">
<table class="oe_view_editor">
@ -1572,6 +1566,7 @@
<t t-name="vieweditor_boolean">
<input type="checkbox" t-att-id="widget.name"/>
</t>
<t t-name="ExportView">
<a id="exportview" href="javascript: void(0)" style="text-decoration: none;color: #3D3D3D;">Export</a>
</t>

View File

@ -420,6 +420,15 @@ instance.web_kanban.KanbanGroup = instance.web.OldWidget.extend({
self.quick.appendTo($(".oe_kanban_group_list_header", self.$records));
self.quick.focus();
});
// Add bounce effect on image '+' of kanban header when click on empty space of kanban grouped column.
var add_btn = this.$element.find('.oe_kanban_add');
this.$records.click(function (ev) {
if (ev.target == ev.currentTarget) {
if (!self.state.folded) {
add_btn.wrap('<div>').addClass('oe_bounce');
}
}
});
this.$records.find('.oe_kanban_show_more').click(this.do_show_more);
if (this.state.folded) {
this.do_toggle_fold();