Initial commit.
This commit is contained in:
commit
322d85b797
7
MANIFEST.in
Normal file
7
MANIFEST.in
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
include README.txt
|
||||||
|
recursive-include xstatic/pkg/angular_irdragndrop *
|
||||||
|
|
||||||
|
global-exclude *.pyc
|
||||||
|
global-exclude *.pyo
|
||||||
|
global-exclude *.orig
|
||||||
|
global-exclude *.rej
|
25
PKG-INFO
Normal file
25
PKG-INFO
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
Metadata-Version: 1.0
|
||||||
|
Name: XStatic-angular-irdragndrop
|
||||||
|
Version: 1.0.2
|
||||||
|
Summary: irdragndrop 1.0.2 (XStatic packaging standard)
|
||||||
|
Home-page: https://github.com/lorenzofox3/lrDragNDrop
|
||||||
|
Author: Thai Tran
|
||||||
|
Author-email: tqtran@us.ibm.com
|
||||||
|
License: MIT
|
||||||
|
Description:
|
||||||
|
XStatic-angular-IrDragNDrop
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
IrDragNDrop javascript library packaged for setuptools (easy_install) / pip.
|
||||||
|
|
||||||
|
This package is intended to be used by **any** project that needs these files.
|
||||||
|
|
||||||
|
It intentionally does **not** provide any extra code except some metadata
|
||||||
|
**nor** has any extra requirements. You MAY use some minimal support code from
|
||||||
|
the XStatic base package, if you like.
|
||||||
|
|
||||||
|
You can find more info about the xstatic packaging way in the package
|
||||||
|
`XStatic`.
|
||||||
|
|
||||||
|
Keywords: drag-n-drop angular table irdragndrop xstatic
|
||||||
|
Platform: any
|
14
README.txt
Normal file
14
README.txt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
XStatic-angular-IrDragNDrop
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
IrDragNDrop javascript library packaged for setuptools (easy_install) / pip.
|
||||||
|
|
||||||
|
This package is intended to be used by **any** project that needs these files.
|
||||||
|
|
||||||
|
It intentionally does **not** provide any extra code except some metadata
|
||||||
|
**nor** has any extra requirements. You MAY use some minimal support code from
|
||||||
|
the XStatic base package, if you like.
|
||||||
|
|
||||||
|
You can find more info about the xstatic packaging way in the package
|
||||||
|
`XStatic`.
|
27
setup.py
Normal file
27
setup.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
from xstatic.pkg import angular_smart_table as xs
|
||||||
|
|
||||||
|
# The README.txt file should be written in reST so that PyPI can use
|
||||||
|
# it to generate your project's PyPI page.
|
||||||
|
long_description = open('README.txt').read()
|
||||||
|
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name=xs.PACKAGE_NAME,
|
||||||
|
version=xs.PACKAGE_VERSION,
|
||||||
|
description=xs.DESCRIPTION,
|
||||||
|
long_description=long_description,
|
||||||
|
classifiers=xs.CLASSIFIERS,
|
||||||
|
keywords=xs.KEYWORDS,
|
||||||
|
maintainer=xs.MAINTAINER,
|
||||||
|
maintainer_email=xs.MAINTAINER_EMAIL,
|
||||||
|
license=xs.LICENSE,
|
||||||
|
url=xs.HOMEPAGE,
|
||||||
|
platforms=xs.PLATFORMS,
|
||||||
|
packages=find_packages(),
|
||||||
|
namespace_packages=['xstatic', 'xstatic.pkg', ],
|
||||||
|
include_package_data=True,
|
||||||
|
zip_safe=False,
|
||||||
|
install_requires=[],
|
||||||
|
)
|
1
xstatic/__init__.py
Normal file
1
xstatic/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
__import__('pkg_resources').declare_namespace(__name__)
|
1
xstatic/pkg/__init__.py
Normal file
1
xstatic/pkg/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
__import__('pkg_resources').declare_namespace(__name__)
|
57
xstatic/pkg/angular_irdragndrop/__init__.py
Normal file
57
xstatic/pkg/angular_irdragndrop/__init__.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
|
||||||
|
"""
|
||||||
|
XStatic resource package
|
||||||
|
|
||||||
|
See package 'XStatic' for documentation and basic tools.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# official name, upper/lowercase allowed, no spaces
|
||||||
|
DISPLAY_NAME = 'IrDragNDrop'
|
||||||
|
|
||||||
|
# name used for PyPi
|
||||||
|
PACKAGE_NAME = 'XStatic-%s' % DISPLAY_NAME
|
||||||
|
|
||||||
|
NAME = __name__.split('.')[-1] # package name (e.g. 'foo' or 'foo_bar')
|
||||||
|
# please use a all-lowercase valid python
|
||||||
|
# package name
|
||||||
|
|
||||||
|
VERSION = '1.0.2' # version of the packaged files, please use the upstream
|
||||||
|
# version number
|
||||||
|
BUILD = '0' # our package build number, so we can release new builds
|
||||||
|
# with fixes for xstatic stuff.
|
||||||
|
PACKAGE_VERSION = VERSION + '.' + BUILD # version used for PyPi
|
||||||
|
|
||||||
|
DESCRIPTION = "%s %s (XStatic packaging standard)" % (DISPLAY_NAME, VERSION)
|
||||||
|
|
||||||
|
PLATFORMS = 'any'
|
||||||
|
CLASSIFIERS = []
|
||||||
|
KEYWORDS = 'drag-n-drop angular table irdragndrop xstatic'
|
||||||
|
|
||||||
|
# XStatic-* package maintainer:
|
||||||
|
MAINTAINER = 'Thai Tran'
|
||||||
|
MAINTAINER_EMAIL = 'tqtran@us.ibm.com'
|
||||||
|
|
||||||
|
# this refers to the project homepage of the stuff we packaged:
|
||||||
|
HOMEPAGE = 'https://github.com/lorenzofox3/lrDragNDrop'
|
||||||
|
|
||||||
|
# this refers to all files:
|
||||||
|
LICENSE = '(same as %s)' % DISPLAY_NAME
|
||||||
|
|
||||||
|
from os.path import join, dirname
|
||||||
|
BASE_DIR = join(dirname(__file__), 'data')
|
||||||
|
# linux package maintainers just can point to their file locations like this:
|
||||||
|
#BASE_DIR = '/usr/share/javascript/' + NAME
|
||||||
|
|
||||||
|
# location of the Javascript file that's the entry point for this package, if
|
||||||
|
# one exists, relative to BASE_DIR
|
||||||
|
MAIN='irdragndrop.js'
|
||||||
|
|
||||||
|
LOCATIONS = {
|
||||||
|
# CDN locations (if no public CDN exists, use an empty dict)
|
||||||
|
# if value is a string, it is a base location, just append relative
|
||||||
|
# path/filename. if value is a dict, do another lookup using the
|
||||||
|
# relative path/filename you want.
|
||||||
|
# your relative path/filenames should usually be without version
|
||||||
|
# information, because either the base dir/url is exactly for this
|
||||||
|
# version or the mapping will care for accessing this version.
|
||||||
|
}
|
184
xstatic/pkg/angular_irdragndrop/data/irdragndrop.js
vendored
Normal file
184
xstatic/pkg/angular_irdragndrop/data/irdragndrop.js
vendored
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
(function (ng) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
function isJqueryEventDataTransfer(){
|
||||||
|
return window.jQuery && (-1 == window.jQuery.event.props.indexOf('dataTransfer'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isJqueryEventDataTransfer()) {
|
||||||
|
window.jQuery.event.props.push('dataTransfer');
|
||||||
|
}
|
||||||
|
|
||||||
|
var module = ng.module('lrDragNDrop', []);
|
||||||
|
|
||||||
|
module.service('lrDragStore', ['$document', function (document) {
|
||||||
|
|
||||||
|
var store = {};
|
||||||
|
|
||||||
|
this.hold = function hold(key, item, collectionFrom, safe) {
|
||||||
|
store[key] = {
|
||||||
|
item: item,
|
||||||
|
collection: collectionFrom,
|
||||||
|
safe: safe === true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.get = function (namespace) {
|
||||||
|
var
|
||||||
|
modelItem = store[namespace], itemIndex;
|
||||||
|
|
||||||
|
if (modelItem) {
|
||||||
|
itemIndex = modelItem.collection.indexOf(modelItem.item);
|
||||||
|
return modelItem.safe === true ? modelItem.item : modelItem.collection.splice(itemIndex, 1)[0];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.clean = function clean() {
|
||||||
|
store = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
this.isHolding = function (namespace) {
|
||||||
|
return store[namespace] !== undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
document.bind('dragend', this.clean);
|
||||||
|
}]);
|
||||||
|
|
||||||
|
module.service('lrDragHelper', function () {
|
||||||
|
var th = this;
|
||||||
|
|
||||||
|
th.parseRepeater = function(scope, attr) {
|
||||||
|
var
|
||||||
|
repeatExpression = attr.ngRepeat,
|
||||||
|
match;
|
||||||
|
|
||||||
|
if (!repeatExpression) {
|
||||||
|
throw Error('this directive must be used with ngRepeat directive');
|
||||||
|
}
|
||||||
|
match = repeatExpression.match(/^(.*\sin).(\S*)/);
|
||||||
|
if (!match) {
|
||||||
|
throw Error("Expected ngRepeat in form of '_item_ in _collection_' but got '" +
|
||||||
|
repeatExpression + "'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return scope.$eval(match[2]);
|
||||||
|
};
|
||||||
|
|
||||||
|
th.lrDragSrcDirective = function(store, safe) {
|
||||||
|
return function compileFunc(el, iattr) {
|
||||||
|
iattr.$set('draggable', true);
|
||||||
|
return function linkFunc(scope, element, attr) {
|
||||||
|
var
|
||||||
|
collection,
|
||||||
|
key = (safe === true ? attr.lrDragSrcSafe : attr.lrDragSrc ) || 'temp';
|
||||||
|
|
||||||
|
if(attr.lrDragData) {
|
||||||
|
scope.$watch(attr.lrDragData, function (newValue) {
|
||||||
|
collection = newValue;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
collection = th.parseRepeater(scope, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
element.bind('dragstart', function (evt) {
|
||||||
|
store.hold(key, collection[scope.$index], collection, safe);
|
||||||
|
if(angular.isDefined(evt.dataTransfer)) {
|
||||||
|
evt.dataTransfer.setData('text/html', null); //FF/jQuery fix
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.directive('lrDragSrc', ['lrDragStore', 'lrDragHelper', function (store, dragHelper) {
|
||||||
|
return{
|
||||||
|
compile: dragHelper.lrDragSrcDirective(store)
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
|
||||||
|
module.directive('lrDragSrcSafe', ['lrDragStore', 'lrDragHelper', function (store, dragHelper) {
|
||||||
|
return{
|
||||||
|
compile: dragHelper.lrDragSrcDirective(store, true)
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
|
||||||
|
module.directive('lrDropTarget', ['lrDragStore', 'lrDragHelper', '$parse', function (store, dragHelper, $parse) {
|
||||||
|
return {
|
||||||
|
link: function (scope, element, attr) {
|
||||||
|
|
||||||
|
var
|
||||||
|
collection,
|
||||||
|
key = attr.lrDropTarget || 'temp',
|
||||||
|
classCache = null;
|
||||||
|
|
||||||
|
function isAfter(x, y) {
|
||||||
|
//check if below or over the diagonal of the box element
|
||||||
|
return (element[0].offsetHeight - x * element[0].offsetHeight / element[0].offsetWidth) < y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetStyle() {
|
||||||
|
if (classCache !== null) {
|
||||||
|
element.removeClass(classCache);
|
||||||
|
classCache = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(attr.lrDragData) {
|
||||||
|
scope.$watch(attr.lrDragData, function (newValue) {
|
||||||
|
collection = newValue;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
collection = dragHelper.parseRepeater(scope, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
element.bind('drop', function (evt) {
|
||||||
|
var
|
||||||
|
collectionCopy = ng.copy(collection),
|
||||||
|
item = store.get(key),
|
||||||
|
dropIndex, i, l;
|
||||||
|
if (item !== null) {
|
||||||
|
dropIndex = scope.$index;
|
||||||
|
dropIndex = isAfter(evt.offsetX, evt.offsetY) ? dropIndex + 1 : dropIndex;
|
||||||
|
//srcCollection=targetCollection => we may need to apply a correction
|
||||||
|
if (collectionCopy.length > collection.length) {
|
||||||
|
for (i = 0, l = Math.min(dropIndex, collection.length - 1); i <= l; i++) {
|
||||||
|
if (!ng.equals(collectionCopy[i], collection[i])) {
|
||||||
|
dropIndex = dropIndex - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scope.$apply(function () {
|
||||||
|
collection.splice(dropIndex, 0, item);
|
||||||
|
var fn = $parse(attr.lrDropSuccess) || ng.noop;
|
||||||
|
fn(scope, {e: evt, item: item, collection: collection});
|
||||||
|
});
|
||||||
|
evt.preventDefault();
|
||||||
|
resetStyle();
|
||||||
|
store.clean();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
element.bind('dragleave', resetStyle);
|
||||||
|
|
||||||
|
element.bind('dragover', function (evt) {
|
||||||
|
var className;
|
||||||
|
if (store.isHolding(key)) {
|
||||||
|
className = isAfter(evt.offsetX, evt.offsetY) ? 'lr-drop-target-after' : 'lr-drop-target-before';
|
||||||
|
if (classCache !== className && classCache !== null) {
|
||||||
|
element.removeClass(classCache);
|
||||||
|
}
|
||||||
|
if (classCache !== className) {
|
||||||
|
element.addClass(className);
|
||||||
|
}
|
||||||
|
classCache = className;
|
||||||
|
}
|
||||||
|
evt.preventDefault();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
})(angular);
|
Loading…
x
Reference in New Issue
Block a user