Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1441 ariadna 1
{"version":3,"file":"generatebase.min.js","sources":["../src/generatebase.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 * Tiny AI base generate class.\n *\n * @module      tiny_aiplacement/generatebase\n * @copyright   2024 Matt Porritt <matt.porritt@moodle.com>\n * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {loadingMessages} from 'tiny_aiplacement/loading';\nimport {getString} from 'core/str';\nimport {\n    getContextId,\n    getUserId,\n} from 'tiny_aiplacement/options';\nimport Policy from 'core_ai/policy';\nimport PolicyModal from 'core_ai/policymodal';\nimport CustomEvents from 'core/custom_interaction_events';\nimport {isPolicyAgreed} from './options';\n\nexport default class GenerateBase {\n    modalObject;\n\n    /**\n     * Class constructor.\n     *\n     * @param {TinyMCE.editor} editor The tinyMCE editor instance.\n     */\n    constructor(editor) {\n        this.editor = editor;\n        this.userid = getUserId(editor);\n        this.contextid = getContextId(editor);\n        this.responseObj = null;\n    }\n\n    /**\n     * Display the modal when the AI button is clicked.\n     *\n     */\n    async displayContentModal() {\n        Policy.preconfigurePolicyState(this.userid, isPolicyAgreed(this.editor));\n        if (!await Policy.getPolicyStatus(this.userid)) {\n            const policyModal = await PolicyModal.create();\n            policyModal.getModal().on(CustomEvents.events.activate, policyModal.getActionSelector('save'), () => {\n                this.displayContentModal();\n            });\n            return;\n        }\n\n        this.modalObject = await this.setupModal();\n    }\n\n    getModalClass() {\n        throw new Error(\"Method 'getModalClass' must be implemented.\");\n    }\n\n\n    /**\n     * Set up the base text generation modal with default body content.\n     *\n     * @returns {TextModal} The image modal object.\n     */\n    async setupModal() {\n        const modal = this.getModalClass().create({\n            templateContext: {\n                elementid: this.editor.id,\n            },\n        });\n\n        this.addContentEventListeners(modal);\n\n        return modal;\n    }\n\n    /**\n     * Add event listeners for the text modal.\n     *\n     * @param {Modal} modal\n     */\n    async addContentEventListeners(modal) {\n        const modalRoot = (await modal).getRoot();\n        const root = modalRoot[0];\n\n        root.addEventListener('click', (e) => {\n            this.handleContentModalClick(e, root);\n        });\n\n        this.setupPromptArea(root);\n        this.hideLoadingSpinner(root);\n    }\n\n    handleContentModalClick() {\n        throw new Error('Method handleContentModalClick must be implemented.');\n    }\n\n    /**\n     * Hide the loading spinner.\n     *\n     * @param {Object} root The root element of the modal.\n     */\n    hideLoadingSpinner(root) {\n        const loadingSpinnerDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_spinner\"]`);\n        loadingSpinnerDiv.classList.add('hidden');\n        loadingSpinnerDiv.classList.remove('tiny-aiplacement-loading-spinner-container');\n    }\n\n    /**\n     * Display the loading state in the modal.\n     *\n     * @param {HTMLElement} root - The root element of the modal.\n     * @param {HTMLElement} submitBtn - The submit button element.\n     * @param {String|null} removeClass - The class to be removed from the loading spinner div, if any.\n     */\n    async displayLoading(root, submitBtn, removeClass = null) {\n        const loadingSpinnerDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_spinner\"]`);\n        const overlayDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_overlay\"]`);\n        const blurDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_blur\"]`);\n        const loadingTextDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_loading_text\"]`);\n        const actionButtons = root.querySelectorAll('.tiny-aiplacement-generate-footer button');\n\n        loadingMessages(loadingTextDiv);\n\n        if (removeClass) {\n            loadingSpinnerDiv.classList.remove(removeClass);\n        }\n\n        loadingSpinnerDiv.classList.remove('hidden');\n        overlayDiv.classList.remove('hidden');\n        blurDiv.classList.add('tiny-aiplacement-blur');\n        submitBtn.innerHTML = await getString('generating', 'tiny_aiplacement');\n\n        if (actionButtons) {\n            actionButtons.forEach((button) => {\n                button.disabled = true;\n            });\n        }\n    }\n\n    /**\n     * Hide the loading action in the modal.\n     *\n     * @param {Object} root The root element of the modal.\n     * @param {Object} submitBtn The submit button element.\n     */\n    async hideLoading(root, submitBtn) {\n        const loadingSpinnerDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_spinner\"]`);\n        const overlayDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_overlay\"]`);\n        const blurDiv = root.querySelector(`[id=\"${this.editor.id}_tiny_aiplacement_blur\"]`);\n        const actionButtons = root.querySelectorAll('.tiny-aiplacement-generate-footer button');\n        if (loadingSpinnerDiv) {\n            loadingSpinnerDiv.classList.add('hidden');\n        }\n        if (overlayDiv) {\n            overlayDiv.classList.add('hidden');\n        }\n        if (blurDiv) {\n            blurDiv.classList.remove('tiny-aiplacement-blur');\n        }\n        submitBtn.innerHTML = await getString('regenerate', 'tiny_aiplacement');\n\n        if (actionButtons) {\n            actionButtons.forEach((button) => {\n                button.disabled = false;\n            });\n        }\n    }\n}\n"],"names":["constructor","editor","userid","contextid","responseObj","preconfigurePolicyState","this","Policy","getPolicyStatus","modalObject","setupModal","policyModal","PolicyModal","create","getModal","on","CustomEvents","events","activate","getActionSelector","displayContentModal","getModalClass","Error","modal","templateContext","elementid","id","addContentEventListeners","root","getRoot","addEventListener","e","handleContentModalClick","setupPromptArea","hideLoadingSpinner","loadingSpinnerDiv","querySelector","classList","add","remove","submitBtn","removeClass","overlayDiv","blurDiv","loadingTextDiv","actionButtons","querySelectorAll","innerHTML","forEach","button","disabled"],"mappings":"qpBA0CIA,YAAYC,kLACHA,OAASA,YACTC,QAAS,sBAAUD,aACnBE,WAAY,yBAAaF,aACzBG,YAAc,oDAQZC,wBAAwBC,KAAKJ,QAAQ,4BAAeI,KAAKL,eACrDM,gBAAOC,gBAAgBF,KAAKJ,aAQlCO,kBAAoBH,KAAKI,wBAPpBC,kBAAoBC,qBAAYC,SACtCF,YAAYG,WAAWC,GAAGC,mCAAaC,OAAOC,SAAUP,YAAYQ,kBAAkB,SAAS,UACtFC,0BAQjBC,sBACU,IAAIC,MAAM,wEAUVC,MAAQjB,KAAKe,gBAAgBR,OAAO,CACtCW,gBAAiB,CACbC,UAAWnB,KAAKL,OAAOyB,kBAI1BC,yBAAyBJ,OAEvBA,qCAQoBA,aAErBK,YADmBL,OAAOM,UACT,GAEvBD,KAAKE,iBAAiB,SAAUC,SACvBC,wBAAwBD,EAAGH,cAG/BK,gBAAgBL,WAChBM,mBAAmBN,MAG5BI,gCACU,IAAIV,MAAM,uDAQpBY,mBAAmBN,YACTO,kBAAoBP,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,mCACjES,kBAAkBE,UAAUC,IAAI,UAChCH,kBAAkBE,UAAUE,OAAO,mEAUlBX,KAAMY,eAAWC,mEAAc,WAC1CN,kBAAoBP,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,mCAC3DgB,WAAad,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,mCACpDiB,QAAUf,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,gCACjDkB,eAAiBhB,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,wCACxDmB,cAAgBjB,KAAKkB,iBAAiB,yEAE5BF,gBAEZH,aACAN,kBAAkBE,UAAUE,OAAOE,aAGvCN,kBAAkBE,UAAUE,OAAO,UACnCG,WAAWL,UAAUE,OAAO,UAC5BI,QAAQN,UAAUC,IAAI,yBACtBE,UAAUO,gBAAkB,kBAAU,aAAc,oBAEhDF,eACAA,cAAcG,SAASC,SACnBA,OAAOC,UAAW,uBAWZtB,KAAMY,iBACdL,kBAAoBP,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,mCAC3DgB,WAAad,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,mCACpDiB,QAAUf,KAAKQ,6BAAsB9B,KAAKL,OAAOyB,gCACjDmB,cAAgBjB,KAAKkB,iBAAiB,4CACxCX,mBACAA,kBAAkBE,UAAUC,IAAI,UAEhCI,YACAA,WAAWL,UAAUC,IAAI,UAEzBK,SACAA,QAAQN,UAAUE,OAAO,yBAE7BC,UAAUO,gBAAkB,kBAAU,aAAc,oBAEhDF,eACAA,cAAcG,SAASC,SACnBA,OAAOC,UAAW"}