avances en plantillas
This commit is contained in:
parent
0f84beacf1
commit
da0530d79b
2062 changed files with 598814 additions and 22 deletions
21
storage/public/dist/libs/sortablejs/LICENSE
vendored
Normal file
21
storage/public/dist/libs/sortablejs/LICENSE
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2019 All contributors to Sortable
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
829
storage/public/dist/libs/sortablejs/README.md
vendored
Normal file
829
storage/public/dist/libs/sortablejs/README.md
vendored
Normal file
|
|
@ -0,0 +1,829 @@
|
|||
# Sortable [](https://opencollective.com/Sortable) [](https://circleci.com/gh/SortableJS/Sortable) [](https://deepscan.io/dashboard#view=project&tid=3901&pid=5666&bid=43977) [](https://www.jsdelivr.com/package/npm/sortablejs) [](https://www.npmjs.com/package/sortablejs)
|
||||
|
||||
Sortable is a JavaScript library for reorderable drag-and-drop lists.
|
||||
|
||||
Demo: http://sortablejs.github.io/Sortable/
|
||||
|
||||
[<img width="250px" src="https://raw.githubusercontent.com/SortableJS/Sortable/HEAD/st/saucelabs.svg?sanitize=true">](https://saucelabs.com/)
|
||||
|
||||
## Features
|
||||
|
||||
* Supports touch devices and [modern](http://caniuse.com/#search=drag) browsers (including IE9)
|
||||
* Can drag from one list to another or within the same list
|
||||
* CSS animation when moving items
|
||||
* Supports drag handles *and selectable text* (better than voidberg's html5sortable)
|
||||
* Smart auto-scrolling
|
||||
* Advanced swap detection
|
||||
* Smooth animations
|
||||
* [Multi-drag](https://github.com/SortableJS/Sortable/tree/master/plugins/MultiDrag) support
|
||||
* Support for CSS transforms
|
||||
* Built using native HTML5 drag and drop API
|
||||
* Supports
|
||||
* [Meteor](https://github.com/SortableJS/meteor-sortablejs)
|
||||
* Angular
|
||||
* [2.0+](https://github.com/SortableJS/angular-sortablejs)
|
||||
* [1.*](https://github.com/SortableJS/angular-legacy-sortablejs)
|
||||
* React
|
||||
* [ES2015+](https://github.com/SortableJS/react-sortablejs)
|
||||
* [Mixin](https://github.com/SortableJS/react-mixin-sortablejs)
|
||||
* [Knockout](https://github.com/SortableJS/knockout-sortablejs)
|
||||
* [Polymer](https://github.com/SortableJS/polymer-sortablejs)
|
||||
* [Vue](https://github.com/SortableJS/Vue.Draggable)
|
||||
* [Ember](https://github.com/SortableJS/ember-sortablejs)
|
||||
* Supports any CSS library, e.g. [Bootstrap](#bs)
|
||||
* Simple API
|
||||
* Support for [plugins](#plugins)
|
||||
* [CDN](#cdn)
|
||||
* No jQuery required (but there is [support](https://github.com/SortableJS/jquery-sortablejs))
|
||||
* Typescript definitions at `@types/sortablejs`
|
||||
|
||||
|
||||
<br/>
|
||||
|
||||
|
||||
### Articles
|
||||
|
||||
* [Dragging Multiple Items in Sortable](https://github.com/SortableJS/Sortable/wiki/Dragging-Multiple-Items-in-Sortable) (April 26, 2019)
|
||||
* [Swap Thresholds and Direction](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction) (December 2, 2018)
|
||||
* [Sortable v1.0 — New capabilities](https://github.com/SortableJS/Sortable/wiki/Sortable-v1.0-—-New-capabilities/) (December 22, 2014)
|
||||
* [Sorting with the help of HTML5 Drag'n'Drop API](https://github.com/SortableJS/Sortable/wiki/Sorting-with-the-help-of-HTML5-Drag'n'Drop-API/) (December 23, 2013)
|
||||
|
||||
<br/>
|
||||
|
||||
### Getting Started
|
||||
|
||||
Install with NPM:
|
||||
```bash
|
||||
npm install sortablejs --save
|
||||
```
|
||||
|
||||
Install with Bower:
|
||||
```bash
|
||||
bower install --save sortablejs
|
||||
```
|
||||
|
||||
Import into your project:
|
||||
```js
|
||||
// Default SortableJS
|
||||
import Sortable from 'sortablejs';
|
||||
|
||||
// Core SortableJS (without default plugins)
|
||||
import Sortable from 'sortablejs/modular/sortable.core.esm.js';
|
||||
|
||||
// Complete SortableJS (with all plugins)
|
||||
import Sortable from 'sortablejs/modular/sortable.complete.esm.js';
|
||||
```
|
||||
|
||||
Cherrypick plugins:
|
||||
```js
|
||||
// Cherrypick extra plugins
|
||||
import Sortable, { MultiDrag, Swap } from 'sortablejs';
|
||||
|
||||
Sortable.mount(new MultiDrag(), new Swap());
|
||||
|
||||
|
||||
// Cherrypick default plugins
|
||||
import Sortable, { AutoScroll } from 'sortablejs/modular/sortable.core.esm.js';
|
||||
|
||||
Sortable.mount(new AutoScroll());
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
### Usage
|
||||
```html
|
||||
<ul id="items">
|
||||
<li>item 1</li>
|
||||
<li>item 2</li>
|
||||
<li>item 3</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
```js
|
||||
var el = document.getElementById('items');
|
||||
var sortable = Sortable.create(el);
|
||||
```
|
||||
|
||||
You can use any element for the list and its elements, not just `ul`/`li`. Here is an [example with `div`s](https://jsbin.com/visimub/edit?html,js,output).
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
### Options
|
||||
```js
|
||||
var sortable = new Sortable(el, {
|
||||
group: "name", // or { name: "...", pull: [true, false, 'clone', array], put: [true, false, array] }
|
||||
sort: true, // sorting inside list
|
||||
delay: 0, // time in milliseconds to define when the sorting should start
|
||||
delayOnTouchOnly: false, // only delay if user is using touch
|
||||
touchStartThreshold: 0, // px, how many pixels the point should move before cancelling a delayed drag event
|
||||
disabled: false, // Disables the sortable if set to true.
|
||||
store: null, // @see Store
|
||||
animation: 150, // ms, animation speed moving items when sorting, `0` — without animation
|
||||
easing: "cubic-bezier(1, 0, 0, 1)", // Easing for animation. Defaults to null. See https://easings.net/ for examples.
|
||||
handle: ".my-handle", // Drag handle selector within list items
|
||||
filter: ".ignore-elements", // Selectors that do not lead to dragging (String or Function)
|
||||
preventOnFilter: true, // Call `event.preventDefault()` when triggered `filter`
|
||||
draggable: ".item", // Specifies which items inside the element should be draggable
|
||||
|
||||
dataIdAttr: 'data-id', // HTML attribute that is used by the `toArray()` method
|
||||
|
||||
ghostClass: "sortable-ghost", // Class name for the drop placeholder
|
||||
chosenClass: "sortable-chosen", // Class name for the chosen item
|
||||
dragClass: "sortable-drag", // Class name for the dragging item
|
||||
|
||||
swapThreshold: 1, // Threshold of the swap zone
|
||||
invertSwap: false, // Will always use inverted swap zone if set to true
|
||||
invertedSwapThreshold: 1, // Threshold of the inverted swap zone (will be set to swapThreshold value by default)
|
||||
direction: 'horizontal', // Direction of Sortable (will be detected automatically if not given)
|
||||
|
||||
forceFallback: false, // ignore the HTML5 DnD behaviour and force the fallback to kick in
|
||||
|
||||
fallbackClass: "sortable-fallback", // Class name for the cloned DOM Element when using forceFallback
|
||||
fallbackOnBody: false, // Appends the cloned DOM Element into the Document's Body
|
||||
fallbackTolerance: 0, // Specify in pixels how far the mouse should move before it's considered as a drag.
|
||||
|
||||
dragoverBubble: false,
|
||||
removeCloneOnHide: true, // Remove the clone element when it is not showing, rather than just hiding it
|
||||
emptyInsertThreshold: 5, // px, distance mouse must be from empty sortable to insert drag element into it
|
||||
|
||||
|
||||
setData: function (/** DataTransfer */dataTransfer, /** HTMLElement*/dragEl) {
|
||||
dataTransfer.setData('Text', dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent
|
||||
},
|
||||
|
||||
// Element is chosen
|
||||
onChoose: function (/**Event*/evt) {
|
||||
evt.oldIndex; // element index within parent
|
||||
},
|
||||
|
||||
// Element is unchosen
|
||||
onUnchoose: function(/**Event*/evt) {
|
||||
// same properties as onEnd
|
||||
},
|
||||
|
||||
// Element dragging started
|
||||
onStart: function (/**Event*/evt) {
|
||||
evt.oldIndex; // element index within parent
|
||||
},
|
||||
|
||||
// Element dragging ended
|
||||
onEnd: function (/**Event*/evt) {
|
||||
var itemEl = evt.item; // dragged HTMLElement
|
||||
evt.to; // target list
|
||||
evt.from; // previous list
|
||||
evt.oldIndex; // element's old index within old parent
|
||||
evt.newIndex; // element's new index within new parent
|
||||
evt.oldDraggableIndex; // element's old index within old parent, only counting draggable elements
|
||||
evt.newDraggableIndex; // element's new index within new parent, only counting draggable elements
|
||||
evt.clone // the clone element
|
||||
evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving
|
||||
},
|
||||
|
||||
// Element is dropped into the list from another list
|
||||
onAdd: function (/**Event*/evt) {
|
||||
// same properties as onEnd
|
||||
},
|
||||
|
||||
// Changed sorting within list
|
||||
onUpdate: function (/**Event*/evt) {
|
||||
// same properties as onEnd
|
||||
},
|
||||
|
||||
// Called by any change to the list (add / update / remove)
|
||||
onSort: function (/**Event*/evt) {
|
||||
// same properties as onEnd
|
||||
},
|
||||
|
||||
// Element is removed from the list into another list
|
||||
onRemove: function (/**Event*/evt) {
|
||||
// same properties as onEnd
|
||||
},
|
||||
|
||||
// Attempt to drag a filtered element
|
||||
onFilter: function (/**Event*/evt) {
|
||||
var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event.
|
||||
},
|
||||
|
||||
// Event when you move an item in the list or between lists
|
||||
onMove: function (/**Event*/evt, /**Event*/originalEvent) {
|
||||
// Example: https://jsbin.com/nawahef/edit?js,output
|
||||
evt.dragged; // dragged HTMLElement
|
||||
evt.draggedRect; // DOMRect {left, top, right, bottom}
|
||||
evt.related; // HTMLElement on which have guided
|
||||
evt.relatedRect; // DOMRect
|
||||
evt.willInsertAfter; // Boolean that is true if Sortable will insert drag element after target by default
|
||||
originalEvent.clientY; // mouse position
|
||||
// return false; — for cancel
|
||||
// return -1; — insert before target
|
||||
// return 1; — insert after target
|
||||
// return true; — keep default insertion point based on the direction
|
||||
// return void; — keep default insertion point based on the direction
|
||||
},
|
||||
|
||||
// Called when creating a clone of element
|
||||
onClone: function (/**Event*/evt) {
|
||||
var origEl = evt.item;
|
||||
var cloneEl = evt.clone;
|
||||
},
|
||||
|
||||
// Called when dragging element changes position
|
||||
onChange: function(/**Event*/evt) {
|
||||
evt.newIndex // most likely why this event is used is to get the dragging element's current index
|
||||
// same properties as onEnd
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `group` option
|
||||
To drag elements from one list into another, both lists must have the same `group` value.
|
||||
You can also define whether lists can give away, give and keep a copy (`clone`), and receive elements.
|
||||
|
||||
* name: `String` — group name
|
||||
* pull: `true|false|["foo", "bar"]|'clone'|function` — ability to move from the list. `clone` — copy the item, rather than move. Or an array of group names which the elements may be put in. Defaults to `true`.
|
||||
* put: `true|false|["baz", "qux"]|function` — whether elements can be added from other lists, or an array of group names from which elements can be added.
|
||||
* revertClone: `boolean` — revert cloned element to initial position after moving to a another list.
|
||||
|
||||
|
||||
Demo:
|
||||
- https://jsbin.com/hijetos/edit?js,output
|
||||
- https://jsbin.com/nacoyah/edit?js,output — use of complex logic in the `pull` and` put`
|
||||
- https://jsbin.com/bifuyab/edit?js,output — use `revertClone: true`
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `sort` option
|
||||
Allow sorting inside list.
|
||||
|
||||
Demo: https://jsbin.com/jayedig/edit?js,output
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `delay` option
|
||||
Time in milliseconds to define when the sorting should start.
|
||||
Unfortunately, due to browser restrictions, delaying is not possible on IE or Edge with native drag & drop.
|
||||
|
||||
Demo: https://jsbin.com/zosiwah/edit?js,output
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `delayOnTouchOnly` option
|
||||
Whether or not the delay should be applied only if the user is using touch (eg. on a mobile device). No delay will be applied in any other case. Defaults to `false`.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `swapThreshold` option
|
||||
Percentage of the target that the swap zone will take up, as a float between `0` and `1`.
|
||||
|
||||
[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#swap-threshold)
|
||||
|
||||
Demo: http://sortablejs.github.io/Sortable#thresholds
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `invertSwap` option
|
||||
Set to `true` to set the swap zone to the sides of the target, for the effect of sorting "in between" items.
|
||||
|
||||
[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#forcing-inverted-swap-zone)
|
||||
|
||||
Demo: http://sortablejs.github.io/Sortable#thresholds
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `invertedSwapThreshold` option
|
||||
Percentage of the target that the inverted swap zone will take up, as a float between `0` and `1`. If not given, will default to `swapThreshold`.
|
||||
|
||||
[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#dealing-with-swap-glitching)
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `direction` option
|
||||
Direction that the Sortable should sort in. Can be set to `'vertical'`, `'horizontal'`, or a function, which will be called whenever a target is dragged over. Must return `'vertical'` or `'horizontal'`.
|
||||
|
||||
[Read more](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#direction)
|
||||
|
||||
|
||||
Example of direction detection for vertical list that includes full column and half column elements:
|
||||
|
||||
```js
|
||||
Sortable.create(el, {
|
||||
direction: function(evt, target, dragEl) {
|
||||
if (target !== null && target.className.includes('half-column') && dragEl.className.includes('half-column')) {
|
||||
return 'horizontal';
|
||||
}
|
||||
return 'vertical';
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `touchStartThreshold` option
|
||||
This option is similar to `fallbackTolerance` option.
|
||||
|
||||
When the `delay` option is set, some phones with very sensitive touch displays like the Samsung Galaxy S8 will fire
|
||||
unwanted touchmove events even when your finger is not moving, resulting in the sort not triggering.
|
||||
|
||||
This option sets the minimum pointer movement that must occur before the delayed sorting is cancelled.
|
||||
|
||||
Values between 3 to 5 are good.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `disabled` options
|
||||
Disables the sortable if set to `true`.
|
||||
|
||||
Demo: https://jsbin.com/sewokud/edit?js,output
|
||||
|
||||
```js
|
||||
var sortable = Sortable.create(list);
|
||||
|
||||
document.getElementById("switcher").onclick = function () {
|
||||
var state = sortable.option("disabled"); // get
|
||||
|
||||
sortable.option("disabled", !state); // set
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `handle` option
|
||||
To make list items draggable, Sortable disables text selection by the user.
|
||||
That's not always desirable. To allow text selection, define a drag handler,
|
||||
which is an area of every list element that allows it to be dragged around.
|
||||
|
||||
Demo: https://jsbin.com/numakuh/edit?html,js,output
|
||||
|
||||
```js
|
||||
Sortable.create(el, {
|
||||
handle: ".my-handle"
|
||||
});
|
||||
```
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li><span class="my-handle">::</span> list item text one
|
||||
<li><span class="my-handle">::</span> list item text two
|
||||
</ul>
|
||||
```
|
||||
|
||||
```css
|
||||
.my-handle {
|
||||
cursor: move;
|
||||
cursor: -webkit-grabbing;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `filter` option
|
||||
|
||||
|
||||
```js
|
||||
Sortable.create(list, {
|
||||
filter: ".js-remove, .js-edit",
|
||||
onFilter: function (evt) {
|
||||
var item = evt.item,
|
||||
ctrl = evt.target;
|
||||
|
||||
if (Sortable.utils.is(ctrl, ".js-remove")) { // Click on remove button
|
||||
item.parentNode.removeChild(item); // remove sortable item
|
||||
}
|
||||
else if (Sortable.utils.is(ctrl, ".js-edit")) { // Click on edit link
|
||||
// ...
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `ghostClass` option
|
||||
Class name for the drop placeholder (default `sortable-ghost`).
|
||||
|
||||
Demo: https://jsbin.com/henuyiw/edit?css,js,output
|
||||
|
||||
```css
|
||||
.ghost {
|
||||
opacity: 0.4;
|
||||
}
|
||||
```
|
||||
|
||||
```js
|
||||
Sortable.create(list, {
|
||||
ghostClass: "ghost"
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `chosenClass` option
|
||||
Class name for the chosen item (default `sortable-chosen`).
|
||||
|
||||
Demo: https://jsbin.com/hoqufox/edit?css,js,output
|
||||
|
||||
```css
|
||||
.chosen {
|
||||
color: #fff;
|
||||
background-color: #c00;
|
||||
}
|
||||
```
|
||||
|
||||
```js
|
||||
Sortable.create(list, {
|
||||
delay: 500,
|
||||
chosenClass: "chosen"
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `forceFallback` option
|
||||
If set to `true`, the Fallback for non HTML5 Browser will be used, even if we are using an HTML5 Browser.
|
||||
This gives us the possibility to test the behaviour for older Browsers even in newer Browser, or make the Drag 'n Drop feel more consistent between Desktop , Mobile and old Browsers.
|
||||
|
||||
On top of that, the Fallback always generates a copy of that DOM Element and appends the class `fallbackClass` defined in the options. This behaviour controls the look of this 'dragged' Element.
|
||||
|
||||
Demo: https://jsbin.com/sibiput/edit?html,css,js,output
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `fallbackTolerance` option
|
||||
Emulates the native drag threshold. Specify in pixels how far the mouse should move before it's considered as a drag.
|
||||
Useful if the items are also clickable like in a list of links.
|
||||
|
||||
When the user clicks inside a sortable element, it's not uncommon for your hand to move a little between the time you press and the time you release.
|
||||
Dragging only starts if you move the pointer past a certain tolerance, so that you don't accidentally start dragging every time you click.
|
||||
|
||||
3 to 5 are probably good values.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `dragoverBubble` option
|
||||
If set to `true`, the dragover event will bubble to parent sortables. Works on both fallback and native dragover event.
|
||||
By default, it is false, but Sortable will only stop bubbling the event once the element has been inserted into a parent Sortable, or *can* be inserted into a parent Sortable, but isn't at that specific time (due to animation, etc).
|
||||
|
||||
Since 1.8.0, you will probably want to leave this option as false. Before 1.8.0, it may need to be `true` for nested sortables to work.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `removeCloneOnHide` option
|
||||
If set to `false`, the clone is hidden by having it's CSS `display` property set to `none`.
|
||||
By default, this option is `true`, meaning Sortable will remove the cloned element from the DOM when it is supposed to be hidden.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### `emptyInsertThreshold` option
|
||||
The distance (in pixels) the mouse must be from an empty sortable while dragging for the drag element to be inserted into that sortable. Defaults to `5`. Set to `0` to disable this feature.
|
||||
|
||||
Demo: https://jsbin.com/becavoj/edit?js,output
|
||||
|
||||
An alternative to this option would be to set a padding on your list when it is empty.
|
||||
|
||||
For example:
|
||||
```css
|
||||
ul:empty {
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
```
|
||||
|
||||
Warning: For `:empty` to work, it must have no node inside (even text one).
|
||||
|
||||
Demo:
|
||||
https://jsbin.com/yunakeg/edit?html,css,js,output
|
||||
|
||||
---
|
||||
### Event object ([demo](https://jsbin.com/fogujiv/edit?js,output))
|
||||
|
||||
- to:`HTMLElement` — list, in which moved element
|
||||
- from:`HTMLElement` — previous list
|
||||
- item:`HTMLElement` — dragged element
|
||||
- clone:`HTMLElement`
|
||||
- oldIndex:`Number|undefined` — old index within parent
|
||||
- newIndex:`Number|undefined` — new index within parent
|
||||
- oldDraggableIndex: `Number|undefined` — old index within parent, only counting draggable elements
|
||||
- newDraggableIndex: `Number|undefined` — new index within parent, only counting draggable elements
|
||||
- pullMode:`String|Boolean|undefined` — Pull mode if dragging into another sortable (`"clone"`, `true`, or `false`), otherwise undefined
|
||||
|
||||
|
||||
#### `move` event object
|
||||
- to:`HTMLElement`
|
||||
- from:`HTMLElement`
|
||||
- dragged:`HTMLElement`
|
||||
- draggedRect:`DOMRect`
|
||||
- related:`HTMLElement` — element on which have guided
|
||||
- relatedRect:`DOMRect`
|
||||
- willInsertAfter:`Boolean` — `true` if will element be inserted after target (or `false` if before)
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
### Methods
|
||||
|
||||
|
||||
##### option(name:`String`[, value:`*`]):`*`
|
||||
Get or set the option.
|
||||
|
||||
|
||||
|
||||
##### closest(el:`HTMLElement`[, selector:`String`]):`HTMLElement|null`
|
||||
For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
|
||||
|
||||
|
||||
##### toArray():`String[]`
|
||||
Serializes the sortable's item `data-id`'s (`dataIdAttr` option) into an array of string.
|
||||
|
||||
|
||||
##### sort(order:`String[]`, useAnimation:`Boolean`)
|
||||
Sorts the elements according to the array.
|
||||
|
||||
```js
|
||||
var order = sortable.toArray();
|
||||
sortable.sort(order.reverse(), true); // apply
|
||||
```
|
||||
|
||||
|
||||
##### save()
|
||||
Save the current sorting (see [store](#store))
|
||||
|
||||
|
||||
##### destroy()
|
||||
Removes the sortable functionality completely.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
<a name="store"></a>
|
||||
### Store
|
||||
Saving and restoring of the sort.
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li data-id="1">order</li>
|
||||
<li data-id="2">save</li>
|
||||
<li data-id="3">restore</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
```js
|
||||
Sortable.create(el, {
|
||||
group: "localStorage-example",
|
||||
store: {
|
||||
/**
|
||||
* Get the order of elements. Called once during initialization.
|
||||
* @param {Sortable} sortable
|
||||
* @returns {Array}
|
||||
*/
|
||||
get: function (sortable) {
|
||||
var order = localStorage.getItem(sortable.options.group.name);
|
||||
return order ? order.split('|') : [];
|
||||
},
|
||||
|
||||
/**
|
||||
* Save the order of elements. Called onEnd (when the item is dropped).
|
||||
* @param {Sortable} sortable
|
||||
*/
|
||||
set: function (sortable) {
|
||||
var order = sortable.toArray();
|
||||
localStorage.setItem(sortable.options.group.name, order.join('|'));
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
<a name="bs"></a>
|
||||
### Bootstrap
|
||||
Demo: https://jsbin.com/visimub/edit?html,js,output
|
||||
|
||||
```html
|
||||
<!-- Latest compiled and minified CSS -->
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"/>
|
||||
|
||||
|
||||
<!-- Latest Sortable -->
|
||||
<script src="http://SortableJS.github.io/Sortable/Sortable.js"></script>
|
||||
|
||||
|
||||
<!-- Simple List -->
|
||||
<ul id="simpleList" class="list-group">
|
||||
<li class="list-group-item">This is <a href="http://SortableJS.github.io/Sortable/">Sortable</a></li>
|
||||
<li class="list-group-item">It works with Bootstrap...</li>
|
||||
<li class="list-group-item">...out of the box.</li>
|
||||
<li class="list-group-item">It has support for touch devices.</li>
|
||||
<li class="list-group-item">Just drag some elements around.</li>
|
||||
</ul>
|
||||
|
||||
<script>
|
||||
// Simple list
|
||||
Sortable.create(simpleList, { /* options */ });
|
||||
</script>
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
### Static methods & properties
|
||||
|
||||
|
||||
|
||||
##### Sortable.create(el:`HTMLElement`[, options:`Object`]):`Sortable`
|
||||
Create new instance.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
##### Sortable.active:`Sortable`
|
||||
The active Sortable instance.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
##### Sortable.dragged:`HTMLElement`
|
||||
The element being dragged.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
##### Sortable.ghost:`HTMLElement`
|
||||
The ghost element.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
##### Sortable.clone:`HTMLElement`
|
||||
The clone element.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
##### Sortable.get(element:`HTMLElement`):`Sortable`
|
||||
Get the Sortable instance on an element.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
##### Sortable.mount(plugin:`...SortablePlugin|SortablePlugin[]`)
|
||||
Mounts a plugin to Sortable.
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
##### Sortable.utils
|
||||
* on(el`:HTMLElement`, event`:String`, fn`:Function`) — attach an event handler function
|
||||
* off(el`:HTMLElement`, event`:String`, fn`:Function`) — remove an event handler
|
||||
* css(el`:HTMLElement`)`:Object` — get the values of all the CSS properties
|
||||
* css(el`:HTMLElement`, prop`:String`)`:Mixed` — get the value of style properties
|
||||
* css(el`:HTMLElement`, prop`:String`, value`:String`) — set one CSS properties
|
||||
* css(el`:HTMLElement`, props`:Object`) — set more CSS properties
|
||||
* find(ctx`:HTMLElement`, tagName`:String`[, iterator`:Function`])`:Array` — get elements by tag name
|
||||
* bind(ctx`:Mixed`, fn`:Function`)`:Function` — Takes a function and returns a new one that will always have a particular context
|
||||
* is(el`:HTMLElement`, selector`:String`)`:Boolean` — check the current matched set of elements against a selector
|
||||
* closest(el`:HTMLElement`, selector`:String`[, ctx`:HTMLElement`])`:HTMLElement|Null` — for each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree
|
||||
* clone(el`:HTMLElement`)`:HTMLElement` — create a deep copy of the set of matched elements
|
||||
* toggleClass(el`:HTMLElement`, name`:String`, state`:Boolean`) — add or remove one classes from each element
|
||||
* detectDirection(el`:HTMLElement`)`:String` — automatically detect the [direction](https://github.com/SortableJS/Sortable/wiki/Swap-Thresholds-and-Direction#direction) of the element as either `'vertical'` or `'horizontal'`
|
||||
* index(el`:HTMLElement`, selector`:String`)`:Number` — index of the element within its parent for a selected set of elements
|
||||
* getChild(el`:HTMLElement`, childNum`:Number`, options`:Object`, includeDragEl`:Boolean`):`HTMLElement` — get the draggable element at a given index of draggable elements within a Sortable instance
|
||||
* expando`:String` — expando property name for internal use, sortableListElement[expando] returns the Sortable instance of that elemenet
|
||||
---
|
||||
|
||||
|
||||
### Plugins
|
||||
#### Extra Plugins (included in complete versions)
|
||||
- [MultiDrag](https://github.com/SortableJS/Sortable/tree/master/plugins/MultiDrag)
|
||||
- [Swap](https://github.com/SortableJS/Sortable/tree/master/plugins/Swap)
|
||||
|
||||
#### Default Plugins (included in default versions)
|
||||
- [AutoScroll](https://github.com/SortableJS/Sortable/tree/master/plugins/AutoScroll)
|
||||
- [OnSpill](https://github.com/SortableJS/Sortable/tree/master/plugins/OnSpill)
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
<a name="cdn"></a>
|
||||
### CDN
|
||||
|
||||
```html
|
||||
<!-- jsDelivr :: Sortable :: Latest (https://www.jsdelivr.com/package/npm/sortablejs) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
### Contributing (Issue/PR)
|
||||
|
||||
Please, [read this](CONTRIBUTING.md).
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Contributors
|
||||
|
||||
### Code Contributors
|
||||
|
||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||
<a href="https://github.com/SortableJS/Sortable/graphs/contributors"><img src="https://opencollective.com/Sortable/contributors.svg?width=890&button=false" /></a>
|
||||
|
||||
### Financial Contributors
|
||||
|
||||
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/Sortable/contribute)]
|
||||
|
||||
#### Individuals
|
||||
|
||||
<a href="https://opencollective.com/Sortable"><img src="https://opencollective.com/Sortable/individuals.svg?width=890"></a>
|
||||
|
||||
#### Organizations
|
||||
|
||||
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/Sortable/contribute)]
|
||||
|
||||
<a href="https://opencollective.com/Sortable/organization/0/website"><img src="https://opencollective.com/Sortable/organization/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/1/website"><img src="https://opencollective.com/Sortable/organization/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/2/website"><img src="https://opencollective.com/Sortable/organization/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/3/website"><img src="https://opencollective.com/Sortable/organization/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/4/website"><img src="https://opencollective.com/Sortable/organization/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/5/website"><img src="https://opencollective.com/Sortable/organization/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/6/website"><img src="https://opencollective.com/Sortable/organization/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/7/website"><img src="https://opencollective.com/Sortable/organization/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/8/website"><img src="https://opencollective.com/Sortable/organization/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/Sortable/organization/9/website"><img src="https://opencollective.com/Sortable/organization/9/avatar.svg"></a>
|
||||
|
||||
## MIT LICENSE
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
3373
storage/public/dist/libs/sortablejs/Sortable.js
vendored
Normal file
3373
storage/public/dist/libs/sortablejs/Sortable.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
2
storage/public/dist/libs/sortablejs/Sortable.min.js
vendored
Normal file
2
storage/public/dist/libs/sortablejs/Sortable.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3365
storage/public/dist/libs/sortablejs/modular/sortable.complete.esm.js
vendored
Normal file
3365
storage/public/dist/libs/sortablejs/modular/sortable.complete.esm.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
3361
storage/public/dist/libs/sortablejs/modular/sortable.core.esm.js
vendored
Normal file
3361
storage/public/dist/libs/sortablejs/modular/sortable.core.esm.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
3363
storage/public/dist/libs/sortablejs/modular/sortable.esm.js
vendored
Normal file
3363
storage/public/dist/libs/sortablejs/modular/sortable.esm.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
57
storage/public/dist/libs/sortablejs/package.json
vendored
Normal file
57
storage/public/dist/libs/sortablejs/package.json
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"name": "sortablejs",
|
||||
"exportName": "Sortable",
|
||||
"version": "1.15.7",
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.4.4",
|
||||
"@babel/plugin-transform-object-assign": "^7.2.0",
|
||||
"@babel/preset-env": "^7.4.4",
|
||||
"rollup": "^1.11.3",
|
||||
"rollup-plugin-babel": "^4.3.2",
|
||||
"rollup-plugin-json": "^4.0.0",
|
||||
"rollup-plugin-node-resolve": "^5.0.0",
|
||||
"testcafe": "^1.3.1",
|
||||
"testcafe-browser-provider-saucelabs": "^1.7.0",
|
||||
"testcafe-reporter-xunit": "^2.1.0",
|
||||
"uglify-js": "^3.5.12"
|
||||
},
|
||||
"description": "JavaScript library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery required. Supports Meteor, AngularJS, React, Polymer, Vue, Knockout and any CSS library, e.g. Bootstrap.",
|
||||
"main": "./Sortable.min.js",
|
||||
"module": "modular/sortable.esm.js",
|
||||
"scripts": {
|
||||
"build:umd": "set NODE_ENV=umd&& rollup -c ./scripts/umd-build.js",
|
||||
"build:umd:watch": "set NODE_ENV=umd&& rollup -w -c ./scripts/umd-build.js",
|
||||
"build:es": "set NODE_ENV=es&& rollup -c ./scripts/esm-build.js",
|
||||
"build:es:watch": "set NODE_ENV=es&& rollup -w -c ./scripts/esm-build.js",
|
||||
"minify": "node ./scripts/minify.js",
|
||||
"build": "npm run build:es && npm run build:umd && npm run minify",
|
||||
"test:compat": "node ./scripts/test-compat.js",
|
||||
"test": "node ./scripts/test.js"
|
||||
},
|
||||
"maintainers": [
|
||||
"Konstantin Lebedev <ibnRubaXa@gmail.com>",
|
||||
"Owen Mills <owen23355@gmail.com>"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/SortableJS/Sortable.git"
|
||||
},
|
||||
"files": [
|
||||
"Sortable.js",
|
||||
"Sortable.min.js",
|
||||
"modular/",
|
||||
"src/"
|
||||
],
|
||||
"keywords": [
|
||||
"sortable",
|
||||
"reorder",
|
||||
"drag",
|
||||
"meteor",
|
||||
"angular",
|
||||
"ng-sortable",
|
||||
"react",
|
||||
"vue",
|
||||
"mixin"
|
||||
],
|
||||
"license": "MIT"
|
||||
}
|
||||
175
storage/public/dist/libs/sortablejs/src/Animation.js
vendored
Normal file
175
storage/public/dist/libs/sortablejs/src/Animation.js
vendored
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
import { getRect, css, matrix, isRectEqual, indexOfObject } from './utils.js';
|
||||
import Sortable from './Sortable.js';
|
||||
|
||||
export default function AnimationStateManager() {
|
||||
let animationStates = [],
|
||||
animationCallbackId;
|
||||
|
||||
return {
|
||||
captureAnimationState() {
|
||||
animationStates = [];
|
||||
if (!this.options.animation) return;
|
||||
let children = [].slice.call(this.el.children);
|
||||
|
||||
children.forEach(child => {
|
||||
if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
|
||||
animationStates.push({
|
||||
target: child,
|
||||
rect: getRect(child)
|
||||
});
|
||||
let fromRect = { ...animationStates[animationStates.length - 1].rect };
|
||||
|
||||
// If animating: compensate for current animation
|
||||
if (child.thisAnimationDuration) {
|
||||
let childMatrix = matrix(child, true);
|
||||
if (childMatrix) {
|
||||
fromRect.top -= childMatrix.f;
|
||||
fromRect.left -= childMatrix.e;
|
||||
}
|
||||
}
|
||||
|
||||
child.fromRect = fromRect;
|
||||
});
|
||||
},
|
||||
|
||||
addAnimationState(state) {
|
||||
animationStates.push(state);
|
||||
},
|
||||
|
||||
removeAnimationState(target) {
|
||||
animationStates.splice(indexOfObject(animationStates, { target }), 1);
|
||||
},
|
||||
|
||||
animateAll(callback) {
|
||||
if (!this.options.animation) {
|
||||
clearTimeout(animationCallbackId);
|
||||
if (typeof(callback) === 'function') callback();
|
||||
return;
|
||||
}
|
||||
|
||||
let animating = false,
|
||||
animationTime = 0;
|
||||
|
||||
animationStates.forEach((state) => {
|
||||
let time = 0,
|
||||
animatingThis = false,
|
||||
target = state.target,
|
||||
fromRect = target.fromRect,
|
||||
toRect = getRect(target),
|
||||
prevFromRect = target.prevFromRect,
|
||||
prevToRect = target.prevToRect,
|
||||
animatingRect = state.rect,
|
||||
targetMatrix = matrix(target, true);
|
||||
|
||||
|
||||
if (targetMatrix) {
|
||||
// Compensate for current animation
|
||||
toRect.top -= targetMatrix.f;
|
||||
toRect.left -= targetMatrix.e;
|
||||
}
|
||||
|
||||
target.toRect = toRect;
|
||||
|
||||
if (target.thisAnimationDuration) {
|
||||
// Could also check if animatingRect is between fromRect and toRect
|
||||
if (
|
||||
isRectEqual(prevFromRect, toRect) &&
|
||||
!isRectEqual(fromRect, toRect) &&
|
||||
// Make sure animatingRect is on line between toRect & fromRect
|
||||
(animatingRect.top - toRect.top) /
|
||||
(animatingRect.left - toRect.left) ===
|
||||
(fromRect.top - toRect.top) /
|
||||
(fromRect.left - toRect.left)
|
||||
) {
|
||||
// If returning to same place as started from animation and on same axis
|
||||
time = calculateRealTime(animatingRect, prevFromRect, prevToRect, this.options);
|
||||
}
|
||||
}
|
||||
|
||||
// if fromRect != toRect: animate
|
||||
if (!isRectEqual(toRect, fromRect)) {
|
||||
target.prevFromRect = fromRect;
|
||||
target.prevToRect = toRect;
|
||||
|
||||
if (!time) {
|
||||
time = this.options.animation;
|
||||
}
|
||||
this.animate(
|
||||
target,
|
||||
animatingRect,
|
||||
toRect,
|
||||
time
|
||||
);
|
||||
}
|
||||
|
||||
if (time) {
|
||||
animating = true;
|
||||
animationTime = Math.max(animationTime, time);
|
||||
clearTimeout(target.animationResetTimer);
|
||||
target.animationResetTimer = setTimeout(function() {
|
||||
target.animationTime = 0;
|
||||
target.prevFromRect = null;
|
||||
target.fromRect = null;
|
||||
target.prevToRect = null;
|
||||
target.thisAnimationDuration = null;
|
||||
}, time);
|
||||
target.thisAnimationDuration = time;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
clearTimeout(animationCallbackId);
|
||||
if (!animating) {
|
||||
if (typeof(callback) === 'function') callback();
|
||||
} else {
|
||||
animationCallbackId = setTimeout(function() {
|
||||
if (typeof(callback) === 'function') callback();
|
||||
}, animationTime);
|
||||
}
|
||||
animationStates = [];
|
||||
},
|
||||
|
||||
animate(target, currentRect, toRect, duration) {
|
||||
if (duration) {
|
||||
css(target, 'transition', '');
|
||||
css(target, 'transform', '');
|
||||
let elMatrix = matrix(this.el),
|
||||
scaleX = elMatrix && elMatrix.a,
|
||||
scaleY = elMatrix && elMatrix.d,
|
||||
translateX = (currentRect.left - toRect.left) / (scaleX || 1),
|
||||
translateY = (currentRect.top - toRect.top) / (scaleY || 1);
|
||||
|
||||
target.animatingX = !!translateX;
|
||||
target.animatingY = !!translateY;
|
||||
|
||||
css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
|
||||
|
||||
this.forRepaintDummy = repaint(target); // repaint
|
||||
|
||||
css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
|
||||
css(target, 'transform', 'translate3d(0,0,0)');
|
||||
(typeof target.animated === 'number') && clearTimeout(target.animated);
|
||||
target.animated = setTimeout(function () {
|
||||
css(target, 'transition', '');
|
||||
css(target, 'transform', '');
|
||||
target.animated = false;
|
||||
|
||||
target.animatingX = false;
|
||||
target.animatingY = false;
|
||||
}, duration);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function repaint(target) {
|
||||
return target.offsetWidth;
|
||||
}
|
||||
|
||||
|
||||
function calculateRealTime(animatingRect, fromRect, toRect, options) {
|
||||
return (
|
||||
Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) /
|
||||
Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2))
|
||||
) * options.animation;
|
||||
}
|
||||
12
storage/public/dist/libs/sortablejs/src/BrowserInfo.js
vendored
Normal file
12
storage/public/dist/libs/sortablejs/src/BrowserInfo.js
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
function userAgent(pattern) {
|
||||
if (typeof window !== 'undefined' && window.navigator) {
|
||||
return !!/*@__PURE__*/navigator.userAgent.match(pattern);
|
||||
}
|
||||
}
|
||||
|
||||
export const IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
|
||||
export const Edge = userAgent(/Edge/i);
|
||||
export const FireFox = userAgent(/firefox/i);
|
||||
export const Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
|
||||
export const IOS = userAgent(/iP(ad|od|hone)/i);
|
||||
export const ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
|
||||
57
storage/public/dist/libs/sortablejs/src/EventDispatcher.js
vendored
Normal file
57
storage/public/dist/libs/sortablejs/src/EventDispatcher.js
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import { IE11OrLess, Edge } from './BrowserInfo.js';
|
||||
import { expando } from './utils.js';
|
||||
import PluginManager from './PluginManager.js';
|
||||
|
||||
export default function dispatchEvent(
|
||||
{
|
||||
sortable, rootEl, name,
|
||||
targetEl, cloneEl, toEl, fromEl,
|
||||
oldIndex, newIndex,
|
||||
oldDraggableIndex, newDraggableIndex,
|
||||
originalEvent, putSortable, extraEventProperties
|
||||
}
|
||||
) {
|
||||
sortable = (sortable || (rootEl && rootEl[expando]));
|
||||
if (!sortable) return;
|
||||
|
||||
let evt,
|
||||
options = sortable.options,
|
||||
onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);
|
||||
// Support for new CustomEvent feature
|
||||
if (window.CustomEvent && !IE11OrLess && !Edge) {
|
||||
evt = new CustomEvent(name, {
|
||||
bubbles: true,
|
||||
cancelable: true
|
||||
});
|
||||
} else {
|
||||
evt = document.createEvent('Event');
|
||||
evt.initEvent(name, true, true);
|
||||
}
|
||||
|
||||
evt.to = toEl || rootEl;
|
||||
evt.from = fromEl || rootEl;
|
||||
evt.item = targetEl || rootEl;
|
||||
evt.clone = cloneEl;
|
||||
|
||||
evt.oldIndex = oldIndex;
|
||||
evt.newIndex = newIndex;
|
||||
|
||||
evt.oldDraggableIndex = oldDraggableIndex;
|
||||
evt.newDraggableIndex = newDraggableIndex;
|
||||
|
||||
evt.originalEvent = originalEvent;
|
||||
evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
|
||||
|
||||
let allEventProperties = { ...extraEventProperties, ...PluginManager.getEventProperties(name, sortable) };
|
||||
for (let option in allEventProperties) {
|
||||
evt[option] = allEventProperties[option];
|
||||
}
|
||||
|
||||
if (rootEl) {
|
||||
rootEl.dispatchEvent(evt);
|
||||
}
|
||||
|
||||
if (options[onName]) {
|
||||
options[onName].call(sortable, evt);
|
||||
}
|
||||
}
|
||||
94
storage/public/dist/libs/sortablejs/src/PluginManager.js
vendored
Normal file
94
storage/public/dist/libs/sortablejs/src/PluginManager.js
vendored
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
let plugins = [];
|
||||
|
||||
const defaults = {
|
||||
initializeByDefault: true
|
||||
};
|
||||
|
||||
export default {
|
||||
mount(plugin) {
|
||||
// Set default static properties
|
||||
for (let option in defaults) {
|
||||
if (defaults.hasOwnProperty(option) && !(option in plugin)) {
|
||||
plugin[option] = defaults[option];
|
||||
}
|
||||
}
|
||||
|
||||
plugins.forEach(p => {
|
||||
if (p.pluginName === plugin.pluginName) {
|
||||
throw (`Sortable: Cannot mount plugin ${ plugin.pluginName } more than once`);
|
||||
}
|
||||
});
|
||||
|
||||
plugins.push(plugin);
|
||||
},
|
||||
pluginEvent(eventName, sortable, evt) {
|
||||
this.eventCanceled = false;
|
||||
evt.cancel = () => {
|
||||
this.eventCanceled = true;
|
||||
};
|
||||
const eventNameGlobal = eventName + 'Global';
|
||||
plugins.forEach(plugin => {
|
||||
if (!sortable[plugin.pluginName]) return;
|
||||
// Fire global events if it exists in this sortable
|
||||
if (
|
||||
sortable[plugin.pluginName][eventNameGlobal]
|
||||
) {
|
||||
sortable[plugin.pluginName][eventNameGlobal]({ sortable, ...evt });
|
||||
}
|
||||
|
||||
// Only fire plugin event if plugin is enabled in this sortable,
|
||||
// and plugin has event defined
|
||||
if (
|
||||
sortable.options[plugin.pluginName] &&
|
||||
sortable[plugin.pluginName][eventName]
|
||||
) {
|
||||
sortable[plugin.pluginName][eventName]({ sortable, ...evt });
|
||||
}
|
||||
});
|
||||
},
|
||||
initializePlugins(sortable, el, defaults, options) {
|
||||
plugins.forEach(plugin => {
|
||||
const pluginName = plugin.pluginName;
|
||||
if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
|
||||
|
||||
let initialized = new plugin(sortable, el, sortable.options);
|
||||
initialized.sortable = sortable;
|
||||
initialized.options = sortable.options;
|
||||
sortable[pluginName] = initialized;
|
||||
|
||||
// Add default options from plugin
|
||||
Object.assign(defaults, initialized.defaults);
|
||||
});
|
||||
|
||||
for (let option in sortable.options) {
|
||||
if (!sortable.options.hasOwnProperty(option)) continue;
|
||||
let modified = this.modifyOption(sortable, option, sortable.options[option]);
|
||||
if (typeof(modified) !== 'undefined') {
|
||||
sortable.options[option] = modified;
|
||||
}
|
||||
}
|
||||
},
|
||||
getEventProperties(name, sortable) {
|
||||
let eventProperties = {};
|
||||
plugins.forEach(plugin => {
|
||||
if (typeof(plugin.eventProperties) !== 'function') return;
|
||||
Object.assign(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
|
||||
});
|
||||
|
||||
return eventProperties;
|
||||
},
|
||||
modifyOption(sortable, name, value) {
|
||||
let modifiedValue;
|
||||
plugins.forEach(plugin => {
|
||||
// Plugin must exist on the Sortable
|
||||
if (!sortable[plugin.pluginName]) return;
|
||||
|
||||
// If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
|
||||
if (plugin.optionListeners && typeof(plugin.optionListeners[name]) === 'function') {
|
||||
modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
|
||||
}
|
||||
});
|
||||
|
||||
return modifiedValue;
|
||||
}
|
||||
};
|
||||
2031
storage/public/dist/libs/sortablejs/src/Sortable.js
vendored
Normal file
2031
storage/public/dist/libs/sortablejs/src/Sortable.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
595
storage/public/dist/libs/sortablejs/src/utils.js
vendored
Normal file
595
storage/public/dist/libs/sortablejs/src/utils.js
vendored
Normal file
|
|
@ -0,0 +1,595 @@
|
|||
import { IE11OrLess } from './BrowserInfo.js';
|
||||
import Sortable from './Sortable.js';
|
||||
|
||||
const captureMode = {
|
||||
capture: false,
|
||||
passive: false
|
||||
};
|
||||
|
||||
function on(el, event, fn) {
|
||||
el.addEventListener(event, fn, !IE11OrLess && captureMode);
|
||||
}
|
||||
|
||||
|
||||
function off(el, event, fn) {
|
||||
el.removeEventListener(event, fn, !IE11OrLess && captureMode);
|
||||
}
|
||||
|
||||
function matches(/**HTMLElement*/el, /**String*/selector) {
|
||||
if (!selector) return;
|
||||
|
||||
selector[0] === '>' && (selector = selector.substring(1));
|
||||
|
||||
if (el) {
|
||||
try {
|
||||
if (el.matches) {
|
||||
return el.matches(selector);
|
||||
} else if (el.msMatchesSelector) {
|
||||
return el.msMatchesSelector(selector);
|
||||
} else if (el.webkitMatchesSelector) {
|
||||
return el.webkitMatchesSelector(selector);
|
||||
}
|
||||
} catch(_) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function getParentOrHost(el) {
|
||||
return (el.host && el !== document && el.host.nodeType && el.host !== el)
|
||||
? el.host
|
||||
: el.parentNode;
|
||||
}
|
||||
|
||||
function closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {
|
||||
if (el) {
|
||||
ctx = ctx || document;
|
||||
|
||||
do {
|
||||
if (
|
||||
selector != null &&
|
||||
(
|
||||
selector[0] === '>' ?
|
||||
el.parentNode === ctx && matches(el, selector) :
|
||||
matches(el, selector)
|
||||
) ||
|
||||
includeCTX && el === ctx
|
||||
) {
|
||||
return el;
|
||||
}
|
||||
|
||||
if (el === ctx) break;
|
||||
/* jshint boss:true */
|
||||
} while (el = getParentOrHost(el));
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
const R_SPACE = /\s+/g;
|
||||
|
||||
function toggleClass(el, name, state) {
|
||||
if (el && name) {
|
||||
if (el.classList) {
|
||||
el.classList[state ? 'add' : 'remove'](name);
|
||||
}
|
||||
else {
|
||||
let className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
|
||||
el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function css(el, prop, val) {
|
||||
let style = el && el.style;
|
||||
|
||||
if (style) {
|
||||
if (val === void 0) {
|
||||
if (document.defaultView && document.defaultView.getComputedStyle) {
|
||||
val = document.defaultView.getComputedStyle(el, '');
|
||||
}
|
||||
else if (el.currentStyle) {
|
||||
val = el.currentStyle;
|
||||
}
|
||||
|
||||
return prop === void 0 ? val : val[prop];
|
||||
}
|
||||
else {
|
||||
if (!(prop in style) && prop.indexOf('webkit') === -1) {
|
||||
prop = '-webkit-' + prop;
|
||||
}
|
||||
|
||||
style[prop] = val + (typeof val === 'string' ? '' : 'px');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function matrix(el, selfOnly) {
|
||||
let appliedTransforms = '';
|
||||
if (typeof(el) === 'string') {
|
||||
appliedTransforms = el;
|
||||
} else {
|
||||
do {
|
||||
let transform = css(el, 'transform');
|
||||
|
||||
if (transform && transform !== 'none') {
|
||||
appliedTransforms = transform + ' ' + appliedTransforms;
|
||||
}
|
||||
/* jshint boss:true */
|
||||
} while (!selfOnly && (el = el.parentNode));
|
||||
}
|
||||
|
||||
const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
|
||||
/*jshint -W056 */
|
||||
return matrixFn && (new matrixFn(appliedTransforms));
|
||||
}
|
||||
|
||||
|
||||
function find(ctx, tagName, iterator) {
|
||||
if (ctx) {
|
||||
let list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
|
||||
|
||||
if (iterator) {
|
||||
for (; i < n; i++) {
|
||||
iterator(list[i], i);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
|
||||
|
||||
function getWindowScrollingElement() {
|
||||
let scrollingElement = document.scrollingElement;
|
||||
|
||||
if (scrollingElement) {
|
||||
return scrollingElement
|
||||
} else {
|
||||
return document.documentElement
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the "bounding client rect" of given element
|
||||
* @param {HTMLElement} el The element whose boundingClientRect is wanted
|
||||
* @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container
|
||||
* @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr
|
||||
* @param {[Boolean]} undoScale Whether the container's scale() should be undone
|
||||
* @param {[HTMLElement]} container The parent the element will be placed in
|
||||
* @return {Object} The boundingClientRect of el, with specified adjustments
|
||||
*/
|
||||
function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
|
||||
if (!el.getBoundingClientRect && el !== window) return;
|
||||
|
||||
let elRect,
|
||||
top,
|
||||
left,
|
||||
bottom,
|
||||
right,
|
||||
height,
|
||||
width;
|
||||
|
||||
if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {
|
||||
elRect = el.getBoundingClientRect();
|
||||
top = elRect.top;
|
||||
left = elRect.left;
|
||||
bottom = elRect.bottom;
|
||||
right = elRect.right;
|
||||
height = elRect.height;
|
||||
width = elRect.width;
|
||||
} else {
|
||||
top = 0;
|
||||
left = 0;
|
||||
bottom = window.innerHeight;
|
||||
right = window.innerWidth;
|
||||
height = window.innerHeight;
|
||||
width = window.innerWidth;
|
||||
}
|
||||
|
||||
if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
|
||||
// Adjust for translate()
|
||||
container = container || el.parentNode;
|
||||
|
||||
// solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
|
||||
// Not needed on <= IE11
|
||||
if (!IE11OrLess) {
|
||||
do {
|
||||
if (
|
||||
container &&
|
||||
container.getBoundingClientRect &&
|
||||
(
|
||||
css(container, 'transform') !== 'none' ||
|
||||
relativeToNonStaticParent &&
|
||||
css(container, 'position') !== 'static'
|
||||
)
|
||||
) {
|
||||
let containerRect = container.getBoundingClientRect();
|
||||
|
||||
// Set relative to edges of padding box of container
|
||||
top -= containerRect.top + parseInt(css(container, 'border-top-width'));
|
||||
left -= containerRect.left + parseInt(css(container, 'border-left-width'));
|
||||
bottom = top + elRect.height;
|
||||
right = left + elRect.width;
|
||||
|
||||
break;
|
||||
}
|
||||
/* jshint boss:true */
|
||||
} while (container = container.parentNode);
|
||||
}
|
||||
}
|
||||
|
||||
if (undoScale && el !== window) {
|
||||
// Adjust for scale()
|
||||
let elMatrix = matrix(container || el),
|
||||
scaleX = elMatrix && elMatrix.a,
|
||||
scaleY = elMatrix && elMatrix.d;
|
||||
|
||||
if (elMatrix) {
|
||||
top /= scaleY;
|
||||
left /= scaleX;
|
||||
|
||||
width /= scaleX;
|
||||
height /= scaleY;
|
||||
|
||||
bottom = top + height;
|
||||
right = left + width;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
top: top,
|
||||
left: left,
|
||||
bottom: bottom,
|
||||
right: right,
|
||||
width: width,
|
||||
height: height
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the content rect of the element (bounding rect minus border and padding)
|
||||
* @param {HTMLElement} el
|
||||
*/
|
||||
function getContentRect(el) {
|
||||
let rect = getRect(el);
|
||||
const paddingLeft = parseInt(css(el, 'padding-left')),
|
||||
paddingTop = parseInt(css(el, 'padding-top')),
|
||||
paddingRight = parseInt(css(el, 'padding-right')),
|
||||
paddingBottom = parseInt(css(el, 'padding-bottom'));
|
||||
rect.top += paddingTop + parseInt(css(el, 'border-top-width'));
|
||||
rect.left += paddingLeft + parseInt(css(el, 'border-left-width'));
|
||||
// Client Width/Height includes padding only
|
||||
rect.width = el.clientWidth - paddingLeft - paddingRight;
|
||||
rect.height = el.clientHeight - paddingTop - paddingBottom;
|
||||
rect.bottom = rect.top + rect.height;
|
||||
rect.right = rect.left + rect.width;
|
||||
return rect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a side of an element is scrolled past a side of its parents
|
||||
* @param {HTMLElement} el The element who's side being scrolled out of view is in question
|
||||
* @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')
|
||||
* @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')
|
||||
* @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
|
||||
*/
|
||||
function isScrolledPast(el, elSide, parentSide) {
|
||||
let parent = getParentAutoScrollElement(el, true),
|
||||
elSideVal = getRect(el)[elSide];
|
||||
|
||||
/* jshint boss:true */
|
||||
while (parent) {
|
||||
let parentSideVal = getRect(parent)[parentSide],
|
||||
visible;
|
||||
|
||||
if (parentSide === 'top' || parentSide === 'left') {
|
||||
visible = elSideVal >= parentSideVal;
|
||||
} else {
|
||||
visible = elSideVal <= parentSideVal;
|
||||
}
|
||||
|
||||
if (!visible) return parent;
|
||||
|
||||
if (parent === getWindowScrollingElement()) break;
|
||||
|
||||
parent = getParentAutoScrollElement(parent, false);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
|
||||
* and non-draggable elements
|
||||
* @param {HTMLElement} el The parent element
|
||||
* @param {Number} childNum The index of the child
|
||||
* @param {Object} options Parent Sortable's options
|
||||
* @return {HTMLElement} The child at index childNum, or null if not found
|
||||
*/
|
||||
function getChild(el, childNum, options, includeDragEl) {
|
||||
let currentChild = 0,
|
||||
i = 0,
|
||||
children = el.children;
|
||||
|
||||
while (i < children.length) {
|
||||
if (
|
||||
children[i].style.display !== 'none' &&
|
||||
children[i] !== Sortable.ghost &&
|
||||
(includeDragEl || children[i] !== Sortable.dragged) &&
|
||||
closest(children[i], options.draggable, el, false)
|
||||
) {
|
||||
if (currentChild === childNum) {
|
||||
return children[i];
|
||||
}
|
||||
currentChild++;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last child in the el, ignoring ghostEl or invisible elements (clones)
|
||||
* @param {HTMLElement} el Parent element
|
||||
* @param {selector} selector Any other elements that should be ignored
|
||||
* @return {HTMLElement} The last child, ignoring ghostEl
|
||||
*/
|
||||
function lastChild(el, selector) {
|
||||
let last = el.lastElementChild;
|
||||
|
||||
while (
|
||||
last &&
|
||||
(
|
||||
last === Sortable.ghost ||
|
||||
css(last, 'display') === 'none' ||
|
||||
selector && !matches(last, selector)
|
||||
)
|
||||
) {
|
||||
last = last.previousElementSibling;
|
||||
}
|
||||
|
||||
return last || null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the index of an element within its parent for a selected set of
|
||||
* elements
|
||||
* @param {HTMLElement} el
|
||||
* @param {selector} selector
|
||||
* @return {number}
|
||||
*/
|
||||
function index(el, selector) {
|
||||
let index = 0;
|
||||
|
||||
if (!el || !el.parentNode) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* jshint boss:true */
|
||||
while (el = el.previousElementSibling) {
|
||||
if ((el.nodeName.toUpperCase() !== 'TEMPLATE') && el !== Sortable.clone && (!selector || matches(el, selector))) {
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.
|
||||
* The value is returned in real pixels.
|
||||
* @param {HTMLElement} el
|
||||
* @return {Array} Offsets in the format of [left, top]
|
||||
*/
|
||||
function getRelativeScrollOffset(el) {
|
||||
let offsetLeft = 0,
|
||||
offsetTop = 0,
|
||||
winScroller = getWindowScrollingElement();
|
||||
|
||||
if (el) {
|
||||
do {
|
||||
let elMatrix = matrix(el),
|
||||
scaleX = elMatrix.a,
|
||||
scaleY = elMatrix.d;
|
||||
|
||||
offsetLeft += el.scrollLeft * scaleX;
|
||||
offsetTop += el.scrollTop * scaleY;
|
||||
} while (el !== winScroller && (el = el.parentNode));
|
||||
}
|
||||
|
||||
return [offsetLeft, offsetTop];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index of the object within the given array
|
||||
* @param {Array} arr Array that may or may not hold the object
|
||||
* @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find
|
||||
* @return {Number} The index of the object in the array, or -1
|
||||
*/
|
||||
function indexOfObject(arr, obj) {
|
||||
for (let i in arr) {
|
||||
if (!arr.hasOwnProperty(i)) continue;
|
||||
for (let key in obj) {
|
||||
if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
function getParentAutoScrollElement(el, includeSelf) {
|
||||
// skip to window
|
||||
if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
|
||||
|
||||
let elem = el;
|
||||
let gotSelf = false;
|
||||
do {
|
||||
// we don't need to get elem css if it isn't even overflowing in the first place (performance)
|
||||
if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
|
||||
let elemCSS = css(elem);
|
||||
if (
|
||||
elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') ||
|
||||
elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')
|
||||
) {
|
||||
if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
|
||||
|
||||
if (gotSelf || includeSelf) return elem;
|
||||
gotSelf = true;
|
||||
}
|
||||
}
|
||||
/* jshint boss:true */
|
||||
} while (elem = elem.parentNode);
|
||||
|
||||
return getWindowScrollingElement();
|
||||
}
|
||||
|
||||
function extend(dst, src) {
|
||||
if (dst && src) {
|
||||
for (let key in src) {
|
||||
if (src.hasOwnProperty(key)) {
|
||||
dst[key] = src[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
function isRectEqual(rect1, rect2) {
|
||||
return Math.round(rect1.top) === Math.round(rect2.top) &&
|
||||
Math.round(rect1.left) === Math.round(rect2.left) &&
|
||||
Math.round(rect1.height) === Math.round(rect2.height) &&
|
||||
Math.round(rect1.width) === Math.round(rect2.width);
|
||||
}
|
||||
|
||||
|
||||
let _throttleTimeout;
|
||||
function throttle(callback, ms) {
|
||||
return function () {
|
||||
if (!_throttleTimeout) {
|
||||
let args = arguments,
|
||||
_this = this;
|
||||
|
||||
if (args.length === 1) {
|
||||
callback.call(_this, args[0]);
|
||||
} else {
|
||||
callback.apply(_this, args);
|
||||
}
|
||||
|
||||
_throttleTimeout = setTimeout(function () {
|
||||
_throttleTimeout = void 0;
|
||||
}, ms);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
function cancelThrottle() {
|
||||
clearTimeout(_throttleTimeout);
|
||||
_throttleTimeout = void 0;
|
||||
}
|
||||
|
||||
|
||||
function scrollBy(el, x, y) {
|
||||
el.scrollLeft += x;
|
||||
el.scrollTop += y;
|
||||
}
|
||||
|
||||
|
||||
function clone(el) {
|
||||
let Polymer = window.Polymer;
|
||||
let $ = window.jQuery || window.Zepto;
|
||||
|
||||
if (Polymer && Polymer.dom) {
|
||||
return Polymer.dom(el).cloneNode(true);
|
||||
}
|
||||
else if ($) {
|
||||
return $(el).clone(true)[0];
|
||||
}
|
||||
else {
|
||||
return el.cloneNode(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function setRect(el, rect) {
|
||||
css(el, 'position', 'absolute');
|
||||
css(el, 'top', rect.top);
|
||||
css(el, 'left', rect.left);
|
||||
css(el, 'width', rect.width);
|
||||
css(el, 'height', rect.height);
|
||||
}
|
||||
|
||||
function unsetRect(el) {
|
||||
css(el, 'position', '');
|
||||
css(el, 'top', '');
|
||||
css(el, 'left', '');
|
||||
css(el, 'width', '');
|
||||
css(el, 'height', '');
|
||||
}
|
||||
|
||||
function getChildContainingRectFromElement(container, options, ghostEl) {
|
||||
const rect = {};
|
||||
|
||||
Array.from(container.children).forEach(child => {
|
||||
if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;
|
||||
const childRect = getRect(child);
|
||||
rect.left = Math.min(rect.left ?? Infinity, childRect.left);
|
||||
rect.top = Math.min(rect.top ?? Infinity, childRect.top);
|
||||
rect.right = Math.max(rect.right ?? -Infinity, childRect.right);
|
||||
rect.bottom = Math.max(rect.bottom ?? -Infinity, childRect.bottom);
|
||||
});
|
||||
rect.width = rect.right - rect.left;
|
||||
rect.height = rect.bottom - rect.top;
|
||||
rect.x = rect.left;
|
||||
rect.y = rect.top;
|
||||
return rect;
|
||||
}
|
||||
|
||||
const expando = 'Sortable' + (new Date).getTime();
|
||||
|
||||
|
||||
export {
|
||||
on,
|
||||
off,
|
||||
matches,
|
||||
getParentOrHost,
|
||||
closest,
|
||||
toggleClass,
|
||||
css,
|
||||
matrix,
|
||||
find,
|
||||
getWindowScrollingElement,
|
||||
getRect,
|
||||
isScrolledPast,
|
||||
getChild,
|
||||
lastChild,
|
||||
index,
|
||||
getRelativeScrollOffset,
|
||||
indexOfObject,
|
||||
getParentAutoScrollElement,
|
||||
extend,
|
||||
isRectEqual,
|
||||
throttle,
|
||||
cancelThrottle,
|
||||
scrollBy,
|
||||
clone,
|
||||
setRect,
|
||||
unsetRect,
|
||||
getContentRect,
|
||||
getChildContainingRectFromElement,
|
||||
expando
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue