summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/fields
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2018-01-10 20:35:53 +0100
committerChristophe Simonis <chs@odoo.com>2018-01-10 20:35:53 +0100
commit782154da11975b9db4620d7d39df3b567f3abcdc (patch)
tree8cfe110e53ccfcee7a06421d6367b88d51d60add /addons/web/static/src/js/fields
parent61bb46c82ba8113dddc0a95bd86cb029fbbf110e (diff)
parentf6ef0c776096774fc4c6821449ab42cfc2f53e62 (diff)
[MERGE] forward port branch saas-11.1 up to f6ef0c77609
Diffstat (limited to 'addons/web/static/src/js/fields')
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js21
-rw-r--r--addons/web/static/src/js/fields/field_registry.js1
-rw-r--r--addons/web/static/src/js/fields/field_utils.js22
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js8
4 files changed, 50 insertions, 2 deletions
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index eb56844de14..d0662fe7cef 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -582,6 +582,7 @@ var FieldMonetary = InputField.extend({
this.formatOptions.currency = this.currency;
this.formatOptions.digits = [16, 2];
+ this.formatOptions.field_digits = this.nodeOptions.field_digits;
},
//--------------------------------------------------------------------------
@@ -1311,6 +1312,25 @@ var FieldBinaryFile = AbstractFieldBinary.extend({
},
});
+var FieldBinaryDownloadLink = AbstractFieldBinary.extend({
+ template: 'FieldBinaryDownloadLink',
+ events: _.extend({}, AbstractFieldBinary.prototype.events, {
+ 'click': function (ev) {
+ ev.stopPropagation();
+ },
+ }),
+ supportedFieldTypes: ['binary'],
+ init: function () {
+ this._super.apply(this, arguments);
+ this.filename = _t("Binary File");
+ if (this.nodeOptions.filename && this.recordData[this.nodeOptions.filename]) {
+ this.filename = this.recordData[this.nodeOptions.filename];
+ }
+ this.url = "data:application/octet-stream;base64," + this.value;
+ this.text = _t("Download");
+ },
+});
+
var PriorityWidget = AbstractField.extend({
// the current implementation of this widget makes it
// only usable for fields of type selection
@@ -2541,6 +2561,7 @@ return {
TranslatableFieldMixin: TranslatableFieldMixin,
DebouncedField: DebouncedField,
FieldEmail: FieldEmail,
+ FieldBinaryDownloadLink: FieldBinaryDownloadLink,
FieldBinaryFile: FieldBinaryFile,
FieldBinaryImage: FieldBinaryImage,
FieldBoolean: FieldBoolean,
diff --git a/addons/web/static/src/js/fields/field_registry.js b/addons/web/static/src/js/fields/field_registry.js
index 6692663d5f9..85b4fc1187f 100644
--- a/addons/web/static/src/js/fields/field_registry.js
+++ b/addons/web/static/src/js/fields/field_registry.js
@@ -33,6 +33,7 @@ registry
.add('email', basic_fields.FieldEmail)
.add('phone', basic_fields.FieldPhone)
.add('url', basic_fields.UrlWidget)
+ .add('download_link', basic_fields.FieldBinaryDownloadLink)
.add('image', basic_fields.FieldBinaryImage)
.add('binary', basic_fields.FieldBinaryFile)
.add('monetary', basic_fields.FieldMonetary)
diff --git a/addons/web/static/src/js/fields/field_utils.js b/addons/web/static/src/js/fields/field_utils.js
index 932ea997e6a..812a7f380f7 100644
--- a/addons/web/static/src/js/fields/field_utils.js
+++ b/addons/web/static/src/js/fields/field_utils.js
@@ -28,6 +28,20 @@ var _t = core._t;
//------------------------------------------------------------------------------
/**
+ *
+ * @param {string} value base64 representation of the binary
+ * @param {Object} [field]
+ * a description of the field (note: this parameter is ignored)
+ * @param {Object} [options] additional options (note: this parameter is ignored)
+ */
+function formatBinary(value, field, options) {
+ if (!value) {
+ return '';
+ }
+ return utils.human_size(value.length / 1.37); // base64 estimated size: http://en.wikipedia.org/wiki/Base64#MIME
+}
+
+/**
* @todo Really? it returns a jQuery element... We should try to avoid this and
* let DOM utility functions handle this directly. And replace this with a
* function that returns a string so we can get rid of the forceString.
@@ -286,8 +300,12 @@ function formatMonetary(value, field, options) {
currency = session.get_currency(currency_id);
}
+ var digits = (currency && currency.digits) || options.digits;
+ if (options.field_digits === true) {
+ digits = field.digits || digits;
+ }
var formatted_value = formatFloat(value, field, {
- digits: (currency && currency.digits) || options.digits,
+ digits: digits,
});
if (!currency || options.noSymbol) {
@@ -557,7 +575,7 @@ function parseMany2one(value) {
return {
format: {
- binary: _.identity, // todo
+ binary: formatBinary,
boolean: formatBoolean,
char: formatChar,
date: formatDate,
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index 677663a4967..1ee40bfccdb 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -1019,6 +1019,7 @@ var FieldX2Many = AbstractField.extend({
*/
_onEditLine: function (ev) {
ev.stopPropagation();
+ this.trigger_up('freeze_order', {id: this.value.id});
var editedRecord = this.value.data[ev.data.index];
this.renderer.setRowMode(editedRecord.id, 'edit')
.done(ev.data.onSuccess);
@@ -1105,6 +1106,7 @@ var FieldX2Many = AbstractField.extend({
*/
_onResequence: function (event) {
var self = this;
+ this.trigger_up('freeze_order', {id: this.value.id});
var rowIDs = event.data.rowIDs.slice();
var rowID = rowIDs.pop();
var defs = _.map(rowIDs, function (rowID, index) {
@@ -1124,6 +1126,11 @@ var FieldX2Many = AbstractField.extend({
operation: 'UPDATE',
id: rowID,
data: _.object([event.data.handleField], [event.data.offset + rowIDs.length]),
+ }).always(function () {
+ self.trigger_up('toggle_column_order', {
+ id: self.value.id,
+ name: event.data.handleField,
+ });
});
});
},
@@ -1230,6 +1237,7 @@ var FieldOne2Many = FieldX2Many.extend({
}
} else if (!this.creatingRecord) {
this.creatingRecord = true;
+ this.trigger_up('freeze_order', {id: this.value.id});
this._setValue({
operation: 'CREATE',
position: this.editable,