summaryrefslogtreecommitdiff
path: root/addons/mrp/static/src/js/mrp_documents_controller_mixin.js
blob: 9bcaf3d6cf3c73e749a60f6d8f4252161d170cde (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
odoo.define('mrp.controllerMixin', function (require) {
'use strict';

const { _t, qweb } = require('web.core');
const fileUploadMixin = require('web.fileUploadMixin');
const DocumentViewer = require('mrp.MrpDocumentViewer');

const MrpDocumentsControllerMixin = Object.assign({}, fileUploadMixin, {
    events: {
        'click .o_mrp_documents_kanban_upload': '_onClickMrpDocumentsUpload',
    },
    custom_events: Object.assign({}, fileUploadMixin.custom_events, {
        kanban_image_clicked: '_onKanbanPreview',
        upload_file: '_onUploadFile',
    }),

    //--------------------------------------------------------------------------
    // Public
    //--------------------------------------------------------------------------

    /**
     * Called right after the reload of the view.
     */
    async reload() {
        await this._renderFileUploads();
    },

    /**
     * @override
     * @param {jQueryElement} $node
     */
    renderButtons($node) {
        this.$buttons = $(qweb.render('MrpDocumentsKanbanView.buttons'));
        this.$buttons.appendTo($node);
    },

    //--------------------------------------------------------------------------
    // Private
    //--------------------------------------------------------------------------

    /**
     * @override
     */
    _getFileUploadRoute() {
        return '/mrp/upload_attachment';
    },

    /**
     * @override
     * @param {integer} param0.recordId
     */
    _makeFileUploadFormDataKeys() {
        const context = this.model.get(this.handle, { raw: true }).getContext();
        return {
            res_id: context.default_res_id,
            res_model: context.default_res_model,
        };
    },

    //--------------------------------------------------------------------------
    // Handlers
    //--------------------------------------------------------------------------

    /**
     * @private
     */
    _onClickMrpDocumentsUpload() {
        const $uploadInput = $('<input>', {
            type: 'file',
            name: 'files[]',
            multiple: 'multiple'
        });
        $uploadInput.on('change', async ev => {
            await this._uploadFiles(ev.target.files);
            $uploadInput.remove();
        });
        $uploadInput.click();
    },

    /**
     * Handles custom event to display the document viewer.
     *
     * @private
     * @param {OdooEvent} ev
     * @param {integer} ev.data.recordID
     * @param {Array<Object>} ev.data.recordList
     */
    _onKanbanPreview(ev) {
        ev.stopPropagation();
        const documents = ev.data.recordList;
        const documentID = ev.data.recordID;
        const documentViewer = new DocumentViewer(this, documents, documentID);
        documentViewer.appendTo(this.$('.o_mrp_documents_kanban_view'));
    },

    /**
     * Specially created to call `_uploadFiles` method from tests.
     *
     * @private
     * @param {OdooEvent} ev
     */
    async _onUploadFile(ev) {
        await this._uploadFiles(ev.data.files);
    },

    /**
     * @override
     * @param {Object} param0
     * @param {XMLHttpRequest} param0.xhr
     */
    _onUploadLoad({ xhr }) {
        const result = xhr.status === 200
            ? JSON.parse(xhr.response)
            : {
                error: _.str.sprintf(_t("status code: %s </br> message: %s"), xhr.status, xhr.response)
            };
        if (result.error) {
            this.do_notify(_t("Error"), result.error, true);
        }
        fileUploadMixin._onUploadLoad.apply(this, arguments);
    },
});

return MrpDocumentsControllerMixin;

});