{"componentChunkName":"component---src-components-tutorials-js","path":"/tutorials/drag-and-drop/","result":{"data":{"markdownRemark":{"html":"<h2>Contents</h2>\n<ol>\n<li><a href=\"#about\">Why would I need this?</a></li>\n<li>\n<p><a href=\"#work\">How does this app work?</a></p>\n<ol>\n<li><a href=\"#work-component\">Creating a draggable functional component</a></li>\n<li><a href=\"#work-ui\">Developing the UI and integrating the draggable component</a></li>\n<li><a href=\"#work-CSS\">Defining styles for drag events</a></li>\n<li>\n<p><a href=\"#work-events\">Writing the drag and drop events</a></p>\n<ol>\n<li><a href=\"#work-events-vars\">Defining variables and a helper function</a></li>\n<li><a href=\"#work-events-dragstart\">Event for dragstart</a></li>\n<li><a href=\"#work-events-dragend\">Event for dragend</a></li>\n<li><a href=\"#work-events-dragover\">Event for dragover</a></li>\n<li><a href=\"#work-events-dragenter\">Event for dragenter</a></li>\n<li><a href=\"#work-events-dragleave\">Event for dragleave</a></li>\n<li><a href=\"#work-events-drop\">Event for drop</a></li>\n</ol>\n</li>\n</ol>\n</li>\n<li><a href=\"#know\">What do I need to know before I integrate this into my app?</a></li>\n<li><a href=\"#run\">How do I run the demo?</a></li>\n</ol>\n<!-- endexcerpt -->\n<span id=\"about\" />\n<h2>Why would I need this?</h2>\n<p>I am currently working on a shiny app that is an interactive to-do list. In the app, want to reorder items by dragging and dropping them. There are many packages (e.g., <a href=\"https://github.com/ayayron/shinydnd\">shinyDND</a>, RStudio's <a href=\"https://github.com/rstudio/sortable\">sortable</a>) and JavaScript libraries available, however I wanted to learn how to build my own. Since there is a browser ready <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API\">drag and drop API</a>, it is fairly straightforward to create your own events. </p>\n<p>In this tutorial, I will cover the basic elements for creating draggable elements in shiny. I will focus on creating a draggable element and the corresponding JavaScript events, as well as the CSS classes that are added when an element is dragged. I will try to keep the concepts simple and provide links for further reading where applicable. If you have any questions or if something is not clear, feel free to open a new issue.</p>\n<p>For more information, please see the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API\">drag and drop API</a> documentation, as well as the section <a href=\"#know\">What do I need to know before I integrate this into my app?</a> for implementation notes.</p>\n<span id=\"work\" />\n<h2>How does this app work?</h2>\n<p>We will build an app that allows users to reorder a series cards in any order.</p>\n<p><img src=\"/d579913c414afe30f76791d998b65bf0/drag_and_drop_demo.gif\" alt=\"drag and drop demonstration\"></p>\n<p>In the GIF, users can reorder a series of cards. Each card a group assignment (i.e., letters A through E) and a random value (i.e., 1 through 50). Users can reorder the cards by name, by value or any method they choose. Cards can be moved by clicking and then dragging the card up or down the page. When the user drops the card, the card will be inserted into that space (either before or after).</p>\n<p>In this tutorial, I will cover the following items.</p>\n<ol>\n<li>Creating a draggable functional component</li>\n<li>Developing the UI and integrating the draggable component</li>\n<li>Defining styles for drag events</li>\n<li>Writing the drag and drop events</li>\n</ol>\n<p>I am using the <code>app.R</code> format and have created the JavaScript and CSS files. Your project directory should look like this. I also saved the draggable component in a separate file.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&gt; drag-and-drop/\n    + app.R\n    + draggable_card.R\n    + www/\n       - styles.CSS\n       - index.js</code></pre></div>\n<span id=\"work-component\" />\n<h3>Creating a draggable functional component</h3>\n<p>The most important aspect to creating a draggable component is the attribute <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/draggable\">draggable</a>. When this attribute is set to <code>true</code>, the element can be dragged. If you do not want it to be dragged, then use <code>draggable=\"false\"</code> or remove the attribute altogether.</p>\n<p>In HTML, the draggable attribute is added to an element like so.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">draggable</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>Hello, world!<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>In shiny, it would like this.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\"><span class=\"token comment\"># ui.R</span>\ntags<span class=\"token operator\">$</span>div<span class=\"token punctuation\">(</span>\n    draggable <span class=\"token operator\">=</span> <span class=\"token string\">\"true\"</span><span class=\"token punctuation\">,</span>\n    tags<span class=\"token operator\">$</span>p<span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello, world!\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Before I begin developing the app, I will start off by developing a draggable functional component. This component will display a title, some text, and an icon that indicates that a card can be dragged. I will also add a logical argument that disables drag-ability for a card. I will call this component <code>draggable_card</code>.</p>\n<p>The function runs in the following order.</p>\n<ol>\n<li>Validate input arguments (by default, all items are draggable)</li>\n<li>Create the SVG icon: The icon is a plus sign with a filled circular background.</li>\n<li>Create the card element with all elements (title, text, and icon)</li>\n<li>If <code>!draggable</code>, then remove the SVG icon.</li>\n<li>Return the element.</li>\n</ol>\n<p>Here is the whole function as it appears in the file <code>draggable_card.R</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">draggable_card <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> title<span class=\"token punctuation\">,</span> text<span class=\"token punctuation\">,</span> draggable <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\"># validate args</span>\n    stopifnot<span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>is.null<span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    stopifnot<span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>is.null<span class=\"token punctuation\">(</span>title<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    stopifnot<span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>is.null<span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    stopifnot<span class=\"token punctuation\">(</span>is.logical<span class=\"token punctuation\">(</span>draggable<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># create &lt;svg> icon</span>\n    fill_color <span class=\"token operator\">&lt;-</span> <span class=\"token string\">\"#09BC8A\"</span>\n    line_color <span class=\"token operator\">&lt;-</span> <span class=\"token string\">\"#ffffff\"</span>\n    svg <span class=\"token operator\">&lt;-</span> tag<span class=\"token punctuation\">(</span>\n        <span class=\"token string\">\"svg\"</span><span class=\"token punctuation\">,</span>\n        list<span class=\"token punctuation\">(</span>\n            <span class=\"token string\">\"width\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"25\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"height\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"25\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"viewBox\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"0 0 25 25\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"class\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"card-icon\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token comment\"># &lt;circle></span>\n            tag<span class=\"token punctuation\">(</span>\n                <span class=\"token string\">\"circle\"</span><span class=\"token punctuation\">,</span>\n                list<span class=\"token punctuation\">(</span>\n                    <span class=\"token string\">\"cx\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"12.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"cy\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"12.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"r\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"12.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"fill\"</span> <span class=\"token operator\">=</span> fill_color\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token comment\"># vertical: &lt;line></span>\n            tag<span class=\"token punctuation\">(</span>\n                <span class=\"token string\">\"line\"</span><span class=\"token punctuation\">,</span>\n                list<span class=\"token punctuation\">(</span>\n                    <span class=\"token string\">\"x1\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"12.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"y1\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"x2\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"12.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"y2\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"20\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"stroke\"</span> <span class=\"token operator\">=</span> line_color<span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"stroke-width\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"2.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"stroke-linecap\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"butt\"</span>\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token comment\"># horizontal: &lt;line></span>\n            tag<span class=\"token punctuation\">(</span>\n                <span class=\"token string\">\"line\"</span><span class=\"token punctuation\">,</span>\n                list<span class=\"token punctuation\">(</span>\n                    <span class=\"token string\">\"x1\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"y1\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"12.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"x2\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"20\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"y2\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"12.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"stroke\"</span> <span class=\"token operator\">=</span> line_color<span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"stroke-width\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"2.5\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"stroke-linecap\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"butt\"</span>\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># build parent element: &lt;div class=\"card\"></span>\n    el <span class=\"token operator\">&lt;-</span> tags<span class=\"token operator\">$</span>div<span class=\"token punctuation\">(</span>\n        id <span class=\"token operator\">=</span> paste0<span class=\"token punctuation\">(</span><span class=\"token string\">\"card-\"</span><span class=\"token punctuation\">,</span> id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        class <span class=\"token operator\">=</span> <span class=\"token string\">\"card\"</span><span class=\"token punctuation\">,</span>\n        draggable <span class=\"token operator\">=</span> tolower<span class=\"token punctuation\">(</span>draggable<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        `data<span class=\"token operator\">-</span>value` <span class=\"token operator\">=</span> title<span class=\"token punctuation\">,</span>\n        tags<span class=\"token operator\">$</span>h2<span class=\"token punctuation\">(</span>class <span class=\"token operator\">=</span> <span class=\"token string\">\"card-title\"</span><span class=\"token punctuation\">,</span> title<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        svg<span class=\"token punctuation\">,</span>\n        tags<span class=\"token operator\">$</span>p<span class=\"token punctuation\">(</span>class <span class=\"token operator\">=</span> <span class=\"token string\">\"card-message\"</span><span class=\"token punctuation\">,</span> text<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># remove &lt;svg> element if draggable = FALSE</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>draggable<span class=\"token punctuation\">)</span> el<span class=\"token operator\">$</span>children<span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">NULL</span>\n\n    <span class=\"token comment\"># return</span>\n    return<span class=\"token punctuation\">(</span>el<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The function returns the HTML markup for the draggable component which is rendered in browser. Here is a sample output.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">draggable_card<span class=\"token punctuation\">(</span>id <span class=\"token operator\">=</span> <span class=\"token string\">\"example\"</span><span class=\"token punctuation\">,</span> title <span class=\"token operator\">=</span> <span class=\"token string\">\"Test\"</span><span class=\"token punctuation\">,</span> text <span class=\"token operator\">=</span> <span class=\"token string\">\"This is a test\"</span><span class=\"token punctuation\">)</span>            \n<span class=\"token comment\"># &lt;div id=\"card-example\" class=\"card\" draggable=\"true\" data-value=\"Test\"></span>\n<span class=\"token comment\">#  &lt;h2 class=\"card-title\">Test&lt;/h2></span>\n<span class=\"token comment\">#  &lt;svg width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" class=\"card-icon\"></span>\n<span class=\"token comment\">#    &lt;circle cx=\"12.5\" cy=\"12.5\" r=\"12.5\" fill=\"#09BC8A\">&lt;/circle></span>\n<span class=\"token comment\">#    &lt;line x1=\"12.5\" y1=\"5\" x2=\"12.5\" y2=\"20\" stroke=\"#ffffff\" stroke-width=\"2.5\" stroke-linecap=\"butt\">&lt;/line></span>\n<span class=\"token comment\">#     &lt;line x1=\"5\" y1=\"12.5\" x2=\"20\" y2=\"12.5\" stroke=\"#ffffff\" stroke-width=\"2.5\" stroke-linecap=\"butt\">&lt;/line></span>\n<span class=\"token comment\">#   &lt;/svg></span>\n<span class=\"token comment\">#   &lt;p class=\"card-message\">This is a test&lt;/p></span>\n<span class=\"token comment\"># &lt;/div></span></code></pre></div>\n<p>If the option <code>draggable</code> was set to false, the function would return the following markup.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">draggable_card<span class=\"token punctuation\">(</span>id <span class=\"token operator\">=</span> <span class=\"token string\">\"example\"</span><span class=\"token punctuation\">,</span> title <span class=\"token operator\">=</span> <span class=\"token string\">\"Test\"</span><span class=\"token punctuation\">,</span> text <span class=\"token operator\">=</span> <span class=\"token string\">\"This is a test\"</span><span class=\"token punctuation\">,</span> draggable <span class=\"token operator\">=</span> <span class=\"token boolean\">FALSE</span><span class=\"token punctuation\">)</span>            \n<span class=\"token comment\"># &lt;div id=\"card-example\" class=\"card\" data-value=\"Test\"></span>\n<span class=\"token comment\">#  &lt;h2 class=\"card-title\">Test&lt;/h2></span>\n<span class=\"token comment\">#   &lt;p class=\"card-message\">This is a test&lt;/p></span>\n<span class=\"token comment\"># &lt;/div></span></code></pre></div>\n<span id=\"work-ui\" />\n<h3>Developing the UI and integrating the draggable component</h3>\n<p>Now that the component is working, it can be integrated into a shiny app. In the example app, I am using the tags approach for building the UI. Using the draggable card function, I will create a few cards using example data. I have wrapped the cards in a container and have included an extra drop area. The purpose of the extra drop area is that if an element is dropped into this area, then it will be placed last. I have also created a button is used to display the order of the cards.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">ui <span class=\"token operator\">&lt;-</span> tagList<span class=\"token punctuation\">(</span>\n\n    <span class=\"token comment\"># &lt;head>: link CSS</span>\n    tags<span class=\"token operator\">$</span>head<span class=\"token punctuation\">(</span>\n        tags<span class=\"token operator\">$</span>link<span class=\"token punctuation\">(</span>rel <span class=\"token operator\">=</span> <span class=\"token string\">\"stylesheet\"</span><span class=\"token punctuation\">,</span> href <span class=\"token operator\">=</span> <span class=\"token string\">\"styles.CSS\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n    <span class=\"token comment\"># &lt;main>: main content</span>\n    tags<span class=\"token operator\">$</span>main<span class=\"token punctuation\">(</span>\n        tags<span class=\"token operator\">$</span>h2<span class=\"token punctuation\">(</span><span class=\"token string\">\"Moveable Elements\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        tags<span class=\"token operator\">$</span>p<span class=\"token punctuation\">(</span>\n            <span class=\"token string\">\"Order the cards by the number of cases or by group.\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"Drag and drop a card into the drop zone or on top of\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"another card. Press 'done' when you are finished.\"</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n        <span class=\"token comment\"># container for dragged elements</span>\n        tags<span class=\"token operator\">$</span>div<span class=\"token punctuation\">(</span>\n            class <span class=\"token operator\">=</span> <span class=\"token string\">\"dragarea\"</span><span class=\"token punctuation\">,</span>\n\n            <span class=\"token comment\"># primary elements</span>\n            draggable_card<span class=\"token punctuation\">(</span><span class=\"token string\">\"groupA\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Group A\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"14 cases\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            draggable_card<span class=\"token punctuation\">(</span><span class=\"token string\">\"groupB\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Group B\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"3 cases\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            draggable_card<span class=\"token punctuation\">(</span><span class=\"token string\">\"groupC\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Group C\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"33 cases\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            draggable_card<span class=\"token punctuation\">(</span><span class=\"token string\">\"groupD\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Group D\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"7 cases\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            draggable_card<span class=\"token punctuation\">(</span><span class=\"token string\">\"groupE\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Group E\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"21 cases\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n            <span class=\"token comment\"># extra drop zone</span>\n            tags<span class=\"token operator\">$</span>div<span class=\"token punctuation\">(</span>\n                class <span class=\"token operator\">=</span> <span class=\"token string\">\"droparea\"</span><span class=\"token punctuation\">,</span>\n                tags<span class=\"token operator\">$</span>p<span class=\"token punctuation\">(</span><span class=\"token string\">\"Drop here\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n        <span class=\"token comment\"># submit button that shows results</span>\n        tags<span class=\"token operator\">$</span>button<span class=\"token punctuation\">(</span>\n            id <span class=\"token operator\">=</span> <span class=\"token string\">\"submit\"</span><span class=\"token punctuation\">,</span>\n            type <span class=\"token operator\">=</span> <span class=\"token string\">\"submit\"</span><span class=\"token punctuation\">,</span>\n            class <span class=\"token operator\">=</span> <span class=\"token string\">\"shiny-bound-input action-button\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"Done\"</span>\n        <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n    <span class=\"token comment\"># link js file</span>\n    tags<span class=\"token operator\">$</span>script<span class=\"token punctuation\">(</span>src <span class=\"token operator\">=</span> <span class=\"token string\">\"index.js\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># server</span>\nserver <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">,</span> output<span class=\"token punctuation\">,</span> session<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># app</span>\nshinyApp<span class=\"token punctuation\">(</span>ui<span class=\"token punctuation\">,</span> server<span class=\"token punctuation\">)</span></code></pre></div>\n<span id=\"work-CSS\" />\n<h3>Defining styles for drag events</h3>\n<p>There are a number of styles in the CSS file, but I would like focus on a few of them: highlighting, drag, and focus. The classes highlighting and focus are used for highlighting a potential drop area by adding a bright green border to the target element. Focus is only used for the blank drop zone. The class drag is used for adding a shadow to the element when it is dragged.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token comment\">/* for highlighting potential drop */</span>\n<span class=\"token selector\">.highlighting</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">border-color</span><span class=\"token punctuation\">:</span> #09BC8A<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* add shadow to dragged element */</span>\n<span class=\"token selector\">.drag</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">-webkit-box-shadow</span><span class=\"token punctuation\">:</span> 0 0 9px 3px <span class=\"token function\">hsla</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 0%<span class=\"token punctuation\">,</span> 0%<span class=\"token punctuation\">,</span> 0.3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 0 0 9px 3px <span class=\"token function\">hsla</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 0%<span class=\"token punctuation\">,</span> 0%<span class=\"token punctuation\">,</span> 0.3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* for highlighting dropzone element */</span>\n<span class=\"token selector\">.droparea.focus</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> White<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">border-color</span><span class=\"token punctuation\">:</span> #09BC8A<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>These classes will be added and removed in the following js events.</p>\n<span id=\"work-events\" />\n<h3>Writing the drag and drop events</h3>\n<p>There are a number of drag related events that you can choose from. At a minimum, you should use <code>dragstart</code> and <code>drop</code>. In this example, I will cover <code>dragstart</code>, <code>dragend</code>, <code>dragover</code>, <code>dragenter</code>, <code>dragleave</code>, and <code>drop</code>. The list below provides a summary of the events that I used in the example app and what each event does.</p>\n<ol>\n<li><code>dagstart</code>/<code>dragend</code>: When an element is dragged, I would like to add a CSS class that makes the dragged element visually noticeable. I also want to remove the class when dragging is stopped.</li>\n<li><code>dragover</code>: When the element is hovered over a potential drop area, I would like to add a CSS class to the drop area.</li>\n<li><code>dragenter</code>/<code>dragleave</code>: If the dragged element is hovered over the extra dropzone, I would like to add a CSS class that focuses the dropzone. I also want to remove this class if the dropzone is no longer focused.</li>\n<li><code>drop</code>: I would also like add some logic that determines where the element should be added. If I drag an element down the page, I am assuming that I want the element to be further down the page. Therefore, I would like the element to be placed <strong>after</strong> the droparea. If I drag an element up the page, I am assuming that I want the element to appear higher on the page. Therefore, I would like the element to be placed <strong>before</strong> the droparea.</li>\n</ol>\n<span id=\"work-events-vars\" />\n<h4>Defining variables and a helper function</h4>\n<p>First, I will create a few variables that will be used across all events. The element <code>dragged</code> will receive the HTML element that I dragged. The variable <code>startingY</code> saves the starting <code>y</code> position of the dragged element. This will be used to determine if the element is moved up or down the page. The last variable I have defined is used to select the blank drop element.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> dragged<span class=\"token punctuation\">,</span> startingY<span class=\"token punctuation\">,</span> dropzone <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">\".droparea\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>In some events that I will write, I will be adding the CSS class <code>.highlighting</code> a potential droparea. However, I will need a function that removes all this class when events are finished.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">remove_highlighting</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelectorAll</span><span class=\"token punctuation\">(</span><span class=\"token string\">\".card\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">elem</span> <span class=\"token operator\">=></span> elem<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"highlighting\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<span id=\"work-events-dragstart\" />\n<h4>Event for dragstart</h4>\n<p>The first event is <code>dragstart</code>. This event runs as soon as an element is dragged. In this example, I initialized a few things.</p>\n<ol>\n<li><code>dataTransfer</code>: this property manages the type of drag (i.e., copy or move), the content that is being dragged (i.e., HTML, images, text, etc.), and other data that you want to use</li>\n<li><code>classList.add</code>: Add the <code>.drag</code> CSS class to the element is, at the moment, being dragged</li>\n<li>update variables: Update the <code>dragged</code> and <code>startingY</code> variables (defined in the previous section).</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dragstart\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// set event data transfer</span>\n    event<span class=\"token punctuation\">.</span>dataTransfer<span class=\"token punctuation\">.</span>dropEffect <span class=\"token operator\">=</span> <span class=\"token string\">\"move\"</span><span class=\"token punctuation\">;</span>\n    event<span class=\"token punctuation\">.</span>dataTransfer<span class=\"token punctuation\">.</span><span class=\"token function\">setData</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"text/HTML\"</span><span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>outerHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// add class to dragged item</span>\n    event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"drag\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// update variables</span>\n    dragged <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">;</span>\n    startingY <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>pageY<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span></code></pre></div>\n<span id=\"work-events-dragend\" />\n<h4>Event for dragend</h4>\n<p>The <code>dragend</code> event is used for running a function when dragging stops. In this example, when the user stops dragging an element, I want to remove the CSS class <code>drag</code>—that was added in the <code>dragstart</code> event—from the dragged element.  </p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dragend\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"drag\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span></code></pre></div>\n<span id=\"work-events-dragover\" />\n<h4>Event for dragover</h4>\n<p>The event <code>dragover</code> is run when an element is dragged over a potential drop area. In this example, this would be another card (i.e., <code>&#x3C;div class=\"card\">...&#x3C;/div></code>) and the extra dropzone (which I will explain in next section). When the user drags an element over another draggable card, I want to add the <code>.highlighting</code> CSS class to the other card. The value of event target is tied to the location of the cursor, which would return other elements besides the card element. Therefore, we need to find the nearest draggable card (i.e., div with the CSS class <code>card</code>).</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dragover\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// prevent any default actions (e.g., link clicks, etc.)</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// if the closet &lt;div> to the target has the class of \"card\",</span>\n    <span class=\"token comment\">// add highlighting to it</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span><span class=\"token function\">closest</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"div\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>className <span class=\"token operator\">===</span> <span class=\"token string\">\"card\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span><span class=\"token function\">closest</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"div.card\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"highlighting\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><strong>NOTE:</strong> If the code above is unclear, add a console log inside the event. Add <code>console.log(event.target)</code> anywhere in this event. Open the browser console and restart the app. Take note of the cursor position and the output element.</p>\n<span id=\"work-events-dragenter\" />\n<h4>Event for dragenter</h4>\n<p>The event <code>dragenter</code> is similar to <code>dragover</code> as they both can be used for highlighting potential drop areas. In this example, I am using <code>dragenter</code> for highlighting the extra dropzone. The variable <code>dropzone</code> was defined in the section <a href=\"#work-events-vars\">Defining variables and a helper function</a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dragenter\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// if the target element is the \"droparea\"</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>className <span class=\"token operator\">===</span> <span class=\"token string\">\"droparea\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        dropzone<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"focus\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span></code></pre></div>\n<span id=\"work-events-dragleave\" />\n<h4>Event for dragleave</h4>\n<p>The opposite event of <code>dragenter</code> is <code>dragleave</code>. In this example, if a card is dragged into the extra drop zone and then dragged elsewhere, I want to remove all highlighting classes. </p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dragleave\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// if the target element is the \"droparea\"</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>className <span class=\"token operator\">===</span> <span class=\"token string\">\"droparea\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        dropzone<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"focus\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// remove all highlighting</span>\n    <span class=\"token function\">remove_highlighting</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h4>Event for drop</h4>\n<p>The last event is the drop event. This event will run when the dragged element is dropped into a new, valid position. In this example, I structured the drop event in two ways: 1) if the element is dropped in the blank dropzone and 2) if the element is dropped on top of another card. Both methods will remove the dragged element and insert it into a valid target location. Should the target location is not valid, then the dragged element will return to the starting position.</p>\n<p>If the element is dropped on top of another card I want to add it before or after the element. Using the variable <code>startingY</code>, we can determine if the element is dragged up or down the page. I will use the event property <code>event.pageY</code> and compare it with <code>startingY</code>. If the value of <code>pageY</code>—at the time of drop‐is less than <code>startingY</code>, then the element has been moved up the page. If the <code>pageY</code> value is greater than <code>startingY</code>, then the element has been moved down the page. </p>\n<p>Depending on the comparison of these values, the dragged element will either be added before or after the target element (i.e., drop area). Using the function <code>insertAdjacentHTML</code>, you can specify the insert position (i.e., <code>beforebegin</code>, <code>afterbegin</code>, <code>beforeend</code>, <code>afterend</code>). In this example, I am using <code>beforebegin</code> and <code>afterend</code> as I want the dragged card to appear before or after another card.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"drop\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// remove any remaining highlighting</span>\n    <span class=\"token function\">remove_highlighting</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    dropzone<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"focus\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// when dropped in droparea</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>className <span class=\"token operator\">===</span> <span class=\"token string\">\"droparea\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// remove styles dragged element</span>\n        dragged<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"drag\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// remove dragged element starting point and add before dropzone</span>\n        <span class=\"token comment\">// we want to keep the dropzone for future use.</span>\n        dragged<span class=\"token punctuation\">.</span>parentNode<span class=\"token punctuation\">.</span><span class=\"token function\">removeChild</span><span class=\"token punctuation\">(</span>dragged<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span><span class=\"token function\">insertAdjacentHTML</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"beforebegin\"</span><span class=\"token punctuation\">,</span> dragged<span class=\"token punctuation\">.</span>outerHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// when \"replacing\" card</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span><span class=\"token function\">closest</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"div\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>className <span class=\"token operator\">==</span> <span class=\"token string\">\"card\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// remove element from document and add to drop position</span>\n        dragged<span class=\"token punctuation\">.</span>classList<span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"drag\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        dragged<span class=\"token punctuation\">.</span>parentNode<span class=\"token punctuation\">.</span><span class=\"token function\">removeChild</span><span class=\"token punctuation\">(</span>dragged<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// if item is moved up, insert the element before the target</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>pageY <span class=\"token operator\">&lt;</span> startingY<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span><span class=\"token function\">closest</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"div.card\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">insertAdjacentHTML</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"beforebegin\"</span><span class=\"token punctuation\">,</span> dragged<span class=\"token punctuation\">.</span>outerHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// if item is moved down, insert the element after the target</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>pageY <span class=\"token operator\">>=</span> startingY<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span><span class=\"token function\">closest</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"div.card\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">insertAdjacentHTML</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"afterend\"</span><span class=\"token punctuation\">,</span> dragged<span class=\"token punctuation\">.</span>outerHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>That is it! </p>\n<p><strong>NOTE:</strong> In this <code>index.js</code> file, the final event runs when the button <em>done</em> is clicked. This event triggers an alert that displays the new order of the cards. </p>\n<span id=\"know\" />\n<h2>What do I need to know before I integrate this into my app?</h2>\n<p>To summarize this tutorial, here are the basic elements that you need.</p>\n<ol>\n<li>An element with the attribute <code>draggable=\"true\"</code> (e.g., <code>&#x3C;div draggable=\"true\">...&#x3C;/div></code>)</li>\n<li>An event that initializes the data transfer when an element is dragged, as well as saves the HTML element for re-adding the dragged element into the document.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// \"save\" dragged element</span>\n<span class=\"token keyword\">let</span> dragged<span class=\"token punctuation\">;</span> \n\n<span class=\"token comment\">// listener</span>\ndocument<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dragstart\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span>dataTransfer<span class=\"token punctuation\">.</span>dropEffect <span class=\"token operator\">=</span> <span class=\"token string\">\"move\"</span><span class=\"token punctuation\">;</span>\n    event<span class=\"token punctuation\">.</span>dataTransfer<span class=\"token punctuation\">.</span><span class=\"token function\">setData</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"text/HTML\"</span><span class=\"token punctuation\">,</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>outerHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    dragged <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ol start=\"3\">\n<li>An event that removes and adds the dragged element when it is dropped.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">document<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"drop\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// remove dragged element</span>\n    dragged<span class=\"token punctuation\">.</span>parentNode<span class=\"token punctuation\">.</span><span class=\"token function\">removeChild</span><span class=\"token punctuation\">(</span>dragged<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// add the dragged element - or \"afterend\", \"beforeend\", etc.</span>\n    event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span><span class=\"token function\">insertAdjacentHTML</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"beforebegin\"</span><span class=\"token punctuation\">,</span> dragged<span class=\"token punctuation\">.</span>outerHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>There are other drag events that may be useful for your app that I did not cover in this tutorial. See the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API\">drag and drop API</a> documentation for more information and examples.</p>\n<p>In this example, I wanted to insert the dragged element before or after an element depending on if the element was dragged up or down the page. Therefore, I used the function <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML\">insertAdjacentHTML</a>. You may want to use another HTML insert function depending on purpose of your app (e.g., <code>appendChild</code>, etc.).</p>\n<p>More reading and testing is needed to ensure the draggable elements are web accessible. I will be investigating this and will update the tutorial. Stay tuned!</p>\n<span id=\"run\" />\n<h2>How do I run the example?</h2>\n<p>The simplest way to run the example is directly from the R console using the function <code>shiny::runGitHub</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">install.packages<span class=\"token punctuation\">(</span><span class=\"token string\">\"shiny\"</span><span class=\"token punctuation\">)</span>\nshiny<span class=\"token operator\">::</span>runGitHub<span class=\"token punctuation\">(</span>repo <span class=\"token operator\">=</span> <span class=\"token string\">\"shinyAppTutorials\"</span><span class=\"token punctuation\">,</span> username <span class=\"token operator\">=</span> <span class=\"token string\">\"davidruvolo51\"</span><span class=\"token punctuation\">,</span> subdir <span class=\"token operator\">=</span> <span class=\"token string\">\"drag-and-drop\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Alternatively, you can clone the repository and run locally.</p>","frontmatter":{"title":"Drag and Drop Example","subtitle":"Learn how to create movable elements in shiny apps.","abstract":"Drag and drop elements may be useful for advanced user interactivity. You can use draggable elements in many situations, such as allowing users to personalize the UI. In this tutorial, learn how to create a draggable element and the required javscript events.","date":"2020-05-12","updated":"2020-05-12","keywords":["javascript","interactivity"]},"fields":{"readingTime":{"minutes":14.695}}}},"pageContext":{"slug":"/tutorials/drag-and-drop/"}},"staticQueryHashes":["63159454"]}