{"version":3,"file":"form.min.js","sources":["../src/form.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * This module depends on the real jquery - and returns the non-global version of it.\n *\n * @module     core_customfield/form\n * @package    core_customfield\n * @copyright  2018 Toni Barbera\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n    'jquery',\n    'core/str',\n    'core/notification',\n    'core/ajax',\n    'core/templates',\n    'core/sortable_list',\n    'core/pending',\n    'core/inplace_editable',\n], function($, Str, Notification, Ajax, Templates, SortableList, Pending) {\n\n    /**\n     * Display confirmation dialogue\n     *\n     * @param {Number} id\n     * @param {String} type\n     * @param {String} component\n     * @param {String} area\n     * @param {Number} itemid\n     */\n    var confirmDelete = function(id, type, component, area, itemid) {\n        var pendingPromise = new Pending('core_customfield/form:confirmDelete');\n        Str.get_strings([\n            {'key': 'confirm'},\n            {'key': 'confirmdelete' + type, component: 'core_customfield'},\n            {'key': 'yes'},\n            {'key': 'no'},\n        ])\n        .then(function(s) {\n            Notification.confirm(s[0], s[1], s[2], s[3], function() {\n                var pendingDeletePromise = new Pending('core_customfield/form:confirmDelete');\n                var func = (type === 'field') ? 'core_customfield_delete_field' : 'core_customfield_delete_category';\n                Ajax.call([\n                    {methodname: func, args: {id: id}},\n                    {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n                ])[1]\n                .then(function(response) {\n                    return Templates.render('core_customfield/list', response);\n                })\n                .then(function(html, js) {\n                    Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n                    return null;\n                })\n                .then(pendingDeletePromise.resolve)\n                .catch(Notification.exception);\n            });\n\n            return;\n        })\n        .then(pendingPromise.resolve)\n        .catch(Notification.exception);\n    };\n\n    /**\n     * Creates a new custom fields category with default name and updates the list\n     *\n     * @param {String} component\n     * @param {String} area\n     * @param {Number} itemid\n     */\n    var createNewCategory = function(component, area, itemid) {\n        var pendingPromise = new Pending('core_customfield/form:confirmDelete');\n        var promises = Ajax.call([\n            {methodname: 'core_customfield_create_category', args: {component: component, area: area, itemid: itemid}},\n            {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n        ]);\n        var categoryid;\n\n        promises[0].then(function(response) {\n            categoryid = response;\n            return null;\n        }).catch(Notification.exception);\n\n        promises[1].then(function(response) {\n            return Templates.render('core_customfield/list', response);\n        })\n        .then(function(html, js) {\n            Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n            window.location.href = '#category-' + categoryid;\n            return null;\n        })\n        .catch(Notification.exception);\n\n        Promise.all(promises)\n        .then(pendingPromise.resolve)\n        .catch();\n    };\n\n    return {\n        /**\n         * Initialise the custom fields manager\n         */\n        init: function() {\n            var mainlist = $('#customfield_catlist');\n            var component = mainlist.attr('data-component');\n            var area = mainlist.attr('data-area');\n            var itemid = mainlist.attr('data-itemid');\n\n            $(\"[data-role=deletefield]\").on('click', function(e) {\n                confirmDelete($(this).attr('data-id'), 'field', component, area, itemid);\n                e.preventDefault();\n            });\n\n            $(\"[data-role=deletecategory]\").on('click', function(e) {\n                confirmDelete($(this).attr('data-id'), 'category', component, area, itemid);\n                e.preventDefault();\n            });\n\n            $('[data-role=addnewcategory]').on('click', function() {\n                createNewCategory(component, area, itemid);\n            });\n\n            var categoryName = function(element) {\n                return element\n                    .closest('[data-category-id]')\n                    .find('[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]')\n                    .attr('data-value');\n            };\n\n            // Sort category.\n            var sortCat = new SortableList(\n                $('#customfield_catlist .categorieslist'),\n                {moveHandlerSelector: '.movecategory [data-drag-type=move]'}\n            );\n\n            sortCat.getElementName = function(el) {\n                return $.Deferred().resolve(categoryName(el));\n            };\n\n            $('[data-category-id]').on('sortablelist-drop', function(evt, info) {\n                if (info.positionChanged) {\n                    var pendingPromise = new Pending('core_customfield/form:categoryid:on:sortablelist-drop');\n                    Ajax.call([\n                        {\n                            methodname: 'core_customfield_move_category',\n                            args: {\n                                id: info.element.data('category-id'),\n                                beforeid: info.targetNextElement.data('category-id')\n                            }\n\n                        },\n                    ])[0]\n                    .then(pendingPromise.resolve)\n                    .catch(Notification.exception);\n                }\n                evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n            });\n\n            // Sort fields.\n            var sort = new SortableList(\n                $('#customfield_catlist .fieldslist tbody'),\n                {moveHandlerSelector: '.movefield [data-drag-type=move]'}\n            );\n\n            sort.getDestinationName = function(parentElement, afterElement) {\n                if (!afterElement.length) {\n                    return Str.get_string('totopofcategory', 'customfield', categoryName(parentElement));\n                } else if (afterElement.attr('data-field-name')) {\n                    return Str.get_string('afterfield', 'customfield', afterElement.attr('data-field-name'));\n                } else {\n                    return $.Deferred().resolve('');\n                }\n            };\n\n            $('[data-field-name]').on('sortablelist-drop', function(evt, info) {\n                evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n                if (info.positionChanged) {\n                    var pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drop');\n                    Ajax.call([\n                        {\n                            methodname: 'core_customfield_move_field',\n                            args: {\n                                id: info.element.data('field-id'),\n                                beforeid: info.targetNextElement.data('field-id'),\n                                categoryid: Number(info.targetList.closest('[data-category-id]').attr('data-category-id'))\n                            },\n                        },\n                    ])[0]\n                    .then(pendingPromise.resolve)\n                    .catch(Notification.exception);\n                }\n            });\n\n            $('[data-field-name]').on('sortablelist-drag', function(evt) {\n                var pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drag');\n\n                evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n\n                // Refreshing fields tables.\n                Str.get_string('therearenofields', 'core_customfield').then(function(s) {\n                    $('#customfield_catlist .categorieslist').children().each(function() {\n                        var fields = $(this).find($('.field')),\n                            nofields = $(this).find($('.nofields'));\n                        if (!fields.length && !nofields.length) {\n                            $(this).find('tbody').append(\n                                '<tr class=\"nofields\"><td colspan=\"5\">' + s + '</td></tr>'\n                            );\n                        }\n                        if (fields.length && nofields.length) {\n                            nofields.remove();\n                        }\n                    });\n                    return null;\n                })\n                .then(pendingPromise.resolve)\n                .catch(Notification.exception);\n            });\n\n            $('[data-category-id], [data-field-name]').on('sortablelist-dragstart',\n                function(evt, info) {\n                    setTimeout(function() {\n                        $('.sortable-list-is-dragged').width(info.element.width());\n                    }, 501);\n                }\n            );\n\n        }\n    };\n});\n"],"names":["define","$","Str","Notification","Ajax","Templates","SortableList","Pending","confirmDelete","id","type","component","area","itemid","pendingPromise","get_strings","then","s","confirm","pendingDeletePromise","func","call","methodname","args","response","render","html","js","replaceNode","resolve","catch","exception","init","mainlist","attr","on","e","this","preventDefault","categoryid","promises","window","location","href","Promise","all","createNewCategory","categoryName","element","closest","find","moveHandlerSelector","getElementName","el","Deferred","evt","info","positionChanged","data","beforeid","targetNextElement","stopPropagation","getDestinationName","parentElement","afterElement","length","get_string","Number","targetList","children","each","fields","nofields","append","remove","setTimeout","width"],"mappings":"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"}