From 04cf56c34e1e56a49d91db5696dd7616d9feec00 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Thu, 29 Feb 2024 13:57:40 +0800 Subject: [PATCH] Final tidy up and addition of toast notifications Version bump and checks. --- CHANGELOG.md | 2 +- README.md | 4 ++-- amd/build/local/removals/main.min.js | 2 +- amd/build/local/removals/main.min.js.map | 2 +- amd/src/local/removals/main.js | 13 ++++++++++++- lang/en/block_stash.php | 4 ++++ removals.php | 19 ++++++++++++++----- templates/local/removal/zerostate.mustache | 4 ++++ version.php | 4 ++-- 9 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 templates/local/removal/zerostate.mustache diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a84e22..588789a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Block Stash =========== -Version 2.1.0 (TBD) +Version 2.1.0 (29th February 2024) ------------------- * Add another leaderboard which shows a list of students with a specified item. diff --git a/README.md b/README.md index 7abe408..6d9bd86 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Features - Unlock access to activities based on the objects found (requires plugin [availability_stash](https://moodle.org/plugins/availability_stash)) - Trade by exchanging items for different items (requires plugin [filter plugin](https://github.com/branchup/moodle-filter_shortcodes)) - Allow students to trade items with each other in the trade center. -- *New* Configure stash to remove items to allow quiz attempts. +- **New** Configure stash to remove items to allow quiz attempts. Requirements ------------ @@ -55,7 +55,7 @@ Note that teachers cannot pick up the objects, for them they will always re-appe 4. Click the 'Configure removal' button 5. Select at least one item to remove (+ symbol) 6. Select a quiz and click save -7. You're quiz will no remove the configured items from students attempting that quiz. It is recommended that you inform you students about the cost of the quiz in the description of the quiz +7. Your quiz will now remove the configured items from students attempting that quiz. It is recommended that you inform your students about the item removal in the quiz description ### Important! diff --git a/amd/build/local/removals/main.min.js b/amd/build/local/removals/main.min.js index bbf5b4e..44dd427 100644 --- a/amd/build/local/removals/main.min.js +++ b/amd/build/local/removals/main.min.js @@ -1,3 +1,3 @@ -define("block_stash/local/removals/main",["exports","core/modal_factory","core/modal_events","core/templates","block_stash/local/trade_adder/main","core/ajax","block_stash/local/datasources/items-getter","core/str","core/toast"],(function(_exports,_modal_factory,_modal_events,_templates,tradeAdder,_ajax,getItems,_str,Toast){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}return newObj.default=obj,cache&&cache.set(obj,newObj),newObj}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),_templates=_interopRequireDefault(_templates),tradeAdder=_interopRequireWildcard(tradeAdder),_ajax=_interopRequireDefault(_ajax),getItems=_interopRequireWildcard(getItems),Toast=_interopRequireWildcard(Toast);const showModal=async function(courseid){let editdetails=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];const modal=await buildModal(courseid,editdetails);displayModal(modal,courseid)},buildModal=async(courseid,editdetails)=>{let quizzes=await fetchQuizData(courseid);quizzes.activities.forEach((quiz=>{quiz.selected=!1,0!==editdetails.length&&quiz.id==editdetails.quizid&&(quiz.selected=!0)}));let context={courseid:courseid,quizzes:quizzes.activities};if(0!==editdetails.length){let allitems=await getItems.getIndexedItems(courseid),additemsdata=[];editdetails.items.forEach((item=>{additemsdata.push({itemid:item.itemid,name:allitems[item.itemid].name,quantity:item.quantity,imageurl:allitems[item.itemid].imageurl})})),context.additems=additemsdata,context.removalid=editdetails.removalid}return window.console.log(context),_modal_factory.default.create({title:(0,_str.get_string)("configureremoval","block_stash"),body:_templates.default.render("block_stash/local/removal/removal_form",context),type:_modal_factory.default.types.SAVE_CANCEL})},displayModal=async(modal,courseid)=>{modal.getRoot().on(_modal_events.default.bodyRendered,(()=>{tradeAdder.init(),tradeAdder.registerActions()})),modal.getRoot().on(_modal_events.default.save,(()=>{saveData(courseid)})),modal.getRoot().on(_modal_events.default.hidden,(()=>{modal.destroy()})),modal.show()},saveData=async courseid=>{let itemsinfo=document.querySelectorAll(".block-stash-quantity"),items=[],returnitemdata=[];itemsinfo.forEach((item=>{let itemid=item.closest(".block-stash-trade-item").getAttribute("data-id"),basedata={itemid:parseInt(itemid),quantity:parseInt(item.value)},fulldata={itemid:parseInt(itemid),quantity:parseInt(item.value),name:item.closest(".block-stash-trade-item").children[0].innerText.trim()};items.push(basedata),returnitemdata.push(fulldata)}));let quizselect=document.querySelector(".block-stash-quiz-select"),cmid=quizselect.value;if("0"===cmid)return await Toast.addToastRegion(document.querySelector(".modal-body")),Toast.add((0,_str.get_string)("selectquizcheck","block_stash"),{type:"danger",autohide:!0,closeButton:!0}),!1;let removalid=0,removalelement=document.getElementById("block_stash_removal_id");removalid=removalelement?await updateRemovalEntry(courseid,parseInt(cmid),items,removalelement.dataset.id):await saveRemovalEntry(courseid,parseInt(cmid),items);let context={cmid:cmid,cmname:quizselect.item(quizselect.selectedIndex).text,courseid:courseid,removalid:removalid,items:returnitemdata,editinfo:JSON.stringify(items)};_templates.default.render("block_stash/local/removal/table_row",context).then(((html,js)=>{if(removalelement){let tmpe=document.querySelector('.block-stash-removal-edit[data-id="'+removalid+'"').closest("tr"),things=_templates.default.replaceNode(tmpe,html,js);registerDeleteEvent(courseid,things[0].querySelector(".block-stash-removal-icon")),registerEditEvent(courseid,things[0].querySelector(".block-stash-removal-edit"))}else{let tableobject=document.querySelector(".block-stash-removal-body"),things=_templates.default.appendNodeContents(tableobject,html,js);registerDeleteEvent(courseid,things[0].querySelector(".block-stash-removal-icon")),registerEditEvent(courseid,things[0].querySelector(".block-stash-removal-edit"))}}))},registerDeleteEvent=(courseid,deleteobject)=>{deleteobject.addEventListener("click",(e=>{e.preventDefault();let deletionelement=e.currentTarget,removalid=deletionelement.dataset.id;deleteRemovalEntry(courseid,parseInt(removalid)).then((()=>{deletionelement.closest("tr").remove()}))}))},registerEditEvent=(courseid,editobject)=>{editobject.addEventListener("click",(e=>{e.preventDefault();let jsondata=JSON.parse(editobject.dataset.json),details={removalid:editobject.dataset.id,quizid:editobject.dataset.quiz,items:jsondata};showModal(courseid,details)}))};_exports.init=courseid=>{document.querySelector(".block-config-removal").addEventListener("click",(e=>{e.preventDefault(),showModal(courseid)})),document.querySelectorAll(".block-stash-removal-icon").forEach((deleteobject=>{registerDeleteEvent(courseid,deleteobject)})),document.querySelectorAll(".block-stash-removal-edit").forEach((editobject=>{registerEditEvent(courseid,editobject)}))};const fetchQuizData=courseid=>_ajax.default.call([{methodname:"block_stash_get_removal_activities",args:{courseid:courseid}}])[0],saveRemovalEntry=(courseid,cmid,items)=>_ajax.default.call([{methodname:"block_stash_save_removal",args:{courseid:courseid,cmid:cmid,items:items}}])[0],updateRemovalEntry=(courseid,cmid,items,removalid)=>_ajax.default.call([{methodname:"block_stash_save_removal",args:{courseid:courseid,cmid:cmid,items:items,removalid:removalid}}])[0],deleteRemovalEntry=(courseid,removalid)=>_ajax.default.call([{methodname:"block_stash_delete_removal",args:{courseid:courseid,removalid:removalid}}])[0]})); +define("block_stash/local/removals/main",["exports","core/modal_factory","core/modal_events","core/templates","block_stash/local/trade_adder/main","core/ajax","block_stash/local/datasources/items-getter","core/str","core/toast"],(function(_exports,_modal_factory,_modal_events,_templates,tradeAdder,_ajax,getItems,_str,Toast){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}return newObj.default=obj,cache&&cache.set(obj,newObj),newObj}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),_templates=_interopRequireDefault(_templates),tradeAdder=_interopRequireWildcard(tradeAdder),_ajax=_interopRequireDefault(_ajax),getItems=_interopRequireWildcard(getItems),Toast=_interopRequireWildcard(Toast);const showModal=async function(courseid){let editdetails=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];const modal=await buildModal(courseid,editdetails);displayModal(modal,courseid)},buildModal=async(courseid,editdetails)=>{let quizzes=await fetchQuizData(courseid);quizzes.activities.forEach((quiz=>{quiz.selected=!1,0!==editdetails.length&&quiz.id==editdetails.quizid&&(quiz.selected=!0)}));let context={courseid:courseid,quizzes:quizzes.activities};if(0!==editdetails.length){let allitems=await getItems.getIndexedItems(courseid),additemsdata=[];editdetails.items.forEach((item=>{additemsdata.push({itemid:item.itemid,name:allitems[item.itemid].name,quantity:item.quantity,imageurl:allitems[item.itemid].imageurl})})),context.additems=additemsdata,context.removalid=editdetails.removalid}return window.console.log(context),_modal_factory.default.create({title:(0,_str.get_string)("configureremoval","block_stash"),body:_templates.default.render("block_stash/local/removal/removal_form",context),type:_modal_factory.default.types.SAVE_CANCEL})},displayModal=async(modal,courseid)=>{modal.getRoot().on(_modal_events.default.bodyRendered,(()=>{tradeAdder.init(),tradeAdder.registerActions()})),modal.getRoot().on(_modal_events.default.save,(()=>{saveData(courseid)})),modal.getRoot().on(_modal_events.default.hidden,(()=>{modal.destroy()})),modal.show()},saveData=async courseid=>{let itemsinfo=document.querySelectorAll(".block-stash-quantity"),items=[],returnitemdata=[];itemsinfo.forEach((item=>{let itemid=item.closest(".block-stash-trade-item").getAttribute("data-id"),basedata={itemid:parseInt(itemid),quantity:parseInt(item.value)},fulldata={itemid:parseInt(itemid),quantity:parseInt(item.value),name:item.closest(".block-stash-trade-item").children[0].innerText.trim()};items.push(basedata),returnitemdata.push(fulldata)}));let quizselect=document.querySelector(".block-stash-quiz-select"),cmid=quizselect.value;if("0"===cmid)return await Toast.addToastRegion(document.querySelector(".modal-body")),Toast.add((0,_str.get_string)("selectquizcheck","block_stash"),{type:"danger",autohide:!0,closeButton:!0}),!1;let removalid=0,removalelement=document.getElementById("block_stash_removal_id");removalid=removalelement?updateRemovalEntry(courseid,parseInt(cmid),items,removalelement.dataset.id).then((()=>{Toast.add((0,_str.get_string)("configupdated","block_stash"),{type:"info",autohide:!0,closeButton:!0})})):await saveRemovalEntry(courseid,parseInt(cmid),items);let context={cmid:cmid,cmname:quizselect.item(quizselect.selectedIndex).text,courseid:courseid,removalid:removalid,items:returnitemdata,editinfo:JSON.stringify(items)};_templates.default.render("block_stash/local/removal/table_row",context).then(((html,js)=>{if(removalelement){let tmpe=document.querySelector('.block-stash-removal-edit[data-id="'+removalid+'"').closest("tr"),things=_templates.default.replaceNode(tmpe,html,js);registerDeleteEvent(courseid,things[0].querySelector(".block-stash-removal-icon")),registerEditEvent(courseid,things[0].querySelector(".block-stash-removal-edit"))}else{let tableobject=document.querySelector(".block-stash-removal-body"),things=_templates.default.appendNodeContents(tableobject,html,js);registerDeleteEvent(courseid,things[0].querySelector(".block-stash-removal-icon")),registerEditEvent(courseid,things[0].querySelector(".block-stash-removal-edit"))}}))},registerDeleteEvent=(courseid,deleteobject)=>{deleteobject.addEventListener("click",(e=>{e.preventDefault();let deletionelement=e.currentTarget,removalid=deletionelement.dataset.id;deleteRemovalEntry(courseid,parseInt(removalid)).then((()=>{deletionelement.closest("tr").remove(),Toast.add((0,_str.get_string)("configdeleted","block_stash"),{type:"info",autohide:!0,closeButton:!0})}))}))},registerEditEvent=(courseid,editobject)=>{editobject.addEventListener("click",(e=>{e.preventDefault();let jsondata=JSON.parse(editobject.dataset.json),details={removalid:editobject.dataset.id,quizid:editobject.dataset.quiz,items:jsondata};showModal(courseid,details)}))};_exports.init=courseid=>{document.querySelector(".block-config-removal").addEventListener("click",(e=>{e.preventDefault(),showModal(courseid)})),document.querySelectorAll(".block-stash-removal-icon").forEach((deleteobject=>{registerDeleteEvent(courseid,deleteobject)})),document.querySelectorAll(".block-stash-removal-edit").forEach((editobject=>{registerEditEvent(courseid,editobject)}))};const fetchQuizData=courseid=>_ajax.default.call([{methodname:"block_stash_get_removal_activities",args:{courseid:courseid}}])[0],saveRemovalEntry=(courseid,cmid,items)=>_ajax.default.call([{methodname:"block_stash_save_removal",args:{courseid:courseid,cmid:cmid,items:items}}])[0],updateRemovalEntry=(courseid,cmid,items,removalid)=>_ajax.default.call([{methodname:"block_stash_save_removal",args:{courseid:courseid,cmid:cmid,items:items,removalid:removalid}}])[0],deleteRemovalEntry=(courseid,removalid)=>_ajax.default.call([{methodname:"block_stash_delete_removal",args:{courseid:courseid,removalid:removalid}}])[0]})); //# sourceMappingURL=main.min.js.map \ No newline at end of file diff --git a/amd/build/local/removals/main.min.js.map b/amd/build/local/removals/main.min.js.map index 0c3f861..fb4c71f 100644 --- a/amd/build/local/removals/main.min.js.map +++ b/amd/build/local/removals/main.min.js.map @@ -1 +1 @@ -{"version":3,"file":"main.min.js","sources":["../../../src/local/removals/main.js"],"sourcesContent":["import ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport Templates from 'core/templates';\nimport * as tradeAdder from 'block_stash/local/trade_adder/main';\nimport Ajax from 'core/ajax';\nimport * as getItems from 'block_stash/local/datasources/items-getter';\nimport {get_string as getString} from 'core/str';\nimport * as Toast from 'core/toast';\n\nconst showModal = async(courseid, editdetails = []) => {\n const modal = await buildModal(courseid, editdetails);\n displayModal(modal, courseid);\n};\n\nconst buildModal = async(courseid, editdetails) => {\n\n // Fetch quizzes.\n let quizzes = await fetchQuizData(courseid);\n\n quizzes.activities.forEach((quiz) => {\n quiz['selected'] = false;\n if (editdetails.length !== 0) {\n if (quiz.id == editdetails.quizid) {\n quiz['selected'] = true;\n }\n }\n });\n\n let context = {'courseid': courseid, 'quizzes': quizzes.activities};\n if (editdetails.length !== 0) {\n let allitems = await getItems.getIndexedItems(courseid);\n let additemsdata = [];\n editdetails.items.forEach((item) => {\n additemsdata.push(\n {\n 'itemid': item.itemid,\n 'name': allitems[item.itemid].name,\n 'quantity': item.quantity,\n 'imageurl': allitems[item.itemid].imageurl\n }\n );\n });\n context['additems'] = additemsdata;\n context['removalid'] = editdetails.removalid;\n }\n window.console.log(context);\n\n return ModalFactory.create({\n title: getString('configureremoval', 'block_stash'),\n body: Templates.render('block_stash/local/removal/removal_form', context),\n type: ModalFactory.types.SAVE_CANCEL\n });\n};\n\nconst displayModal = async(modal, courseid) => {\n\n modal.getRoot().on(ModalEvents.bodyRendered, () => {\n tradeAdder.init();\n tradeAdder.registerActions();\n });\n\n modal.getRoot().on(ModalEvents.save, () => {\n saveData(courseid);\n });\n\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n modal.show();\n};\n\nconst saveData = async (courseid) => {\n let itemsinfo = document.querySelectorAll('.block-stash-quantity');\n let items = [];\n let returnitemdata = [];\n itemsinfo.forEach((item) => {\n let itemid = item.closest('.block-stash-trade-item').getAttribute('data-id');\n let basedata = {\n 'itemid': parseInt(itemid),\n 'quantity': parseInt(item.value)\n };\n // Do it again, but duplicating objects just ends up with a reference which is not what I want.\n let fulldata = {\n 'itemid': parseInt(itemid),\n 'quantity': parseInt(item.value),\n 'name': item.closest('.block-stash-trade-item').children[0].innerText.trim()\n };\n items.push(basedata);\n returnitemdata.push(fulldata);\n });\n let quizselect = document.querySelector('.block-stash-quiz-select');\n let cmid = quizselect.value;\n if (cmid === '0') {\n await Toast.addToastRegion(document.querySelector('.modal-body'));\n Toast.add(getString('selectquizcheck', 'block_stash'), {\n type: 'danger',\n autohide: true,\n closeButton: true,\n });\n return false;\n }\n let removalid = 0;\n let removalelement = document.getElementById('block_stash_removal_id');\n if (removalelement) {\n removalid = await updateRemovalEntry(courseid, parseInt(cmid), items, removalelement.dataset.id);\n } else {\n removalid = await saveRemovalEntry(courseid, parseInt(cmid), items);\n }\n\n let context = {\n 'cmid': cmid,\n 'cmname': quizselect.item(quizselect.selectedIndex).text,\n 'courseid': courseid,\n 'removalid': removalid,\n 'items': returnitemdata,\n 'editinfo': JSON.stringify(items)\n };\n // window.console.log(context);\n Templates.render('block_stash/local/removal/table_row', context).then((html, js) => {\n if (!removalelement) {\n let tableobject = document.querySelector('.block-stash-removal-body');\n let things = Templates.appendNodeContents(tableobject, html, js);\n registerDeleteEvent(courseid, things[0].querySelector('.block-stash-removal-icon'));\n registerEditEvent(courseid, things[0].querySelector('.block-stash-removal-edit'));\n } else {\n let rowelement = document.querySelector('.block-stash-removal-edit[data-id=\"' + removalid + '\"');\n let tmpe = rowelement.closest('tr');\n let things = Templates.replaceNode(tmpe, html, js);\n registerDeleteEvent(courseid, things[0].querySelector('.block-stash-removal-icon'));\n registerEditEvent(courseid, things[0].querySelector('.block-stash-removal-edit'));\n }\n });\n};\n\nconst registerDeleteEvent = (courseid, deleteobject) => {\n deleteobject.addEventListener('click', (e) => {\n e.preventDefault();\n let deletionelement = e.currentTarget;\n let removalid = deletionelement.dataset.id;\n // Make ajax request to delete this removal configuration.\n deleteRemovalEntry(courseid, parseInt(removalid)).then(() => {\n // If the request was okay then remove the table row.\n let row = deletionelement.closest('tr');\n row.remove();\n });\n });\n};\n\nconst registerEditEvent = (courseid, editobject) => {\n editobject.addEventListener('click', (e) => {\n e.preventDefault();\n let jsondata = JSON.parse(editobject.dataset.json);\n let details = {'removalid': editobject.dataset.id, 'quizid': editobject.dataset.quiz, 'items': jsondata};\n showModal(courseid, details);\n });\n};\n\nexport const init = (courseid) => {\n\n let configbutton = document.querySelector('.block-config-removal');\n configbutton.addEventListener('click', (e) => {\n e.preventDefault();\n showModal(courseid);\n });\n\n let deletebutton = document.querySelectorAll('.block-stash-removal-icon');\n deletebutton.forEach((deleteobject) => {\n registerDeleteEvent(courseid, deleteobject);\n });\n\n let editbutton = document.querySelectorAll('.block-stash-removal-edit');\n editbutton.forEach((editobject) => {\n registerEditEvent(courseid, editobject);\n });\n};\n\nconst fetchQuizData = (courseid) => Ajax.call([{\n methodname: 'block_stash_get_removal_activities',\n args: {courseid: courseid}\n}])[0];\n\nconst saveRemovalEntry = (courseid, cmid, items) => Ajax.call([{\n methodname: 'block_stash_save_removal',\n args: {'courseid': courseid, 'cmid': cmid, 'items': items}\n}])[0];\n\nconst updateRemovalEntry = (courseid, cmid, items, removalid) => Ajax.call([{\n methodname: 'block_stash_save_removal',\n args: {'courseid': courseid, 'cmid': cmid, 'items': items, 'removalid': removalid}\n}])[0];\n\nconst deleteRemovalEntry = (courseid, removalid) => Ajax.call([{\n methodname: 'block_stash_delete_removal',\n args: {'courseid': courseid, 'removalid': removalid}\n}])[0];\n"],"names":["showModal","async","courseid","editdetails","modal","buildModal","displayModal","quizzes","fetchQuizData","activities","forEach","quiz","length","id","quizid","context","allitems","getItems","getIndexedItems","additemsdata","items","item","push","itemid","name","quantity","imageurl","removalid","window","console","log","ModalFactory","create","title","body","Templates","render","type","types","SAVE_CANCEL","getRoot","on","ModalEvents","bodyRendered","tradeAdder","init","registerActions","save","saveData","hidden","destroy","show","itemsinfo","document","querySelectorAll","returnitemdata","closest","getAttribute","basedata","parseInt","value","fulldata","children","innerText","trim","quizselect","querySelector","cmid","Toast","addToastRegion","add","autohide","closeButton","removalelement","getElementById","updateRemovalEntry","dataset","saveRemovalEntry","selectedIndex","text","JSON","stringify","then","html","js","tmpe","things","replaceNode","registerDeleteEvent","registerEditEvent","tableobject","appendNodeContents","deleteobject","addEventListener","e","preventDefault","deletionelement","currentTarget","deleteRemovalEntry","remove","editobject","jsondata","parse","json","details","Ajax","call","methodname","args"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.min.js","sources":["../../../src/local/removals/main.js"],"sourcesContent":["import ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport Templates from 'core/templates';\nimport * as tradeAdder from 'block_stash/local/trade_adder/main';\nimport Ajax from 'core/ajax';\nimport * as getItems from 'block_stash/local/datasources/items-getter';\nimport {get_string as getString} from 'core/str';\nimport * as Toast from 'core/toast';\n\nconst showModal = async(courseid, editdetails = []) => {\n const modal = await buildModal(courseid, editdetails);\n displayModal(modal, courseid);\n};\n\nconst buildModal = async(courseid, editdetails) => {\n\n // Fetch quizzes.\n let quizzes = await fetchQuizData(courseid);\n\n quizzes.activities.forEach((quiz) => {\n quiz['selected'] = false;\n if (editdetails.length !== 0) {\n if (quiz.id == editdetails.quizid) {\n quiz['selected'] = true;\n }\n }\n });\n\n let context = {'courseid': courseid, 'quizzes': quizzes.activities};\n if (editdetails.length !== 0) {\n let allitems = await getItems.getIndexedItems(courseid);\n let additemsdata = [];\n editdetails.items.forEach((item) => {\n additemsdata.push(\n {\n 'itemid': item.itemid,\n 'name': allitems[item.itemid].name,\n 'quantity': item.quantity,\n 'imageurl': allitems[item.itemid].imageurl\n }\n );\n });\n context['additems'] = additemsdata;\n context['removalid'] = editdetails.removalid;\n }\n window.console.log(context);\n\n return ModalFactory.create({\n title: getString('configureremoval', 'block_stash'),\n body: Templates.render('block_stash/local/removal/removal_form', context),\n type: ModalFactory.types.SAVE_CANCEL\n });\n};\n\nconst displayModal = async(modal, courseid) => {\n\n modal.getRoot().on(ModalEvents.bodyRendered, () => {\n tradeAdder.init();\n tradeAdder.registerActions();\n });\n\n modal.getRoot().on(ModalEvents.save, () => {\n saveData(courseid);\n });\n\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n modal.show();\n};\n\nconst saveData = async (courseid) => {\n let itemsinfo = document.querySelectorAll('.block-stash-quantity');\n let items = [];\n let returnitemdata = [];\n itemsinfo.forEach((item) => {\n let itemid = item.closest('.block-stash-trade-item').getAttribute('data-id');\n let basedata = {\n 'itemid': parseInt(itemid),\n 'quantity': parseInt(item.value)\n };\n // Do it again, but duplicating objects just ends up with a reference which is not what I want.\n let fulldata = {\n 'itemid': parseInt(itemid),\n 'quantity': parseInt(item.value),\n 'name': item.closest('.block-stash-trade-item').children[0].innerText.trim()\n };\n items.push(basedata);\n returnitemdata.push(fulldata);\n });\n let quizselect = document.querySelector('.block-stash-quiz-select');\n let cmid = quizselect.value;\n if (cmid === '0') {\n await Toast.addToastRegion(document.querySelector('.modal-body'));\n Toast.add(getString('selectquizcheck', 'block_stash'), {\n type: 'danger',\n autohide: true,\n closeButton: true,\n });\n return false;\n }\n let removalid = 0;\n let removalelement = document.getElementById('block_stash_removal_id');\n if (removalelement) {\n removalid = updateRemovalEntry(courseid, parseInt(cmid), items, removalelement.dataset.id).then(() => {\n Toast.add(getString('configupdated', 'block_stash'), {\n type: 'info',\n autohide: true,\n closeButton: true,\n });\n });\n } else {\n removalid = await saveRemovalEntry(courseid, parseInt(cmid), items);\n }\n\n let context = {\n 'cmid': cmid,\n 'cmname': quizselect.item(quizselect.selectedIndex).text,\n 'courseid': courseid,\n 'removalid': removalid,\n 'items': returnitemdata,\n 'editinfo': JSON.stringify(items)\n };\n // window.console.log(context);\n Templates.render('block_stash/local/removal/table_row', context).then((html, js) => {\n if (!removalelement) {\n let tableobject = document.querySelector('.block-stash-removal-body');\n let things = Templates.appendNodeContents(tableobject, html, js);\n registerDeleteEvent(courseid, things[0].querySelector('.block-stash-removal-icon'));\n registerEditEvent(courseid, things[0].querySelector('.block-stash-removal-edit'));\n } else {\n let rowelement = document.querySelector('.block-stash-removal-edit[data-id=\"' + removalid + '\"');\n let tmpe = rowelement.closest('tr');\n let things = Templates.replaceNode(tmpe, html, js);\n registerDeleteEvent(courseid, things[0].querySelector('.block-stash-removal-icon'));\n registerEditEvent(courseid, things[0].querySelector('.block-stash-removal-edit'));\n }\n });\n};\n\nconst registerDeleteEvent = (courseid, deleteobject) => {\n deleteobject.addEventListener('click', (e) => {\n e.preventDefault();\n let deletionelement = e.currentTarget;\n let removalid = deletionelement.dataset.id;\n // Make ajax request to delete this removal configuration.\n deleteRemovalEntry(courseid, parseInt(removalid)).then(() => {\n // If the request was okay then remove the table row.\n let row = deletionelement.closest('tr');\n row.remove();\n Toast.add(getString('configdeleted', 'block_stash'), {\n type: 'info',\n autohide: true,\n closeButton: true,\n });\n });\n });\n};\n\nconst registerEditEvent = (courseid, editobject) => {\n editobject.addEventListener('click', (e) => {\n e.preventDefault();\n let jsondata = JSON.parse(editobject.dataset.json);\n let details = {'removalid': editobject.dataset.id, 'quizid': editobject.dataset.quiz, 'items': jsondata};\n showModal(courseid, details);\n });\n};\n\nexport const init = (courseid) => {\n\n let configbutton = document.querySelector('.block-config-removal');\n configbutton.addEventListener('click', (e) => {\n e.preventDefault();\n showModal(courseid);\n });\n\n let deletebutton = document.querySelectorAll('.block-stash-removal-icon');\n deletebutton.forEach((deleteobject) => {\n registerDeleteEvent(courseid, deleteobject);\n });\n\n let editbutton = document.querySelectorAll('.block-stash-removal-edit');\n editbutton.forEach((editobject) => {\n registerEditEvent(courseid, editobject);\n });\n};\n\nconst fetchQuizData = (courseid) => Ajax.call([{\n methodname: 'block_stash_get_removal_activities',\n args: {courseid: courseid}\n}])[0];\n\nconst saveRemovalEntry = (courseid, cmid, items) => Ajax.call([{\n methodname: 'block_stash_save_removal',\n args: {'courseid': courseid, 'cmid': cmid, 'items': items}\n}])[0];\n\nconst updateRemovalEntry = (courseid, cmid, items, removalid) => Ajax.call([{\n methodname: 'block_stash_save_removal',\n args: {'courseid': courseid, 'cmid': cmid, 'items': items, 'removalid': removalid}\n}])[0];\n\nconst deleteRemovalEntry = (courseid, removalid) => Ajax.call([{\n methodname: 'block_stash_delete_removal',\n args: {'courseid': courseid, 'removalid': removalid}\n}])[0];\n"],"names":["showModal","async","courseid","editdetails","modal","buildModal","displayModal","quizzes","fetchQuizData","activities","forEach","quiz","length","id","quizid","context","allitems","getItems","getIndexedItems","additemsdata","items","item","push","itemid","name","quantity","imageurl","removalid","window","console","log","ModalFactory","create","title","body","Templates","render","type","types","SAVE_CANCEL","getRoot","on","ModalEvents","bodyRendered","tradeAdder","init","registerActions","save","saveData","hidden","destroy","show","itemsinfo","document","querySelectorAll","returnitemdata","closest","getAttribute","basedata","parseInt","value","fulldata","children","innerText","trim","quizselect","querySelector","cmid","Toast","addToastRegion","add","autohide","closeButton","removalelement","getElementById","updateRemovalEntry","dataset","then","saveRemovalEntry","selectedIndex","text","JSON","stringify","html","js","tmpe","things","replaceNode","registerDeleteEvent","registerEditEvent","tableobject","appendNodeContents","deleteobject","addEventListener","e","preventDefault","deletionelement","currentTarget","deleteRemovalEntry","remove","editobject","jsondata","parse","json","details","Ajax","call","methodname","args"],"mappings":"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"} \ No newline at end of file diff --git a/amd/src/local/removals/main.js b/amd/src/local/removals/main.js index 9d64bec..6966676 100644 --- a/amd/src/local/removals/main.js +++ b/amd/src/local/removals/main.js @@ -102,7 +102,13 @@ const saveData = async (courseid) => { let removalid = 0; let removalelement = document.getElementById('block_stash_removal_id'); if (removalelement) { - removalid = await updateRemovalEntry(courseid, parseInt(cmid), items, removalelement.dataset.id); + removalid = updateRemovalEntry(courseid, parseInt(cmid), items, removalelement.dataset.id).then(() => { + Toast.add(getString('configupdated', 'block_stash'), { + type: 'info', + autohide: true, + closeButton: true, + }); + }); } else { removalid = await saveRemovalEntry(courseid, parseInt(cmid), items); } @@ -142,6 +148,11 @@ const registerDeleteEvent = (courseid, deleteobject) => { // If the request was okay then remove the table row. let row = deletionelement.closest('tr'); row.remove(); + Toast.add(getString('configdeleted', 'block_stash'), { + type: 'info', + autohide: true, + closeButton: true, + }); }); }); }; diff --git a/lang/en/block_stash.php b/lang/en/block_stash.php index 8aa93da..f090006 100644 --- a/lang/en/block_stash.php +++ b/lang/en/block_stash.php @@ -35,6 +35,8 @@ $string['appearance'] = 'Appearance'; $string['backtostart'] = 'Back to the main screen'; $string['buttontext'] = 'Button text'; +$string['configdeleted'] = 'Configuration deleted'; +$string['configupdated'] = 'Configuration updated'; $string['configurationtitle'] = 'Stash title'; $string['configureremoval'] = 'Configure removal'; $string['completed'] = 'Completed'; @@ -42,6 +44,7 @@ $string['copytoclipboard'] = 'Copy to clipboard'; $string['cost'] = 'Cost'; $string['createtrade'] = 'Create trade request'; +$string['createquizzes'] = 'Create a quiz in this course to configure a stash item removal for it here.'; $string['decline'] = 'Decline'; $string['delete'] = 'Delete'; $string['deletedrop'] = 'Delete {$a}'; @@ -131,6 +134,7 @@ $string['noitems'] = 'No items selected'; $string['noitemstotrade'] = 'You have no items to trade'; $string['nomorescarceitems'] = 'The maximum number of this item has already been allocated. Consider upping the scarcity amount of this item.'; +$string['noquizzes'] = 'You have no quizzes'; $string['nosingularitem'] = 'Please add at least one item to use this leaderboard'; $string['notiny'] = '📢 Did you know there is a new plugin for the TinyMCE editor that makes creating items and trades much easier? Download and install the TinyMCE plugin tiny stash to vastly improve your stash creation experience. A preview video is available via the previous link.'; $string['notrecorded'] = 'Not recorded'; diff --git a/removals.php b/removals.php index ec7c3b1..3ab906e 100644 --- a/removals.php +++ b/removals.php @@ -33,11 +33,13 @@ $manager->require_enabled(); $manager->require_manage(); +$removalhelper = new \block_stash\local\stash_elements\removal_helper($manager); if (isset($removalid)) { - $removalhelper = new \block_stash\local\stash_elements\removal_helper($manager); $removalhelper->delete_removal_configuration($removalid); } +$quizzes = $removalhelper->get_quizzes_for_course(); + $url = new moodle_url('/blocks/stash/removals.php', ['courseid' => $courseid]); $pagetitle = get_string('removalconfigurations', 'block_stash'); @@ -53,11 +55,18 @@ $removebtn = $OUTPUT->single_button($dummyurl, get_string('configureremoval', 'block_stash'), 'get', ['class' => 'singlebutton heading-button block-config-removal']); -$subtitle .= $removebtn; - -if (!empty($subtitle)) { +if (empty($quizzes)) { echo $OUTPUT->heading($subtitle, 3); + echo $OUTPUT->render_from_template('block_stash/local/removal/zerostate', []); +} else { + + $subtitle .= $removebtn; + + if (!empty($subtitle)) { + echo $OUTPUT->heading($subtitle, 3); + } + + echo $renderer->render(new \block_stash\output\local\configuration\removals($manager)); } -echo $renderer->render(new \block_stash\output\local\configuration\removals($manager)); echo $OUTPUT->footer(); diff --git a/templates/local/removal/zerostate.mustache b/templates/local/removal/zerostate.mustache new file mode 100644 index 0000000..a15c4eb --- /dev/null +++ b/templates/local/removal/zerostate.mustache @@ -0,0 +1,4 @@ +
+

{{#str}}noquizzes, block_stash{{/str}}

+

{{#str}}createquizzes, block_stash{{/str}}

+
diff --git a/version.php b/version.php index 1b43478..652f31a 100644 --- a/version.php +++ b/version.php @@ -24,8 +24,8 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2024019008; +$plugin->version = 2024022900; $plugin->requires = 2022112802; // Moodle 4.1.2. $plugin->component = 'block_stash'; $plugin->maturity = MATURITY_STABLE; -$plugin->release = '2.0.3'; +$plugin->release = '2.1.0';