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"}
|