├── vue-draggable.png ├── src ├── core │ ├── helpers │ │ ├── index.js │ │ ├── events.helper.js │ │ ├── state.helper.js │ │ └── dom.helper.js │ ├── listeners │ │ ├── handlers │ │ │ ├── index.js │ │ │ ├── dragenter.handler.js │ │ │ ├── dragleave.handler.js │ │ │ ├── mousedown.handler.js │ │ │ ├── dragstart.handler.js │ │ │ ├── mouseup.handler.js │ │ │ ├── dragover.handler.js │ │ │ ├── dragend.handler.js │ │ │ └── keydown.handler.js │ │ └── index.js │ ├── state.js │ ├── options.js │ └── index.js ├── index.js └── components │ └── vue-draggable-group.component.js ├── .babelrc ├── types ├── index.d.ts └── vue-draggable-options.d.ts ├── .editorconfig ├── example ├── index.ejs ├── style.css ├── README.md └── index.js ├── .vuepress └── config.js ├── .github └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── webpack.config.js ├── test └── index.spec.js ├── polyfills └── index.js ├── package.json ├── .eslintrc ├── README.md └── lib ├── vue-draggable.min.js.map ├── vue-draggable.min.js ├── vue-draggable.js.map └── vue-draggable.js /vue-draggable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vivify-Ideas/vue-draggable/HEAD/vue-draggable.png -------------------------------------------------------------------------------- /src/core/helpers/index.js: -------------------------------------------------------------------------------- 1 | export * from './dom.helper'; 2 | export * from './state.helper'; 3 | export * from './events.helper'; 4 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env" 4 | ], 5 | "plugins": [ 6 | "babel-plugin-add-module-exports", 7 | "@babel/plugin-proposal-object-rest-spread" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /types/index.d.ts: -------------------------------------------------------------------------------- 1 | import _Vue from 'vue' 2 | 3 | export declare function install(Vue: typeof _Vue): void; 4 | 5 | declare class VueDraggable { 6 | static install: typeof install; 7 | } 8 | 9 | export default VueDraggable; -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = LF 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /src/core/listeners/handlers/index.js: -------------------------------------------------------------------------------- 1 | export * from './mousedown.handler'; 2 | export * from './mouseup.handler'; 3 | export * from './dragover.handler'; 4 | export * from './dragstart.handler'; 5 | export * from './dragenter.handler'; 6 | export * from './dragleave.handler'; 7 | export * from './dragend.handler'; 8 | export * from './keydown.handler'; 9 | -------------------------------------------------------------------------------- /example/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | VueDraggable 8 | 9 | 10 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /src/core/state.js: -------------------------------------------------------------------------------- 1 | export const getState = () => ({ 2 | targets: null, 3 | items: null, 4 | nextItemElement: null, 5 | // related variable is needed to maintain a reference to the 6 | // dragleave's relatedTarget, since it doesn't have e.relatedTarget 7 | related: null, 8 | selections: { 9 | items: [], 10 | owner: null, 11 | droptarget: null 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /.vuepress/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: 'VueDraggable', 3 | description: 'Vue Drag and Drop library without any dependency', 4 | base: '/vue-draggable/', 5 | themeConfig: { 6 | nav: [ 7 | { text: 'Start', link: '/' }, 8 | { text: 'Examples', link: '/example/' }, 9 | ], 10 | sidebar: [ 11 | ['/', 'Start' ], 12 | ['/example/', 'Examples'] 13 | ] 14 | } 15 | } -------------------------------------------------------------------------------- /src/core/options.js: -------------------------------------------------------------------------------- 1 | export const getOptions = (componentInstance, options) => ({ 2 | dropzoneSelector: 'ul', 3 | draggableSelector: 'li', 4 | handlerSelector: null, 5 | reactivityEnabled: true, 6 | multipleDropzonesItemsDraggingEnabled: false, 7 | showDropzoneAreas: true, 8 | ...options, 9 | onDragstart: (options.onDragstart || (() => {})).bind(componentInstance), 10 | onDragenter: (options.onDragenter || (() => {})).bind(componentInstance), 11 | onDragover: (options.onDragover || (() => {})).bind(componentInstance), 12 | onDragend: (options.onDragend || (() => {})).bind(componentInstance), 13 | onDrop: (options.onDrop || (() => {})).bind(componentInstance) 14 | }); 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | # Remove some common IDE working directories 30 | .idea 31 | .vscode 32 | 33 | .DS_Store 34 | .vuepress/dist -------------------------------------------------------------------------------- /src/core/listeners/handlers/dragenter.handler.js: -------------------------------------------------------------------------------- 1 | export const dragenterHandler = function (e) { 2 | this.related = e.target; 3 | 4 | if (typeof this.defaultOptions.onDragenter === 'function') { 5 | try { 6 | this.defaultOptions.onDragenter( 7 | { 8 | nativeEvent: e, 9 | stop: () => { 10 | throw new Error(`Stop method is available only for callbacks 11 | 'onDragstart' and 'onDragend'. For more info look at 12 | https://github.com/Vivify-Ideas/vue-draggable/blob/master/README.md 13 | `); 14 | }, 15 | ...this.selections 16 | } 17 | ); 18 | } catch (error) { 19 | e.preventDefault(); 20 | return; 21 | } 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/core/index.js: -------------------------------------------------------------------------------- 1 | import { attachListeners } from './listeners'; 2 | import { setInitialAtributes, updateInitialAttributes } from './helpers'; 3 | import { getOptions } from './options'; 4 | import { getState } from './state'; 5 | 6 | export class VueDraggable { 7 | constructor(el, componentInstance, options) { 8 | Object.assign( 9 | this, 10 | getState(), 11 | { 12 | defaultOptions: getOptions(componentInstance, options) 13 | }, 14 | { el } 15 | ); 16 | 17 | this.registerListeners(el); 18 | this.initiate(el); 19 | } 20 | 21 | registerListeners(el) { 22 | attachListeners.bind(this)(el); 23 | } 24 | 25 | initiate(el) { 26 | setInitialAtributes.bind(this)(el); 27 | } 28 | 29 | update(el) { 30 | updateInitialAttributes.bind(this)(el); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /types/vue-draggable-options.d.ts: -------------------------------------------------------------------------------- 1 | export interface VueDraggableEvent { 2 | nativeEvent: typeof Event, 3 | items: Array, 4 | owner: HTMLElement, 5 | droptarget: HTMLElement, 6 | stop?: () => void // Stop D&D (available only for callbacks `onDragstart` and `onDragend`) 7 | } 8 | 9 | export interface VueDraggableOptions { 10 | dropzoneSelector: string, 11 | draggableSelector: string, 12 | handlerSelector: string, 13 | reactivityEnabled: boolean, 14 | multipleDropzonesItemsDraggingEnabled: boolean, 15 | showDropzoneAreas: boolean, 16 | onDrop: (event: VueDraggableEvent) => void, 17 | onDragstart: (event: VueDraggableEvent) => void, 18 | onDragenter: (event: VueDraggableEvent) => void, 19 | onDragover: (event: VueDraggableEvent) => void, 20 | onDragend: (event: VueDraggableEvent) => void 21 | } 22 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { VueDraggable } from './core'; 2 | import { VueDraggableGroup } from './components/vue-draggable-group.component'; 3 | 4 | let instances = []; 5 | 6 | export const VueDraggableDirective = { 7 | bind(el, options, vnode) { 8 | const instance = new VueDraggable(el, vnode.context, options.value); 9 | 10 | instances.push(instance); 11 | }, 12 | componentUpdated(el) { 13 | setTimeout(() => { 14 | instances.forEach(instance => { 15 | if (instance.el !== el) return; 16 | instance.update(el); 17 | }); 18 | }); 19 | }, 20 | unbind(el) { 21 | instances = instances.filter( 22 | (instance) => instance.el !== el); 23 | } 24 | }; 25 | 26 | VueDraggable.install = function (Vue) { 27 | Vue.directive('drag-and-drop', VueDraggableDirective); 28 | Vue.component('vue-draggable-group', VueDraggableGroup); 29 | }; 30 | 31 | export default VueDraggable; 32 | -------------------------------------------------------------------------------- /src/core/listeners/handlers/dragleave.handler.js: -------------------------------------------------------------------------------- 1 | import { getContainer } from './../../helpers'; 2 | 3 | export const dragleaveHandler = function () { 4 | // get a drop target reference from the relatedTarget 5 | let droptarget = getContainer(this.related); 6 | 7 | // if the drop target is different from the last stored reference 8 | // (or we have one of those references but not the other one) 9 | if (droptarget !== this.selections.droptarget) { 10 | // if we have a saved reference, clear its existing dragover class 11 | if (this.selections.droptarget) { 12 | this.selections.droptarget.className = 13 | this.selections.droptarget.className.replace(/ dragover/g, ''); 14 | } 15 | 16 | // apply the dragover class to the new drop target reference 17 | if (droptarget) { 18 | droptarget.className += ' dragover'; 19 | } 20 | 21 | // then save that reference for next time 22 | this.selections.droptarget = droptarget; 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are **welcome** and will be fully **credited**. 4 | 5 | We accept contributions via Pull Requests on [Github](https://github.com/Vivify-Ideas/vue-draggable). 6 | 7 | ## Pull Requests 8 | 9 | - **Keep the same style** - eslint will automatically be ran before committing 10 | 11 | - **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. 12 | 13 | - **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option. 14 | 15 | - **Create feature branches** - Don't ask us to pull from your master branch. 16 | 17 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. 18 | 19 | - **Send coherent history** - Make sure your commits message means something 20 | 21 | 22 | ## Running 23 | 24 | Launch example 25 | 26 | ``` bash 27 | $ npm run dev 28 | ``` 29 | 30 | **Happy coding**! -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Nikola Spalevic 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/core/helpers/events.helper.js: -------------------------------------------------------------------------------- 1 | const createCustomEvent = (name, data) => { 2 | return new CustomEvent(name, { 3 | detail: data 4 | }); 5 | }; 6 | 7 | export const dispatchCustomEvent = (name, data, element) => { 8 | const customEvent = createCustomEvent(name, data); 9 | 10 | element.dispatchEvent(customEvent); 11 | }; 12 | 13 | export const dispatchReorderEvents = function (e) { 14 | const oldItems = this.selections.droptarget.querySelectorAll( 15 | this.defaultOptions.draggableSelector 16 | ); 17 | const index = this.nextItemElement ? 18 | Array.prototype.indexOf.call( 19 | oldItems, 20 | this.nextItemElement 21 | ) : oldItems.length; 22 | const eventData = { 23 | ids: this.selections.items 24 | .map(item => item.dataset.id), 25 | index, 26 | nativeEvent: e, 27 | ...this.selections 28 | }; 29 | 30 | if (this.selections.droptarget === this.selections.owner) { 31 | dispatchCustomEvent('reordered', eventData, this.selections.droptarget); 32 | return; 33 | } 34 | dispatchCustomEvent('added', eventData, this.selections.droptarget); 35 | dispatchCustomEvent('removed', eventData, this.selections.owner); 36 | }; 37 | -------------------------------------------------------------------------------- /src/core/listeners/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | mousedownHandler, 3 | mouseupHandler, 4 | dragstartHandler, 5 | dragleaveHandler, 6 | dragenterHandler, 7 | dragoverHandler, 8 | dragendHandler, 9 | keydownHandler 10 | } from './handlers'; 11 | 12 | export const attachListeners = function (el) { 13 | // mousedown event to clear previous selections 14 | el.addEventListener('mousedown', mousedownHandler.bind(this), false); 15 | 16 | // mouseup event to implement multiple selection 17 | el.addEventListener('mouseup', mouseupHandler.bind(this), false); 18 | 19 | // dragstart event to initiate mouse dragging 20 | el.addEventListener('dragstart', dragstartHandler.bind(this), false); 21 | 22 | // keydown event to implement selection and abort 23 | el.addEventListener('keydown', keydownHandler.bind(this), false); 24 | 25 | // dragenter event to set related variable 26 | el.addEventListener('dragenter', dragenterHandler.bind(this), false); 27 | 28 | // dragleave event to maintain target highlighting using that variable 29 | el.addEventListener('dragleave', dragleaveHandler.bind(this), false); 30 | 31 | // dragover event to allow the drag by preventing its default 32 | el.addEventListener('dragover', dragoverHandler.bind(this), false); 33 | 34 | // dragend event to implement items being validly dropped into targets, 35 | // or invalidly dropped elsewhere, and to clean-up the interface either way 36 | el.addEventListener('dragend', dragendHandler.bind(this), false); 37 | }; 38 | -------------------------------------------------------------------------------- /example/style.css: -------------------------------------------------------------------------------- 1 | .drag-wrapper { 2 | display: flex; 3 | justify-content: center; 4 | } 5 | 6 | ul { 7 | display: flex; 8 | flex-direction: column; 9 | padding: 3px !important; 10 | min-height: 70vh; 11 | width: 100px; 12 | float:left; 13 | list-style-type:none; 14 | overflow-y:auto; 15 | border:2px solid #888; 16 | border-radius:0.2em; 17 | background:#8adccc; 18 | color:#555; 19 | margin-right: 5px; 20 | } 21 | 22 | /* drop target state */ 23 | ul[aria-dropeffect="move"] { 24 | border-color:#68b; 25 | background:#fff; 26 | } 27 | 28 | /* draggable items */ 29 | li { 30 | display:block; 31 | list-style-type:none; 32 | margin:0 0 2px 0; 33 | padding:0.2em 0.4em; 34 | border-radius:0.2em; 35 | line-height:1.3; 36 | } 37 | 38 | li:hover { 39 | box-shadow:0 0 0 2px #68b, inset 0 0 0 1px #ddd; 40 | } 41 | 42 | /* items focus state */ 43 | li:focus 44 | { 45 | outline:none; 46 | box-shadow:0 0 0 2px #68b, inset 0 0 0 1px #ddd; 47 | } 48 | 49 | /* items grabbed state */ 50 | li[aria-grabbed="true"] 51 | { 52 | background:#5cc1a6; 53 | color:#fff; 54 | } 55 | 56 | @keyframes nodeInserted { 57 | from { opacity: 0.2; } 58 | to { opacity: 0.8; } 59 | } 60 | 61 | .item-dropzone-area { 62 | height: 2rem; 63 | background: #888; 64 | opacity: 0.8; 65 | animation-duration: 0.5s; 66 | animation-name: nodeInserted; 67 | } 68 | 69 | .vue-draggable-json { 70 | display: flex; 71 | padding: 10px; 72 | } 73 | 74 | .vue-draggable-json > code { 75 | margin-left: 10px; 76 | width: 30%; 77 | background: #68b; 78 | padding: 10px; 79 | } -------------------------------------------------------------------------------- /src/core/listeners/handlers/mousedown.handler.js: -------------------------------------------------------------------------------- 1 | import { 2 | clearDropeffects, addSelection, 3 | clearSelections, hasModifier 4 | } from './../../helpers'; 5 | 6 | export const mousedownHandler = function (e) { 7 | if (this.defaultOptions.handlerSelector) { 8 | const handler = e.target.closest(this.defaultOptions.handlerSelector); 9 | 10 | if (!handler) { 11 | return; 12 | } 13 | } 14 | 15 | let elem = e.target.closest(this.defaultOptions.draggableSelector); 16 | 17 | // if the element is a draggable item 18 | if (elem && elem.getAttribute('draggable')) { 19 | // clear dropeffect from the target containers 20 | clearDropeffects(this.items, this.selections, this.targets); 21 | // if the multiple selection modifier is not pressed 22 | // and the item's grabbed state is currently false 23 | if (!hasModifier(e) && 24 | elem.getAttribute('aria-grabbed') === 'false') { 25 | // clear all existing selections 26 | clearSelections.bind(this)(); 27 | 28 | // then add this new selection 29 | addSelection.bind(this)(elem); 30 | } 31 | } else if (!hasModifier(e)) { 32 | // else [if the element is anything else] 33 | // and the selection modifier is not pressed 34 | // clear dropeffect from the target containers 35 | clearDropeffects(this.items, this.selections, this.targets); 36 | 37 | // clear all existing selections 38 | clearSelections.bind(this)(); 39 | } else { 40 | // else [if the element is anything else and the modifier is pressed] 41 | // clear dropeffect from the target containers 42 | clearDropeffects(this.items, this.selections, this.targets); 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | /* global __dirname, require, module*/ 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const path = require('path'); 4 | const pkg = require('./package.json'); 5 | 6 | const config = env => { 7 | let libraryName = pkg.name; 8 | 9 | let plugins = [], outputFile; 10 | 11 | if (env === 'build') { 12 | outputFile = libraryName + '.min.js'; 13 | } else if (env === 'server') { 14 | plugins.push(new HtmlWebpackPlugin({ 15 | template: 'example/index.ejs' 16 | })); 17 | } else { 18 | outputFile = libraryName + '.js'; 19 | } 20 | 21 | return { 22 | entry: __dirname + ( 23 | env === 'server' ? '/example/index.js' : '/src/index.js' 24 | ), 25 | mode: env === 'build' ? 'production' : 'development', 26 | devtool: 'nosources-source-map', 27 | output: { 28 | path: __dirname + '/lib', 29 | filename: outputFile, 30 | library: 'VueDraggable', 31 | libraryTarget: 'umd', 32 | umdNamedDefine: true, 33 | globalObject: 'this' 34 | }, 35 | devServer: { 36 | contentBase: path.join(__dirname, 'example'), 37 | compress: true 38 | }, 39 | module: { 40 | rules: [ 41 | { 42 | test: /(\.jsx|\.js)$/, 43 | loader: 'babel-loader', 44 | exclude: /node_modules/ 45 | }, 46 | { 47 | test: /(\.jsx|\.js)$/, 48 | loader: 'eslint-loader', 49 | exclude: /node_modules/ 50 | } 51 | ] 52 | }, 53 | resolve: { 54 | modules: [path.resolve('./node_modules'), path.resolve('./src')], 55 | extensions: ['.json', '.js'] 56 | }, 57 | plugins: plugins 58 | }; 59 | }; 60 | 61 | module.exports = config; 62 | -------------------------------------------------------------------------------- /src/core/listeners/handlers/dragstart.handler.js: -------------------------------------------------------------------------------- 1 | import { 2 | removeOldDropzoneAreaElements, addDropeffects, addSelection, 3 | stopDragAndDrop, hasModifier 4 | } from './../../helpers'; 5 | 6 | export const dragstartHandler = function (e) { 7 | let elem = e.target.closest(this.defaultOptions.draggableSelector); 8 | 9 | // if the element's parent is not the owner, then block this event 10 | if (!this.defaultOptions.multipleDropzonesItemsDraggingEnabled && 11 | elem && this.selections.owner !== elem.parentNode) { 12 | e.preventDefault(); 13 | return; 14 | } 15 | 16 | if (typeof this.defaultOptions.onDragstart === 'function') { 17 | try { 18 | this.defaultOptions.onDragstart( 19 | { 20 | nativeEvent: e, 21 | stop: stopDragAndDrop, 22 | ...this.selections 23 | } 24 | ); 25 | } catch (error) { 26 | e.preventDefault(); 27 | removeOldDropzoneAreaElements(); 28 | return; 29 | } 30 | } 31 | 32 | // [else] if the multiple selection modifier is pressed 33 | // and the item's grabbed state is currently false 34 | if (hasModifier(e) && 35 | elem.getAttribute('aria-grabbed') === 'false') { 36 | // add this additional selection 37 | addSelection.bind(this)(elem); 38 | } 39 | 40 | // we don't need the transfer data, but we have to define something 41 | // otherwise the drop action won't work at all in firefox 42 | // most browsers support the proper mime-type syntax, eg. "text/plain" 43 | // but we have to use this incorrect syntax for the benefit of IE10+ 44 | e.dataTransfer.setData('text', ''); 45 | 46 | // apply dropeffect to the target containers 47 | addDropeffects(this.items, this.selections, this.targets); 48 | }; 49 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | ## Start 4 | 5 | ::: tip 6 | Attach vue-draggable directive on d&d wrapper element and you are ready to start. 7 | If you want to change default draggable and droppable elements you can pass 8 | new values `dropzoneSelector` and `draggableSelector`. 9 | By default selectors are `'ul'` and `'li'`. 10 | ::: 11 | 15 | 16 | ## Working with Reactive Data 17 | 18 | ::: tip 19 | Multiple callbacks available for use`onDragstart`, `onDrop`, `onDragend`. 20 | 21 | - `onDragend` is always triggered even if item is dropped in invalid 22 | dropzone. 23 | 24 | - `onDrop` is triggered only when items are dropped in 25 | valid dropzones. 26 | 27 | - `onDragstart` is always called when D&D starts. 28 | 29 | Data passed to callbacks: 30 | 31 | ```javascript 32 | { 33 | nativeEvent: {}, // native js event 34 | items: [], // list of selected draggable elements 35 | owner: null, // old dropzone element 36 | droptarget: null // new dropzone element, 37 | stop: () => {} // Stop D&D (available only for callbacks `onDragstart` and `onDragend`) 38 | } 39 | ``` 40 | ::: 41 | -------------------------------------------------------------------------------- /test/index.spec.js: -------------------------------------------------------------------------------- 1 | /* global describe, it, before */ 2 | import 'jsdom-global/register'; 3 | import chai from 'chai'; 4 | import { shallowMount, createLocalVue } from '@vue/test-utils'; 5 | import VueDraggable from '../lib/vue-draggable.js'; 6 | import { VueDraggableDirective } from '../src'; 7 | 8 | chai.expect(); 9 | 10 | const expect = chai.expect; 11 | 12 | let lib; 13 | 14 | describe('is an vuejs plugin', () => { 15 | before(() => { 16 | lib = VueDraggable; 17 | }); 18 | describe('when i need the install function', () => { 19 | it('should return the function', () => { 20 | expect(lib.install).is.instanceof(Function); 21 | }); 22 | }); 23 | }); 24 | 25 | describe('li elements are draggable', () => { 26 | const component = { 27 | template: ` 28 |
29 | 34 | 39 | 44 |
45 | `, 46 | data() { 47 | return { 48 | options: { 49 | dropzoneSelector: 'ul', 50 | draggableSelector: 'li', 51 | excludeOlderBrowsers: false 52 | } 53 | }; 54 | } 55 | }; 56 | const localVue = createLocalVue(); 57 | 58 | localVue.directive('dragAndDrop', VueDraggableDirective); 59 | 60 | const wrapper = shallowMount(component, { 61 | localVue 62 | }); 63 | 64 | const testEl = wrapper.find('.test-el'); 65 | 66 | it('li elements should have attribute draggable', () => { 67 | expect(testEl.element.getAttribute('draggable')).to.be.equal('true'); 68 | }); 69 | }); 70 | -------------------------------------------------------------------------------- /polyfills/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * IE polyfills 3 | * closest: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest 4 | * remove: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove 5 | */ 6 | if (!Element.prototype.matches) { 7 | Element.prototype.matches = Element.prototype.msMatchesSelector || 8 | Element.prototype.webkitMatchesSelector; 9 | } 10 | 11 | if (!Element.prototype.closest) { 12 | Element.prototype.closest = function (s) { 13 | var el = this; 14 | 15 | do { 16 | if (el.matches(s)) return el; 17 | el = el.parentElement || el.parentNode; 18 | } while (el !== null && el.nodeType === 1); 19 | return null; 20 | }; 21 | } 22 | // from:https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md 23 | (function (arr) { 24 | arr.forEach(function (item) { 25 | if (item.hasOwnProperty('remove')) { 26 | return; 27 | } 28 | Object.defineProperty(item, 'remove', { 29 | configurable: true, 30 | enumerable: true, 31 | writable: true, 32 | value: function remove() { 33 | if (this.parentNode !== null) { 34 | this.parentNode.removeChild(this); 35 | } 36 | } 37 | }); 38 | }); 39 | })([Element.prototype, CharacterData.prototype, DocumentType.prototype]); 40 | 41 | // Custom Events 42 | // IE Polyfills: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill 43 | (function () { 44 | 45 | if (typeof window.CustomEvent === 'function') return false; 46 | 47 | function CustomEvent(event, params) { 48 | var evt = document.createEvent('CustomEvent'); 49 | 50 | params = params || { bubbles: false, cancelable: false, detail: null }; 51 | 52 | evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); 53 | return evt; 54 | } 55 | 56 | CustomEvent.prototype = window.Event.prototype; 57 | window.CustomEvent = CustomEvent; 58 | 59 | return CustomEvent; 60 | })(); 61 | -------------------------------------------------------------------------------- /src/core/helpers/state.helper.js: -------------------------------------------------------------------------------- 1 | export const addSelection = function (item) { 2 | // if the owner reference is still null, set it to this item's parent 3 | // so that further selection is only allowed within the same container 4 | if (!this.selections.owner) { 5 | this.selections.owner = item.parentNode; 6 | } 7 | 8 | // or if that's already happened then compare it with this item's parent 9 | // and if they're not the same container, return to prevent selection 10 | if (!this.defaultOptions.multipleDropzonesItemsDraggingEnabled && 11 | this.selections.owner !== item.parentNode) { 12 | return; 13 | } 14 | 15 | // set this item's grabbed state 16 | item.setAttribute('aria-grabbed', 'true'); 17 | 18 | // add it to the items array 19 | this.selections.items = 20 | this.selections.items.indexOf(item) >= 0 ? 21 | this.selections.items : 22 | [ ...this.selections.items, item ]; 23 | }; 24 | 25 | export const removeSelection = function (item) { 26 | // reset this item's grabbed state 27 | item.setAttribute('aria-grabbed', 'false'); 28 | 29 | // then find and remove this item from the existing items array 30 | for (let i = 0; i < this.selections.items.length; i++) { 31 | if (this.selections.items[i] === item) { 32 | this.selections.items.splice(i, 1); 33 | break; 34 | } 35 | } 36 | }; 37 | 38 | export const clearSelections = function () { 39 | // if we have any selected items 40 | if (this.selections.items.length) { 41 | // reset the owner reference 42 | this.selections.owner = null; 43 | 44 | // reset the grabbed state on every selected item 45 | for (let i = 0; i < this.selections.items.length; i++) { 46 | this.selections.items[i].setAttribute('aria-grabbed', 'false'); 47 | } 48 | 49 | // then reset the items array 50 | this.selections.items = []; 51 | } 52 | }; 53 | 54 | export const stopDragAndDrop = function () { 55 | // throw exception and catch this to stop further d&d 56 | throw new Error('Requested D&D stop...'); 57 | }; 58 | -------------------------------------------------------------------------------- /src/components/vue-draggable-group.component.js: -------------------------------------------------------------------------------- 1 | const CUSTOM_EVENTS = [ 2 | 'added', 3 | 'removed', 4 | 'reordered' 5 | ]; 6 | 7 | export const VueDraggableGroup = { 8 | name: 'VueDraggableGroup', 9 | props: { 10 | groups: { 11 | required: true, 12 | type: Array 13 | }, 14 | value: { 15 | required: true, 16 | type: Array 17 | }, 18 | itemsKey: { 19 | type: String, 20 | default: 'items' 21 | } 22 | }, 23 | render() { 24 | return this.$scopedSlots.default({}); 25 | }, 26 | methods: { 27 | added(event) { 28 | const newItems = this.groups 29 | .map(group => group[this.itemsKey]) 30 | .reduce((prev, curr) => [...prev, ...curr], []) 31 | .filter(item => event.detail.ids.map(Number).indexOf(item.id) >= 0); 32 | 33 | this.value.splice(event.detail.index, 0, ...newItems); 34 | this.$emit('change', this.groups); 35 | }, 36 | removed(event) { 37 | const newArray = this.value.filter( 38 | item => event.detail.ids.map(Number).indexOf(item.id) < 0 39 | ); 40 | 41 | this.$emit('input', newArray); 42 | }, 43 | reordered(event, group) { 44 | const reorderedItems = this.value.filter( 45 | item => event.detail.ids.map(Number).indexOf(item.id) >= 0 46 | ); 47 | const notReorderedItems = this.value.filter( 48 | item => event.detail.ids.map(Number).indexOf(item.id) < 0 49 | ); 50 | 51 | notReorderedItems.splice(event.detail.index, 0, ...reorderedItems); 52 | 53 | this.$emit('input', notReorderedItems); 54 | this.$emit('change', this.groups); 55 | }, 56 | addListeners() { 57 | CUSTOM_EVENTS.forEach((event) => 58 | this.$el.addEventListener(event, this[event])); 59 | }, 60 | removeListeners() { 61 | CUSTOM_EVENTS.forEach((event) => 62 | this.$el.removeEventListener(event, this[event])); 63 | } 64 | }, 65 | mounted() { 66 | this.addListeners(); 67 | }, 68 | beforeDestroy() { 69 | this.removeListeners(); 70 | } 71 | }; 72 | -------------------------------------------------------------------------------- /src/core/listeners/handlers/mouseup.handler.js: -------------------------------------------------------------------------------- 1 | import { 2 | addSelection, removeSelection, hasModifier, clearSelections 3 | } from './../../helpers'; 4 | 5 | const isItemInSelectionArea = (item, element, lastItem) => { 6 | return item.parentNode === element.parentNode && 7 | ( 8 | (element.offsetTop > lastItem.offsetTop && 9 | item.offsetTop <= element.offsetTop && 10 | item.offsetTop >= lastItem.offsetTop 11 | ) || 12 | (item.offsetTop >= element.offsetTop && 13 | item.offsetTop <= lastItem.offsetTop 14 | ) 15 | ); 16 | }; 17 | 18 | export const mouseupHandler = function (e) { 19 | let elem = e.target.closest(this.defaultOptions.draggableSelector); 20 | 21 | // if the element is a draggable item 22 | if (elem && elem.getAttribute('draggable')) { 23 | // if shift key is pressed select multiple items 24 | if (hasModifier(e)) { 25 | if (this.selections.items.length && e.shiftKey) { 26 | // last selected item 27 | const lastItem = this.selections.items.slice(-1).pop(); 28 | 29 | if (this.items && this.items.length > 0) { 30 | for (let i = 0; i < this.items.length; i++) { 31 | const item = this.items[i]; 32 | 33 | const shouldSelectItem = isItemInSelectionArea(item, elem, lastItem); 34 | 35 | shouldSelectItem && addSelection.bind(this)(item); 36 | } // if the item's grabbed state is currently true 37 | } 38 | 39 | } else if (elem.getAttribute('aria-grabbed') === 'true') { 40 | // unselect this item 41 | removeSelection.bind(this)(elem); 42 | 43 | // if that was the only selected item 44 | // then reset the owner container reference 45 | if (!this.selections.items.length) { 46 | this.selections.owner = null; 47 | } 48 | } else { 49 | // else [if the item's grabbed state is false] 50 | // add this additional selection 51 | addSelection.bind(this)(elem); 52 | } 53 | } else { 54 | // if no modifier, clear all selections and add current item. 55 | clearSelections.bind(this)(); 56 | addSelection.bind(this)(elem); 57 | } 58 | } 59 | }; 60 | -------------------------------------------------------------------------------- /src/core/listeners/handlers/dragover.handler.js: -------------------------------------------------------------------------------- 1 | import { removeOldDropzoneAreaElements } from './../../helpers'; 2 | 3 | const state = { 4 | previousTarget: null, 5 | dragoverCalls: 0 6 | }; 7 | 8 | const displayDropzones = function (e) { 9 | if (state.dragoverCalls % 100 !== 0 && 10 | ( 11 | e.target === state.previousTarget || 12 | !e.target || 13 | e.target.className === 'item-dropzone-area' 14 | ) 15 | ) return; 16 | 17 | state.dragoverCalls++; 18 | state.previousTarget = e.target; 19 | 20 | this.nextItemElement = e.target.closest(this.defaultOptions.draggableSelector); 21 | this.selections.droptarget = e.target.closest(this.defaultOptions.dropzoneSelector); 22 | 23 | let itemDropzoneElement = document.createElement('div'); 24 | 25 | itemDropzoneElement.className = 'item-dropzone-area'; 26 | removeOldDropzoneAreaElements(); 27 | 28 | if (this.selections.droptarget && this.nextItemElement) { 29 | this.selections.droptarget.insertBefore( 30 | itemDropzoneElement, 31 | state.previousTarget.closest(this.defaultOptions.draggableSelector) 32 | ); 33 | } 34 | 35 | if (this.selections.droptarget && !this.nextItemElement) { 36 | this.selections.droptarget.appendChild(itemDropzoneElement); 37 | } 38 | }; 39 | 40 | export const dragoverHandler = function (e) { 41 | // if we have any selected items, 42 | // allow them to be dragged 43 | if (this.selections.items.length) { 44 | e.preventDefault(); 45 | } 46 | if (!this.defaultOptions.showDropzoneAreas) { 47 | return; 48 | } 49 | displayDropzones.bind(this)(e); 50 | 51 | if (typeof this.defaultOptions.onDragover === 'function') { 52 | try { 53 | this.defaultOptions.onDragover( 54 | { 55 | nativeEvent: e, 56 | stop: () => { 57 | throw new Error(`Stop method is available only for callbacks 58 | 'onDragstart' and 'onDragend'. For more info look at 59 | https://github.com/Vivify-Ideas/vue-draggable/blob/master/README.md 60 | `); 61 | }, 62 | ...this.selections 63 | } 64 | ); 65 | } catch (error) { 66 | e.preventDefault(); 67 | return; 68 | } 69 | } 70 | }; 71 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-draggable", 3 | "version": "2.0.6", 4 | "description": "Vue drag and drop library without any dependency", 5 | "main": "lib/vue-draggable.js", 6 | "scripts": { 7 | "build": "webpack --env dev && webpack --env build && npm run test", 8 | "dev": "webpack-dev-server --progress --colors --watch --env server --config ./webpack.config.js", 9 | "test": "mocha --require @babel/register --colors ./test/*.spec.js", 10 | "test:watch": "mocha --require @babel/register --colors -w ./test/*.spec.js", 11 | "lint": "eslint src", 12 | "vuepress:dev": "vuepress dev", 13 | "vuepress:build": "vuepress build", 14 | "deploy": "npm run vuepress:build && gh-pages -d .vuepress/dist" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/Vivify-Ideas/vue-draggable" 19 | }, 20 | "bugs": { 21 | "url": "https://github.com/Vivify-Ideas/vue-draggable/issues" 22 | }, 23 | "typings": "types/index.d.ts", 24 | "files": [ 25 | "src", 26 | "polyfills/*.js", 27 | "lib/*.js", 28 | "types/*.d.ts" 29 | ], 30 | "keywords": [ 31 | "vue", 32 | "vuejs", 33 | "html5", 34 | "drag", 35 | "drop", 36 | "draggable" 37 | ], 38 | "author": "Nikola Spalevic", 39 | "license": "MIT", 40 | "homepage": "https://github.com/Vivify-Ideas/vue-draggable#readme", 41 | "devDependencies": { 42 | "@babel/cli": "^7.2.3", 43 | "@babel/core": "^7.4.0", 44 | "@babel/plugin-proposal-object-rest-spread": "^7.4.0", 45 | "@babel/preset-env": "^7.4.2", 46 | "@babel/register": "^7.4.0", 47 | "@vue/test-utils": "^1.0.0-beta.29", 48 | "babel-eslint": "^10.0.1", 49 | "babel-loader": "^8.0.5", 50 | "babel-plugin-add-module-exports": "^0.2.1", 51 | "chai": "^4.2.0", 52 | "eslint": "^5.16.0", 53 | "eslint-loader": "^2.1.2", 54 | "gh-pages": "^2.0.1", 55 | "html-webpack-plugin": "^3.2.0", 56 | "husky": "^3.1.0", 57 | "jsdom": "^11.11.0", 58 | "jsdom-global": "^3.0.2", 59 | "mocha": "^5.2.0", 60 | "vue": "^2.6.10", 61 | "vue-template-compiler": "^2.6.10", 62 | "vuepress": "^1.2.0", 63 | "webpack": "^4.29.6", 64 | "webpack-cli": "^3.3.0", 65 | "webpack-dev-server": "^3.2.1" 66 | }, 67 | "resolutions": { 68 | "serialize-javascript": "^2.1.1" 69 | }, 70 | "husky": { 71 | "hooks": { 72 | "pre-commit": "npm run lint" 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/core/listeners/handlers/dragend.handler.js: -------------------------------------------------------------------------------- 1 | import { 2 | removeOldDropzoneAreaElements, clearDropeffects, 3 | clearSelections, stopDragAndDrop, dispatchReorderEvents 4 | } from './../../helpers'; 5 | 6 | const reorderDomElements = (droptarget, items, nextItemElement) => { 7 | for (let i = 0; i < items.length; i++) { 8 | if (nextItemElement) { 9 | droptarget.insertBefore( 10 | items[i], nextItemElement); 11 | continue; 12 | } 13 | droptarget.appendChild(items[i]); 14 | } 15 | }; 16 | 17 | export const dragendHandler = function (e) { 18 | if (typeof this.defaultOptions.onDragend === 'function') { 19 | try { 20 | this.defaultOptions.onDragend( 21 | { 22 | nativeEvent: e, 23 | stop: stopDragAndDrop, 24 | ...this.selections 25 | } 26 | ); 27 | } catch (error) { 28 | removeOldDropzoneAreaElements(); 29 | return; 30 | } 31 | } 32 | 33 | // if we have a valid drop target reference 34 | // (which implies that we have some selected items) 35 | if (this.selections.droptarget) { 36 | if (this.defaultOptions.reactivityEnabled) { 37 | dispatchReorderEvents.bind(this)(e); 38 | } else { 39 | // make dom manipulation only if reactivity is disabled 40 | reorderDomElements( 41 | this.selections.droptarget, 42 | this.selections.items, 43 | this.nextItemElement 44 | ); 45 | } 46 | 47 | if (typeof this.defaultOptions.onDrop === 'function') { 48 | this.defaultOptions.onDrop({ 49 | nativeEvent: e, 50 | stop: () => { 51 | throw new Error(`Stop method is available only for callbacks 52 | 'onDragstart' and 'onDragend'. For more info look at 53 | https://github.com/Vivify-Ideas/vue-draggable/blob/master/README.md 54 | `); 55 | }, 56 | ...this.selections 57 | }); 58 | } 59 | 60 | // prevent default to allow the action 61 | e.preventDefault(); 62 | } 63 | 64 | // if we have any selected items 65 | if (this.selections.items.length) { 66 | // clear dropeffect from the target containers 67 | clearDropeffects(this.items, this.selections, this.targets); 68 | 69 | // if we have a valid drop target reference 70 | if (this.selections.droptarget) { 71 | // reset the selections array 72 | clearSelections.bind(this)(); 73 | 74 | // reset the target's dragover class 75 | this.selections.droptarget.className = 76 | this.selections.droptarget.className.replace(/ dragover/g, ''); 77 | 78 | // reset the target reference 79 | this.selections.droptarget = null; 80 | } 81 | } 82 | 83 | // dropzone area elements 84 | removeOldDropzoneAreaElements(); 85 | }; 86 | -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue/dist/vue.common'; 2 | import VueDraggable from './../src'; 3 | 4 | Vue.use(VueDraggable); 5 | 6 | Vue.component('VueDraggable', { 7 | data() { 8 | return { 9 | groups: [ 10 | { 11 | id: 1, 12 | name: 'Group 1', 13 | items: [ 14 | { id: 1, name: 'Item 1' }, 15 | { id: 2, name: 'Item 2' }, 16 | { id: 3, name: 'Item 3' } 17 | ] 18 | }, 19 | { 20 | id: 2, 21 | name: 'Group 2', 22 | items: [ 23 | { id: 4, name: 'Item 4' }, 24 | { id: 5, name: 'Item 5' }, 25 | { id: 6, name: 'Item 6' } 26 | ] 27 | }, 28 | { 29 | id: 3, 30 | name: 'Group 3', 31 | items: [ 32 | { id: 7, name: 'Item 7' }, 33 | { id: 8, name: 'Item 8' }, 34 | { id: 9, name: 'Item 9' } 35 | ] 36 | } 37 | ], 38 | options: { 39 | // dropzoneSelector: 'ul', 40 | // draggableSelector: 'li', 41 | // excludeOlderBrowsers: true, 42 | // multipleDropzonesItemsDraggingEnabled: true, 43 | onDrop(event) { 44 | console.log({ 45 | event, 46 | el: this.$el 47 | }); 48 | } 49 | // onDragstart(event) { 50 | // event.stop(); 51 | // }, 52 | // onDragend(event) { 53 | // event.stop(); 54 | // } 55 | } 56 | }; 57 | }, 58 | methods: { 59 | onGroupsChange(groups) { 60 | console.log({groups}); 61 | } 62 | }, 63 | template: ` 64 |
65 | 73 |
    74 |
  • 79 | 80 |
  • 81 |
