Clipboard
Seamless integration with JavaScript
Place the following into a file named public/clipboard.css
:
.clipboard-button {
display: none;
}
.clipboard--supported .clipboard-button {
display: initial;
}
Add the following to your public/index.html
:
<div data-controller="clipboard">
PIN: <input data-clipboard-target="source" type="text" value="1234" readonly>
<button data-action="clipboard#copy" class="clipboard-button">Copy to Clipboard</button>
</div>
<div data-controller="clipboard">
PIN: <input data-clipboard-target="source" type="text" value="3737" readonly>
<button data-action="clipboard#copy" class="clipboard-button">Copy to Clipboard</button>
</div>
Now create a src/controllers/clipboard_controller.js.rb
file with the following
contents:
import "../clipboard.css"
class ClipboardController < Stimulus::Controller
def connect()
if document.queryCommandSupported("copy")
element.classList.add("clipboard--supported")
end
end
def copy(event)
event.preventDefault()
sourceTarget.select()
document.execCommand("copy")
end
end
Results
Click a copy button, and see it in action. Paste the results elsewhere.
Commentary
What is notable here is the seamless access to JavaScript functionality.
Note the import
at the top of the file as well as the calls to methods on the
document
, element
, event
, and sourceTarget
objects. The syntax for
these calls is identical to what you would code in JavaScript.
Feel free to go wild. Just be aware that seemless integration with JavaScript is an example of the provide sharp knives doctrine.
Also note that Ruby2JS’s Stimulus
filter knows to only add this.
to the element
and sourceTarget
references. The document
, and event
objects are left alone.