init
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
(() => {
|
||||
|
||||
const onChange = value => {
|
||||
if (value === '-' || parseInt(value, 10) === 0) {
|
||||
document.getElementById('menuselect-group').classList.add('hidden');
|
||||
} else {
|
||||
document.getElementById('menuselect-group').classList.remove('hidden');
|
||||
}
|
||||
};
|
||||
const onBoot = () => {
|
||||
const element = document.getElementById('jform_assignment');
|
||||
if (element) {
|
||||
// Initialise the state
|
||||
onChange(element.value);
|
||||
|
||||
// Check for changes in the state
|
||||
element.addEventListener('change', ({
|
||||
target
|
||||
}) => {
|
||||
onChange(target.value);
|
||||
});
|
||||
}
|
||||
document.removeEventListener('DOMContentLoaded', onBoot);
|
||||
};
|
||||
document.addEventListener('DOMContentLoaded', onBoot);
|
||||
})();
|
||||
@@ -0,0 +1,4 @@
|
||||
/**
|
||||
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/(()=>{const n=e=>{e==="-"||parseInt(e,10)===0?document.getElementById("menuselect-group").classList.add("hidden"):document.getElementById("menuselect-group").classList.remove("hidden")},t=()=>{const e=document.getElementById("jform_assignment");e&&(n(e.value),e.addEventListener("change",({target:d})=>{n(d.value)})),document.removeEventListener("DOMContentLoaded",t)};document.addEventListener("DOMContentLoaded",t)})();
|
||||
Binary file not shown.
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
* @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
/**
|
||||
* Add a keyboard event listener to the Select a Module Type search element.
|
||||
*
|
||||
* IMPORTANT! This script is meant to be loaded deferred. This means that a. it's non-blocking
|
||||
* (the browser can load it whenever) and b. it doesn't need an on DOMContentLoaded event handler
|
||||
* because the browser is guaranteed to execute it only after the DOM content has loaded, the
|
||||
* whole point of it being deferred.
|
||||
*
|
||||
* The search box has a keyboard handler that fires every time you press a keyboard button or send
|
||||
* a keypress with a touch / virtual keyboard. We then iterate all module type cards and check if
|
||||
* the plain text (HTML stripped out) representation of the module title or description partially
|
||||
* matches the text you entered in the search box. If it doesn't we add a Bootstrap class to hide
|
||||
* the module.
|
||||
*
|
||||
* This way we limit the displayed modules only to those searched.
|
||||
*
|
||||
* This feature follows progressive enhancement. The search box is hidden by default and only
|
||||
* displayed when this JavaScript here executes. Furthermore, session storage is only used if it
|
||||
* is available in the browser. That's a bit of a pain but makes sure things won't break in older
|
||||
* browsers.
|
||||
*
|
||||
* Furthermore and to facilitate the user experience we auto-focus the search element which has a
|
||||
* suitable title so that non-sighted users are not startled. This way we address both UX concerns
|
||||
* and accessibility.
|
||||
*
|
||||
* Finally, the search string is saved into session storage on the assumption that the user is
|
||||
* probably going to be creating multiple instances of the same module, one after another, as is
|
||||
* typical when building a new Joomla! site.
|
||||
*/
|
||||
|
||||
// Make sure the element exists i.e. a template override has not removed it.
|
||||
const elSearch = document.getElementById('comModulesSelectSearch');
|
||||
const elSearchContainer = document.getElementById('comModulesSelectSearchContainer');
|
||||
const elSearchHeader = document.getElementById('comModulesSelectTypeHeader');
|
||||
const elSearchResults = document.getElementById('comModulesSelectResultsContainer');
|
||||
const alertElement = document.querySelector('.modules-alert');
|
||||
if (elSearch && elSearchContainer) {
|
||||
// Add the keyboard event listener which performs the live search in the cards
|
||||
elSearch.addEventListener('keyup', event => {
|
||||
/** @type {KeyboardEvent} event */
|
||||
const partialSearch = event.target.value;
|
||||
let hasSearchResults = false;
|
||||
|
||||
// Save the search string into session storage
|
||||
if (typeof sessionStorage !== 'undefined') {
|
||||
sessionStorage.setItem('Joomla.com_modules.new.search', partialSearch);
|
||||
}
|
||||
|
||||
// Iterate all the module cards
|
||||
document.querySelectorAll('.comModulesSelectCard').forEach(card => {
|
||||
// First remove the class which hide the module cards
|
||||
card.classList.remove('d-none');
|
||||
|
||||
// An empty search string means that we should show everything
|
||||
if (!partialSearch) {
|
||||
return;
|
||||
}
|
||||
const cardHeader = card.querySelector('.new-module-title');
|
||||
const cardBody = card.querySelector('.new-module-caption');
|
||||
const title = cardHeader ? cardHeader.textContent : '';
|
||||
const description = cardBody ? cardBody.textContent : '';
|
||||
|
||||
// If the module title and description don’t match add a class to hide it.
|
||||
if (title && !title.toLowerCase().includes(partialSearch.toLowerCase()) && description && !description.toLowerCase().includes(partialSearch.toLowerCase())) {
|
||||
card.classList.add('d-none');
|
||||
} else {
|
||||
hasSearchResults = true;
|
||||
}
|
||||
});
|
||||
if (hasSearchResults || !partialSearch) {
|
||||
alertElement.classList.add('d-none');
|
||||
elSearchHeader.classList.remove('d-none');
|
||||
elSearchResults.classList.remove('d-none');
|
||||
} else {
|
||||
alertElement.classList.remove('d-none');
|
||||
elSearchHeader.classList.add('d-none');
|
||||
elSearchResults.classList.add('d-none');
|
||||
}
|
||||
});
|
||||
|
||||
// For reasons of progressive enhancement the search box is hidden by default.
|
||||
elSearchContainer.classList.remove('d-none');
|
||||
|
||||
// Focus the just show element
|
||||
elSearch.focus();
|
||||
try {
|
||||
if (typeof sessionStorage !== 'undefined') {
|
||||
// Load the search string from session storage
|
||||
elSearch.value = sessionStorage.getItem('Joomla.com_modules.new.search') || '';
|
||||
|
||||
// Trigger the keyboard handler event manually to initiate the search
|
||||
elSearch.dispatchEvent(new KeyboardEvent('keyup'));
|
||||
}
|
||||
} catch (e) {
|
||||
// This is probably Internet Explorer which doesn't support the KeyboardEvent constructor :(
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
/**
|
||||
* @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/const elSearch=document.getElementById("comModulesSelectSearch"),elSearchContainer=document.getElementById("comModulesSelectSearchContainer"),elSearchHeader=document.getElementById("comModulesSelectTypeHeader"),elSearchResults=document.getElementById("comModulesSelectResultsContainer"),alertElement=document.querySelector(".modules-alert");if(elSearch&&elSearchContainer){elSearch.addEventListener("keyup",o=>{const e=o.target.value;let s=!1;typeof sessionStorage<"u"&&sessionStorage.setItem("Joomla.com_modules.new.search",e),document.querySelectorAll(".comModulesSelectCard").forEach(t=>{if(t.classList.remove("d-none"),!e)return;const n=t.querySelector(".new-module-title"),c=t.querySelector(".new-module-caption"),l=n?n.textContent:"",a=c?c.textContent:"";l&&!l.toLowerCase().includes(e.toLowerCase())&&a&&!a.toLowerCase().includes(e.toLowerCase())?t.classList.add("d-none"):s=!0}),s||!e?(alertElement.classList.add("d-none"),elSearchHeader.classList.remove("d-none"),elSearchResults.classList.remove("d-none")):(alertElement.classList.remove("d-none"),elSearchHeader.classList.add("d-none"),elSearchResults.classList.add("d-none"))}),elSearchContainer.classList.remove("d-none"),elSearch.focus();try{typeof sessionStorage<"u"&&(elSearch.value=sessionStorage.getItem("Joomla.com_modules.new.search")||"",elSearch.dispatchEvent(new KeyboardEvent("keyup")))}catch{}}
|
||||
Binary file not shown.
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
(() => {
|
||||
// Use a JoomlaExpectingPostMessage flag to be able to distinct legacy methods
|
||||
if (window.parent.JoomlaExpectingPostMessage) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Assign listener for click event (for single module id insertion)
|
||||
document.querySelectorAll('.js-module-insert').forEach(element => {
|
||||
element.addEventListener('click', event => {
|
||||
event.preventDefault();
|
||||
const modid = event.target.getAttribute('data-module');
|
||||
const editor = event.target.getAttribute('data-editor');
|
||||
|
||||
// Use the API
|
||||
if (window.parent.Joomla && window.parent.Joomla.editors && window.parent.Joomla.editors.instances && Object.prototype.hasOwnProperty.call(window.parent.Joomla.editors.instances, editor)) {
|
||||
window.parent.Joomla.editors.instances[editor].replaceSelection(`{loadmoduleid ${modid}}`);
|
||||
}
|
||||
if (window.parent.Joomla.Modal) {
|
||||
window.parent.Joomla.Modal.getCurrent().close();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Assign listener for click event (for position insertion)
|
||||
document.querySelectorAll('.js-position-insert').forEach(element => {
|
||||
element.addEventListener('click', event => {
|
||||
event.preventDefault();
|
||||
const position = event.target.getAttribute('data-position');
|
||||
const editor = event.target.getAttribute('data-editor');
|
||||
|
||||
// Use the API
|
||||
if (window.Joomla && window.Joomla.editors && Joomla.editors.instances && Object.prototype.hasOwnProperty.call(window.parent.Joomla.editors.instances, editor)) {
|
||||
window.parent.Joomla.editors.instances[editor].replaceSelection(`{loadposition ${position}}`);
|
||||
}
|
||||
if (window.parent.Joomla.Modal) {
|
||||
window.parent.Joomla.Modal.getCurrent().close();
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,4 @@
|
||||
/**
|
||||
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/window.parent.JoomlaExpectingPostMessage||(document.querySelectorAll(".js-module-insert").forEach(e=>{e.addEventListener("click",o=>{o.preventDefault();const a=o.target.getAttribute("data-module"),t=o.target.getAttribute("data-editor");window.parent.Joomla&&window.parent.Joomla.editors&&window.parent.Joomla.editors.instances&&Object.prototype.hasOwnProperty.call(window.parent.Joomla.editors.instances,t)&&window.parent.Joomla.editors.instances[t].replaceSelection(`{loadmoduleid ${a}}`),window.parent.Joomla.Modal&&window.parent.Joomla.Modal.getCurrent().close()})}),document.querySelectorAll(".js-position-insert").forEach(e=>{e.addEventListener("click",o=>{o.preventDefault();const a=o.target.getAttribute("data-position"),t=o.target.getAttribute("data-editor");window.Joomla&&window.Joomla.editors&&Joomla.editors.instances&&Object.prototype.hasOwnProperty.call(window.parent.Joomla.editors.instances,t)&&window.parent.Joomla.editors.instances[t].replaceSelection(`{loadposition ${a}}`),window.parent.Joomla.Modal&&window.parent.Joomla.Modal.getCurrent().close()})}));
|
||||
Binary file not shown.
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
(document => {
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
document.querySelectorAll('#new-modules-list a.select-link').forEach(elem => {
|
||||
elem.addEventListener('click', ({
|
||||
currentTarget,
|
||||
target
|
||||
}) => {
|
||||
let targetElem = currentTarget;
|
||||
|
||||
// There is some bug with events in iframe where currentTarget is "null"
|
||||
// => prevent this here by bubble up
|
||||
if (!targetElem) {
|
||||
targetElem = target;
|
||||
if (targetElem && !targetElem.classList.contains('select-link')) {
|
||||
targetElem = targetElem.parentNode;
|
||||
}
|
||||
}
|
||||
const functionName = targetElem.getAttribute('data-function');
|
||||
if (functionName && typeof window.parent[functionName] === 'function') {
|
||||
window.parent[functionName](targetElem);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
})(document);
|
||||
@@ -0,0 +1,4 @@
|
||||
/**
|
||||
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/(n=>{n.addEventListener("DOMContentLoaded",()=>{n.querySelectorAll("#new-modules-list a.select-link").forEach(i=>{i.addEventListener("click",({currentTarget:a,target:o})=>{let e=a;e||(e=o,e&&!e.classList.contains("select-link")&&(e=e.parentNode));const t=e.getAttribute("data-function");t&&typeof window.parent[t]=="function"&&window.parent[t](e)})})})})(document);
|
||||
Binary file not shown.
Reference in New Issue
Block a user