From b52dd8051f3e98aab4f6f8583a1b48b056bde743 Mon Sep 17 00:00:00 2001 From: AHIDev Date: Thu, 8 Aug 2024 15:49:01 +0400 Subject: [PATCH] [MOD] default max size check has been removed and message dialog change to notification --- .../js/odx_many2many_attachment_preview.js | 497 +++++++++--------- 1 file changed, 256 insertions(+), 241 deletions(-) diff --git a/odex25_base/odx_m2m_attachment_preview/static/src/js/odx_many2many_attachment_preview.js b/odex25_base/odx_m2m_attachment_preview/static/src/js/odx_many2many_attachment_preview.js index 1af7f491a..bd645e406 100644 --- a/odex25_base/odx_m2m_attachment_preview/static/src/js/odx_many2many_attachment_preview.js +++ b/odex25_base/odx_m2m_attachment_preview/static/src/js/odx_many2many_attachment_preview.js @@ -2,284 +2,299 @@ odoo.define('odx_m2m_attachment_preview.odx_many2many_attachment_preview', funct "use strict"; -var AbstractField = require('web.AbstractField'); -var field_registry = require('web.field_registry'); -var core = require('web.core'); -var relational_fields = require('web.relational_fields'); -var DocumentViewer = require('odx_m2m_attachment_preview.DocumentViewer'); -var session = require('web.session'); -var rpc = require('web.rpc'); -var Dialog = require('web.Dialog'); + var AbstractField = require('web.AbstractField'); + var field_registry = require('web.field_registry'); + var core = require('web.core'); + var relational_fields = require('web.relational_fields'); + var DocumentViewer = require('odx_m2m_attachment_preview.DocumentViewer'); + var session = require('web.session'); + var rpc = require('web.rpc'); + var Notification = require('web.Notification'); -var _t = core._t; -var _lt = core._lt; -var qweb = core.qweb; -/** - * Widget to upload or delete one or more files at the same time. - */ -var FieldMany2ManyAttachmentPreview = AbstractField.extend({ - - - - template: "FieldBinaryFileUploader", - template_files: "FieldAttachmentFileUploader.files", - supportedFieldTypes: ['many2many'], - fieldsToFetch: { - name: {type: 'char'}, - mimetype: {type: 'char'}, - }, - - events: { - 'click .o_attach': '_onAttach', - 'click .o_attachment_delete': '_onDelete', - 'change .o_input_file': '_onFileChanged', - 'click .o_attachment_wrap': '_previewAttachment', - }, + var _t = core._t; + var _lt = core._lt; + var qweb = core.qweb; /** - * @constructor + * Widget to upload or delete one or more files at the same time. */ - init: function () { - this._super.apply(this, arguments); + var FieldMany2ManyAttachmentPreview = AbstractField.extend({ - if (this.field.type !== 'many2many' || this.field.relation !== 'ir.attachment') { - var msg = _t("The type of the field '%s' must be a many2many field with a relation to 'ir.attachment' model."); - throw _.str.sprintf(msg, this.field.string); - } - this.uploadedFiles = {}; - this.uploadingFiles = []; - this.fileupload_id = _.uniqueId('oe_fileupload_temp'); - this.accepted_file_extensions = (this.nodeOptions && this.nodeOptions.accepted_file_extensions) || this.accepted_file_extensions || '*'; - $(window).on(this.fileupload_id, this._onFileLoaded.bind(this)); - this.fileMaxSize = 0; - this.metadata = {}; - this._getMaxFileSize(); - }, - destroy: function () { - this._super(); - $(window).off(this.fileupload_id); - }, + template: "FieldBinaryFileUploader", + template_files: "FieldAttachmentFileUploader.files", + supportedFieldTypes: ['many2many'], + fieldsToFetch: { + name: { + type: 'char' + }, + mimetype: { + type: 'char' + }, + }, - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- + events: { + 'click .o_attach': '_onAttach', + 'click .o_attachment_delete': '_onDelete', + 'change .o_input_file': '_onFileChanged', + 'click .o_attachment_wrap': '_previewAttachment', + }, + /** + * @constructor + */ + init: function () { + this._super.apply(this, arguments); - /** - * Compute the URL of an attachment. - * - * @private - * @param {Object} attachment - * @returns {string} URL of the attachment - */ - _getFileUrl: function (attachment) { - // return '/web/content/' + attachment.id + '?download=true'; - return '/web/content/' + attachment.id; - }, - /** - * Process the field data to add some information (url, etc.). - * - * @private - */ - _generatedMetadata: function () { - var self = this; - _.each(this.value.data, function (record) { - // tagging `allowUnlink` ascertains if the attachment was user - // uploaded or was an existing or system generated attachment - self.metadata[record.id] = { - allowUnlink: self.uploadedFiles[record.data.id] || false, - url: self._getFileUrl(record.data), - }; - }); - }, - /** - * @private - * @override - */ - _render: function () { - // render the attachments ; as the attachments will changes after each - // _setValue, we put the rendering here to ensure they will be updated - this._generatedMetadata(); - this.$('.oe_placeholder_files, .o_attachments') - .replaceWith($(qweb.render(this.template_files, { - widget: this, - }))); - this.$('.oe_fileupload').show(); - - this.$('.o_image[data-mimetype^="image"]').each(function () { - var $img = $(this); - if (/gif|jpe|jpg|png/.test($img.data('mimetype')) && $img.data('src')) { - $img.css('background-image', "url('" + $img.data('src') + "')"); + if (this.field.type !== 'many2many' || this.field.relation !== 'ir.attachment') { + var msg = _t("The type of the field '%s' must be a many2many field with a relation to 'ir.attachment' model."); + throw _.str.sprintf(msg, this.field.string); } - }); - }, - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- + this.uploadedFiles = {}; + this.uploadingFiles = []; + this.fileupload_id = _.uniqueId('oe_fileupload_temp'); + this.accepted_file_extensions = (this.nodeOptions && this.nodeOptions.accepted_file_extensions) || this.accepted_file_extensions || '*'; + $(window).on(this.fileupload_id, this._onFileLoaded.bind(this)); + this.fileMaxSize = 0; + this.metadata = {}; + this._getMaxFileSize(); + }, - /** - * @private - */ - _onAttach: function () { - // This widget uses a hidden form to upload files. Clicking on 'Attach' - // will simulate a click on the related input. - this.$('.o_input_file').click(); - }, - /** - * @private - * @param {MouseEvent} ev - */ - _onDelete: function (ev) { - ev.preventDefault(); - ev.stopPropagation(); + destroy: function () { + this._super(); + $(window).off(this.fileupload_id); + }, - var fileID = $(ev.currentTarget).data('id'); - var record = _.findWhere(this.value.data, {res_id: fileID}); - if (record) { - this._setValue({ - operation: 'FORGET', - ids: [record.id], + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * Compute the URL of an attachment. + * + * @private + * @param {Object} attachment + * @returns {string} URL of the attachment + */ + _getFileUrl: function (attachment) { + // return '/web/content/' + attachment.id + '?download=true'; + return '/web/content/' + attachment.id; + }, + /** + * Process the field data to add some information (url, etc.). + * + * @private + */ + _generatedMetadata: function () { + var self = this; + _.each(this.value.data, function (record) { + // tagging `allowUnlink` ascertains if the attachment was user + // uploaded or was an existing or system generated attachment + self.metadata[record.id] = { + allowUnlink: self.uploadedFiles[record.data.id] || false, + url: self._getFileUrl(record.data), + }; }); - var metadata = this.metadata[record.id]; - if (!metadata || metadata.allowUnlink) { - this._rpc({ - model: 'ir.attachment', - method: 'unlink', - args: [record.res_id], + }, + /** + * @private + * @override + */ + _render: function () { + // render the attachments ; as the attachments will changes after each + // _setValue, we put the rendering here to ensure they will be updated + this._generatedMetadata(); + this.$('.oe_placeholder_files, .o_attachments') + .replaceWith($(qweb.render(this.template_files, { + widget: this, + }))); + this.$('.oe_fileupload').show(); + + this.$('.o_image[data-mimetype^="image"]').each(function () { + var $img = $(this); + if (/gif|jpe|jpg|png/.test($img.data('mimetype')) && $img.data('src')) { + $img.css('background-image', "url('" + $img.data('src') + "')"); + } + }); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + */ + _onAttach: function () { + // This widget uses a hidden form to upload files. Clicking on 'Attach' + // will simulate a click on the related input. + this.$('.o_input_file').click(); + }, + /** + * @private + * @param {MouseEvent} ev + */ + _onDelete: function (ev) { + ev.preventDefault(); + ev.stopPropagation(); + + var fileID = $(ev.currentTarget).data('id'); + var record = _.findWhere(this.value.data, { + res_id: fileID + }); + if (record) { + this._setValue({ + operation: 'FORGET', + ids: [record.id], }); + var metadata = this.metadata[record.id]; + if (!metadata || metadata.allowUnlink) { + this._rpc({ + model: 'ir.attachment', + method: 'unlink', + args: [record.res_id], + }); + } } - } - }, - /** - * @private - * @param {Event} ev - */ - _onFileChanged: function (ev) { - var self = this; - ev.stopPropagation(); + }, + /** + * @private + * @param {Event} ev + */ + _onFileChanged: function (ev) { + var self = this; + ev.stopPropagation(); - var files = ev.target.files; - var attachment_ids = this.value.res_ids; - var file_status = true; + var files = ev.target.files; + var attachment_ids = this.value.res_ids; + var file_status = true; - // Don't create an attachment if the upload window is cancelled. - if(files.length === 0) - return; + // Don't create an attachment if the upload window is cancelled. + if (files.length === 0) + return; - _.each(files, function (file) { - var record = _.find(self.value.data, function (attachment) { - return attachment.data.name === file.name; - }); + _.each(files, function (file) { + var record = _.find(self.value.data, function (attachment) { + return attachment.data.name === file.name; + }); - // check max file size - if (self.fileMaxSize !== 0) { - if(file.size > self.fileMaxSize){ + // check max file size + if (file.size > self.fileMaxSize) { file_status = false; - Dialog.alert(this, _.str.sprintf(_t('The selected file exceeds the maximum file size of %s MB'),(self.fileMaxSize/1024/1024)), { - title: _t("Validation Error"), + + self.displayNotification({ + type: "danger", + message: _.str.sprintf(_t('The selected file exceeds the maximum file size of %s MB'), (self.fileMaxSize / 1024 / 1024)) }); return false; } - } - if(file_status){ - if (record) { - var metadata = self.metadata[record.id]; - if (!metadata || metadata.allowUnlink) { - // there is a existing attachment with the same name so we - // replace it - attachment_ids = _.without(attachment_ids, record.res_id); - self._rpc({ - model: 'ir.attachment', - method: 'unlink', - args: [record.res_id], - }); + if (file_status) { + if (record) { + var metadata = self.metadata[record.id]; + if (!metadata || metadata.allowUnlink) { + // there is a existing attachment with the same name so we + // replace it + attachment_ids = _.without(attachment_ids, record.res_id); + self._rpc({ + model: 'ir.attachment', + method: 'unlink', + args: [record.res_id], + }); + } } + self.uploadingFiles.push(file); } - self.uploadingFiles.push(file); - } - }); + }); + + if (file_status) { + this._setValue({ + operation: 'REPLACE_WITH', + ids: attachment_ids, + }); + + this.$('form.o_form_binary_form').submit(); + this.$('.oe_fileupload').hide(); + ev.target.value = ""; + } + }, + /** + * @private + */ + _onFileLoaded: function () { + var self = this; + // the first argument isn't a file but the jQuery.Event + var files = Array.prototype.slice.call(arguments, 1); + // files has been uploaded, clear uploading + this.uploadingFiles = []; + + var attachment_ids = this.value.res_ids; + _.each(files, function (file) { + if (file.error) { + self.displayNotification({ + title: _t('Uploading Error'), + message: file.error, + type: 'danger' + }); + } else { + attachment_ids.push(file.id); + self.uploadedFiles[file.id] = true; + } + }); - if(file_status){ this._setValue({ operation: 'REPLACE_WITH', ids: attachment_ids, }); + }, - this.$('form.o_form_binary_form').submit(); - this.$('.oe_fileupload').hide(); - ev.target.value = ""; - } - }, - /** - * @private - */ - _onFileLoaded: function () { - var self = this; - // the first argument isn't a file but the jQuery.Event - var files = Array.prototype.slice.call(arguments, 1); - // files has been uploaded, clear uploading - this.uploadingFiles = []; + _previewAttachment: function (ev) { + ev.stopPropagation(); + ev.preventDefault(); + var self = this; + var activeAttachmentID = $(ev.currentTarget).data('id'); + this._rpc({ + model: 'ir.attachment', + method: 'read_as_sudo', + kwargs: { + domain: [ + ['id', 'in', this.value.res_ids] + ], + fields: ['id', 'mimetype', 'index_content'], + }, + }).then(result => { + this.attachments = result.map(r => { + return { + id: r.id, + mimetype: r.mimetype, + fileType: r.index_content + } + }); + var attachmentViewer = new DocumentViewer(this, this.attachments, activeAttachmentID); + attachmentViewer.appendTo($('body')); + }) + }, - var attachment_ids = this.value.res_ids; - _.each(files, function (file) { - if (file.error) { - self.displayNotification({ title: _t('Uploading Error'), message: file.error, type: 'danger' }); - } else { - attachment_ids.push(file.id); - self.uploadedFiles[file.id] = true; - } - }); + _getMaxFileSize: async function () { + var self = this; - this._setValue({ - operation: 'REPLACE_WITH', - ids: attachment_ids, - }); - }, + await rpc.query({ + model: 'res.users', + method: 'read', + args: [ + [session.uid], + ['set_restriction', 'max_size'] + ], + }).then(function (result) { - _previewAttachment: function(ev) { - ev.stopPropagation(); - ev.preventDefault(); - var self = this; - var activeAttachmentID = $(ev.currentTarget).data('id'); - this._rpc({ - model: 'ir.attachment', - method: 'read_as_sudo', - kwargs: { - domain: [['id', 'in', this.value.res_ids]], - fields: ['id', 'mimetype', 'index_content'], - }, - }).then(result => { - this.attachments = result.map(r => { - return { - id: r.id, - mimetype: r.mimetype, - fileType: r.index_content + if (result[0].set_restriction) { + self.fileMaxSize = result[0].max_size * 1024 * 1024; } + }); - var attachmentViewer = new DocumentViewer(this, this.attachments, activeAttachmentID); - attachmentViewer.appendTo($('body')); - }) - }, + } + }); - _getMaxFileSize: async function () { - var self = this; - - await rpc.query({ - model: 'res.users', - method: 'read', - args: [[session.uid], ['set_restriction','max_size']], - }).then(function (result) { - - if(result[0].set_restriction){ - self.fileMaxSize = result[0].max_size * 1024 * 1024; - } - - }); - } -}); - -field_registry.add("many2many_attachment_preview", FieldMany2ManyAttachmentPreview); + field_registry.add("many2many_attachment_preview", FieldMany2ManyAttachmentPreview); }); \ No newline at end of file