82 |
83 | 84 |
85 | {{ group }} 86 |
87 |
88 | ` 89 | }); 90 | 91 | (new Vue({ 92 | data() { 93 | return { 94 | showFirst: false, 95 | showSecond: false 96 | }; 97 | }, 98 | template: ` 99 |
100 | 101 | 102 | 103 | 104 |
105 | ` 106 | })).$mount('#app'); 107 | -------------------------------------------------------------------------------- /src/core/helpers/dom.helper.js: -------------------------------------------------------------------------------- 1 | export const getDroptargets = (el, dropzoneSelector) => 2 | el.querySelectorAll(dropzoneSelector); 3 | 4 | export const getDraggables = (el, draggableSelector) => 5 | el.querySelectorAll(draggableSelector); 6 | 7 | export const updateInitialAttributes = function (el) { 8 | this.targets = getDroptargets(el, this.defaultOptions.dropzoneSelector); 9 | this.items = getDraggables(el, this.defaultOptions.draggableSelector); 10 | for (let i = 0; i < this.targets.length; i++) { 11 | this.targets[i].setAttribute('aria-dropeffect', 'none'); 12 | } 13 | 14 | for (let i = 0; i < this.items.length; i++) { 15 | this.items[i].setAttribute('draggable', 'true'); 16 | if (this.items[i].getAttribute('aria-grabbed') !== 'true') { 17 | this.items[i].setAttribute('aria-grabbed', 'false'); 18 | } 19 | this.items[i].setAttribute('tabindex', '0'); 20 | } 21 | }; 22 | export const setInitialAtributes = function (el) { 23 | this.targets = getDroptargets(el, this.defaultOptions.dropzoneSelector); 24 | this.items = getDraggables(el, this.defaultOptions.draggableSelector); 25 | 26 | for (let i = 0; i < this.targets.length; i++) { 27 | this.targets[i].setAttribute('aria-dropeffect', 'none'); 28 | } 29 | 30 | for (let i = 0; i < this.items.length; i++) { 31 | this.items[i].setAttribute('draggable', 'true'); 32 | this.items[i].setAttribute('aria-grabbed', 'false'); 33 | this.items[i].setAttribute('tabindex', '0'); 34 | } 35 | }; 36 | 37 | export const removeOldDropzoneAreaElements = () => { 38 | let oldItemDropzoneElements = document.querySelectorAll('.item-dropzone-area'); 39 | 40 | for (let i = 0; i < oldItemDropzoneElements.length; i++) { 41 | oldItemDropzoneElements[i].remove(); 42 | } 43 | }; 44 | 45 | export const getContainer = (element) => { 46 | let containerElement = element; 47 | 48 | do { 49 | if (containerElement && 50 | containerElement.nodeType === 1 && 51 | containerElement.getAttribute('aria-dropeffect') 52 | ) { 53 | return containerElement; 54 | } 55 | } while ((containerElement = 56 | containerElement ? containerElement.parentNode : null) 57 | ); 58 | 59 | return null; 60 | }; 61 | 62 | export const addDropeffects = (items, selections, targets) => { 63 | // apply aria-dropeffect and tabindex to all targets apart from the owner 64 | for (let len = targets.length, i = 0; i < len; i++) { 65 | if (targets[i] !== selections.owner && 66 | targets[i].getAttribute('aria-dropeffect') === 'none') { 67 | targets[i].setAttribute('aria-dropeffect', 'move'); 68 | targets[i].setAttribute('tabindex', '0'); 69 | } 70 | } 71 | 72 | // remove aria-grabbed and tabindex from all items inside those containers 73 | for (let len = items.length, i = 0; i < len; i++) { 74 | if (items[i].parentNode !== selections.owner && 75 | items[i].getAttribute('aria-grabbed')) { 76 | items[i].removeAttribute('aria-grabbed'); 77 | items[i].removeAttribute('tabindex'); 78 | } 79 | } 80 | }; 81 | 82 | export const clearDropeffects = (items, selections, targets) => { 83 | // if we dont't have any selected items just skip 84 | if (!selections.items.length) { 85 | return; 86 | } 87 | // reset aria-dropeffect and remove tabindex from all targets 88 | for (let i = 0; i < targets.length; i++) { 89 | if (targets[i].getAttribute('aria-dropeffect') !== 'none') { 90 | targets[i].setAttribute('aria-dropeffect', 'none'); 91 | targets[i].removeAttribute('tabindex'); 92 | } 93 | } 94 | 95 | // restore aria-grabbed and tabindex to all selectable items 96 | // without changing the grabbed value of any existing selected items 97 | for (let i = 0; i < items.length; i++) { 98 | if (!items[i].getAttribute('aria-grabbed')) { 99 | items[i].setAttribute('aria-grabbed', 'false'); 100 | items[i].setAttribute('tabindex', '0'); 101 | } else if (items[i].getAttribute('aria-grabbed') === 'true') { 102 | items[i].setAttribute('tabindex', '0'); 103 | } 104 | } 105 | }; 106 | 107 | export const hasModifier = (e) => { 108 | return (e.ctrlKey || e.metaKey || e.shiftKey); 109 | }; 110 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "env": { 4 | "browser": true, 5 | "es6": true, 6 | "node": true 7 | }, 8 | 9 | "globals": { 10 | "document": false, 11 | "escape": false, 12 | "navigator": false, 13 | "unescape": false, 14 | "window": false, 15 | "describe": true, 16 | "before": true, 17 | "it": true, 18 | "expect": true, 19 | "sinon": true 20 | }, 21 | 22 | "parser": "babel-eslint", 23 | 24 | "plugins": [ 25 | 26 | ], 27 | 28 | "rules": { 29 | "block-scoped-var": 2, 30 | "brace-style": [2, "1tbs", { "allowSingleLine": true }], 31 | "camelcase": [2, { "properties": "always" }], 32 | "comma-dangle": [2, "never"], 33 | "comma-spacing": [2, { "before": false, "after": true }], 34 | "comma-style": [2, "last"], 35 | "complexity": 0, 36 | "consistent-return": 2, 37 | "consistent-this": 0, 38 | "curly": [2, "multi-line"], 39 | "default-case": 0, 40 | "dot-location": [2, "property"], 41 | "dot-notation": 0, 42 | "eol-last": 2, 43 | "eqeqeq": [2, "allow-null"], 44 | "func-names": 0, 45 | "func-style": 0, 46 | "generator-star-spacing": [2, "both"], 47 | "guard-for-in": 0, 48 | "handle-callback-err": [2, "^(err|error|anySpecificError)$" ], 49 | "indent": [2, 2, { "SwitchCase": 1 }], 50 | "key-spacing": [2, { "beforeColon": false, "afterColon": true }], 51 | "keyword-spacing": [2, {"before": true, "after": true}], 52 | "linebreak-style": 0, 53 | "max-depth": 0, 54 | "max-len": [2, 120, 4], 55 | "max-nested-callbacks": 0, 56 | "max-params": 0, 57 | "max-statements": 0, 58 | "new-cap": [2, { "newIsCap": true, "capIsNew": false }], 59 | "newline-after-var": [2, "always"], 60 | "new-parens": 2, 61 | "no-alert": 0, 62 | "no-array-constructor": 2, 63 | "no-bitwise": 0, 64 | "no-caller": 2, 65 | "no-catch-shadow": 0, 66 | "no-cond-assign": 2, 67 | "no-console": 0, 68 | "no-constant-condition": 0, 69 | "no-continue": 0, 70 | "no-control-regex": 2, 71 | "no-debugger": 2, 72 | "no-delete-var": 2, 73 | "no-div-regex": 0, 74 | "no-dupe-args": 2, 75 | "no-dupe-keys": 2, 76 | "no-duplicate-case": 2, 77 | "no-else-return": 2, 78 | "no-empty": 0, 79 | "no-empty-character-class": 2, 80 | "no-eq-null": 0, 81 | "no-eval": 2, 82 | "no-ex-assign": 2, 83 | "no-extend-native": 2, 84 | "no-extra-bind": 2, 85 | "no-extra-boolean-cast": 2, 86 | "no-extra-parens": 0, 87 | "no-extra-semi": 0, 88 | "no-extra-strict": 0, 89 | "no-fallthrough": 2, 90 | "no-floating-decimal": 2, 91 | "no-func-assign": 2, 92 | "no-implied-eval": 2, 93 | "no-inline-comments": 0, 94 | "no-inner-declarations": [2, "functions"], 95 | "no-invalid-regexp": 2, 96 | "no-irregular-whitespace": 2, 97 | "no-iterator": 2, 98 | "no-label-var": 2, 99 | "no-labels": 2, 100 | "no-lone-blocks": 0, 101 | "no-lonely-if": 0, 102 | "no-loop-func": 0, 103 | "no-mixed-requires": 0, 104 | "no-mixed-spaces-and-tabs": [2, false], 105 | "no-multi-spaces": 2, 106 | "no-multi-str": 2, 107 | "no-multiple-empty-lines": [2, { "max": 1 }], 108 | "no-native-reassign": 2, 109 | "no-negated-in-lhs": 2, 110 | "no-nested-ternary": 0, 111 | "no-new": 2, 112 | "no-new-func": 2, 113 | "no-new-object": 2, 114 | "no-new-require": 2, 115 | "no-new-wrappers": 2, 116 | "no-obj-calls": 2, 117 | "no-octal": 2, 118 | "no-octal-escape": 2, 119 | "no-path-concat": 0, 120 | "no-plusplus": 0, 121 | "no-process-env": 0, 122 | "no-process-exit": 0, 123 | "no-proto": 2, 124 | "no-redeclare": 2, 125 | "no-regex-spaces": 2, 126 | "no-reserved-keys": 0, 127 | "no-restricted-modules": 0, 128 | "no-return-assign": 2, 129 | "no-script-url": 0, 130 | "no-self-compare": 2, 131 | "no-sequences": 2, 132 | "no-shadow": 0, 133 | "no-shadow-restricted-names": 2, 134 | "no-spaced-func": 2, 135 | "no-sparse-arrays": 2, 136 | "no-sync": 0, 137 | "no-ternary": 0, 138 | "no-throw-literal": 2, 139 | "no-trailing-spaces": 2, 140 | "no-undef": 2, 141 | "no-undef-init": 2, 142 | "no-undefined": 0, 143 | "no-underscore-dangle": 0, 144 | "no-unneeded-ternary": 2, 145 | "no-unreachable": 2, 146 | "no-unused-expressions": 0, 147 | "no-unused-vars": [2, { "vars": "all", "args": "none" }], 148 | "no-use-before-define": 2, 149 | "no-var": 0, 150 | "no-void": 0, 151 | "no-warning-comments": 0, 152 | "no-with": 2, 153 | "one-var": 0, 154 | "operator-assignment": 0, 155 | "operator-linebreak": [2, "after"], 156 | "padded-blocks": 0, 157 | "quote-props": 0, 158 | "quotes": [2, "single", "avoid-escape"], 159 | "radix": 2, 160 | "semi": [2, "always"], 161 | "semi-spacing": 0, 162 | "sort-vars": 0, 163 | "space-before-blocks": [2, "always"], 164 | "space-before-function-paren": [2, {"anonymous": "always", "named": "never"}], 165 | "space-in-brackets": 0, 166 | "space-in-parens": [2, "never"], 167 | "space-infix-ops": 2, 168 | "space-unary-ops": [2, { "words": true, "nonwords": false }], 169 | "spaced-comment": [2, "always"], 170 | "strict": 0, 171 | "use-isnan": 2, 172 | "valid-jsdoc": 0, 173 | "valid-typeof": 2, 174 | "vars-on-top": 2, 175 | "wrap-iife": [2, "any"], 176 | "wrap-regex": 0, 177 | "yoda": [2, "never"] 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #

2 | 3 | [![npm version](https://img.shields.io/npm/v/vue-draggable.svg?maxAge=2592000&v=2.0.6)](https://www.npmjs.com/package/vue-draggable) 4 | [![vue2](https://img.shields.io/badge/vue-2.x-brightgreen.svg)](https://vuejs.org/) 5 | [![GitHub open issues](https://img.shields.io/github/issues/Vivify-Ideas/vue-draggable.svg?maxAge=2592000&v=2.0.6)](https://github.com/Vivify-Ideas/vue-draggable/issues?q=is%3Aopen+is%3Aissue) 6 | [![npm download](https://img.shields.io/npm/dt/vue-draggable.svg?maxAge=2592000&v=2.0.6)](https://www.npmjs.com/package/vue-draggable) 7 | [![MIT License](https://img.shields.io/github/license/Vivify-Ideas/vue-draggable.svg)](https://github.com/Vivify-Ideas/vue-draggable/blob/master/LICENSE) 8 | 9 | ## Description 10 | 11 | Vue Drag and Drop library without any dependency. 12 | 13 | Native HTML5 drag and drop implementation made for Vue. 14 | 15 | [Examples 🎪](https://vivify-ideas.github.io/vue-draggable/example/) 16 | 17 | ## Installation 18 | 19 | ``` 20 | npm install vue-draggable 21 | 22 | yarn add vue-draggable 23 | ``` 24 | 25 | ## Setup 26 | 27 | ### Setup plugin 28 | 29 | ```javascript 30 | import Vue from 'vue' 31 | import VueDraggable from 'vue-draggable' 32 | 33 | Vue.use(VueDraggable) 34 | ``` 35 | 36 | ### Setup directive locally 37 | 38 | ```javascript 39 | import { VueDraggableDirective } from 'vue-draggable' 40 | 41 | export default { 42 | directives: { 43 | dragAndDrop: VueDraggableDirective 44 | } 45 | } 46 | 47 | ``` 48 | 49 | ## Usage 50 | 51 | In the template, use the `v-drag-and-drop` directive: 52 | 53 | ### HTML 54 | 55 | ```html 56 |
57 | 62 | 67 |
68 | ``` 69 | 70 | ### Options 71 | 72 | #### Directive `v-drag-and-drop` available options 73 | 74 | ```javascript 75 | { 76 | dropzoneSelector: 'ul', 77 | draggableSelector: 'li', 78 | handlerSelector: null, 79 | reactivityEnabled: true, 80 | multipleDropzonesItemsDraggingEnabled: true, 81 | showDropzoneAreas: true, 82 | onDrop: function(event) {}, 83 | onDragstart: function(event) {}, 84 | onDragenter: function(event) {}, 85 | onDragover: function(event) {}, 86 | onDragend: function(event) {} 87 | } 88 | ``` 89 | 90 | #### Dropzone events (added, removed, reordered) 91 | 92 | ```html 93 |
94 | 103 |
104 | ``` 105 | These three custom events have additional `ids` and `index` params. 106 | Ids is an array of defined `data-id` attributes and `index` represents 107 | drop intersection. For more info check out [example](https://vivify-ideas.github.io/vue-draggable/example/#working-with-reactive-data) 108 | 109 | #### Reactivity handling and renderless component 110 | 111 | There is available `VueDraggableGroup` component so you don't need to write your own model 112 | manipulation logic. However, usage of this component is optional. Use only with Vue v2.6+. 113 | You can pass to component optional `itemsKey` prop if you want to change items collection 114 | property name. By default it's `items`. 115 | 116 | ```html 117 |
118 | 119 | 127 |
    128 |
  • 133 | 134 |
  • 135 |
