ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç home/smkb8269/public_html/lms.smk-almanshuriyah.sch.id/user/amd/src/status_field.js000064400000023472152266362200024227 0ustar00// This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . /** * AMD module for the user enrolment status field in the course participants page. * * @module core_user/status_field * @copyright 2017 Jun Pataleta * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ import * as DynamicTable from 'core_table/dynamic'; import * as Repository from './repository'; import * as Str from 'core/str'; import DynamicTableSelectors from 'core_table/local/dynamic/selectors'; import Fragment from 'core/fragment'; import ModalEvents from 'core/modal_events'; import Notification from 'core/notification'; import Templates from 'core/templates'; import {add as notifyUser} from 'core/toast'; import SaveCancelModal from 'core/modal_save_cancel'; import CancelModal from 'core/modal_cancel'; const Selectors = { editEnrolment: '[data-action="editenrolment"]', showDetails: '[data-action="showdetails"]', unenrol: '[data-action="unenrol"]', statusElement: '[data-status]', }; /** * Get the dynamic table from the specified link. * * @param {HTMLElement} link * @returns {HTMLElement} */ const getDynamicTableFromLink = link => link.closest(DynamicTableSelectors.main.region); /** * Get the status container from the specified link. * * @param {HTMLElement} link * @returns {HTMLElement} */ const getStatusContainer = link => link.closest(Selectors.statusElement); /** * Get user enrolment id from the specified link * * @param {HTMLElement} link * @returns {Number} */ const getUserEnrolmentIdFromLink = link => link.getAttribute('rel'); /** * Register all event listeners for the status fields. * * @param {Number} contextId * @param {Number} uniqueId */ const registerEventListeners = (contextId, uniqueId) => { const getBodyFunction = (userEnrolmentId, formData) => getBody(contextId, userEnrolmentId, formData); document.addEventListener('click', e => { const tableRoot = e.target.closest(DynamicTableSelectors.main.fromRegionId(uniqueId)); if (!tableRoot) { return; } const editLink = e.target.closest(Selectors.editEnrolment); if (editLink) { e.preventDefault(); showEditDialogue(editLink, getBodyFunction); } const unenrolLink = e.target.closest(Selectors.unenrol); if (unenrolLink) { e.preventDefault(); showUnenrolConfirmation(unenrolLink); } const showDetailsLink = e.target.closest(Selectors.showDetails); if (showDetailsLink) { e.preventDefault(); showStatusDetails(showDetailsLink); } }); }; /** * Show the edit dialogue. * * @param {HTMLElement} link * @param {Function} getBody Function to get the body for the specified user enrolment */ const showEditDialogue = (link, getBody) => { const container = getStatusContainer(link); const userEnrolmentId = getUserEnrolmentIdFromLink(link); SaveCancelModal.create({ large: true, title: Str.get_string('edituserenrolment', 'enrol', container.dataset.fullname), body: getBody(userEnrolmentId) }) .then(modal => { // Handle save event. modal.getRoot().on(ModalEvents.save, e => { // Don't close the modal yet. e.preventDefault(); // Submit form data. submitEditFormAjax(link, getBody, modal, userEnrolmentId, container.dataset); }); // Handle hidden event. modal.getRoot().on(ModalEvents.hidden, () => { // Destroy when hidden. modal.destroy(); }); // Show the modal. modal.show(); return modal; }) .catch(Notification.exception); }; /** * Show and handle the unenrolment confirmation dialogue. * * @param {HTMLElement} link */ const showUnenrolConfirmation = link => { const container = getStatusContainer(link); const userEnrolmentId = getUserEnrolmentIdFromLink(link); SaveCancelModal.create() .then(modal => { // Handle confirm event. modal.getRoot().on(ModalEvents.save, e => { // Don't close the modal yet. e.preventDefault(); // Submit data. submitUnenrolFormAjax( link, modal, { ueid: userEnrolmentId, }, container.dataset ); }); // Handle hidden event. modal.getRoot().on(ModalEvents.hidden, () => { // Destroy when hidden. modal.destroy(); }); // Display the delete confirmation modal. modal.show(); const stringData = [ { key: 'unenrol', component: 'enrol', }, { key: 'unenrolconfirm', component: 'enrol', param: { user: container.dataset.fullname, course: container.dataset.coursename, enrolinstancename: container.dataset.enrolinstancename, } } ]; return Promise.all([Str.get_strings(stringData), modal]); }) .then(([strings, modal]) => { modal.setTitle(strings[0]); modal.setSaveButtonText(strings[0]); modal.setBody(strings[1]); return modal; }) .catch(Notification.exception); }; /** * Show the user details dialogue. * * @param {HTMLElement} link */ const showStatusDetails = link => { const container = getStatusContainer(link); const context = { editenrollink: '', statusclass: container.querySelector('span.badge').getAttribute('class'), ...container.dataset, }; // Find the edit enrolment link. const editEnrolLink = container.querySelector(Selectors.editEnrolment); if (editEnrolLink) { // If there's an edit enrolment link for this user, clone it into the context for the modal. context.editenrollink = editEnrolLink.outerHTML; } CancelModal.create({ large: true, title: Str.get_string('enroldetails', 'enrol'), body: Templates.render('core_user/status_details', context), }) .then(modal => { if (editEnrolLink) { modal.getRoot().on('click', Selectors.editEnrolment, e => { e.preventDefault(); modal.hide(); // Trigger click event for the edit enrolment link to show the edit enrolment modal. editEnrolLink.click(); }); } modal.show(); // Handle hidden event. modal.getRoot().on(ModalEvents.hidden, () => modal.destroy()); return modal; }) .catch(Notification.exception); }; /** * Submit the edit dialogue. * * @param {HTMLElement} clickedLink * @param {Function} getBody * @param {Object} modal * @param {Number} userEnrolmentId * @param {Object} userData */ const submitEditFormAjax = (clickedLink, getBody, modal, userEnrolmentId, userData) => { const form = modal.getRoot().find('form'); Repository.submitUserEnrolmentForm(form.serialize()) .then(data => { if (!data.result) { throw data.result; } // Dismiss the modal. modal.hide(); modal.destroy(); return data; }) .then(() => { DynamicTable.refreshTableContent(getDynamicTableFromLink(clickedLink)) .catch(Notification.exception); return Str.get_string('enrolmentupdatedforuser', 'core_enrol', userData); }) .then(notificationString => { notifyUser(notificationString); return; }) .catch(() => { modal.setBody(getBody(userEnrolmentId, JSON.stringify(form.serialize()))); return modal; }); }; /** * Submit the unenrolment form. * * @param {HTMLElement} clickedLink * @param {Object} modal * @param {Object} args * @param {Object} userData */ const submitUnenrolFormAjax = (clickedLink, modal, args, userData) => { Repository.unenrolUser(args.ueid) .then(data => { if (!data.result) { // Display an alert containing the error message Notification.alert(data.errors[0].key, data.errors[0].message); return data; } // Dismiss the modal. modal.hide(); modal.destroy(); return data; }) .then(() => { DynamicTable.refreshTableContent(getDynamicTableFromLink(clickedLink)) .catch(Notification.exception); return Str.get_string('unenrolleduser', 'core_enrol', userData); }) .then(notificationString => { notifyUser(notificationString); return; }) .catch(Notification.exception); }; /** * Get the body fragment. * * @param {Number} contextId * @param {Number} ueid The user enrolment id * @param {Object} formdata * @returns {Promise} */ const getBody = (contextId, ueid, formdata = null) => Fragment.loadFragment( 'enrol', 'user_enrolment_form', contextId, { ueid, formdata, } ); /** * Initialise the statu field handler. * * @param {object} param * @param {Number} param.contextid * @param {Number} param.uniqueid */ export const init = ({contextid, uniqueid}) => { registerEventListeners(contextid, uniqueid); };