Javascript: CTRL + V sends the image from the clipboard (from the server)

I have a task which is descripted as follows:

“Purpose and need: The image attachment is added directly from the clipboard with ctrl + v.

The server has an interface at xxxxx.com. Attachments are sent on PUT request and the query portion of the address is, for example, like ?attachment_id[/request_id/urlkey], where attachment_id is something unique and invented, request_id is the request ID number, and urlkey is the “password” associated the request. The last two are therefore either defined or not at all. The content of the transmission itself must be a multipart/form-data model.

The server then returns a JSON response and if it was a success then the okMessage field can be found in it immediately at the root. Otherwise, an error message such as errorMessages (str arr) or errors (obj → srt) will return.

There are two places on this page to send an attachment:

  1. Make a New Job Request. See if this is visible. Here’s how to check it: document.getElementById('v1r').checked. If the file was successfully uploaded to the server, it will add a tag as an extension to this table: document.getElementById ('rootNew')._fields.appendixTags.i.a_newTags.

  2. Previously sent request. See if this is visible. Here’s how: document.getElementById('v2r').checked && document.getElementById ('justRequest') parentElement.style.display != 'nothing'
    (v1r and v2r are mutually exclusive, meaning only one can be visible at a time) Then, when the file has been successfully uploaded, even if you call this function, it will already be the text you want to see: l_help_addFileList(lt, name, size, mime, days) however, only name information is currently used. But where lt comes from in 1, is document.getElementById('justNew')._fields.appendixTags.i.e_sentFiles, and the conditions in section 2 are: document.getElementById('requestAttachment').e_sentFiles.

Job Request Response (Email) Not yet

In step 2, the credentials can be angled from the tag_id and tag_key data stored in the document.getElementById ('comment') element.”

I have no idea where to start. I have two javascript files: index and sendAttachment. First of all, must I modify both files or only sendAttachment one?

Secondly, what I’m missing from the code so that in addition to dragging and droping , attachments can also be attached with ctrl + v?

I appreciate your help. Thank you!

Here’s the current codes from client side (please tell me if there’s too much code for this question of mine):

index.js

//SOME CODE FIRST

        //Send button
    {
        let send = document.createElement('div');
        send.id = 'send';
        send.className = 'tr';

        let button = document.createElement('input');
        button.type = 'button';
        button.onclick = new_sendForm;
        button.value = 'Submit';
        send.appendChild(button);

        root.appendChild(send);
        root._send = button;
    }

    //Shows that notification is received
    {
        let note = document.createElement('div');
        note.id = 'new_note';
        note.style.display = 'none';
        let div = document.createElement('div');

        let text = document.createElement('h2');
        text.textContent = 'Sended successfully';
        div.appendChild(text);

        let button = document.createElement('input');
        button.type = 'button';
        button.onclick = function reset(){
            note.style.display = 'none';
            new_resetForm();
            if (root._fields.attachmentTags)
                l_addBufferedAttachmentInformation(root._fields.attachmentTags.i, []);
        };
        button.value = 'Empty form';
        div.appendChild(button);

        div.appendChild(document.createElement('br'));
        div.appendChild(document.createElement('br'));

        let p = document.createElement('i');
        p.textContent = 'You can find this and previous requests from the tab named Previous'
            + ' if you gave your email address.'
        ;
        div.appendChild(p);

        p = document.createElement('p');
        p.style.fontFamily = "'Lucida Console', monospace";
        p.innerHTML = 'Here's the link<br>';
        let a = document.createElement('a');
        a.href = '#';
        a.textContent = 'The link isn't created yet';
        p.appendChild(a);
        div.appendChild(p);

        note.appendChild(div);
        root.appendChild(note);
        root._note = note;
        root._note_a = a;
    }

    {
        let email = root._fields['email'];
        let o = s_get();
        if (email && email.i && !email.i.value && o.email)
            email.i.value = o.email;
    }
}

// ----------------------------------------------------------------------------


function show_comment(){
    let comment = document.getElementById('comment');
    let selection = null;{
        let inputs = comment.getElementsByTagName('input');
        for (let i=0, ii=inputs.length; i<ii; i++){
            let input = inputs.item(i);
            if (input.checked){
                selection = input.value;
                break;
            }
        }
    }
    let n_comment = document.getElementById('n_comment');
    let n_comment_error = document.getElementById('n_comment_error');
    let n_comment_button = document.getElementById('n_comment_button');
    if (!selection)
        n_comment_error.textContent = 'Not done';
    else if (!n_comment.value.trim())
        n_comment_error.textContent = 'Comment missing';
    else {
        n_comment_error.textContent = '';
        n_comment_button.disabled = true;
        let post = {
            feature: "addComment",
            getRequest: {
                id: comment.key_id,
                urlkey: comment.key_key,
                status: selection,
                description: n_comment.value
            }
        }
        xhr(
            function ok(json){
                n_comment_button.disabled = false;
                if (json.errorMessages)
                    n_comment_error.innerHTML = json.errorMessages.join('<br>');
                else
                    n_comment.value = '';
                if (json.requests && json.requests[0]){
                    let request = json.requests[0];
                    let label = document.getElementById('rootRequest').getElementsByTagName('h3').item(0);
                    if (label && request.jira_fields && request.jira_fields.description){
                        label.nextElementSibling.innerHTML = '';
                        doc2html(request.jira_fields.description, bella.nextElementSibling);
                    }
                }
            },
            '/api',
            JSON.stringify(post),
            function err(json){
                n_comment_button.disabled = false;
                n_comment_error.textContent = 'Sending failed';
            }
        );
    }
}

