Initial commit.

This commit is contained in:
Thai Tran 2015-01-14 17:43:59 -08:00
commit 322d85b797
8 changed files with 316 additions and 0 deletions

7
MANIFEST.in Normal file
View 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
View 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
View 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
View 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
View File

@ -0,0 +1 @@
__import__('pkg_resources').declare_namespace(__name__)

1
xstatic/pkg/__init__.py Normal file
View File

@ -0,0 +1 @@
__import__('pkg_resources').declare_namespace(__name__)

View 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.
}

View 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);