summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js20
-rw-r--r--addons/web/static/src/js/fields/field_registry.js1
-rw-r--r--addons/web/static/src/js/fields/field_utils.js16
3 files changed, 36 insertions, 1 deletions
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 09406b43711..38fc0cad439 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -1298,6 +1298,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
@@ -2528,6 +2547,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 6a6ad5a7a98..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.
@@ -561,7 +575,7 @@ function parseMany2one(value) {
return {
format: {
- binary: _.identity, // todo
+ binary: formatBinary,
boolean: formatBoolean,
char: formatChar,
date: formatDate,