__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
// 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 <http://www.gnu.org/licenses/>.
/**
* A JavaScript module that enhances a button and text container to support copy-to-clipboard functionality.
*
* This module needs to be loaded by pages/templates/modules that require this functionality.
*
* To enable copy-to-clipboard functionality, we need a trigger element (usually a button) and a copy target element
* (e.g. a div, span, text input, or text area).
*
* In the trigger element, we need to declare the <code>data-action="copytoclipboard"</code> attribute and set the
* <code>data-clipboard-target</code> attribute which is the CSS selector that points to the target element that contains the text
* to be copied.
*
* When the text is successfully copied to the clipboard, a toast message that indicates that the copy operation was a success
* will be shown. This success message can be customised by setting the <code>data-clipboard-success-message</code> attribute in the
* trigger element.
*
* @module core/copy_to_clipboard
* @copyright 2021 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*
* @example <caption>Markup for the trigger and target elements</caption>
* <input type="text" id="textinputtocopy" class="form-control" value="Copy me!" readonly />
* <button id="copybutton" data-action="copytoclipboard" data-clipboard-target="#textinputtocopy"
* data-clipboard-success-message="Success!" class="btn btn-secondary">
* Copy to clipboard
* </button>
*/
import {getString} from 'core/str';
import {add as addToast} from 'core/toast';
import {prefetchStrings} from 'core/prefetch';
/**
* Add event listeners to trigger elements through event delegation.
*
* @private
*/
const addEventListeners = () => {
document.addEventListener('click', e => {
const copyButton = e.target.closest('[data-action="copytoclipboard"]');
if (!copyButton) {
return;
}
if (!copyButton.dataset.clipboardTarget) {
return;
}
const copyTarget = document.querySelector(copyButton.dataset.clipboardTarget);
if (!copyTarget) {
return;
}
// This is a copy target and there is content.
// Prevent the default action.
e.preventDefault();
// We have a copy target - great. Let's copy its content.
const textToCopy = getTextFromContainer(copyTarget);
if (!textToCopy) {
displayFailureToast();
return;
}
if (navigator.clipboard) {
navigator.clipboard.writeText(textToCopy)
.then(() => displaySuccessToast(copyButton)).catch();
return;
}
// The clipboard API is not available.
// This may happen when the page is not served over SSL.
// Try to fall back to document.execCommand() approach of copying the text.
// WARNING: This is deprecated functionality that may get dropped at anytime by browsers.
if (copyTarget instanceof HTMLInputElement || copyTarget instanceof HTMLTextAreaElement) {
// Focus and select the text in the target element.
// If the execCommand fails, at least the user can readily copy the text.
copyTarget.focus();
if (copyNodeContentToClipboard(copyButton, copyTarget)) {
// If the copy was successful then focus back on the copy button.
copyButton.focus();
}
} else {
// This copyTarget is not an input, or text area so cannot be used with the execCommand('copy') command.
// To work around this we create a new textarea and copy that.
// This textarea must be part of the DOM and must be visible.
// We (ab)use the sr-only tag to ensure that it is considered visible to the browser, whilst being
// hidden from view by the user.
const copyRegion = document.createElement('textarea');
copyRegion.value = textToCopy;
copyRegion.classList.add('sr-only');
document.body.appendChild(copyRegion);
copyNodeContentToClipboard(copyButton, copyRegion);
// After copying, remove the temporary element and move focus back to the triggering button.
copyRegion.remove();
copyButton.focus();
}
});
};
/**
* Copy the content of the selected element to the clipboard, and display a notifiction if successful.
*
* @param {HTMLElement} copyButton
* @param {HTMLElement} copyTarget
* @returns {boolean}
* @private
*/
const copyNodeContentToClipboard = (copyButton, copyTarget) => {
copyTarget.select();
// Try to copy the text from the target element.
if (document.execCommand('copy')) {
displaySuccessToast(copyButton);
return true;
}
displayFailureToast();
return false;
};
/**
* Displays a toast containing the success message.
*
* @param {HTMLElement} copyButton The element that copies the text from the container.
* @returns {Promise<void>}
* @private
*/
const displaySuccessToast = copyButton => getSuccessText(copyButton)
.then(successMessage => addToast(successMessage, {}));
/**
* Displays a toast containing the failure message.
*
* @returns {Promise<void>}
* @private
*/
const displayFailureToast = () => getFailureText()
.then(message => addToast(message, {type: 'warning'}));
/**
* Fetches the failure message to show to the user.
*
* @returns {Promise}
* @private
*/
const getFailureText = () => getString('unabletocopytoclipboard', 'core');
/**
* Fetches the success message to show to the user.
*
* @param {HTMLElement} copyButton The element that copies the text from the container. This may contain the custom success message
* via its data-clipboard-success-message attribute.
* @returns {Promise|*}
* @private
*/
const getSuccessText = copyButton => {
if (copyButton.dataset.clipboardSuccessMessage) {
return Promise.resolve(copyButton.dataset.clipboardSuccessMessage);
}
return getString('textcopiedtoclipboard', 'core');
};
/**
* Fetches the text to be copied from the container.
*
* @param {HTMLElement} container The element containing the text to be copied.
* @returns {null|string}
* @private
*/
const getTextFromContainer = container => {
if (container.value) {
// For containers which are form elements (e.g. text area, text input), get the element's value.
return container.value;
} else if (container.innerText) {
// For other elements, try to use the innerText attribute.
return container.innerText;
}
return null;
};
let loaded = false;
if (!loaded) {
prefetchStrings('core', [
'textcopiedtoclipboard',
'unabletocopytoclipboard',
]);
// Add event listeners.
addEventListeners();
loaded = true;
}
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| bulkactions | Folder | 0777 |
|
|
| check | Folder | 0777 |
|
|
| comboboxsearch | Folder | 0777 |
|
|
| datafilter | Folder | 0777 |
|
|
| emoji | Folder | 0777 |
|
|
| local | Folder | 0777 |
|
|
| moodlenet | Folder | 0777 |
|
|
| adapter.js | File | 123.08 KB | 0777 |
|
| addblockmodal.js | File | 4.34 KB | 0777 |
|
| ajax.js | File | 11.97 KB | 0777 |
|
| aria.js | File | 1011 B | 0777 |
|
| auto_rows.js | File | 3.46 KB | 0777 |
|
| autoscroll.js | File | 6.49 KB | 0777 |
|
| backoff_timer.js | File | 4.98 KB | 0777 |
|
| chart_axis.js | File | 7.39 KB | 0777 |
|
| chart_bar.js | File | 3.08 KB | 0777 |
|
| chart_base.js | File | 11.36 KB | 0777 |
|
| chart_builder.js | File | 1.65 KB | 0777 |
|
| chart_line.js | File | 2.08 KB | 0777 |
|
| chart_output.js | File | 1.08 KB | 0777 |
|
| chart_output_base.js | File | 2.03 KB | 0777 |
|
| chart_output_chartjs.js | File | 11.5 KB | 0777 |
|
| chart_output_htmltable.js | File | 3.3 KB | 0777 |
|
| chart_pie.js | File | 3.03 KB | 0777 |
|
| chart_series.js | File | 8.35 KB | 0777 |
|
| chartjs-lazy.js | File | 497.88 KB | 0777 |
|
| chartjs.js | File | 913 B | 0777 |
|
| checkbox-toggleall.js | File | 12.78 KB | 0777 |
|
| config.js | File | 978 B | 0777 |
|
| copy_to_clipboard.js | File | 7.38 KB | 0777 |
|
| custom_interaction_events.js | File | 22.18 KB | 0777 |
|
| datafilter.js | File | 17.92 KB | 0777 |
|
| dragdrop.js | File | 12.92 KB | 0777 |
|
| drawer.js | File | 3.49 KB | 0777 |
|
| drawer_events.js | File | 967 B | 0777 |
|
| dropzone.js | File | 5.71 KB | 0777 |
|
| dynamic_tabs.js | File | 6.67 KB | 0777 |
|
| edit_switch.js | File | 3.45 KB | 0777 |
|
| event.js | File | 2.53 KB | 0777 |
|
| event_dispatcher.js | File | 2.79 KB | 0777 |
|
| fetch.js | File | 9.4 KB | 0777 |
|
| first.js | File | 1.33 KB | 0777 |
|
| form-autocomplete.js | File | 53.74 KB | 0777 |
|
| form-cohort-selector.js | File | 2.5 KB | 0777 |
|
| form-course-selector.js | File | 3.77 KB | 0777 |
|
| fragment.js | File | 5.03 KB | 0777 |
|
| fullscreen.js | File | 1.62 KB | 0777 |
|
| icon_system.js | File | 3.39 KB | 0777 |
|
| icon_system_fontawesome.js | File | 5.35 KB | 0777 |
|
| icon_system_standard.js | File | 1.96 KB | 0777 |
|
| inplace_editable.js | File | 16.82 KB | 0777 |
|
| key_codes.js | File | 1.34 KB | 0777 |
|
| loadingicon.js | File | 3.88 KB | 0777 |
|
| localstorage.js | File | 2.24 KB | 0777 |
|
| log.js | File | 1.74 KB | 0777 |
|
| loglevel.js | File | 12.38 KB | 0777 |
|
| menu_navigation.js | File | 9.2 KB | 0777 |
|
| modal.js | File | 36.33 KB | 0777 |
|
| modal_backdrop.js | File | 4.17 KB | 0777 |
|
| modal_cancel.js | File | 1.6 KB | 0777 |
|
| modal_copy_to_clipboard.js | File | 3.75 KB | 0777 |
|
| modal_delete_cancel.js | File | 2.36 KB | 0777 |
|
| modal_events.js | File | 1.28 KB | 0777 |
|
| modal_factory.js | File | 5.91 KB | 0777 |
|
| modal_registry.js | File | 2.26 KB | 0777 |
|
| modal_save_cancel.js | File | 2.34 KB | 0777 |
|
| moremenu.js | File | 10.3 KB | 0777 |
|
| mustache.js | File | 28.75 KB | 0777 |
|
| network.js | File | 9.66 KB | 0777 |
|
| normalise.js | File | 2.43 KB | 0777 |
|
| notification.js | File | 11.57 KB | 0777 |
|
| page_global.js | File | 5.38 KB | 0777 |
|
| paged_content.js | File | 2.87 KB | 0777 |
|
| paged_content_events.js | File | 1.17 KB | 0777 |
|
| paged_content_factory.js | File | 20.61 KB | 0777 |
|
| paged_content_pages.js | File | 11.75 KB | 0777 |
|
| paged_content_paging_bar.js | File | 20.36 KB | 0777 |
|
| paged_content_paging_bar_limit_selector.js | File | 2.36 KB | 0777 |
|
| paged_content_paging_dropdown.js | File | 7.36 KB | 0777 |
|
| pagehelpers.js | File | 5.38 KB | 0777 |
|
| pending.js | File | 4.46 KB | 0777 |
|
| permissionmanager.js | File | 9.77 KB | 0777 |
|
| popover_region_controller.js | File | 13.16 KB | 0777 |
|
| popper.js | File | 79.2 KB | 0777 |
|
| popper2.js | File | 61.59 KB | 0777 |
|
| prefetch.js | File | 5.82 KB | 0777 |
|
| process_monitor.js | File | 3.55 KB | 0777 |
|
| pubsub.js | File | 2.17 KB | 0777 |
|
| reactive.js | File | 1.38 KB | 0777 |
|
| scroll_manager.js | File | 5.5 KB | 0777 |
|
| sessionstorage.js | File | 2.22 KB | 0777 |
|
| showhidesettings.js | File | 11.82 KB | 0777 |
|
| showmore.js | File | 1.83 KB | 0777 |
|
| sortable_list.js | File | 29.62 KB | 0777 |
|
| sticky-footer.js | File | 3.16 KB | 0777 |
|
| storage_validation.js | File | 1.36 KB | 0777 |
|
| storagewrapper.js | File | 5.36 KB | 0777 |
|
| stored_progress.js | File | 3.15 KB | 0777 |
|
| str.js | File | 10.01 KB | 0777 |
|
| tag.js | File | 15.02 KB | 0777 |
|
| templates.js | File | 10.83 KB | 0777 |
|
| toast.js | File | 4.26 KB | 0777 |
|
| togglesensitive.js | File | 5.15 KB | 0777 |
|
| tooltip.js | File | 4.09 KB | 0777 |
|
| tree.js | File | 18.39 KB | 0777 |
|
| truncate.js | File | 6.56 KB | 0777 |
|
| url.js | File | 3.65 KB | 0777 |
|
| user_date.js | File | 9.27 KB | 0777 |
|
| userfeedback.js | File | 2.91 KB | 0777 |
|
| usermenu.js | File | 5.13 KB | 0777 |
|
| utility.js | File | 7.5 KB | 0777 |
|
| utils.js | File | 4.83 KB | 0777 |
|
| yui.js | File | 1.13 KB | 0777 |
|