1{"version":3,"sources":["../src/discussion_nested_v2.js"],"names":["getPostContainer","element","closest","Selectors","post","getPostContainerById","id","find","getParentPostContainers","parents","getPostContentContainer","postContainer","children","not","repliesContainer","forumCoreContent","getInPageReplyContainer","filter","inpageReplyContainer","getInPageReplyForm","inpageReplyContent","getInPageReplyCreateButton","inpageReplyCreateButton","getRepliesVisibilityToggleContainer","repliesVisibilityToggleContainer","getRepliesContainer","hasReplies","length","getShowRepliesButton","replyVisibilityToggleContainer","showReplies","getHideRepliesButton","hideReplies","repliesVisible","is","postIdToSee","showButton","hideButton","addClass","removeClass","slideDown","duration","queue","complete","postContainerToSee","scrollIntoView","css","fadeIn","slideUp","fadeOut","showInPageReplyForm","buildShowInPageReplyFormFunction","additionalTemplateContext","inPageReplyContainer","inPageReplyCreateButton","hasInPageReplyForm","renderInPageReplyTemplate","html","Templates","appendNodeContents","Notification","exception","then","Y","Promise","resolve","use","M","core_formchangechecker","init","formid","one","querySelector","generateID","catch","inPageReplyForm","focus","hideInPageReplyForm","button","postContentContainer","currentSubject","forumSubject","text","currentAuthorName","authorName","context","postid","data","attr","sesskey","cfg","parentsubject","parentauthorname","canreplyprivately","postformat","InPageReply","CONTENT_FORMATS","MOODLE","render","incrementTotalReplyCount","replyCount","each","index","currentCount","parseInt","innerText","registerEventListeners","root","CustomEvents","define","events","activate","AutoRows","on","e","originalEvent","preventDefault","currentTarget","inpageReplyCancelButton","target","EVENTS","POST_CREATED","inpageSubmitBtn","newPostId","postContainers","container","Discussion","discussionToolsContainer","discussion","tools","LockToggle","FavouriteToggle","toggleElement","response","newTargetState","userstate","favourited","Pin","pinned","Subscribe","subscribed"],"mappings":"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","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 * Module for viewing a discussion in nested v2 view.\n *\n * @module mod_Forum/discussion_nested_v2\n * @copyright  2019 Ryan Wyllie <ryan@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport $ from 'jquery';\nimport AutoRows from 'core/auto_rows';\nimport CustomEvents from 'core/custom_interaction_events';\nimport Notification from 'core/notification';\nimport Templates from 'core/templates';\nimport Discussion from 'mod_forum/discussion';\nimport InPageReply from 'mod_forum/inpage_reply';\nimport LockToggle from 'mod_forum/lock_toggle';\nimport FavouriteToggle from 'mod_forum/favourite_toggle';\nimport Pin from 'mod_forum/pin_toggle';\nimport Selectors from 'mod_forum/selectors';\nimport Subscribe from 'mod_forum/subscription_toggle';\n\nconst ANIMATION_DURATION = 150;\n\n/**\n * Get the closest post container element from the given element.\n *\n * @param {Object} element jQuery element to search from\n * @return {Object} jQuery element\n */\nconst getPostContainer = (element) => {\n    return element.closest(Selectors.post.post);\n};\n\n/**\n * Get the closest post container element from the given element.\n *\n * @param {Object} element jQuery element to search from\n * @param {Number} id Id of the post to find.\n * @return {Object} jQuery element\n */\nconst getPostContainerById = (element, id) => {\n    return element.find(`${Selectors.post.post}[data-post-id=${id}]`);\n};\n\n/**\n * Get the parent post container elements from the given element.\n *\n * @param {Object} element jQuery element to search from\n * @return {Object} jQuery element\n */\nconst getParentPostContainers = (element) => {\n    return element.parents(Selectors.post.post);\n};\n\n/**\n * Get the post content container element from the post container element.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Object} jQuery element\n */\nconst getPostContentContainer = (postContainer) => {\n    return postContainer.children().not(Selectors.post.repliesContainer).find(Selectors.post.forumCoreContent);\n};\n\n/**\n * Get the in page reply container element from the post container element.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Object} jQuery element\n */\nconst getInPageReplyContainer = (postContainer) => {\n    return postContainer.children().filter(Selectors.post.inpageReplyContainer);\n};\n\n/**\n * Get the in page reply form element from the post container element.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Object} jQuery element\n */\nconst getInPageReplyForm = (postContainer) => {\n    return getInPageReplyContainer(postContainer).find(Selectors.post.inpageReplyContent);\n};\n\n/**\n * Get the in page reply create (reply) button element from the post container element.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Object} jQuery element\n */\nconst getInPageReplyCreateButton = (postContainer) => {\n    return getPostContentContainer(postContainer).find(Selectors.post.inpageReplyCreateButton);\n};\n\n/**\n * Get the replies visibility toggle container (show/hide replies button container) element\n * from the post container element.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Object} jQuery element\n */\nconst getRepliesVisibilityToggleContainer = (postContainer) => {\n    return postContainer.children(Selectors.post.repliesVisibilityToggleContainer);\n};\n\n/**\n * Get the replies container element from the post container element.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Object} jQuery element\n */\nconst getRepliesContainer = (postContainer) => {\n    return postContainer.children(Selectors.post.repliesContainer);\n};\n\n/**\n * Check if the post has any replies.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Bool}\n */\nconst hasReplies = (postContainer) => {\n    return getRepliesContainer(postContainer).children().length > 0;\n};\n\n/**\n * Get the show replies button element from the replies visibility toggle container element.\n *\n * @param {Object} replyVisibilityToggleContainer jQuery element for the toggle container\n * @return {Object} jQuery element\n */\nconst getShowRepliesButton = (replyVisibilityToggleContainer) => {\n    return replyVisibilityToggleContainer.find(Selectors.post.showReplies);\n};\n\n/**\n * Get the hide replies button element from the replies visibility toggle container element.\n *\n * @param {Object} replyVisibilityToggleContainer jQuery element for the toggle container\n * @return {Object} jQuery element\n */\nconst getHideRepliesButton = (replyVisibilityToggleContainer) => {\n    return replyVisibilityToggleContainer.find(Selectors.post.hideReplies);\n};\n\n/**\n * Check if the replies are visible.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @return {Bool}\n */\nconst repliesVisible = (postContainer) => {\n    const repliesContainer = getRepliesContainer(postContainer);\n    return repliesContainer.is(':visible');\n};\n\n/**\n * Show the post replies.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @param {Number|null} postIdToSee Id of the post to scroll into view (if any)\n */\nconst showReplies = (postContainer, postIdToSee = null) => {\n    const repliesContainer = getRepliesContainer(postContainer);\n    const replyVisibilityToggleContainer = getRepliesVisibilityToggleContainer(postContainer);\n    const showButton = getShowRepliesButton(replyVisibilityToggleContainer);\n    const hideButton = getHideRepliesButton(replyVisibilityToggleContainer);\n\n    showButton.addClass('hidden');\n    hideButton.removeClass('hidden');\n\n    repliesContainer.slideDown({\n        duration: ANIMATION_DURATION,\n        queue: false,\n        complete: () => {\n            if (postIdToSee) {\n                const postContainerToSee = getPostContainerById(repliesContainer, postIdToSee);\n                if (postContainerToSee.length) {\n                    postContainerToSee[0].scrollIntoView();\n                }\n            }\n        }\n    }).css('display', 'none').fadeIn(ANIMATION_DURATION);\n};\n\n/**\n * Hide the post replies.\n *\n * @param {Object} postContainer jQuery element for the post container\n */\nconst hideReplies = (postContainer) => {\n    const repliesContainer = getRepliesContainer(postContainer);\n    const replyVisibilityToggleContainer = getRepliesVisibilityToggleContainer(postContainer);\n    const showButton = getShowRepliesButton(replyVisibilityToggleContainer);\n    const hideButton = getHideRepliesButton(replyVisibilityToggleContainer);\n\n    showButton.removeClass('hidden');\n    hideButton.addClass('hidden');\n\n    repliesContainer.slideUp({\n        duration: ANIMATION_DURATION,\n        queue: false\n    }).fadeOut(ANIMATION_DURATION);\n};\n\n/** Variable to hold the showInPageReplyForm function after it's built. */\nlet showInPageReplyForm = null;\n\n/**\n * Build the showInPageReplyForm function with the given additional template context.\n *\n * @param {Object} additionalTemplateContext Additional render context for the in page reply template.\n * @return {Function}\n */\nconst buildShowInPageReplyFormFunction = (additionalTemplateContext) => {\n    /**\n     * Show the in page reply form in the given in page reply container. The form\n     * display will be animated.\n     *\n     * @param {Object} postContainer jQuery element for the post container\n     */\n    return async(postContainer) => {\n\n        const inPageReplyContainer = getInPageReplyContainer(postContainer);\n        const repliesVisibilityToggleContainer = getRepliesVisibilityToggleContainer(postContainer);\n        const inPageReplyCreateButton = getInPageReplyCreateButton(postContainer);\n\n        if (!hasInPageReplyForm(inPageReplyContainer)) {\n            try {\n                const html = await renderInPageReplyTemplate(additionalTemplateContext, inPageReplyCreateButton, postContainer);\n                Templates.appendNodeContents(inPageReplyContainer, html, '');\n            } catch (e) {\n                Notification.exception(e);\n            }\n\n            // Load formchangechecker module.\n            import('core/yui')\n                .then(Y => {\n                    return new Promise(resolve => {\n                        Y.use('moodle-core-formchangechecker', Y => {\n                            resolve(Y);\n                        });\n                    });\n                })\n                .then(Y => {\n                    M.core_formchangechecker.init({formid: Y.one(postContainer[0].querySelector('form')).generateID()});\n                    return Y;\n                })\n                .catch();\n        }\n\n        inPageReplyCreateButton.fadeOut(ANIMATION_DURATION, () => {\n            const inPageReplyForm = getInPageReplyForm(postContainer);\n            inPageReplyForm.slideDown({\n                duration: ANIMATION_DURATION,\n                queue: false,\n                complete: () => {\n                    inPageReplyForm.find('textarea').focus();\n                }\n            }).css('display', 'none').fadeIn(ANIMATION_DURATION);\n\n            if (repliesVisibilityToggleContainer.length && hasReplies(postContainer)) {\n                repliesVisibilityToggleContainer.fadeIn(ANIMATION_DURATION);\n                hideReplies(postContainer);\n            }\n        });\n    };\n};\n\n/**\n * Hide the in page reply form in the given in page reply container. The form\n * display will be animated.\n *\n * @param {Object} postContainer jQuery element for the post container\n * @param {Number|null} postIdToSee Id of the post to scroll into view (if any)\n */\nconst hideInPageReplyForm = (postContainer, postIdToSee = null) => {\n    const inPageReplyForm = getInPageReplyForm(postContainer);\n    const inPageReplyCreateButton = getInPageReplyCreateButton(postContainer);\n    const repliesVisibilityToggleContainer = getRepliesVisibilityToggleContainer(postContainer);\n\n    if (repliesVisibilityToggleContainer.length && hasReplies(postContainer)) {\n        repliesVisibilityToggleContainer.fadeOut(ANIMATION_DURATION);\n        if (!repliesVisible(postContainer)) {\n            showReplies(postContainer, postIdToSee);\n        }\n    }\n\n    inPageReplyForm.slideUp({\n        duration: ANIMATION_DURATION,\n        queue: false,\n        complete: () => {\n            inPageReplyCreateButton.fadeIn(ANIMATION_DURATION);\n        }\n    }).fadeOut(200);\n};\n\n/**\n * Check if the in page reply container contains the in page reply form.\n *\n * @param {Object} inPageReplyContainer jQuery element for the in page reply container\n * @return {Bool}\n */\nconst hasInPageReplyForm = (inPageReplyContainer) => {\n    return inPageReplyContainer.find(Selectors.post.inpageReplyContent).length > 0;\n};\n\n/**\n * Render the template to generate the in page reply form HTML.\n *\n * @param {Object} additionalTemplateContext Additional render context for the in page reply template\n * @param {Object} button jQuery element for the reply button that was clicked\n * @param {Object} postContainer jQuery element for the post container\n * @return {Object} jQuery promise\n */\nconst renderInPageReplyTemplate = (additionalTemplateContext, button, postContainer) => {\n    const postContentContainer = getPostContentContainer(postContainer);\n    const currentSubject = postContentContainer.find(Selectors.post.forumSubject).text();\n    const currentAuthorName = postContentContainer.find(Selectors.post.authorName).text();\n    const context = {\n        postid: postContainer.data('post-id'),\n        \"reply_url\": button.attr('data-href'),\n        sesskey: M.cfg.sesskey,\n        parentsubject: currentSubject,\n        parentauthorname: currentAuthorName,\n        canreplyprivately: button.data('can-reply-privately'),\n        postformat: InPageReply.CONTENT_FORMATS.MOODLE,\n        ...additionalTemplateContext\n    };\n\n    return Templates.render('mod_forum/inpage_reply_v2', context);\n};\n\n/**\n * Increment the total reply count in the show/hide replies buttons for the post.\n *\n * @param {Object} postContainer jQuery element for the post container\n */\nconst incrementTotalReplyCount = (postContainer) => {\n    getRepliesVisibilityToggleContainer(postContainer).find(Selectors.post.replyCount).each((index, element) => {\n        const currentCount = parseInt(element.innerText, 10);\n        element.innerText = currentCount + 1;\n    });\n};\n\n/**\n * Create all of the event listeners for the discussion.\n *\n * @param {Object} root jQuery element for the discussion container\n */\nconst registerEventListeners = (root) => {\n    CustomEvents.define(root, [CustomEvents.events.activate]);\n    // Auto expanding text area for in page reply.\n    AutoRows.init(root);\n\n    // Reply button is clicked.\n    root.on(CustomEvents.events.activate, Selectors.post.inpageReplyCreateButton, (e, data) => {\n        data.originalEvent.preventDefault();\n        const postContainer = getPostContainer($(e.currentTarget));\n        showInPageReplyForm(postContainer);\n    });\n\n    // Cancel in page reply button.\n    root.on(CustomEvents.events.activate, Selectors.post.inpageReplyCancelButton, (e, data) => {\n        data.originalEvent.preventDefault();\n        const postContainer = getPostContainer($(e.currentTarget));\n        hideInPageReplyForm(postContainer);\n    });\n\n    // Show replies button clicked.\n    root.on(CustomEvents.events.activate, Selectors.post.showReplies, (e, data) => {\n        data.originalEvent.preventDefault();\n        const postContainer = getPostContainer($(e.target));\n        showReplies(postContainer);\n    });\n\n    // Hide replies button clicked.\n    root.on(CustomEvents.events.activate, Selectors.post.hideReplies, (e, data) => {\n        data.originalEvent.preventDefault();\n        const postContainer = getPostContainer($(e.target));\n        hideReplies(postContainer);\n    });\n\n    // Post created with in page reply.\n    root.on(InPageReply.EVENTS.POST_CREATED, Selectors.post.inpageSubmitBtn, (e, newPostId) => {\n        const currentTarget = $(e.currentTarget);\n        const postContainer = getPostContainer(currentTarget);\n        const postContainers = getParentPostContainers(currentTarget);\n        hideInPageReplyForm(postContainer, newPostId);\n\n        postContainers.each((index, container) => {\n            incrementTotalReplyCount($(container));\n        });\n    });\n};\n\n/**\n * Initialise the javascript for the discussion in nested v2 display mode.\n *\n * @param {Object} root jQuery element for the discussion container\n * @param {Object} context Additional render context for the in page reply template\n */\nexport const init = (root, context) => {\n    // Build the showInPageReplyForm function with the additional render context.\n    showInPageReplyForm = buildShowInPageReplyFormFunction(context);\n    // Add discussion event listeners.\n    registerEventListeners(root);\n    // Initialise default discussion javascript (keyboard nav etc).\n    Discussion.init(root);\n    // Add in page reply javascript.\n    InPageReply.init(root);\n\n    // Initialise the settings menu javascript.\n    const discussionToolsContainer = root.find(Selectors.discussion.tools);\n    LockToggle.init(discussionToolsContainer, false);\n    FavouriteToggle.init(discussionToolsContainer, false, (toggleElement, response) => {\n        const newTargetState = response.userstate.favourited ? 0 : 1;\n        return toggleElement.data('targetstate', newTargetState);\n    });\n    Pin.init(discussionToolsContainer, false, (toggleElement, response) => {\n        const newTargetState = response.pinned ? 0 : 1;\n        return toggleElement.data('targetstate', newTargetState);\n    });\n    Subscribe.init(discussionToolsContainer, false, (toggleElement, response) => {\n        const newTargetState = response.userstate.subscribed ? 0 : 1;\n        toggleElement.data('targetstate', newTargetState);\n    });\n};\n"],"file":"discussion_nested_v2.min.js"}