MDL-67654 mod_forum: formchangechecker for discussion inline replies.
[moodle.git] / mod / forum / amd / build / inpage_reply.min.js.map
1 {"version":3,"sources":["../src/inpage_reply.js"],"names":["define","$","Templates","Notification","Repository","Selectors","DISPLAYCONSTANTS","NESTED_V2","THREADED","NESTED","FLAT_OLDEST_FIRST","FLAT_NEWEST_FIRST","EVENTS","POST_CREATED","CONTENT_FORMATS","MOODLE","showSubmitButtonLoadingIcon","button","textContainer","find","post","inpageSubmitBtnText","loadingIconContainer","width","outerWidth","css","addClass","removeClass","hideSubmitButtonLoadingIcon","registerEventListeners","root","on","inpageSubmitBtn","e","preventDefault","submitButton","currentTarget","allButtons","parent","inpageReplyButton","form","parents","inpageReplyForm","get","message","elements","value","trim","messageformat","postid","reply","subject","currentRoot","closest","isprivatereply","privatereply","checked","modeSelector","modeSelect","mode","length","parseInt","newid","prop","addDiscussionPost","then","context","messages","reduce","carry","type","addNotification","reset","id","capabilities","currentAuthorName","children","not","repliesContainer","authorName","text","parentauthorname","showactionmenu","view","controlreadstatus","edit","split","delete","export","urls","viewparent","render","html","js","repliesnode","first","prependNodeContents","appendNodeContents","trigger","M","core_formchangechecker","reset_form_dirty_state","inpageReplyContent","hide","location","href","catch","error","exception","init"],"mappings":"AAuBAA,OAAM,0BAAC,CACC,QADD,CAEC,gBAFD,CAGC,mBAHD,CAIC,sBAJD,CAKC,qBALD,CAAD,CAMC,SACCC,CADD,CAECC,CAFD,CAGCC,CAHD,CAICC,CAJD,CAKCC,CALD,CAMD,IAEEC,CAAAA,CAAgB,CAAG,CACnBC,SAAS,CAAE,CADQ,CAEnBC,QAAQ,CAAE,CAFS,CAGnBC,MAAM,CAAE,CAHW,CAInBC,iBAAiB,CAAE,CAJA,CAKnBC,iBAAiB,CAAE,CAAC,CALD,CAFrB,CAUEC,CAAM,CAAG,CACTC,YAAY,CAAE,wBADL,CAVX,CAkBEC,CAAe,CAAG,CAClBC,MAAM,CAAE,CADU,CAlBpB,CA0BEC,CAA2B,CAAG,SAASC,CAAT,CAAiB,IAC3CC,CAAAA,CAAa,CAAGD,CAAM,CAACE,IAAP,CAAYd,CAAS,CAACe,IAAV,CAAeC,mBAA3B,CAD2B,CAE3CC,CAAoB,CAAGL,CAAM,CAACE,IAAP,CAAYd,CAAS,CAACe,IAAV,CAAeE,oBAA3B,CAFoB,CAG3CC,CAAK,CAAGN,CAAM,CAACO,UAAP,EAHmC,CAK/CP,CAAM,CAACQ,GAAP,CAAW,OAAX,CAAoBF,CAApB,EACAL,CAAa,CAACQ,QAAd,CAAuB,QAAvB,EACAJ,CAAoB,CAACK,WAArB,CAAiC,QAAjC,CACH,CAlCC,CAyCEC,CAA2B,CAAG,SAASX,CAAT,CAAiB,IAC3CC,CAAAA,CAAa,CAAGD,CAAM,CAACE,IAAP,CAAYd,CAAS,CAACe,IAAV,CAAeC,mBAA3B,CAD2B,CAE3CC,CAAoB,CAAGL,CAAM,CAACE,IAAP,CAAYd,CAAS,CAACe,IAAV,CAAeE,oBAA3B,CAFoB,CAI/CL,CAAM,CAACQ,GAAP,CAAW,OAAX,CAAoB,EAApB,EACAP,CAAa,CAACS,WAAd,CAA0B,QAA1B,EACAL,CAAoB,CAACI,QAArB,CAA8B,QAA9B,CACH,CAhDC,CAuDEG,CAAsB,CAAG,SAASC,CAAT,CAAe,CACxCA,CAAI,CAACC,EAAL,CAAQ,OAAR,CAAiB1B,CAAS,CAACe,IAAV,CAAeY,eAAhC,CAAiD,SAASC,CAAT,CAAY,CACzDA,CAAC,CAACC,cAAF,GADyD,GAErDC,CAAAA,CAAY,CAAGlC,CAAC,CAACgC,CAAC,CAACG,aAAH,CAFqC,CAGrDC,CAAU,CAAGF,CAAY,CAACG,MAAb,GAAsBnB,IAAtB,CAA2Bd,CAAS,CAACe,IAAV,CAAemB,iBAA1C,CAHwC,CAIrDC,CAAI,CAAGL,CAAY,CAACM,OAAb,CAAqBpC,CAAS,CAACe,IAAV,CAAesB,eAApC,EAAqDC,GAArD,CAAyD,CAAzD,CAJ8C,CAKrDC,CAAO,CAAGJ,CAAI,CAACK,QAAL,CAAczB,IAAd,CAAmB0B,KAAnB,CAAyBC,IAAzB,EAL2C,CAQrDC,CAAa,CAAGlC,CAAe,CAACC,MARqB,CAWrDkC,CAAM,CAAGT,CAAI,CAACK,QAAL,CAAcK,KAAd,CAAoBJ,KAXwB,CAYrDK,CAAO,CAAGX,CAAI,CAACK,QAAL,CAAcM,OAAd,CAAsBL,KAZqB,CAarDM,CAAW,CAAGjB,CAAY,CAACkB,OAAb,CAAqBhD,CAAS,CAACe,IAAV,CAAeA,IAApC,CAbuC,CAcrDkC,CAAc,CAAGd,CAAI,CAACK,QAAL,CAAcU,YAAd,SAA0Cf,CAAI,CAACK,QAAL,CAAcU,YAAd,CAA2BC,OAArE,GAdoC,CAerDC,CAAY,CAAG3B,CAAI,CAACX,IAAL,CAAUd,CAAS,CAACe,IAAV,CAAesC,UAAzB,CAfsC,CAgBrDC,CAAI,CAAGF,CAAY,CAACG,MAAb,CAAsBC,QAAQ,CAACJ,CAAY,CAACd,GAAb,CAAiB,CAAjB,EAAoBG,KAArB,CAA9B,CAA4D,IAhBd,CAiBrDgB,CAjBqD,CAmBzD,GAAIlB,CAAO,CAACgB,MAAZ,CAAoB,CAChB5C,CAA2B,CAACmB,CAAD,CAA3B,CACAE,CAAU,CAAC0B,IAAX,CAAgB,UAAhB,KAEA3D,CAAU,CAAC4D,iBAAX,CAA6Bf,CAA7B,CAAqCE,CAArC,CAA8CP,CAA9C,CAAuDI,CAAvD,CAAsEM,CAAtE,KACKW,IADL,CACU,SAASC,CAAT,CAAkB,CACpB,GAAItB,CAAAA,CAAO,CAAGsB,CAAO,CAACC,QAAR,CAAiBC,MAAjB,CAAwB,SAASC,CAAT,CAAgBzB,CAAhB,CAAyB,CAC3D,GAAoB,SAAhB,EAAAA,CAAO,CAAC0B,IAAZ,CAA+B,CAC3BD,CAAK,EAAI,MAAQzB,CAAO,CAACA,OAAhB,CAA0B,MACtC,CACD,MAAOyB,CAAAA,CACV,CALa,CAKX,EALW,CAAd,CAMAlE,CAAY,CAACoE,eAAb,CAA6B,CACzB3B,OAAO,CAAEA,CADgB,CAEzB0B,IAAI,CAAE,SAFmB,CAA7B,EAKA,MAAOJ,CAAAA,CACV,CAdL,EAeKD,IAfL,CAeU,SAASC,CAAT,CAAkB,CACpB1B,CAAI,CAACgC,KAAL,GACA,GAAIpD,CAAAA,CAAI,CAAG8C,CAAO,CAAC9C,IAAnB,CACA0C,CAAK,CAAG1C,CAAI,CAACqD,EAAb,CAEA,OAAQd,CAAR,EACI,IAAKrD,CAAAA,CAAgB,CAACC,SAAtB,IACQmE,CAAAA,CAAY,CAAGtD,CAAI,CAACsD,YAD5B,CAEQC,CAAiB,CAAGvB,CAAW,CAACwB,QAAZ,GACYC,GADZ,CACgBxE,CAAS,CAACe,IAAV,CAAe0D,gBAD/B,EAEY3D,IAFZ,CAEiBd,CAAS,CAACe,IAAV,CAAe2D,UAFhC,EAGYC,IAHZ,EAF5B,CAMI5D,CAAI,CAAC6D,gBAAL,CAAwBN,CAAxB,CACAvD,CAAI,CAAC8D,cAAL,CAAsBR,CAAY,CAACS,IAAb,EACAT,CAAY,CAACU,iBADb,EAEAV,CAAY,CAACW,IAFb,EAGAX,CAAY,CAACY,KAHb,EAIAZ,CAAY,CAACa,MAJb,EAKAb,CAAY,CAACc,MALb,EAMApE,CAAI,CAACqE,IAAL,CAAUC,UANhC,CAOA,MAAOxF,CAAAA,CAAS,CAACyF,MAAV,CAAiB,iDAAjB,CAAoEvE,CAApE,CAAP,CACJ,IAAKd,CAAAA,CAAgB,CAACE,QAAtB,CACI,MAAON,CAAAA,CAAS,CAACyF,MAAV,CAAiB,0CAAjB,CAA6DvE,CAA7D,CAAP,CACJ,IAAKd,CAAAA,CAAgB,CAACG,MAAtB,CACI,MAAOP,CAAAA,CAAS,CAACyF,MAAV,CAAiB,wCAAjB,CAA2DvE,CAA3D,CAAP,CACJ,QACI,MAAOlB,CAAAA,CAAS,CAACyF,MAAV,CAAiB,iCAAjB,CAAoDvE,CAApD,CAAP,CArBR,CAuBH,CA3CL,EA4CK6C,IA5CL,CA4CU,SAAS2B,CAAT,CAAeC,CAAf,CAAmB,CACrB,GAAIC,CAAAA,CAAW,CAAG1C,CAAW,CAACjC,IAAZ,CAAiBd,CAAS,CAACe,IAAV,CAAe0D,gBAAhC,EAAkDiB,KAAlD,EAAlB,CAEA,GAAIpC,CAAI,EAAIrD,CAAgB,CAACK,iBAA7B,CAAgD,CAC5C,MAAOT,CAAAA,CAAS,CAAC8F,mBAAV,CAA8BF,CAA9B,CAA2CF,CAA3C,CAAiDC,CAAjD,CACV,CAFD,IAEO,CACH,MAAO3F,CAAAA,CAAS,CAAC+F,kBAAV,CAA6BH,CAA7B,CAA0CF,CAA1C,CAAgDC,CAAhD,CACV,CACJ,CApDL,EAqDK5B,IArDL,CAqDU,UAAW,CACb9B,CAAY,CAAC+D,OAAb,CAAqBtF,CAAM,CAACC,YAA5B,CAA0CiD,CAA1C,EACAlC,CAA2B,CAACO,CAAD,CAA3B,CACAE,CAAU,CAAC0B,IAAX,CAAgB,UAAhB,KAGA,GAAwC,WAApC,QAAOoC,CAAAA,CAAC,CAACC,sBAAb,CAAqD,CACjDD,CAAC,CAACC,sBAAF,CAAyBC,sBAAzB,EACH,CAED,MAAOjD,CAAAA,CAAW,CAACjC,IAAZ,CAAiBd,CAAS,CAACe,IAAV,CAAekF,kBAAhC,EAAoDC,IAApD,EACV,CAhEL,EAiEKtC,IAjEL,CAiEU,UAAW,CACbuC,QAAQ,CAACC,IAAT,CAAgB,KAAO3C,CAE1B,CApEL,EAqEK4C,KArEL,CAqEW,SAASC,CAAT,CAAgB,CACnB/E,CAA2B,CAACO,CAAD,CAA3B,CACAE,CAAU,CAAC0B,IAAX,CAAgB,UAAhB,KACA,MAAO5D,CAAAA,CAAY,CAACyG,SAAb,CAAuBD,CAAvB,CACV,CAzEL,CA0EH,CACJ,CAlGD,CAmGH,CA3JC,CA6JF,MAAO,CACHE,IAAI,CAAE,cAAS/E,CAAT,CAAe,CACjBD,CAAsB,CAACC,CAAD,CACzB,CAHE,CAIHhB,eAAe,CAAEA,CAJd,CAKHF,MAAM,CAAEA,CALL,CAOV,CAhLK,CAAN","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 handles the in page replying to forum posts.\n *\n * @module     mod_forum/inpage_reply\n * @package    mod_forum\n * @copyright  2019 Peter Dias\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n        'jquery',\n        'core/templates',\n        'core/notification',\n        'mod_forum/repository',\n        'mod_forum/selectors',\n    ], function(\n        $,\n        Templates,\n        Notification,\n        Repository,\n        Selectors\n    ) {\n\n    var DISPLAYCONSTANTS = {\n        NESTED_V2: 4,\n        THREADED: 2,\n        NESTED: 3,\n        FLAT_OLDEST_FIRST: 1,\n        FLAT_NEWEST_FIRST: -1\n    };\n\n    var EVENTS = {\n        POST_CREATED: 'mod_forum-post-created'\n    };\n\n     /**\n      * Moodle formats taken from the FORMAT_* constants declared in lib/weblib.php.\n      * @type {Object}\n      */\n    var CONTENT_FORMATS = {\n        MOODLE: 0\n    };\n    /**\n     * Show the loading icon for the submit button.\n     *\n     * @param {Object} button The submit button element\n     */\n    var showSubmitButtonLoadingIcon = function(button) {\n        var textContainer = button.find(Selectors.post.inpageSubmitBtnText);\n        var loadingIconContainer = button.find(Selectors.post.loadingIconContainer);\n        var width = button.outerWidth();\n        // Fix the width so that the button size doesn't change when we show the loading icon.\n        button.css('width', width);\n        textContainer.addClass('hidden');\n        loadingIconContainer.removeClass('hidden');\n    };\n\n    /**\n     * Hide the loading icon for the submit button.\n     *\n     * @param {Object} button The submit button element\n     */\n    var hideSubmitButtonLoadingIcon = function(button) {\n        var textContainer = button.find(Selectors.post.inpageSubmitBtnText);\n        var loadingIconContainer = button.find(Selectors.post.loadingIconContainer);\n        // Reset the width back to it's default.\n        button.css('width', '');\n        textContainer.removeClass('hidden');\n        loadingIconContainer.addClass('hidden');\n    };\n\n    /**\n     * Register the event listeners for the submit button of the in page reply.\n     *\n     * @param {Object} root The discussion container element.\n     */\n    var registerEventListeners = function(root) {\n        root.on('click', Selectors.post.inpageSubmitBtn, function(e) {\n            e.preventDefault();\n            var submitButton = $(e.currentTarget);\n            var allButtons = submitButton.parent().find(Selectors.post.inpageReplyButton);\n            var form = submitButton.parents(Selectors.post.inpageReplyForm).get(0);\n            var message = form.elements.post.value.trim();\n            // For now, we consider the inline reply post written using the FORMAT_MOODLE (because a textarea is displayed).\n            // In the future, other formats should be supported, letting users to use their preferred editor and format.\n            var messageformat = CONTENT_FORMATS.MOODLE;\n            // The message post will be converted from messageformat to FORMAT_HTML.\n            var topreferredformat = true;\n            var postid = form.elements.reply.value;\n            var subject = form.elements.subject.value;\n            var currentRoot = submitButton.closest(Selectors.post.post);\n            var isprivatereply = form.elements.privatereply != undefined ? form.elements.privatereply.checked : false;\n            var modeSelector = root.find(Selectors.post.modeSelect);\n            var mode = modeSelector.length ? parseInt(modeSelector.get(0).value) : null;\n            var newid;\n\n            if (message.length) {\n                showSubmitButtonLoadingIcon(submitButton);\n                allButtons.prop('disabled', true);\n\n                Repository.addDiscussionPost(postid, subject, message, messageformat, isprivatereply, topreferredformat)\n                    .then(function(context) {\n                        var message = context.messages.reduce(function(carry, message) {\n                            if (message.type == 'success') {\n                                carry += '<p>' + message.message + '</p>';\n                            }\n                            return carry;\n                        }, '');\n                        Notification.addNotification({\n                            message: message,\n                            type: \"success\"\n                        });\n\n                        return context;\n                    })\n                    .then(function(context) {\n                        form.reset();\n                        var post = context.post;\n                        newid = post.id;\n\n                        switch (mode) {\n                            case DISPLAYCONSTANTS.NESTED_V2:\n                                var capabilities = post.capabilities;\n                                var currentAuthorName = currentRoot.children()\n                                                                   .not(Selectors.post.repliesContainer)\n                                                                   .find(Selectors.post.authorName)\n                                                                   .text();\n                                post.parentauthorname = currentAuthorName;\n                                post.showactionmenu = capabilities.view ||\n                                                      capabilities.controlreadstatus ||\n                                                      capabilities.edit ||\n                                                      capabilities.split ||\n                                                      capabilities.delete ||\n                                                      capabilities.export ||\n                                                      post.urls.viewparent;\n                                return Templates.render('mod_forum/forum_discussion_nested_v2_post_reply', post);\n                            case DISPLAYCONSTANTS.THREADED:\n                                return Templates.render('mod_forum/forum_discussion_threaded_post', post);\n                            case DISPLAYCONSTANTS.NESTED:\n                                return Templates.render('mod_forum/forum_discussion_nested_post', post);\n                            default:\n                                return Templates.render('mod_forum/forum_discussion_post', post);\n                        }\n                    })\n                    .then(function(html, js) {\n                        var repliesnode = currentRoot.find(Selectors.post.repliesContainer).first();\n\n                        if (mode == DISPLAYCONSTANTS.FLAT_NEWEST_FIRST) {\n                            return Templates.prependNodeContents(repliesnode, html, js);\n                        } else {\n                            return Templates.appendNodeContents(repliesnode, html, js);\n                        }\n                    })\n                    .then(function() {\n                        submitButton.trigger(EVENTS.POST_CREATED, newid);\n                        hideSubmitButtonLoadingIcon(submitButton);\n                        allButtons.prop('disabled', false);\n\n                        // Tell formchangechecker we submitted the form.\n                        if (typeof M.core_formchangechecker !== 'undefined') {\n                            M.core_formchangechecker.reset_form_dirty_state();\n                        }\n\n                        return currentRoot.find(Selectors.post.inpageReplyContent).hide();\n                    })\n                    .then(function() {\n                        location.href = \"#p\" + newid;\n                        return;\n                    })\n                    .catch(function(error) {\n                        hideSubmitButtonLoadingIcon(submitButton);\n                        allButtons.prop('disabled', false);\n                        return Notification.exception(error);\n                    });\n            }\n        });\n    };\n\n    return {\n        init: function(root) {\n            registerEventListeners(root);\n        },\n        CONTENT_FORMATS: CONTENT_FORMATS,\n        EVENTS: EVENTS\n    };\n});\n"],"file":"inpage_reply.min.js"}