//OTHER CODES BEFORE NEXT ONES:

        //Attachments part

        let requestAttachment = document.getElementById('requestAttachment');
        if (request.jira_fields && request.jira_fields.attachment)
            l_addJiraAttachmentInfo(requestAttachment, request.jira_fields.attachment);
        else if (pyynto.attachmentTags)
            l_addBufferedAttachmentInfo(requestAttachment, request.attachmentTags);
        else
            l_addBufferedAttachmentInfo(requestAttachment, []);
    } else {
        root.innerHTML = 'Didn't find the request';
    }
    root.parentElement.style.display = 'inline-block';
}

function show_get(id, urlkey){
    xhr(
        function ok(json){
            show_show(json);
        },
        '/api',
        JSON.stringify({
            feature: 'get',
            getRequest: {
                id: id,
                urlkey: urlkey
            }
        }),
        function err(json){
            let root = document.getElementById('rootRequest');
            root.innerHTML = '<b>Download failed</b>';
        }
    );
}

function show_initLomake(){
    let get = getParameters();
    let root = document.getElementById('rootRequest');
    if (get['id'] && get['idKey']){
        root.innerHTML = '<i>Searching...</i>';
        show_get(get['id'], get['idKey']);
        //Switching page
        document.getElementById('v2r').checked = true;
    } else {
        root.parentElement.style.display = 'none';
    }
    let requestAttachment = document.getElementById('requestAttachment');
    let comment = document.getElementById('comment');
    if (typeof l_createForm === 'function' && requestAttachment && comment)
        l_createForm(requestAttachment, comment);
    else if (comment)
        requestAttachment.parentElement.style.display = 'none';
}

    function list_sendLink(email){
    if (email){
        xhr(
            function ok(json){
                let root = document.getElementById('rootList');
                if (json.okMessage)
                    root.textContent = json.okMessage;
                else if (json.errors && json.errors['sendMssage']){
                    let div = document.createElement('div');
                    div.textContent = json.errors['sendMessage'];
                    div.className = 'error';
                    root.appendChild(div);
                } else if (json.errorMessages && json.errorMessages[0]){
                    let div = document.createElement('div');
                    div.textContent = json.errorMessages[0];
                    div.className = 'error';
                    root.appendChild(div);
                } else
                    root.innerHTML = "Something went wrong. Don't know what or where.";
            },
            '/api',
            JSON.stringify({
                feature: 'sendListTag',
                newForm: {
                    email: email
                }
            }),
            function err(json){
                let root = document.getElementById('rootList');
                let div = document.createElement('div');
                div.textContent = 'Sending the request to server failed???';
                div.className = 'error';
                root.appendChild(div);
            }
        );
    }
}

function list_initShowPrevious(){
    let get = getParameters();
    let sailo = s_get();
    let root = document.getElementById('rootList');
    let mm_list = document.getElementById('mm_list');

    let email = get['email'];
    let listTag = get['list'];

    if (sailo.email && sailo.listTag){
        s_forgetButton(true);
        if (!email || !listag || sailo.email == email && sailo.listTag == listTag){
            email = sailo.email;
            listTag = sailo.listTag;
            mm_list.innerHTML = 'Email and list tags.';
        } else {
            mm_list.innerHTML = 'Email and list tag, but they differ!<br><i>If you want to update, you must forget old infos first.</i>';
        }
    } else if (email && listTag){
        s_post(email, listTag);
        mm_list.innerHTML = 'Email and list tags (saved now).';
        s_forgetButton(true);
    } else {
        mm_list.innerHTML = 'Nothing';
    }

    if (email && listTag){
        root.innerHTML = '<i>Searching...</i>';
        list_get(email, listTag);

        if (!get['form'])
            document.getElementById('v2r').checked = true;
    }
}

// ----------------------------------------------------------------------------

function init(){
    //New form?
    xhr(
        function settingsGot(json){
            new_initForm(json);
            window._settings = json;
            list_initShowPrevious();
            show_initForm();
        },
        'form.new.json',
        null,
        null
    );
}

sentAttachment.js

'use strict';

