Add link button

issue9051
review280841002
This commit is contained in:
Cédric Krier
2020-04-13 12:21:55 +02:00
parent b1d501ee66
commit 6239ce291a
6 changed files with 168 additions and 1 deletions
+1
View File
@@ -1,3 +1,4 @@
* Support link button on form
* Add URL for the current export
* Add option to export listed records
* Set treeview header sticky on top
+6 -1
View File
@@ -34,6 +34,7 @@
this.context = context;
this.actions = [];
this.state_widgets = [];
this.el = jQuery('<div/>', {
'class': 'board'
});
@@ -46,9 +47,13 @@
this.actions_prms = jQuery.when.apply(jQuery, actions_prms);
},
reload: function() {
for (var i = 0; i < this.actions.length; i++) {
var i;
for (i = 0; i < this.actions.length; i++) {
this.actions[i].display();
}
for (i = 0; i < this.state_widgets.length; i++) {
this.state_widgets[i].set_state(null);
}
}
});
+2
View File
@@ -544,6 +544,7 @@
this._timestamp = null;
this.resources = null;
this.button_clicks = {};
this.links_counts = {};
this.state_attrs = {};
this.autocompletion = {};
this.exception = false;
@@ -1242,6 +1243,7 @@
this._changed = {};
this._timestamp = null;
this.button_clicks = {};
this.links_counts = {};
},
_check_load: function(fields) {
if (!this.get_loaded(fields)) {
+3
View File
@@ -621,6 +621,9 @@ input.column-boolean {
text-align: left;
text-align: start;
}
.form-link {
display: none;
}
}
@media screen and (max-width: @screen-xs-max) {
+1
View File
@@ -1351,6 +1351,7 @@
action = this.board.actions[i];
action.screen.tab = this;
}
this.board.reload();
}.bind(this));
this.content.append(this.board.el);
}.bind(this));
+155
View File
@@ -95,6 +95,11 @@ function eval_pyson(value){
this.view.state_widgets.push(button);
this.container.add(button, attributes);
},
_parse_link: function(node, attributes) {
var link = new Sao.View.Form.Link(attributes);
this.view.state_widgets.push(link);
this.container.add(link, attributes);
},
_parse_image: function(node, attributes) {
var image = new Sao.View.Form.Image_(attributes);
this.view.state_widgets.push(image);
@@ -884,6 +889,156 @@ function eval_pyson(value){
}
});
Sao.View.Form.Link = Sao.class_(Sao.View.Form.StateWidget, {
class_: 'form-link',
init: function(attributes) {
Sao.View.Form.Link._super.init.call(this, attributes);
this.el = jQuery('<button/>', {
'class': this.class_ + ' btn btn-link',
});
if (attributes.icon) {
var img = jQuery('<img/>', {
'class': 'icon',
}).prependTo(this.el);
Sao.common.ICONFACTORY.get_icon_url(attributes.icon)
.done(function(url) {
img.attr('src', url);
});
}
this.label = jQuery('<div/>').appendTo(this.el);
this._current = null;
},
get action_id() {
return parseInt(this.attributes.id, 10);
},
set_state: function(record) {
Sao.View.Form.Link._super.set_state.call(this, record);
if (this.el.css('display') == 'none') {
return;
}
var data = {},
context = {},
pyson_ctx = {};
if (record) {
data = {
model: record.model.name,
id: record.id,
ids: [record.id],
};
context = record.get_context();
pyson_ctx = {
active_model: record.model.name,
active_id: record.id,
active_ids: [record.id],
};
this._current = record.id;
} else {
this._current = null;
}
pyson_ctx.context = context;
this.el.off('click');
this.el.click([data, context], this.clicked.bind(this));
var action = Sao.rpc({
'method': 'model.ir.action.get_action_value',
'params': [this.action_id, context],
}, Sao.Session.current_session, false);
this.label.text(action.rec_name);
var decoder = new Sao.PYSON.Decoder(pyson_ctx);
var domain = decoder.decode(action.pyson_domain);
if (action.pyson_search_value) {
domain = [domain, decoder.decode(action.pyson_search_value)];
}
var tab_domains = action.domains
.filter(function(d) {
return d[2];
}).map(function(d) {
var name = d[0],
domain = d[1];
return [name, decoder.decode(domain)];
});
var counter;
if (record && record.links_counts[this.action_id]) {
counter = record.links_counts[this.action_id];
this.set_label(action.rec_name, tab_domains, counter);
} else {
if (tab_domains.length) {
counter = tab_domains.map(function() {
return 0;
});
} else {
counter = [0];
}
if (record) {
record.links_counts[this.action_id] = counter;
}
var current = this._current;
if (tab_domains.length) {
tab_domains.map(function(d, i) {
var tab_domain = d[1];
Sao.rpc({
'method': (
'model.' + action.res_model + '.search_count'),
'params': [
['AND', domain, tab_domain], context],
}, Sao.Session.current_session).then(function(value) {
this._set_count(
value, i, current, counter,
action.rec_name, tab_domains);
}.bind(this));
}, this);
} else {
Sao.rpc({
'method': (
'model.' + action.res_model + '.search_count'),
'params': [domain, context],
}, Sao.Session.current_session).then(function(value) {
this._set_count(
value, 0, current, counter,
action.rec_name, tab_domains);
}.bind(this));
}
}
},
_set_count: function(value, idx, current, counter, name, domains) {
if (current != this._current) {
return;
}
counter[idx] = value;
this.set_label(name, domains, counter);
},
set_label: function(name, domains, counter) {
this.label.text(name);
if (domains.length) {
domains.map(function(d, i) {
var name = d[0];
this.label.append(name + ' ');
jQuery('<span/>', {
'class': 'badge',
}).text(counter[i]).appendTo(this.label);
}, this);
} else {
this.label.append(' ');
jQuery('<span/>', {
'class': 'badge',
}).text(counter[0]).appendTo(this.label);
}
if (this.attributes.empty === 'hide') {
var non_empty = counter.filter(function(number) {
return number != 0;
});
if (non_empty.length) {
this.el.show();
} else {
this.el.hide();
}
}
},
clicked: function(evt) {
Sao.Action.execute(this.action_id, evt.data[0], evt.data[1], true);
},
});
Sao.View.Form.Image_ = Sao.class_(Sao.View.Form.StateWidget, {
class_: 'form-image_',
init: function(attributes) {