136 |
137 |
138 | ``` 139 | 140 | #### Event Params for `onDrop`, `onDragstart`, `onDragenter`, `onDragover`, `onDragend` callbacks 141 | 142 | ```javascript 143 | { 144 | nativeEvent: {}, // native js event 145 | items: [], // list of selected draggable elements 146 | owner: null, // old dropzone element 147 | droptarget: null // new dropzone element, 148 | stop: () => {} // Stop D&D (available only for callbacks `onDragstart` and `onDragend`) 149 | } 150 | ``` 151 | 152 | ## TypeScript 153 | 154 | Included TypeScript definitions. 155 | 156 | ## Browser Compatibility 157 | Polyfills for IE9+ support are included in the repo. 158 | 159 | If you need to support IE9 in your applications, import the polyfills: 160 | 161 | ```javascript 162 | import 'vue-draggable/polyfills' 163 | ``` 164 | 165 | ## Contributors 🎖 166 | 167 | [nikolasp](https://github.com/nikolasp) |[tiagocsilva](https://github.com/tiagocsilva) |[piboistudios](https://github.com/piboistudios) |[swaroopjo](https://github.com/swaroopjo) |[figurluk](https://github.com/figurluk) | 168 | :---:|:---:|:---:|:---:|:---:| 169 | [nikolasp](https://github.com/nikolasp)|[tiagocsilva](https://github.com/tiagocsilva)|[piboistudios](https://github.com/piboistudios)|[swaroopjo](https://github.com/swaroopjo)|[figurluk](https://github.com/figurluk)| 170 | 171 | --- 172 | 173 | LICENCE MIT - Created by Nikola Spalevic (nikolaspalevic@gmail.com) 174 | -------------------------------------------------------------------------------- /src/core/listeners/handlers/keydown.handler.js: -------------------------------------------------------------------------------- 1 | import { 2 | clearDropeffects, addDropeffects, 3 | addSelection, removeSelection, 4 | clearSelections, hasModifier, 5 | dispatchReorderEvents 6 | } from './../../helpers'; 7 | 8 | const isItemAroundSelectionArea = (item, lastItem) => { 9 | return item.parentNode === lastItem.parentNode; 10 | }; 11 | 12 | export const keydownHandler = function (e) { 13 | // if the element is a grabbable item 14 | if (e.target.getAttribute('aria-grabbed')) { 15 | // Space is the selection or unselection keystroke 16 | if (e.keyCode === 32) { 17 | // if the multiple selection modifier is pressed 18 | if (hasModifier(e)) { 19 | // if the item's grabbed state is currently true 20 | if (e.target.getAttribute('aria-grabbed') === 'true') { 21 | // if this is the only selected item, clear dropeffect 22 | // from the target containers, which we must do first 23 | // in case subsequent unselection sets owner to null 24 | if (this.selections.items.length === 1) { 25 | clearDropeffects(this.items, this.selections, this.targets); 26 | } 27 | 28 | // unselect this item 29 | removeSelection.bind(this)(e.target); 30 | 31 | // if we have any selections 32 | // apply dropeffect to the target containers, 33 | // in case earlier selections were made by mouse 34 | if (this.selections.items.length) { 35 | addDropeffects(this.items, this.selections, this.targets); 36 | } 37 | 38 | // if that was the only selected item 39 | // then reset the owner container reference 40 | if (!this.selections.items.length) { 41 | this.selections.owner = null; 42 | } 43 | } else { 44 | // else [if its grabbed state is currently false] 45 | // add this additional selection 46 | addSelection.bind(this)(e.target); 47 | 48 | // apply dropeffect to the target containers 49 | addDropeffects(this.items, this.selections, this.targets); 50 | } 51 | } else if (e.target.getAttribute('aria-grabbed') === 'false') { 52 | // else [if the multiple selection modifier is not pressed] 53 | // and the item's grabbed state is currently false 54 | // clear dropeffect from the target containers 55 | clearDropeffects(this.items, this.selections, this.targets); 56 | 57 | // clear all existing selections 58 | clearSelections.bind(this)(); 59 | 60 | // add this new selection 61 | addSelection.bind(this)(e.target); 62 | 63 | // apply dropeffect to the target containers 64 | addDropeffects(this.items, this.selections, this.targets); 65 | } else { 66 | // else [if modifier is not pressed and grabbed is already true] 67 | // apply dropeffect to the target containers 68 | addDropeffects(this.items, this.selections, this.targets); 69 | } 70 | 71 | // then prevent default to avoid any conflict with native actions 72 | e.preventDefault(); 73 | } 74 | 75 | // (CMD or Ctrl) + A - select all the items around the selected one 76 | if (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) { 77 | const lastItem = this.selections.items.slice(-1).pop(); 78 | 79 | if (this.items && this.items.length > 0) { 80 | for (let i = 0; i < this.items.length; i++) { 81 | const item = this.items[i]; 82 | 83 | const shouldSelectItem = isItemAroundSelectionArea(item, lastItem); 84 | 85 | shouldSelectItem && addSelection.bind(this)(item); 86 | } 87 | } 88 | e.preventDefault(); // prevent entire page selection. 89 | } 90 | 91 | // Modifier + M is the end-of-selection keystroke 92 | if (e.keyCode === 77 && hasModifier(e)) { 93 | // if we have any selected items 94 | if (this.selections.items.length) { 95 | // apply dropeffect to the target containers 96 | // in case earlier selections were made by mouse 97 | addDropeffects(this.items, this.selections, this.targets); 98 | 99 | // if the owner container is the last one, focus the first one 100 | if (this.selections.owner === this.targets[this.targets.length - 1]) { 101 | this.targets[0].focus(); 102 | } else { 103 | // else [if it's not the last one], find and focus the next one 104 | for (let i = 0; i < this.targets.length; i++) { 105 | if (this.selections.owner === this.targets[i]) { 106 | this.targets[i + 1].focus(); 107 | break; 108 | } 109 | } 110 | } 111 | } 112 | 113 | // then prevent default to avoid any conflict with native actions 114 | e.preventDefault(); 115 | } 116 | } 117 | 118 | // Escape is the abort keystroke (for any target element) 119 | if (e.keyCode === 27) { 120 | // if we have any selected items 121 | if (this.selections.items.length) { 122 | // clear dropeffect from the target containers 123 | clearDropeffects(this.items, this.selections, this.targets); 124 | 125 | // then set focus back on the last item that was selected, which is 126 | // necessary because we've removed tabindex from the current focus 127 | this.selections.items[this.selections.items.length - 1].focus(); 128 | 129 | // clear all existing selections 130 | clearSelections.bind(this)(); 131 | 132 | // but don't prevent default so that native actions can still occur 133 | } 134 | } 135 | 136 | // if the element is a drop target container 137 | if (e.target.getAttribute('aria-dropeffect')) { 138 | // Enter or Modifier + M is the drop keystroke 139 | if (e.keyCode === 13 || (e.keyCode === 77 && hasModifier(e))) { 140 | // append the selected items to the end of the target container 141 | if (this.defaultOptions.reactivityEnabled) { 142 | this.selections.droptarget = e.target; 143 | dispatchReorderEvents.bind(this)(e); 144 | } else { 145 | for (let i = 0; i < this.selections.items.length; i++) { 146 | e.target.appendChild(this.selections.items[i]); 147 | } 148 | } 149 | 150 | // clear dropeffect from the target containers 151 | clearDropeffects(this.items, this.selections, this.targets); 152 | 153 | // then set focus back on the last item that was selected, which is 154 | // necessary because we've removed tabindex from the current focus 155 | this.selections.items[this.selections.items.length - 1].focus(); 156 | 157 | // reset the selections array 158 | clearSelections.bind(this)(); 159 | 160 | // prevent default to to avoid any conflict with native actions 161 | e.preventDefault(); 162 | } 163 | } 164 | }; 165 | -------------------------------------------------------------------------------- /lib/vue-draggable.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack://VueDraggable/webpack/universalModuleDefinition","webpack://VueDraggable/webpack/bootstrap","webpack://VueDraggable/./src/core/helpers/dom.helper.js","webpack://VueDraggable/./src/core/helpers/state.helper.js","webpack://VueDraggable/./src/core/helpers/events.helper.js","webpack://VueDraggable/./src/core/listeners/handlers/mousedown.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/mouseup.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragover.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragstart.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragenter.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragleave.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragend.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/keydown.handler.js","webpack://VueDraggable/./src/core/listeners/index.js","webpack://VueDraggable/./src/core/options.js","webpack://VueDraggable/./src/core/state.js","webpack://VueDraggable/./src/core/index.js","webpack://VueDraggable/./src/components/vue-draggable-group.component.js","webpack://VueDraggable/./src/index.js"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","getDroptargets","el","dropzoneSelector","querySelectorAll","getDraggables","draggableSelector","updateInitialAttributes","targets","defaultOptions","items","length","setAttribute","getAttribute","setInitialAtributes","removeOldDropzoneAreaElements","oldItemDropzoneElements","document","remove","addDropeffects","selections","len","owner","parentNode","removeAttribute","clearDropeffects","hasModifier","e","ctrlKey","metaKey","shiftKey","addSelection","item","multipleDropzonesItemsDraggingEnabled","indexOf","removeSelection","splice","clearSelections","stopDragAndDrop","Error","dispatchCustomEvent","data","element","customEvent","CustomEvent","detail","createCustomEvent","dispatchEvent","dispatchReorderEvents","oldItems","droptarget","index","nextItemElement","Array","eventData","ids","map","dataset","id","nativeEvent","mousedownHandler","handlerSelector","target","closest","elem","isItemInSelectionArea","lastItem","offsetTop","mouseupHandler","slice","pop","state","previousTarget","dragoverCalls","displayDropzones","className","itemDropzoneElement","createElement","insertBefore","appendChild","dragoverHandler","preventDefault","showDropzoneAreas","onDragover","stop","error","dragstartHandler","onDragstart","dataTransfer","setData","dragenterHandler","related","onDragenter","dragleaveHandler","containerElement","nodeType","getContainer","replace","dragendHandler","onDragend","reactivityEnabled","reorderDomElements","onDrop","isItemAroundSelectionArea","keydownHandler","keyCode","focus","attachListeners","addEventListener","getOptions","componentInstance","options","getState","VueDraggable","assign","registerListeners","initiate","CUSTOM_EVENTS","VueDraggableGroup","props","groups","required","type","itemsKey","String","default","render","$scopedSlots","methods","added","event","newItems","group","reduce","prev","curr","filter","Number","$emit","removed","newArray","reordered","reorderedItems","notReorderedItems","addListeners","forEach","$el","removeListeners","removeEventListener","mounted","beforeDestroy","instances","VueDraggableDirective","vnode","instance","context","push","componentUpdated","setTimeout","update","unbind","install","Vue","directive","component"],"mappings":"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","file":"vue-draggable.min.js","sourceRoot":""} -------------------------------------------------------------------------------- /lib/vue-draggable.min.js: -------------------------------------------------------------------------------- 1 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("VueDraggable",[],e):"object"==typeof exports?exports.VueDraggable=e():t.VueDraggable=e()}(this,(function(){return function(t){var e={};function r(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,i){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(i,n,function(e){return t[e]}.bind(null,n));return i},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";r.r(e);var i=function(t,e){return t.querySelectorAll(e)},n=function(t,e){return t.querySelectorAll(e)},s=function(t){this.targets=i(t,this.defaultOptions.dropzoneSelector),this.items=n(t,this.defaultOptions.draggableSelector);for(var e=0;e=0?this.selections.items:[].concat(f(this.selections.items),[t]))},h=function(t){t.setAttribute("aria-grabbed","false");for(var e=0;er.offsetTop&&t.offsetTop<=e.offsetTop&&t.offsetTop>=r.offsetTop||t.offsetTop>=e.offsetTop&&t.offsetTop<=r.offsetTop)},D=function(t){var e=t.target.closest(this.defaultOptions.draggableSelector);if(e&&e.getAttribute("draggable"))if(u(t))if(this.selections.items.length&&t.shiftKey){var r=this.selections.items.slice(-1).pop();if(this.items&&this.items.length>0)for(var i=0;i0)for(var r=0;r=0}));(e=this.value).splice.apply(e,[t.detail.index,0].concat(J(i))),this.$emit("change",this.groups)},removed:function(t){var e=this.value.filter((function(e){return t.detail.ids.map(Number).indexOf(e.id)<0}));this.$emit("input",e)},reordered:function(t,e){var r=this.value.filter((function(e){return t.detail.ids.map(Number).indexOf(e.id)>=0})),i=this.value.filter((function(e){return t.detail.ids.map(Number).indexOf(e.id)<0}));i.splice.apply(i,[t.detail.index,0].concat(J(r))),this.$emit("input",i),this.$emit("change",this.groups)},addListeners:function(){var t=this;Q.forEach((function(e){return t.$el.addEventListener(e,t[e])}))},removeListeners:function(){var t=this;Q.forEach((function(e){return t.$el.removeEventListener(e,t[e])}))}},mounted:function(){this.addListeners()},beforeDestroy:function(){this.removeListeners()}};r.d(e,"VueDraggableDirective",(function(){return Y}));var X=[],Y={bind:function(t,e,r){var i=new H(t,r.context,e.value);X.push(i)},componentUpdated:function(t){setTimeout((function(){X.forEach((function(e){e.el===t&&e.update(t)}))}))},unbind:function(t){X=X.filter((function(e){return e.el!==t}))}};H.install=function(t){t.directive("drag-and-drop",Y),t.component("vue-draggable-group",W)};e.default=H}])})); 2 | //# sourceMappingURL=vue-draggable.min.js.map -------------------------------------------------------------------------------- /lib/vue-draggable.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack://VueDraggable/webpack/universalModuleDefinition","webpack://VueDraggable/webpack/bootstrap","webpack://VueDraggable/./src/components/vue-draggable-group.component.js","webpack://VueDraggable/./src/core/helpers/dom.helper.js","webpack://VueDraggable/./src/core/helpers/events.helper.js","webpack://VueDraggable/./src/core/helpers/index.js","webpack://VueDraggable/./src/core/helpers/state.helper.js","webpack://VueDraggable/./src/core/index.js","webpack://VueDraggable/./src/core/listeners/handlers/dragend.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragenter.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragleave.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragover.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/dragstart.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/index.js","webpack://VueDraggable/./src/core/listeners/handlers/keydown.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/mousedown.handler.js","webpack://VueDraggable/./src/core/listeners/handlers/mouseup.handler.js","webpack://VueDraggable/./src/core/listeners/index.js","webpack://VueDraggable/./src/core/options.js","webpack://VueDraggable/./src/core/state.js","webpack://VueDraggable/./src/index.js"],"names":["CUSTOM_EVENTS","VueDraggableGroup","name","props","groups","required","type","Array","value","itemsKey","String","render","$scopedSlots","methods","added","event","newItems","map","group","reduce","prev","curr","filter","item","detail","ids","Number","indexOf","id","splice","index","$emit","removed","newArray","reordered","reorderedItems","notReorderedItems","addListeners","forEach","$el","addEventListener","removeListeners","removeEventListener","mounted","beforeDestroy","getDroptargets","el","dropzoneSelector","querySelectorAll","getDraggables","draggableSelector","updateInitialAttributes","targets","defaultOptions","items","i","length","setAttribute","getAttribute","setInitialAtributes","removeOldDropzoneAreaElements","oldItemDropzoneElements","document","remove","getContainer","element","containerElement","nodeType","parentNode","addDropeffects","selections","len","owner","removeAttribute","clearDropeffects","hasModifier","e","ctrlKey","metaKey","shiftKey","createCustomEvent","data","CustomEvent","dispatchCustomEvent","customEvent","dispatchEvent","dispatchReorderEvents","oldItems","droptarget","nextItemElement","prototype","call","eventData","dataset","nativeEvent","addSelection","multipleDropzonesItemsDraggingEnabled","removeSelection","clearSelections","stopDragAndDrop","Error","VueDraggable","componentInstance","options","Object","assign","getState","getOptions","registerListeners","initiate","attachListeners","bind","reorderDomElements","insertBefore","appendChild","dragendHandler","onDragend","stop","error","reactivityEnabled","onDrop","preventDefault","className","replace","dragenterHandler","related","target","onDragenter","dragleaveHandler","state","previousTarget","dragoverCalls","displayDropzones","closest","itemDropzoneElement","createElement","dragoverHandler","showDropzoneAreas","onDragover","dragstartHandler","elem","onDragstart","dataTransfer","setData","isItemAroundSelectionArea","lastItem","keydownHandler","keyCode","slice","pop","shouldSelectItem","focus","mousedownHandler","handlerSelector","handler","isItemInSelectionArea","offsetTop","mouseupHandler","instances","VueDraggableDirective","vnode","instance","context","push","componentUpdated","setTimeout","update","unbind","install","Vue","directive","component"],"mappings":"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","file":"vue-draggable.js","sourceRoot":""} -------------------------------------------------------------------------------- /lib/vue-draggable.js: -------------------------------------------------------------------------------- 1 | (function webpackUniversalModuleDefinition(root, factory) { 2 | if(typeof exports === 'object' && typeof module === 'object') 3 | module.exports = factory(); 4 | else if(typeof define === 'function' && define.amd) 5 | define("VueDraggable", [], factory); 6 | else if(typeof exports === 'object') 7 | exports["VueDraggable"] = factory(); 8 | else 9 | root["VueDraggable"] = factory(); 10 | })(this, function() { 11 | return /******/ (function(modules) { // webpackBootstrap 12 | /******/ // The module cache 13 | /******/ var installedModules = {}; 14 | /******/ 15 | /******/ // The require function 16 | /******/ function __webpack_require__(moduleId) { 17 | /******/ 18 | /******/ // Check if module is in cache 19 | /******/ if(installedModules[moduleId]) { 20 | /******/ return installedModules[moduleId].exports; 21 | /******/ } 22 | /******/ // Create a new module (and put it into the cache) 23 | /******/ var module = installedModules[moduleId] = { 24 | /******/ i: moduleId, 25 | /******/ l: false, 26 | /******/ exports: {} 27 | /******/ }; 28 | /******/ 29 | /******/ // Execute the module function 30 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 31 | /******/ 32 | /******/ // Flag the module as loaded 33 | /******/ module.l = true; 34 | /******/ 35 | /******/ // Return the exports of the module 36 | /******/ return module.exports; 37 | /******/ } 38 | /******/ 39 | /******/ 40 | /******/ // expose the modules object (__webpack_modules__) 41 | /******/ __webpack_require__.m = modules; 42 | /******/ 43 | /******/ // expose the module cache 44 | /******/ __webpack_require__.c = installedModules; 45 | /******/ 46 | /******/ // define getter function for harmony exports 47 | /******/ __webpack_require__.d = function(exports, name, getter) { 48 | /******/ if(!__webpack_require__.o(exports, name)) { 49 | /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 50 | /******/ } 51 | /******/ }; 52 | /******/ 53 | /******/ // define __esModule on exports 54 | /******/ __webpack_require__.r = function(exports) { 55 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 56 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 57 | /******/ } 58 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); 59 | /******/ }; 60 | /******/ 61 | /******/ // create a fake namespace object 62 | /******/ // mode & 1: value is a module id, require it 63 | /******/ // mode & 2: merge all properties of value into the ns 64 | /******/ // mode & 4: return value when already ns object 65 | /******/ // mode & 8|1: behave like require 66 | /******/ __webpack_require__.t = function(value, mode) { 67 | /******/ if(mode & 1) value = __webpack_require__(value); 68 | /******/ if(mode & 8) return value; 69 | /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 70 | /******/ var ns = Object.create(null); 71 | /******/ __webpack_require__.r(ns); 72 | /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 73 | /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 74 | /******/ return ns; 75 | /******/ }; 76 | /******/ 77 | /******/ // getDefaultExport function for compatibility with non-harmony modules 78 | /******/ __webpack_require__.n = function(module) { 79 | /******/ var getter = module && module.__esModule ? 80 | /******/ function getDefault() { return module['default']; } : 81 | /******/ function getModuleExports() { return module; }; 82 | /******/ __webpack_require__.d(getter, 'a', getter); 83 | /******/ return getter; 84 | /******/ }; 85 | /******/ 86 | /******/ // Object.prototype.hasOwnProperty.call 87 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 88 | /******/ 89 | /******/ // __webpack_public_path__ 90 | /******/ __webpack_require__.p = ""; 91 | /******/ 92 | /******/ 93 | /******/ // Load entry module and return exports 94 | /******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); 95 | /******/ }) 96 | /************************************************************************/ 97 | /******/ ({ 98 | 99 | /***/ "./src/components/vue-draggable-group.component.js": 100 | /*!*********************************************************!*\ 101 | !*** ./src/components/vue-draggable-group.component.js ***! 102 | \*********************************************************/ 103 | /*! exports provided: VueDraggableGroup */ 104 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 105 | 106 | "use strict"; 107 | __webpack_require__.r(__webpack_exports__); 108 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VueDraggableGroup", function() { return VueDraggableGroup; }); 109 | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } 110 | 111 | function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } 112 | 113 | function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } 114 | 115 | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } 116 | 117 | var CUSTOM_EVENTS = ['added', 'removed', 'reordered']; 118 | var VueDraggableGroup = { 119 | name: 'VueDraggableGroup', 120 | props: { 121 | groups: { 122 | required: true, 123 | type: Array 124 | }, 125 | value: { 126 | required: true, 127 | type: Array 128 | }, 129 | itemsKey: { 130 | type: String, 131 | "default": 'items' 132 | } 133 | }, 134 | render: function render() { 135 | return this.$scopedSlots["default"]({}); 136 | }, 137 | methods: { 138 | added: function added(event) { 139 | var _this = this, 140 | _this$value; 141 | 142 | var newItems = this.groups.map(function (group) { 143 | return group[_this.itemsKey]; 144 | }).reduce(function (prev, curr) { 145 | return [].concat(_toConsumableArray(prev), _toConsumableArray(curr)); 146 | }, []).filter(function (item) { 147 | return event.detail.ids.map(Number).indexOf(item.id) >= 0; 148 | }); 149 | 150 | (_this$value = this.value).splice.apply(_this$value, [event.detail.index, 0].concat(_toConsumableArray(newItems))); 151 | 152 | this.$emit('change', this.groups); 153 | }, 154 | removed: function removed(event) { 155 | var newArray = this.value.filter(function (item) { 156 | return event.detail.ids.map(Number).indexOf(item.id) < 0; 157 | }); 158 | this.$emit('input', newArray); 159 | }, 160 | reordered: function reordered(event, group) { 161 | var reorderedItems = this.value.filter(function (item) { 162 | return event.detail.ids.map(Number).indexOf(item.id) >= 0; 163 | }); 164 | var notReorderedItems = this.value.filter(function (item) { 165 | return event.detail.ids.map(Number).indexOf(item.id) < 0; 166 | }); 167 | notReorderedItems.splice.apply(notReorderedItems, [event.detail.index, 0].concat(_toConsumableArray(reorderedItems))); 168 | this.$emit('input', notReorderedItems); 169 | this.$emit('change', this.groups); 170 | }, 171 | addListeners: function addListeners() { 172 | var _this2 = this; 173 | 174 | CUSTOM_EVENTS.forEach(function (event) { 175 | return _this2.$el.addEventListener(event, _this2[event]); 176 | }); 177 | }, 178 | removeListeners: function removeListeners() { 179 | var _this3 = this; 180 | 181 | CUSTOM_EVENTS.forEach(function (event) { 182 | return _this3.$el.removeEventListener(event, _this3[event]); 183 | }); 184 | } 185 | }, 186 | mounted: function mounted() { 187 | this.addListeners(); 188 | }, 189 | beforeDestroy: function beforeDestroy() { 190 | this.removeListeners(); 191 | } 192 | }; 193 | 194 | /***/ }), 195 | 196 | /***/ "./src/core/helpers/dom.helper.js": 197 | /*!****************************************!*\ 198 | !*** ./src/core/helpers/dom.helper.js ***! 199 | \****************************************/ 200 | /*! exports provided: getDroptargets, getDraggables, updateInitialAttributes, setInitialAtributes, removeOldDropzoneAreaElements, getContainer, addDropeffects, clearDropeffects, hasModifier */ 201 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 202 | 203 | "use strict"; 204 | __webpack_require__.r(__webpack_exports__); 205 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDroptargets", function() { return getDroptargets; }); 206 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDraggables", function() { return getDraggables; }); 207 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateInitialAttributes", function() { return updateInitialAttributes; }); 208 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setInitialAtributes", function() { return setInitialAtributes; }); 209 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeOldDropzoneAreaElements", function() { return removeOldDropzoneAreaElements; }); 210 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getContainer", function() { return getContainer; }); 211 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addDropeffects", function() { return addDropeffects; }); 212 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearDropeffects", function() { return clearDropeffects; }); 213 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasModifier", function() { return hasModifier; }); 214 | var getDroptargets = function getDroptargets(el, dropzoneSelector) { 215 | return el.querySelectorAll(dropzoneSelector); 216 | }; 217 | var getDraggables = function getDraggables(el, draggableSelector) { 218 | return el.querySelectorAll(draggableSelector); 219 | }; 220 | var updateInitialAttributes = function updateInitialAttributes(el) { 221 | this.targets = getDroptargets(el, this.defaultOptions.dropzoneSelector); 222 | this.items = getDraggables(el, this.defaultOptions.draggableSelector); 223 | 224 | for (var i = 0; i < this.targets.length; i++) { 225 | this.targets[i].setAttribute('aria-dropeffect', 'none'); 226 | } 227 | 228 | for (var _i = 0; _i < this.items.length; _i++) { 229 | this.items[_i].setAttribute('draggable', 'true'); 230 | 231 | if (this.items[_i].getAttribute('aria-grabbed') !== 'true') { 232 | this.items[_i].setAttribute('aria-grabbed', 'false'); 233 | } 234 | 235 | this.items[_i].setAttribute('tabindex', '0'); 236 | } 237 | }; 238 | var setInitialAtributes = function setInitialAtributes(el) { 239 | this.targets = getDroptargets(el, this.defaultOptions.dropzoneSelector); 240 | this.items = getDraggables(el, this.defaultOptions.draggableSelector); 241 | 242 | for (var i = 0; i < this.targets.length; i++) { 243 | this.targets[i].setAttribute('aria-dropeffect', 'none'); 244 | } 245 | 246 | for (var _i2 = 0; _i2 < this.items.length; _i2++) { 247 | this.items[_i2].setAttribute('draggable', 'true'); 248 | 249 | this.items[_i2].setAttribute('aria-grabbed', 'false'); 250 | 251 | this.items[_i2].setAttribute('tabindex', '0'); 252 | } 253 | }; 254 | var removeOldDropzoneAreaElements = function removeOldDropzoneAreaElements() { 255 | var oldItemDropzoneElements = document.querySelectorAll('.item-dropzone-area'); 256 | 257 | for (var i = 0; i < oldItemDropzoneElements.length; i++) { 258 | oldItemDropzoneElements[i].remove(); 259 | } 260 | }; 261 | var getContainer = function getContainer(element) { 262 | var containerElement = element; 263 | 264 | do { 265 | if (containerElement && containerElement.nodeType === 1 && containerElement.getAttribute('aria-dropeffect')) { 266 | return containerElement; 267 | } 268 | } while (containerElement = containerElement ? containerElement.parentNode : null); 269 | 270 | return null; 271 | }; 272 | var addDropeffects = function addDropeffects(items, selections, targets) { 273 | // apply aria-dropeffect and tabindex to all targets apart from the owner 274 | for (var len = targets.length, i = 0; i < len; i++) { 275 | if (targets[i] !== selections.owner && targets[i].getAttribute('aria-dropeffect') === 'none') { 276 | targets[i].setAttribute('aria-dropeffect', 'move'); 277 | targets[i].setAttribute('tabindex', '0'); 278 | } 279 | } // remove aria-grabbed and tabindex from all items inside those containers 280 | 281 | 282 | for (var _len = items.length, _i3 = 0; _i3 < _len; _i3++) { 283 | if (items[_i3].parentNode !== selections.owner && items[_i3].getAttribute('aria-grabbed')) { 284 | items[_i3].removeAttribute('aria-grabbed'); 285 | 286 | items[_i3].removeAttribute('tabindex'); 287 | } 288 | } 289 | }; 290 | var clearDropeffects = function clearDropeffects(items, selections, targets) { 291 | // if we dont't have any selected items just skip 292 | if (!selections.items.length) { 293 | return; 294 | } // reset aria-dropeffect and remove tabindex from all targets 295 | 296 | 297 | for (var i = 0; i < targets.length; i++) { 298 | if (targets[i].getAttribute('aria-dropeffect') !== 'none') { 299 | targets[i].setAttribute('aria-dropeffect', 'none'); 300 | targets[i].removeAttribute('tabindex'); 301 | } 302 | } // restore aria-grabbed and tabindex to all selectable items 303 | // without changing the grabbed value of any existing selected items 304 | 305 | 306 | for (var _i4 = 0; _i4 < items.length; _i4++) { 307 | if (!items[_i4].getAttribute('aria-grabbed')) { 308 | items[_i4].setAttribute('aria-grabbed', 'false'); 309 | 310 | items[_i4].setAttribute('tabindex', '0'); 311 | } else if (items[_i4].getAttribute('aria-grabbed') === 'true') { 312 | items[_i4].setAttribute('tabindex', '0'); 313 | } 314 | } 315 | }; 316 | var hasModifier = function hasModifier(e) { 317 | return e.ctrlKey || e.metaKey || e.shiftKey; 318 | }; 319 | 320 | /***/ }), 321 | 322 | /***/ "./src/core/helpers/events.helper.js": 323 | /*!*******************************************!*\ 324 | !*** ./src/core/helpers/events.helper.js ***! 325 | \*******************************************/ 326 | /*! exports provided: dispatchCustomEvent, dispatchReorderEvents */ 327 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 328 | 329 | "use strict"; 330 | __webpack_require__.r(__webpack_exports__); 331 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatchCustomEvent", function() { return dispatchCustomEvent; }); 332 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatchReorderEvents", function() { return dispatchReorderEvents; }); 333 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 334 | 335 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 336 | 337 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 338 | 339 | var createCustomEvent = function createCustomEvent(name, data) { 340 | return new CustomEvent(name, { 341 | detail: data 342 | }); 343 | }; 344 | 345 | var dispatchCustomEvent = function dispatchCustomEvent(name, data, element) { 346 | var customEvent = createCustomEvent(name, data); 347 | element.dispatchEvent(customEvent); 348 | }; 349 | var dispatchReorderEvents = function dispatchReorderEvents(e) { 350 | var oldItems = this.selections.droptarget.querySelectorAll(this.defaultOptions.draggableSelector); 351 | var index = this.nextItemElement ? Array.prototype.indexOf.call(oldItems, this.nextItemElement) : oldItems.length; 352 | 353 | var eventData = _objectSpread({ 354 | ids: this.selections.items.map(function (item) { 355 | return item.dataset.id; 356 | }), 357 | index: index, 358 | nativeEvent: e 359 | }, this.selections); 360 | 361 | if (this.selections.droptarget === this.selections.owner) { 362 | dispatchCustomEvent('reordered', eventData, this.selections.droptarget); 363 | return; 364 | } 365 | 366 | dispatchCustomEvent('added', eventData, this.selections.droptarget); 367 | dispatchCustomEvent('removed', eventData, this.selections.owner); 368 | }; 369 | 370 | /***/ }), 371 | 372 | /***/ "./src/core/helpers/index.js": 373 | /*!***********************************!*\ 374 | !*** ./src/core/helpers/index.js ***! 375 | \***********************************/ 376 | /*! exports provided: getDroptargets, getDraggables, updateInitialAttributes, setInitialAtributes, removeOldDropzoneAreaElements, getContainer, addDropeffects, clearDropeffects, hasModifier, addSelection, removeSelection, clearSelections, stopDragAndDrop, dispatchCustomEvent, dispatchReorderEvents */ 377 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 378 | 379 | "use strict"; 380 | __webpack_require__.r(__webpack_exports__); 381 | /* harmony import */ var _dom_helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom.helper */ "./src/core/helpers/dom.helper.js"); 382 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDroptargets", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["getDroptargets"]; }); 383 | 384 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDraggables", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["getDraggables"]; }); 385 | 386 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "updateInitialAttributes", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["updateInitialAttributes"]; }); 387 | 388 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setInitialAtributes", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["setInitialAtributes"]; }); 389 | 390 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeOldDropzoneAreaElements", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["removeOldDropzoneAreaElements"]; }); 391 | 392 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getContainer", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["getContainer"]; }); 393 | 394 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addDropeffects", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["addDropeffects"]; }); 395 | 396 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clearDropeffects", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"]; }); 397 | 398 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hasModifier", function() { return _dom_helper__WEBPACK_IMPORTED_MODULE_0__["hasModifier"]; }); 399 | 400 | /* harmony import */ var _state_helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./state.helper */ "./src/core/helpers/state.helper.js"); 401 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addSelection", function() { return _state_helper__WEBPACK_IMPORTED_MODULE_1__["addSelection"]; }); 402 | 403 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeSelection", function() { return _state_helper__WEBPACK_IMPORTED_MODULE_1__["removeSelection"]; }); 404 | 405 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clearSelections", function() { return _state_helper__WEBPACK_IMPORTED_MODULE_1__["clearSelections"]; }); 406 | 407 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stopDragAndDrop", function() { return _state_helper__WEBPACK_IMPORTED_MODULE_1__["stopDragAndDrop"]; }); 408 | 409 | /* harmony import */ var _events_helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./events.helper */ "./src/core/helpers/events.helper.js"); 410 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dispatchCustomEvent", function() { return _events_helper__WEBPACK_IMPORTED_MODULE_2__["dispatchCustomEvent"]; }); 411 | 412 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dispatchReorderEvents", function() { return _events_helper__WEBPACK_IMPORTED_MODULE_2__["dispatchReorderEvents"]; }); 413 | 414 | 415 | 416 | 417 | 418 | /***/ }), 419 | 420 | /***/ "./src/core/helpers/state.helper.js": 421 | /*!******************************************!*\ 422 | !*** ./src/core/helpers/state.helper.js ***! 423 | \******************************************/ 424 | /*! exports provided: addSelection, removeSelection, clearSelections, stopDragAndDrop */ 425 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 426 | 427 | "use strict"; 428 | __webpack_require__.r(__webpack_exports__); 429 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSelection", function() { return addSelection; }); 430 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeSelection", function() { return removeSelection; }); 431 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearSelections", function() { return clearSelections; }); 432 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stopDragAndDrop", function() { return stopDragAndDrop; }); 433 | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } 434 | 435 | function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } 436 | 437 | function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } 438 | 439 | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } 440 | 441 | var addSelection = function addSelection(item) { 442 | // if the owner reference is still null, set it to this item's parent 443 | // so that further selection is only allowed within the same container 444 | if (!this.selections.owner) { 445 | this.selections.owner = item.parentNode; 446 | } // or if that's already happened then compare it with this item's parent 447 | // and if they're not the same container, return to prevent selection 448 | 449 | 450 | if (!this.defaultOptions.multipleDropzonesItemsDraggingEnabled && this.selections.owner !== item.parentNode) { 451 | return; 452 | } // set this item's grabbed state 453 | 454 | 455 | item.setAttribute('aria-grabbed', 'true'); // add it to the items array 456 | 457 | this.selections.items = this.selections.items.indexOf(item) >= 0 ? this.selections.items : [].concat(_toConsumableArray(this.selections.items), [item]); 458 | }; 459 | var removeSelection = function removeSelection(item) { 460 | // reset this item's grabbed state 461 | item.setAttribute('aria-grabbed', 'false'); // then find and remove this item from the existing items array 462 | 463 | for (var i = 0; i < this.selections.items.length; i++) { 464 | if (this.selections.items[i] === item) { 465 | this.selections.items.splice(i, 1); 466 | break; 467 | } 468 | } 469 | }; 470 | var clearSelections = function clearSelections() { 471 | // if we have any selected items 472 | if (this.selections.items.length) { 473 | // reset the owner reference 474 | this.selections.owner = null; // reset the grabbed state on every selected item 475 | 476 | for (var i = 0; i < this.selections.items.length; i++) { 477 | this.selections.items[i].setAttribute('aria-grabbed', 'false'); 478 | } // then reset the items array 479 | 480 | 481 | this.selections.items = []; 482 | } 483 | }; 484 | var stopDragAndDrop = function stopDragAndDrop() { 485 | // throw exception and catch this to stop further d&d 486 | throw new Error('Requested D&D stop...'); 487 | }; 488 | 489 | /***/ }), 490 | 491 | /***/ "./src/core/index.js": 492 | /*!***************************!*\ 493 | !*** ./src/core/index.js ***! 494 | \***************************/ 495 | /*! exports provided: VueDraggable */ 496 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 497 | 498 | "use strict"; 499 | __webpack_require__.r(__webpack_exports__); 500 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VueDraggable", function() { return VueDraggable; }); 501 | /* harmony import */ var _listeners__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./listeners */ "./src/core/listeners/index.js"); 502 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/core/helpers/index.js"); 503 | /* harmony import */ var _options__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./options */ "./src/core/options.js"); 504 | /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./state */ "./src/core/state.js"); 505 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 506 | 507 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 508 | 509 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 510 | 511 | 512 | 513 | 514 | 515 | var VueDraggable = 516 | /*#__PURE__*/ 517 | function () { 518 | function VueDraggable(el, componentInstance, options) { 519 | _classCallCheck(this, VueDraggable); 520 | 521 | Object.assign(this, Object(_state__WEBPACK_IMPORTED_MODULE_3__["getState"])(), { 522 | defaultOptions: Object(_options__WEBPACK_IMPORTED_MODULE_2__["getOptions"])(componentInstance, options) 523 | }, { 524 | el: el 525 | }); 526 | this.registerListeners(el); 527 | this.initiate(el); 528 | } 529 | 530 | _createClass(VueDraggable, [{ 531 | key: "registerListeners", 532 | value: function registerListeners(el) { 533 | _listeners__WEBPACK_IMPORTED_MODULE_0__["attachListeners"].bind(this)(el); 534 | } 535 | }, { 536 | key: "initiate", 537 | value: function initiate(el) { 538 | _helpers__WEBPACK_IMPORTED_MODULE_1__["setInitialAtributes"].bind(this)(el); 539 | } 540 | }, { 541 | key: "update", 542 | value: function update(el) { 543 | _helpers__WEBPACK_IMPORTED_MODULE_1__["updateInitialAttributes"].bind(this)(el); 544 | } 545 | }]); 546 | 547 | return VueDraggable; 548 | }(); 549 | ; 550 | 551 | /***/ }), 552 | 553 | /***/ "./src/core/listeners/handlers/dragend.handler.js": 554 | /*!********************************************************!*\ 555 | !*** ./src/core/listeners/handlers/dragend.handler.js ***! 556 | \********************************************************/ 557 | /*! exports provided: dragendHandler */ 558 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 559 | 560 | "use strict"; 561 | __webpack_require__.r(__webpack_exports__); 562 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dragendHandler", function() { return dragendHandler; }); 563 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../helpers */ "./src/core/helpers/index.js"); 564 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 565 | 566 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 567 | 568 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 569 | 570 | 571 | 572 | var reorderDomElements = function reorderDomElements(droptarget, items, nextItemElement) { 573 | for (var i = 0; i < items.length; i++) { 574 | if (nextItemElement) { 575 | droptarget.insertBefore(items[i], nextItemElement); 576 | continue; 577 | } 578 | 579 | droptarget.appendChild(items[i]); 580 | } 581 | }; 582 | 583 | var dragendHandler = function dragendHandler(e) { 584 | if (typeof this.defaultOptions.onDragend === 'function') { 585 | try { 586 | this.defaultOptions.onDragend(_objectSpread({ 587 | nativeEvent: e, 588 | stop: _helpers__WEBPACK_IMPORTED_MODULE_0__["stopDragAndDrop"] 589 | }, this.selections)); 590 | } catch (error) { 591 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["removeOldDropzoneAreaElements"])(); 592 | return; 593 | } 594 | } // if we have a valid drop target reference 595 | // (which implies that we have some selected items) 596 | 597 | 598 | if (this.selections.droptarget) { 599 | if (this.defaultOptions.reactivityEnabled) { 600 | _helpers__WEBPACK_IMPORTED_MODULE_0__["dispatchReorderEvents"].bind(this)(e); 601 | } else { 602 | // make dom manipulation only if reactivity is disabled 603 | reorderDomElements(this.selections.droptarget, this.selections.items, this.nextItemElement); 604 | } 605 | 606 | if (typeof this.defaultOptions.onDrop === 'function') { 607 | this.defaultOptions.onDrop(_objectSpread({ 608 | nativeEvent: e, 609 | stop: function stop() { 610 | throw new Error("Stop method is available only for callbacks\n 'onDragstart' and 'onDragend'. For more info look at\n https://github.com/Vivify-Ideas/vue-draggable/blob/master/README.md\n "); 611 | } 612 | }, this.selections)); 613 | } // prevent default to allow the action 614 | 615 | 616 | e.preventDefault(); 617 | } // if we have any selected items 618 | 619 | 620 | if (this.selections.items.length) { 621 | // clear dropeffect from the target containers 622 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); // if we have a valid drop target reference 623 | 624 | if (this.selections.droptarget) { 625 | // reset the selections array 626 | _helpers__WEBPACK_IMPORTED_MODULE_0__["clearSelections"].bind(this)(); // reset the target's dragover class 627 | 628 | this.selections.droptarget.className = this.selections.droptarget.className.replace(/ dragover/g, ''); // reset the target reference 629 | 630 | this.selections.droptarget = null; 631 | } 632 | } // dropzone area elements 633 | 634 | 635 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["removeOldDropzoneAreaElements"])(); 636 | }; 637 | 638 | /***/ }), 639 | 640 | /***/ "./src/core/listeners/handlers/dragenter.handler.js": 641 | /*!**********************************************************!*\ 642 | !*** ./src/core/listeners/handlers/dragenter.handler.js ***! 643 | \**********************************************************/ 644 | /*! exports provided: dragenterHandler */ 645 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 646 | 647 | "use strict"; 648 | __webpack_require__.r(__webpack_exports__); 649 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dragenterHandler", function() { return dragenterHandler; }); 650 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 651 | 652 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 653 | 654 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 655 | 656 | var dragenterHandler = function dragenterHandler(e) { 657 | this.related = e.target; 658 | 659 | if (typeof this.defaultOptions.onDragenter === 'function') { 660 | try { 661 | this.defaultOptions.onDragenter(_objectSpread({ 662 | nativeEvent: e, 663 | stop: function stop() { 664 | throw new Error("Stop method is available only for callbacks\n 'onDragstart' and 'onDragend'. For more info look at\n https://github.com/Vivify-Ideas/vue-draggable/blob/master/README.md\n "); 665 | } 666 | }, this.selections)); 667 | } catch (error) { 668 | e.preventDefault(); 669 | return; 670 | } 671 | } 672 | }; 673 | 674 | /***/ }), 675 | 676 | /***/ "./src/core/listeners/handlers/dragleave.handler.js": 677 | /*!**********************************************************!*\ 678 | !*** ./src/core/listeners/handlers/dragleave.handler.js ***! 679 | \**********************************************************/ 680 | /*! exports provided: dragleaveHandler */ 681 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 682 | 683 | "use strict"; 684 | __webpack_require__.r(__webpack_exports__); 685 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dragleaveHandler", function() { return dragleaveHandler; }); 686 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../helpers */ "./src/core/helpers/index.js"); 687 | 688 | var dragleaveHandler = function dragleaveHandler() { 689 | // get a drop target reference from the relatedTarget 690 | var droptarget = Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["getContainer"])(this.related); // if the drop target is different from the last stored reference 691 | // (or we have one of those references but not the other one) 692 | 693 | if (droptarget !== this.selections.droptarget) { 694 | // if we have a saved reference, clear its existing dragover class 695 | if (this.selections.droptarget) { 696 | this.selections.droptarget.className = this.selections.droptarget.className.replace(/ dragover/g, ''); 697 | } // apply the dragover class to the new drop target reference 698 | 699 | 700 | if (droptarget) { 701 | droptarget.className += ' dragover'; 702 | } // then save that reference for next time 703 | 704 | 705 | this.selections.droptarget = droptarget; 706 | } 707 | }; 708 | 709 | /***/ }), 710 | 711 | /***/ "./src/core/listeners/handlers/dragover.handler.js": 712 | /*!*********************************************************!*\ 713 | !*** ./src/core/listeners/handlers/dragover.handler.js ***! 714 | \*********************************************************/ 715 | /*! exports provided: dragoverHandler */ 716 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 717 | 718 | "use strict"; 719 | __webpack_require__.r(__webpack_exports__); 720 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dragoverHandler", function() { return dragoverHandler; }); 721 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../helpers */ "./src/core/helpers/index.js"); 722 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 723 | 724 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 725 | 726 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 727 | 728 | 729 | var state = { 730 | previousTarget: null, 731 | dragoverCalls: 0 732 | }; 733 | 734 | var displayDropzones = function displayDropzones(e) { 735 | if (state.dragoverCalls % 100 !== 0 && (e.target === state.previousTarget || !e.target || e.target.className === 'item-dropzone-area')) return; 736 | state.dragoverCalls++; 737 | state.previousTarget = e.target; 738 | this.nextItemElement = e.target.closest(this.defaultOptions.draggableSelector); 739 | this.selections.droptarget = e.target.closest(this.defaultOptions.dropzoneSelector); 740 | var itemDropzoneElement = document.createElement('div'); 741 | itemDropzoneElement.className = 'item-dropzone-area'; 742 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["removeOldDropzoneAreaElements"])(); 743 | 744 | if (this.selections.droptarget && this.nextItemElement) { 745 | this.selections.droptarget.insertBefore(itemDropzoneElement, state.previousTarget.closest(this.defaultOptions.draggableSelector)); 746 | } 747 | 748 | if (this.selections.droptarget && !this.nextItemElement) { 749 | this.selections.droptarget.appendChild(itemDropzoneElement); 750 | } 751 | }; 752 | 753 | var dragoverHandler = function dragoverHandler(e) { 754 | // if we have any selected items, 755 | // allow them to be dragged 756 | if (this.selections.items.length) { 757 | e.preventDefault(); 758 | } 759 | 760 | if (!this.defaultOptions.showDropzoneAreas) { 761 | return; 762 | } 763 | 764 | displayDropzones.bind(this)(e); 765 | 766 | if (typeof this.defaultOptions.onDragover === 'function') { 767 | try { 768 | this.defaultOptions.onDragover(_objectSpread({ 769 | nativeEvent: e, 770 | stop: function stop() { 771 | throw new Error("Stop method is available only for callbacks\n 'onDragstart' and 'onDragend'. For more info look at\n https://github.com/Vivify-Ideas/vue-draggable/blob/master/README.md\n "); 772 | } 773 | }, this.selections)); 774 | } catch (error) { 775 | e.preventDefault(); 776 | return; 777 | } 778 | } 779 | }; 780 | 781 | /***/ }), 782 | 783 | /***/ "./src/core/listeners/handlers/dragstart.handler.js": 784 | /*!**********************************************************!*\ 785 | !*** ./src/core/listeners/handlers/dragstart.handler.js ***! 786 | \**********************************************************/ 787 | /*! exports provided: dragstartHandler */ 788 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 789 | 790 | "use strict"; 791 | __webpack_require__.r(__webpack_exports__); 792 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dragstartHandler", function() { return dragstartHandler; }); 793 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../helpers */ "./src/core/helpers/index.js"); 794 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 795 | 796 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 797 | 798 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 799 | 800 | 801 | var dragstartHandler = function dragstartHandler(e) { 802 | var elem = e.target.closest(this.defaultOptions.draggableSelector); // if the element's parent is not the owner, then block this event 803 | 804 | if (!this.defaultOptions.multipleDropzonesItemsDraggingEnabled && elem && this.selections.owner !== elem.parentNode) { 805 | e.preventDefault(); 806 | return; 807 | } 808 | 809 | if (typeof this.defaultOptions.onDragstart === 'function') { 810 | try { 811 | this.defaultOptions.onDragstart(_objectSpread({ 812 | nativeEvent: e, 813 | stop: _helpers__WEBPACK_IMPORTED_MODULE_0__["stopDragAndDrop"] 814 | }, this.selections)); 815 | } catch (error) { 816 | e.preventDefault(); 817 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["removeOldDropzoneAreaElements"])(); 818 | return; 819 | } 820 | } // [else] if the multiple selection modifier is pressed 821 | // and the item's grabbed state is currently false 822 | 823 | 824 | if (Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["hasModifier"])(e) && elem.getAttribute('aria-grabbed') === 'false') { 825 | // add this additional selection 826 | _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(elem); 827 | } // we don't need the transfer data, but we have to define something 828 | // otherwise the drop action won't work at all in firefox 829 | // most browsers support the proper mime-type syntax, eg. "text/plain" 830 | // but we have to use this incorrect syntax for the benefit of IE10+ 831 | 832 | 833 | e.dataTransfer.setData('text', ''); // apply dropeffect to the target containers 834 | 835 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["addDropeffects"])(this.items, this.selections, this.targets); 836 | }; 837 | 838 | /***/ }), 839 | 840 | /***/ "./src/core/listeners/handlers/index.js": 841 | /*!**********************************************!*\ 842 | !*** ./src/core/listeners/handlers/index.js ***! 843 | \**********************************************/ 844 | /*! exports provided: mousedownHandler, mouseupHandler, dragoverHandler, dragstartHandler, dragenterHandler, dragleaveHandler, dragendHandler, keydownHandler */ 845 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 846 | 847 | "use strict"; 848 | __webpack_require__.r(__webpack_exports__); 849 | /* harmony import */ var _mousedown_handler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mousedown.handler */ "./src/core/listeners/handlers/mousedown.handler.js"); 850 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mousedownHandler", function() { return _mousedown_handler__WEBPACK_IMPORTED_MODULE_0__["mousedownHandler"]; }); 851 | 852 | /* harmony import */ var _mouseup_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseup.handler */ "./src/core/listeners/handlers/mouseup.handler.js"); 853 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseupHandler", function() { return _mouseup_handler__WEBPACK_IMPORTED_MODULE_1__["mouseupHandler"]; }); 854 | 855 | /* harmony import */ var _dragover_handler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dragover.handler */ "./src/core/listeners/handlers/dragover.handler.js"); 856 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragoverHandler", function() { return _dragover_handler__WEBPACK_IMPORTED_MODULE_2__["dragoverHandler"]; }); 857 | 858 | /* harmony import */ var _dragstart_handler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dragstart.handler */ "./src/core/listeners/handlers/dragstart.handler.js"); 859 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragstartHandler", function() { return _dragstart_handler__WEBPACK_IMPORTED_MODULE_3__["dragstartHandler"]; }); 860 | 861 | /* harmony import */ var _dragenter_handler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dragenter.handler */ "./src/core/listeners/handlers/dragenter.handler.js"); 862 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragenterHandler", function() { return _dragenter_handler__WEBPACK_IMPORTED_MODULE_4__["dragenterHandler"]; }); 863 | 864 | /* harmony import */ var _dragleave_handler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dragleave.handler */ "./src/core/listeners/handlers/dragleave.handler.js"); 865 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragleaveHandler", function() { return _dragleave_handler__WEBPACK_IMPORTED_MODULE_5__["dragleaveHandler"]; }); 866 | 867 | /* harmony import */ var _dragend_handler__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dragend.handler */ "./src/core/listeners/handlers/dragend.handler.js"); 868 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragendHandler", function() { return _dragend_handler__WEBPACK_IMPORTED_MODULE_6__["dragendHandler"]; }); 869 | 870 | /* harmony import */ var _keydown_handler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./keydown.handler */ "./src/core/listeners/handlers/keydown.handler.js"); 871 | /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keydownHandler", function() { return _keydown_handler__WEBPACK_IMPORTED_MODULE_7__["keydownHandler"]; }); 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | /***/ }), 883 | 884 | /***/ "./src/core/listeners/handlers/keydown.handler.js": 885 | /*!********************************************************!*\ 886 | !*** ./src/core/listeners/handlers/keydown.handler.js ***! 887 | \********************************************************/ 888 | /*! exports provided: keydownHandler */ 889 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 890 | 891 | "use strict"; 892 | __webpack_require__.r(__webpack_exports__); 893 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keydownHandler", function() { return keydownHandler; }); 894 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../helpers */ "./src/core/helpers/index.js"); 895 | 896 | 897 | var isItemAroundSelectionArea = function isItemAroundSelectionArea(item, lastItem) { 898 | return item.parentNode === lastItem.parentNode; 899 | }; 900 | 901 | var keydownHandler = function keydownHandler(e) { 902 | // if the element is a grabbable item 903 | if (e.target.getAttribute('aria-grabbed')) { 904 | // Space is the selection or unselection keystroke 905 | if (e.keyCode === 32) { 906 | // if the multiple selection modifier is pressed 907 | if (Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["hasModifier"])(e)) { 908 | // if the item's grabbed state is currently true 909 | if (e.target.getAttribute('aria-grabbed') === 'true') { 910 | // if this is the only selected item, clear dropeffect 911 | // from the target containers, which we must do first 912 | // in case subsequent unselection sets owner to null 913 | if (this.selections.items.length === 1) { 914 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); 915 | } // unselect this item 916 | 917 | 918 | _helpers__WEBPACK_IMPORTED_MODULE_0__["removeSelection"].bind(this)(e.target); // if we have any selections 919 | // apply dropeffect to the target containers, 920 | // in case earlier selections were made by mouse 921 | 922 | if (this.selections.items.length) { 923 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["addDropeffects"])(this.items, this.selections, this.targets); 924 | } // if that was the only selected item 925 | // then reset the owner container reference 926 | 927 | 928 | if (!this.selections.items.length) { 929 | this.selections.owner = null; 930 | } 931 | } else { 932 | // else [if its grabbed state is currently false] 933 | // add this additional selection 934 | _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(e.target); // apply dropeffect to the target containers 935 | 936 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["addDropeffects"])(this.items, this.selections, this.targets); 937 | } 938 | } else if (e.target.getAttribute('aria-grabbed') === 'false') { 939 | // else [if the multiple selection modifier is not pressed] 940 | // and the item's grabbed state is currently false 941 | // clear dropeffect from the target containers 942 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); // clear all existing selections 943 | 944 | _helpers__WEBPACK_IMPORTED_MODULE_0__["clearSelections"].bind(this)(); // add this new selection 945 | 946 | _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(e.target); // apply dropeffect to the target containers 947 | 948 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["addDropeffects"])(this.items, this.selections, this.targets); 949 | } else { 950 | // else [if modifier is not pressed and grabbed is already true] 951 | // apply dropeffect to the target containers 952 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["addDropeffects"])(this.items, this.selections, this.targets); 953 | } // then prevent default to avoid any conflict with native actions 954 | 955 | 956 | e.preventDefault(); 957 | } // (CMD or Ctrl) + A - select all the items around the selected one 958 | 959 | 960 | if (e.keyCode === 65 && (e.ctrlKey || e.metaKey)) { 961 | var lastItem = this.selections.items.slice(-1).pop(); 962 | 963 | if (this.items && this.items.length > 0) { 964 | for (var i = 0; i < this.items.length; i++) { 965 | var item = this.items[i]; 966 | var shouldSelectItem = isItemAroundSelectionArea(item, lastItem); 967 | shouldSelectItem && _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(item); 968 | } 969 | } 970 | 971 | e.preventDefault(); // prevent entire page selection. 972 | } // Modifier + M is the end-of-selection keystroke 973 | 974 | 975 | if (e.keyCode === 77 && Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["hasModifier"])(e)) { 976 | // if we have any selected items 977 | if (this.selections.items.length) { 978 | // apply dropeffect to the target containers 979 | // in case earlier selections were made by mouse 980 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["addDropeffects"])(this.items, this.selections, this.targets); // if the owner container is the last one, focus the first one 981 | 982 | if (this.selections.owner === this.targets[this.targets.length - 1]) { 983 | this.targets[0].focus(); 984 | } else { 985 | // else [if it's not the last one], find and focus the next one 986 | for (var _i = 0; _i < this.targets.length; _i++) { 987 | if (this.selections.owner === this.targets[_i]) { 988 | this.targets[_i + 1].focus(); 989 | 990 | break; 991 | } 992 | } 993 | } 994 | } // then prevent default to avoid any conflict with native actions 995 | 996 | 997 | e.preventDefault(); 998 | } 999 | } // Escape is the abort keystroke (for any target element) 1000 | 1001 | 1002 | if (e.keyCode === 27) { 1003 | // if we have any selected items 1004 | if (this.selections.items.length) { 1005 | // clear dropeffect from the target containers 1006 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); // then set focus back on the last item that was selected, which is 1007 | // necessary because we've removed tabindex from the current focus 1008 | 1009 | this.selections.items[this.selections.items.length - 1].focus(); // clear all existing selections 1010 | 1011 | _helpers__WEBPACK_IMPORTED_MODULE_0__["clearSelections"].bind(this)(); // but don't prevent default so that native actions can still occur 1012 | } 1013 | } // if the element is a drop target container 1014 | 1015 | 1016 | if (e.target.getAttribute('aria-dropeffect')) { 1017 | // Enter or Modifier + M is the drop keystroke 1018 | if (e.keyCode === 13 || e.keyCode === 77 && Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["hasModifier"])(e)) { 1019 | // append the selected items to the end of the target container 1020 | if (this.defaultOptions.reactivityEnabled) { 1021 | this.selections.droptarget = e.target; 1022 | _helpers__WEBPACK_IMPORTED_MODULE_0__["dispatchReorderEvents"].bind(this)(e); 1023 | } else { 1024 | for (var _i2 = 0; _i2 < this.selections.items.length; _i2++) { 1025 | e.target.appendChild(this.selections.items[_i2]); 1026 | } 1027 | } // clear dropeffect from the target containers 1028 | 1029 | 1030 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); // then set focus back on the last item that was selected, which is 1031 | // necessary because we've removed tabindex from the current focus 1032 | 1033 | this.selections.items[this.selections.items.length - 1].focus(); // reset the selections array 1034 | 1035 | _helpers__WEBPACK_IMPORTED_MODULE_0__["clearSelections"].bind(this)(); // prevent default to to avoid any conflict with native actions 1036 | 1037 | e.preventDefault(); 1038 | } 1039 | } 1040 | }; 1041 | 1042 | /***/ }), 1043 | 1044 | /***/ "./src/core/listeners/handlers/mousedown.handler.js": 1045 | /*!**********************************************************!*\ 1046 | !*** ./src/core/listeners/handlers/mousedown.handler.js ***! 1047 | \**********************************************************/ 1048 | /*! exports provided: mousedownHandler */ 1049 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 1050 | 1051 | "use strict"; 1052 | __webpack_require__.r(__webpack_exports__); 1053 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mousedownHandler", function() { return mousedownHandler; }); 1054 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../helpers */ "./src/core/helpers/index.js"); 1055 | 1056 | var mousedownHandler = function mousedownHandler(e) { 1057 | if (this.defaultOptions.handlerSelector) { 1058 | var handler = e.target.closest(this.defaultOptions.handlerSelector); 1059 | 1060 | if (!handler) { 1061 | return; 1062 | } 1063 | } 1064 | 1065 | var elem = e.target.closest(this.defaultOptions.draggableSelector); // if the element is a draggable item 1066 | 1067 | if (elem && elem.getAttribute('draggable')) { 1068 | // clear dropeffect from the target containers 1069 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); // if the multiple selection modifier is not pressed 1070 | // and the item's grabbed state is currently false 1071 | 1072 | if (!Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["hasModifier"])(e) && elem.getAttribute('aria-grabbed') === 'false') { 1073 | // clear all existing selections 1074 | _helpers__WEBPACK_IMPORTED_MODULE_0__["clearSelections"].bind(this)(); // then add this new selection 1075 | 1076 | _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(elem); 1077 | } 1078 | } else if (!Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["hasModifier"])(e)) { 1079 | // else [if the element is anything else] 1080 | // and the selection modifier is not pressed 1081 | // clear dropeffect from the target containers 1082 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); // clear all existing selections 1083 | 1084 | _helpers__WEBPACK_IMPORTED_MODULE_0__["clearSelections"].bind(this)(); 1085 | } else { 1086 | // else [if the element is anything else and the modifier is pressed] 1087 | // clear dropeffect from the target containers 1088 | Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["clearDropeffects"])(this.items, this.selections, this.targets); 1089 | } 1090 | }; 1091 | 1092 | /***/ }), 1093 | 1094 | /***/ "./src/core/listeners/handlers/mouseup.handler.js": 1095 | /*!********************************************************!*\ 1096 | !*** ./src/core/listeners/handlers/mouseup.handler.js ***! 1097 | \********************************************************/ 1098 | /*! exports provided: mouseupHandler */ 1099 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 1100 | 1101 | "use strict"; 1102 | __webpack_require__.r(__webpack_exports__); 1103 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseupHandler", function() { return mouseupHandler; }); 1104 | /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../helpers */ "./src/core/helpers/index.js"); 1105 | 1106 | 1107 | var isItemInSelectionArea = function isItemInSelectionArea(item, element, lastItem) { 1108 | return item.parentNode === element.parentNode && (element.offsetTop > lastItem.offsetTop && item.offsetTop <= element.offsetTop && item.offsetTop >= lastItem.offsetTop || item.offsetTop >= element.offsetTop && item.offsetTop <= lastItem.offsetTop); 1109 | }; 1110 | 1111 | var mouseupHandler = function mouseupHandler(e) { 1112 | var elem = e.target.closest(this.defaultOptions.draggableSelector); // if the element is a draggable item 1113 | 1114 | if (elem && elem.getAttribute('draggable')) { 1115 | // if shift key is pressed select multiple items 1116 | if (Object(_helpers__WEBPACK_IMPORTED_MODULE_0__["hasModifier"])(e)) { 1117 | if (this.selections.items.length && e.shiftKey) { 1118 | // last selected item 1119 | var lastItem = this.selections.items.slice(-1).pop(); 1120 | 1121 | if (this.items && this.items.length > 0) { 1122 | for (var i = 0; i < this.items.length; i++) { 1123 | var item = this.items[i]; 1124 | var shouldSelectItem = isItemInSelectionArea(item, elem, lastItem); 1125 | shouldSelectItem && _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(item); 1126 | } // if the item's grabbed state is currently true 1127 | 1128 | } 1129 | } else if (elem.getAttribute('aria-grabbed') === 'true') { 1130 | // unselect this item 1131 | _helpers__WEBPACK_IMPORTED_MODULE_0__["removeSelection"].bind(this)(elem); // if that was the only selected item 1132 | // then reset the owner container reference 1133 | 1134 | if (!this.selections.items.length) { 1135 | this.selections.owner = null; 1136 | } 1137 | } else { 1138 | // else [if the item's grabbed state is false] 1139 | // add this additional selection 1140 | _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(elem); 1141 | } 1142 | } else { 1143 | // if no modifier, clear all selections and add current item. 1144 | _helpers__WEBPACK_IMPORTED_MODULE_0__["clearSelections"].bind(this)(); 1145 | _helpers__WEBPACK_IMPORTED_MODULE_0__["addSelection"].bind(this)(elem); 1146 | } 1147 | } 1148 | }; 1149 | 1150 | /***/ }), 1151 | 1152 | /***/ "./src/core/listeners/index.js": 1153 | /*!*************************************!*\ 1154 | !*** ./src/core/listeners/index.js ***! 1155 | \*************************************/ 1156 | /*! exports provided: attachListeners */ 1157 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 1158 | 1159 | "use strict"; 1160 | __webpack_require__.r(__webpack_exports__); 1161 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "attachListeners", function() { return attachListeners; }); 1162 | /* harmony import */ var _handlers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./handlers */ "./src/core/listeners/handlers/index.js"); 1163 | 1164 | var attachListeners = function attachListeners(el) { 1165 | // mousedown event to clear previous selections 1166 | el.addEventListener('mousedown', _handlers__WEBPACK_IMPORTED_MODULE_0__["mousedownHandler"].bind(this), false); // mouseup event to implement multiple selection 1167 | 1168 | el.addEventListener('mouseup', _handlers__WEBPACK_IMPORTED_MODULE_0__["mouseupHandler"].bind(this), false); // dragstart event to initiate mouse dragging 1169 | 1170 | el.addEventListener('dragstart', _handlers__WEBPACK_IMPORTED_MODULE_0__["dragstartHandler"].bind(this), false); // keydown event to implement selection and abort 1171 | 1172 | el.addEventListener('keydown', _handlers__WEBPACK_IMPORTED_MODULE_0__["keydownHandler"].bind(this), false); // dragenter event to set related variable 1173 | 1174 | el.addEventListener('dragenter', _handlers__WEBPACK_IMPORTED_MODULE_0__["dragenterHandler"].bind(this), false); // dragleave event to maintain target highlighting using that variable 1175 | 1176 | el.addEventListener('dragleave', _handlers__WEBPACK_IMPORTED_MODULE_0__["dragleaveHandler"].bind(this), false); // dragover event to allow the drag by preventing its default 1177 | 1178 | el.addEventListener('dragover', _handlers__WEBPACK_IMPORTED_MODULE_0__["dragoverHandler"].bind(this), false); // dragend event to implement items being validly dropped into targets, 1179 | // or invalidly dropped elsewhere, and to clean-up the interface either way 1180 | 1181 | el.addEventListener('dragend', _handlers__WEBPACK_IMPORTED_MODULE_0__["dragendHandler"].bind(this), false); 1182 | }; 1183 | 1184 | /***/ }), 1185 | 1186 | /***/ "./src/core/options.js": 1187 | /*!*****************************!*\ 1188 | !*** ./src/core/options.js ***! 1189 | \*****************************/ 1190 | /*! exports provided: getOptions */ 1191 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 1192 | 1193 | "use strict"; 1194 | __webpack_require__.r(__webpack_exports__); 1195 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getOptions", function() { return getOptions; }); 1196 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 1197 | 1198 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 1199 | 1200 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 1201 | 1202 | var getOptions = function getOptions(componentInstance, options) { 1203 | return _objectSpread({ 1204 | dropzoneSelector: 'ul', 1205 | draggableSelector: 'li', 1206 | handlerSelector: null, 1207 | reactivityEnabled: true, 1208 | multipleDropzonesItemsDraggingEnabled: false, 1209 | showDropzoneAreas: true 1210 | }, options, { 1211 | onDragstart: (options.onDragstart || function () {}).bind(componentInstance), 1212 | onDragenter: (options.onDragenter || function () {}).bind(componentInstance), 1213 | onDragover: (options.onDragover || function () {}).bind(componentInstance), 1214 | onDragend: (options.onDragend || function () {}).bind(componentInstance), 1215 | onDrop: (options.onDrop || function () {}).bind(componentInstance) 1216 | }); 1217 | }; 1218 | 1219 | /***/ }), 1220 | 1221 | /***/ "./src/core/state.js": 1222 | /*!***************************!*\ 1223 | !*** ./src/core/state.js ***! 1224 | \***************************/ 1225 | /*! exports provided: getState */ 1226 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 1227 | 1228 | "use strict"; 1229 | __webpack_require__.r(__webpack_exports__); 1230 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getState", function() { return getState; }); 1231 | var getState = function getState() { 1232 | return { 1233 | targets: null, 1234 | items: null, 1235 | nextItemElement: null, 1236 | // related variable is needed to maintain a reference to the 1237 | // dragleave's relatedTarget, since it doesn't have e.relatedTarget 1238 | related: null, 1239 | selections: { 1240 | items: [], 1241 | owner: null, 1242 | droptarget: null 1243 | } 1244 | }; 1245 | }; 1246 | 1247 | /***/ }), 1248 | 1249 | /***/ "./src/index.js": 1250 | /*!**********************!*\ 1251 | !*** ./src/index.js ***! 1252 | \**********************/ 1253 | /*! exports provided: VueDraggableDirective, default */ 1254 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 1255 | 1256 | "use strict"; 1257 | __webpack_require__.r(__webpack_exports__); 1258 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VueDraggableDirective", function() { return VueDraggableDirective; }); 1259 | /* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core */ "./src/core/index.js"); 1260 | /* harmony import */ var _components_vue_draggable_group_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/vue-draggable-group.component */ "./src/components/vue-draggable-group.component.js"); 1261 | 1262 | 1263 | var instances = []; 1264 | var VueDraggableDirective = { 1265 | bind: function bind(el, options, vnode) { 1266 | var instance = new _core__WEBPACK_IMPORTED_MODULE_0__["VueDraggable"](el, vnode.context, options.value); 1267 | instances.push(instance); 1268 | }, 1269 | componentUpdated: function componentUpdated(el) { 1270 | setTimeout(function () { 1271 | instances.forEach(function (instance) { 1272 | if (instance.el !== el) return; 1273 | instance.update(el); 1274 | }); 1275 | }); 1276 | }, 1277 | unbind: function unbind(el) { 1278 | instances = instances.filter(function (instance) { 1279 | return instance.el !== el; 1280 | }); 1281 | } 1282 | }; 1283 | 1284 | _core__WEBPACK_IMPORTED_MODULE_0__["VueDraggable"].install = function (Vue) { 1285 | Vue.directive('drag-and-drop', VueDraggableDirective); 1286 | Vue.component('vue-draggable-group', _components_vue_draggable_group_component__WEBPACK_IMPORTED_MODULE_1__["VueDraggableGroup"]); 1287 | }; 1288 | 1289 | /* harmony default export */ __webpack_exports__["default"] = (_core__WEBPACK_IMPORTED_MODULE_0__["VueDraggable"]); 1290 | 1291 | /***/ }) 1292 | 1293 | /******/ }); 1294 | }); 1295 | //# sourceMappingURL=vue-draggable.js.map --------------------------------------------------------------------------------