From aee0a117a889461ce8ced6fcf73207fe017f1d99 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 20 Dec 2021 13:37:47 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-6-stable-ee --- app/assets/javascripts/behaviors/copy_code.js | 66 +++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 app/assets/javascripts/behaviors/copy_code.js (limited to 'app/assets/javascripts/behaviors/copy_code.js') diff --git a/app/assets/javascripts/behaviors/copy_code.js b/app/assets/javascripts/behaviors/copy_code.js new file mode 100644 index 00000000000..a6e203ea5a2 --- /dev/null +++ b/app/assets/javascripts/behaviors/copy_code.js @@ -0,0 +1,66 @@ +import { uniqueId } from 'lodash'; +import { __ } from '~/locale'; +import { spriteIcon } from '~/lib/utils/common_utils'; +import { setAttributes } from '~/lib/utils/dom_utils'; + +class CopyCodeButton extends HTMLElement { + connectedCallback() { + this.for = uniqueId('code-'); + + this.parentNode.querySelector('pre').setAttribute('id', this.for); + + this.appendChild(this.createButton()); + } + + createButton() { + const button = document.createElement('button'); + + setAttributes(button, { + type: 'button', + class: 'btn btn-default btn-md gl-button btn-icon has-tooltip', + 'data-title': __('Copy to clipboard'), + 'data-clipboard-target': `pre#${this.for}`, + }); + + button.innerHTML = spriteIcon('copy-to-clipboard'); + + return button; + } +} + +function addCodeButton() { + [...document.querySelectorAll('pre.code.js-syntax-highlight')] + .filter((el) => !el.closest('.js-markdown-code')) + .forEach((el) => { + const copyCodeEl = document.createElement('copy-code'); + copyCodeEl.setAttribute('for', uniqueId('code-')); + + const wrapper = document.createElement('div'); + wrapper.className = 'gl-relative markdown-code-block js-markdown-code'; + wrapper.appendChild(el.cloneNode(true)); + wrapper.appendChild(copyCodeEl); + + el.parentNode.insertBefore(wrapper, el); + + el.remove(); + }); +} + +export const initCopyCodeButton = (selector = '#content-body') => { + if (!customElements.get('copy-code')) { + customElements.define('copy-code', CopyCodeButton); + } + + const el = document.querySelector(selector); + + if (!el) return () => {}; + + const observer = new MutationObserver(() => addCodeButton()); + + observer.observe(document.querySelector(selector), { + childList: true, + subtree: true, + }); + + return () => observer.disconnect(); +}; -- cgit v1.2.1