work properly. Wrote two web components. One for cut and paste in general, and another for code samples.
77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
|
|
|
|
|
|
class CopyToClipboardComponent extends HTMLElement {
|
|
static STYLE = `
|
|
<style>
|
|
.clickable {
|
|
cursor: pointer;
|
|
}
|
|
</style>
|
|
<link rel="stylesheet" href="../static/icons/font/bootstrap-icons.css">
|
|
`;
|
|
static IN_ACTIVE = CopyToClipboardComponent.STYLE + `<div class="clickable"><i class="bi bi-clipboard"></i> copy</div>`;
|
|
static ACTIVE = CopyToClipboardComponent.STYLE + `<div class="clickable"><i class="bi bi-clipboard-check"></i> copied</div>`;
|
|
|
|
constructor() {
|
|
super();
|
|
this.attachShadow({ mode: 'open' });
|
|
}
|
|
|
|
connectedCallback() {
|
|
this.render(CopyToClipboardComponent.IN_ACTIVE);
|
|
this.addEventListeners();
|
|
}
|
|
|
|
render(value) {
|
|
this.shadowRoot.innerHTML = value;
|
|
}
|
|
|
|
addEventListeners() {
|
|
this.addEventListener('click', this.copyToClipboard.bind(this));
|
|
}
|
|
|
|
copyToClipboard() {
|
|
const fromElement = document.getElementById(this.getAttribute('from'));
|
|
if (fromElement) {
|
|
navigator.clipboard.writeText(fromElement.innerText)
|
|
.then(() => {
|
|
console.log('Content copied to clipboard');
|
|
this.render(CopyToClipboardComponent.ACTIVE)
|
|
setTimeout((target) => {
|
|
this.render(CopyToClipboardComponent.IN_ACTIVE)
|
|
}, 3000, this);
|
|
})
|
|
.catch(err => {
|
|
console.error('Failed to copy: ', err);
|
|
});
|
|
} else {
|
|
console.error('Element not found');
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
customElements.define('copy-to-clipboard', CopyToClipboardComponent);
|
|
|
|
|
|
|
|
|
|
class CodeSampleComponent extends HTMLElement {
|
|
connectedCallback() {
|
|
this.render();
|
|
}
|
|
|
|
render() {
|
|
let id = this.getAttribute("id");
|
|
let html = "<div class='small ps-5'><copy-to-clipboard from='" + id + "'></copy-to-clipboard></div>";
|
|
html += "<p class='font-monospace small ps-5' id='" +id + "' >" + this.innerHTML + "</p>";
|
|
console.log("html=" + html);
|
|
this.innerHTML = html;
|
|
}
|
|
}
|
|
|
|
customElements.define('code-sample', CodeSampleComponent);
|
|
|