function l_createForm(root, settingSource){
    if (!root || !ss || !ss.SimpleUpload){
        console.error("Formatting of downloading attachment file failed.");
    } else {
        root.a_settingSource = settingSource;
        root.a_newTags = [];
        {
            let sendedFiles = document.createElement('fieldset');
            root.e_SendedFiles = sendedFiles;
            sendedFiles.className = 'sendedFiles';
            let legend = document.createElement('legend');
            legend.innerHTML = 'Sended files';
            sendedFiles.appendChild(legend);
            root.appendChild(sendedFiles);
        }

        {
            let progressBox = document.createElement('div');
            root.e_progressBox = progressBox;
            progressBox.className = 'progressBox';
            root.appendChild(progressBox);
        }

        {
            let key = document.createElement('p');
            root.e_key = key;
            key.className = 'key';
            key.innerHTML = '<span>Drag and drop the files you want to send to the square above</span> ' +
                'or <a>click here</a>';
            root.e_clicking = key.lastElementChild;
            root.appendChild(key);
        }

        root.e_fileUpload = new ss.SimpleUpload({
            button: [root.e_sendedFiles, root.e_clicking],
            url: function before(xhr, settings){
                let extra = '';
                if (settingSource && settingSource.tag_id && settingSource.tag_key)
                    extra = '/' + settingSource.tag_id + '/' + settingSource.tag_key;
                return location.protocol +
                    '//' + location.host +
                    '/api?' + 
                    (Date.now()) +
                    extra
                ;
            },
            name: "file",
            method: "PUT",
            dropzone: root,
            dragClass: 'fileOn',
            encodeHeaders: true,
            cors: false,
            multiple: true,
            multipleSelect: true,
            noParams: true,
            multipart: true,
            autoSubmit: true,
            responseType: "json",
            debug: false,
            onDone: function sendingPassed(
                fileName,//String
                statusCode,//the response status code, if any
                statusText,//the response status code, if any
                json,//false
                button,//Button which started sending
                fileSize//number or null
            ){
                let sendedFiles = root.e_sendedFiles;
                if (sendedFiles){
                    l_help_addFileToList(
                        sendedFiles,
                        fileName,
                        fileSize,
                        null,
                        null
                    );
                    if (json && json.attachmentTag)
                        root.a_newTags.push(json.attachmentTag);
                } else {
                    alert('File "' + fileName + '" sended successfully.');
                }
            },
            onError: function sendingError(
                fileName,//String
                errorType,//"error" or "parseerror"
                statusCode,//the response status code, if any
                statusText,//the response status code, if any
                answer,//false
                button,//Button which started sending
                fileSize//number or null
            ){
                alert('"' + fileName + '": ' + statusText);
            },
            onSubmit: function(filename, extension) {
                // Create the elements of our progress bar
                var progress = document.createElement('div'), // container for progress bar
                bar = document.createElement('div'), // actual progress bar
                fileSize = document.createElement('div'), // container for upload file size
                wrapper = document.createElement('div'), // container for this progress bar
                //declare somewhere: <div id="progressBox"></div> where you want to show the progress-bar(s)
                progressBox = root.e_progressBox; //on page container for progress bars

                // Assign each element its corresponding class
                progress.className = 'progress progress-striped';
                bar.className = 'progress-bar progress-bar-success';
                fileSize.className = 'size';
                wrapper.className = 'wrapper';

                // Assemble the progress bar and add it to the page
                progress.appendChild(bar); 
                wrapper.innerHTML = '<div class="name">Sending <b>'+filename+'</b></div>'; // filename is passed to onSubmit()
                wrapper.appendChild(fileSize);
                wrapper.appendChild(progress);                                       
                progressBox.appendChild(wrapper); // just an element on the page to hold the progress bars    

                // Assign roles to the elements of the progress bar
                this.setProgressBar(bar); // will serve as the actual progress bar
                this.setFileSizeBox(fileSize); // display file size beside progress bar
                this.setProgressContainer(wrapper); // designate the containing div to be removed after upload
            }
        });
    }
}

function l_help_addFileToList(root, name, size, mime, date){
    let square = document.createElement('div');
    square.className = 'square';

    let text = document.createElement('span');
    text.className = 'name';
    text.innerHTML = name;
    square.appendChild(text);

/*
    let size = document.createElement('i');
    size.className = 'size';
    size.innerHTML = size;
    square.appendChild(size);
*/

    root.appendChild(square);
}

function l_addJiraAttachmentInfo(root, attachment_arr){
    if (root.e_sendedFiles && attachment_arr instanceof Array){
        root.e_sendedFiles.innerHTML = '';
        root.a_newTags = [];
        for (let i=0, ii=attachment_arr.length; i<ii; i++){
            let a = attachment_arr[i];
            l_help_addFileToList(
                root.e_sendedFiles,
                a.filename,
                a.size,
                a.mimeType,
                a.created
            );
        }
    }
}

function l_addBufferedAttachmentInfo(root, attachmentTags){
    if (root.e_sendedFiles && attachmentTags instanceof Array){
        root.e_sendedFiles.innerHTML = '';
        root.a_newTags = [];
        for (let i=0, ii=attachmentTags.length; i<ii; i++){
            let a = attachmentTags[i];
            l_help_addFileToList(
                root.e_sendedFiles,
                'Sending_' + a,
                -1,
                null,
                null
            );
        }
    }
}

function l_getSendedTags(root){
    if (root.a_newTags)
        return root.a_newTags;
    else
        return null;
}