reimandlab/Visualistion-Framework-for-Genome-Mutations

View on GitHub
website/static/inline_edit.js

Summary

Maintainability
D
1 day
Test Coverage
var InlineEditManager = function()
{
    // values in the default config are dummy - just to illustrate the concept
    var config = {
        endpoint_save: '/save_message/',
        nltobr: true
    }

    function updateMessage(editable_box, new_content)
    {
        var content_div = editable_box.find('.content').first()
        if(config.nltobr)
            new_content = new_content.replace(/\n/g, '<br class="automatic">')
        return content_div.html(new_content)
    }

    function getContent(editable_box)
    {
        var content_div = editable_box.find('.content').first()
        var content = content_div.html()
        if(config.nltobr)
            content = content.replace(/<br class="automatic">/g, '\n')
        return content
    }

    function saveMessage(editable_box)
    {
        $.ajax({
            url: config.endpoint_save,
            type: 'POST',
            data: {
                entry_id: editable_box.data('id'),
                old_content: getContent(editable_box),
                new_content: editable_box.find('.new-content').first().val()
            },
            success: function(editable_box)
            {
                return function(result)
                {
                    var message = ''

                    if(result.status === 409)
                    {
                        var current_content = getContent(editable_box)
                        if(current_content === result.content)
                            result.status = 200
                        else
                        {
                            updateMessage(editable_box, result.content)
                            message =
                                '<strong>Someone has edited this entry from another window!</strong> ' +
                                'The current text is: ' +
                                '<textarea>' + result.content + '</textarea><br>' +
                                'Press save if you wish to overwrite this text.'
                        }
                    }

                    if(result.status === 200)
                    {
                        updateMessage(editable_box, result.content)
                        return endEdition(editable_box)
                    }

                    if(result.status === 509)
                        message = 'Something went wrong'

                    if(message)
                    {
                        editable_box.find('.feedback').first().html(message)
                        editable_box.find('.feedback').first().show()
                    }
                }
            }(editable_box)
        })
    }

    function rejectEdit(editable_box)
    {
        var unchanged_content = getContent(editable_box)
        editable_box.find('.new-content').first().val(unchanged_content)
        endEdition(editable_box)
    }

    function endEdition(editable_box)
    {
        editable_box.find('.edit-form').first().hide()
        editable_box.find('.edit-btn').first().show()
        editable_box.find('.content').first().show()
        editable_box.find('.feedback').first().hide()
    }

    var publicSpace = {
        init: function(endpoint_save, box_selector, nltobr)
        {
            config.endpoint_save = decodeURIComponent(endpoint_save)
            config.nltobr = nltobr

            var inline_editable_box = $(box_selector)
            inline_editable_box.each(function(i, box)
                {
                    btn = $(box).find('.edit-btn').first()
                    btn.click(
                        function()
                        {
                            var edit_btn = $(this)
                            //var edit_btn = $(btn)
                            edit_btn.hide()

                            var editable_box = edit_btn.closest(box_selector)
                            editable_box.find('.content').first().hide()
                            editable_box.find('.edit-form').first().show()

                            editable_box.find('.save-btn').first().off().click(
                                function(editable_box){ return function(){saveMessage(editable_box)} }(editable_box)
                            )
                            editable_box.find('.reject-btn').first().off().click(
                                function(editable_box){ return function(){rejectEdit(editable_box)} }(editable_box)
                            )
                        }
                    )
                }
            )


        }
    }

    return publicSpace
}


function create_help_manager(endpoint_save)
{
    var inline_help_box = $('.inline-help')
    inline_help_box.find('.dropdown-menu').on(
        'click',
        function(event){event.stopPropagation()}
    )
    return InlineEditManager().init(endpoint_save, '.inline-help', true)
}

function create_text_manager(endpoint_save)
{
    return InlineEditManager().init(endpoint_save, '.text-entry', false)
}