From 5a6671713d83fc80f8f1b3733864128d96ce9ec7 Mon Sep 17 00:00:00 2001 From: xinni-ge Date: Wed, 7 Mar 2018 16:30:47 +0900 Subject: [PATCH] Add angular-notify 1.0.0 An initial commit providing javascript, scss and other meta files. --- .gitignore | 9 + LICENSE | 22 +++ MANIFEST.in | 6 + README.txt | 13 ++ setup.cfg | 20 ++ setup.py | 25 +++ tox.ini | 8 + xstatic/__init__.py | 1 + xstatic/pkg/__init__.py | 1 + xstatic/pkg/angular_notify/__init__.py | 50 +++++ .../pkg/angular_notify/data/angular-notify.js | 184 ++++++++++++++++++ .../angular_notify/data/angular-notify.scss | 83 ++++++++ 12 files changed, 422 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 README.txt create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 tox.ini create mode 100644 xstatic/__init__.py create mode 100644 xstatic/pkg/__init__.py create mode 100644 xstatic/pkg/angular_notify/__init__.py create mode 100644 xstatic/pkg/angular_notify/data/angular-notify.js create mode 100644 xstatic/pkg/angular_notify/data/angular-notify.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b3085b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.pyc +*.sw? +*.sqlite3 +.DS_STORE +*.egg-info +.venv +.tox +build +dist diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e775e39 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright 2013 Chris Gross + +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. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..af3cdd3 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,6 @@ +include README.txt +recursive-include xstatic * +global-exclude *.pyc +global-exclude *.pyo +global-exclude *.orig +global-exclude *.rej diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..9b4136c --- /dev/null +++ b/README.txt @@ -0,0 +1,13 @@ +XStatic-Angular-Notify +-------------- + +Angular-Notify JavaScript and SCSS 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`. + diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..3b34a14 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,20 @@ +[metadata] +name = XStatic-Angular-Notify +description = Angular-Notify 2.5.1 (XStatic packaging standard) +description-file = README.rst +maintainer = xinni.ge +maintainer-email = xinni.ge@ntt.com +home-page = https://github.com/cgross/angular-notify +keywords = angular_notify xstatic +license = MIT +zip_safe = False +namespace_packages = + xstatic + xstatic.pkg + +[files] +packages = + xstatic + +[bdist_wheel] +universal = True diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..b839535 --- /dev/null +++ b/setup.py @@ -0,0 +1,25 @@ +from setuptools import setup, find_packages +from xstatic.pkg import angular_notify 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() + +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=[], +) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..9e60b20 --- /dev/null +++ b/tox.ini @@ -0,0 +1,8 @@ +[tox] +minversion = 1.6 +skipsdist = True +envlist = py27,py33,py34 + +[testenv:venv] +commands = {posargs} + diff --git a/xstatic/__init__.py b/xstatic/__init__.py new file mode 100644 index 0000000..de40ea7 --- /dev/null +++ b/xstatic/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/xstatic/pkg/__init__.py b/xstatic/pkg/__init__.py new file mode 100644 index 0000000..de40ea7 --- /dev/null +++ b/xstatic/pkg/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/xstatic/pkg/angular_notify/__init__.py b/xstatic/pkg/angular_notify/__init__.py new file mode 100644 index 0000000..bcdb581 --- /dev/null +++ b/xstatic/pkg/angular_notify/__init__.py @@ -0,0 +1,50 @@ +""" +XStatic resource package + +See package 'XStatic' for documentation and basic tools. +""" + +DISPLAY_NAME = 'Angular-Notify' # official name, upper/lowercase allowed, no spaces +PACKAGE_NAME = 'XStatic-%s' % DISPLAY_NAME # name used for PyPi + +NAME = __name__.split('.')[-1] # package name (e.g. 'foo' or 'foo_bar') + # please use a all-lowercase valid python + # package name + +VERSION = '2.5.1' # 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 = '%s xstatic' % NAME + +# XStatic-* package maintainer: +MAINTAINER = 'xinni.ge' +MAINTAINER_EMAIL = 'xinni.ge@ntt.com' + +# this refers to the project homepage of the stuff we packaged: +HOMEPAGE = 'https://github.com/cgross/angular-notify' + +# this refers to all files: +LICENSE = 'MIT' + +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/angular-notify' + +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. +} + diff --git a/xstatic/pkg/angular_notify/data/angular-notify.js b/xstatic/pkg/angular_notify/data/angular-notify.js new file mode 100644 index 0000000..6b02529 --- /dev/null +++ b/xstatic/pkg/angular_notify/data/angular-notify.js @@ -0,0 +1,184 @@ +angular.module('cgNotify', []).factory('notify',['$timeout','$http','$compile','$templateCache','$rootScope', + function($timeout,$http,$compile,$templateCache,$rootScope){ + + var startTop = 10; + var verticalSpacing = 15; + var defaultDuration = 10000; + var defaultTemplateUrl = 'angular-notify.html'; + var position = 'center'; + var container = document.body; + var maximumOpen = 0; + + var messageElements = []; + var openNotificationsScope = []; + + var notify = function(args){ + + if (typeof args !== 'object'){ + args = {message:args}; + } + + args.duration = args.duration ? args.duration : defaultDuration; + args.templateUrl = args.templateUrl ? args.templateUrl : defaultTemplateUrl; + args.container = args.container ? args.container : container; + args.classes = args.classes ? args.classes : ''; + + var scope = args.scope ? args.scope.$new() : $rootScope.$new(); + scope.$position = args.position ? args.position : position; + scope.$message = args.message; + scope.$classes = args.classes; + scope.$messageTemplate = args.messageTemplate; + + if (maximumOpen > 0) { + var numToClose = (openNotificationsScope.length + 1) - maximumOpen; + for (var i = 0; i < numToClose; i++) { + openNotificationsScope[i].$close(); + } + } + + $http.get(args.templateUrl,{cache: $templateCache}).then(function(template){ + + var templateElement = $compile(template.data)(scope); + templateElement.bind('webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd', function(e){ + if (e.propertyName === 'opacity' || e.currentTarget.style.opacity === 0 || + (e.originalEvent && e.originalEvent.propertyName === 'opacity')){ + + templateElement.remove(); + messageElements.splice(messageElements.indexOf(templateElement),1); + openNotificationsScope.splice(openNotificationsScope.indexOf(scope),1); + layoutMessages(); + } + }); + + if (args.messageTemplate){ + var messageTemplateElement; + for (var i = 0; i < templateElement.children().length; i ++){ + if (angular.element(templateElement.children()[i]).hasClass('cg-notify-message-template')){ + messageTemplateElement = angular.element(templateElement.children()[i]); + break; + } + } + if (messageTemplateElement){ + messageTemplateElement.append($compile(args.messageTemplate)(scope)); + } else { + throw new Error('cgNotify could not find the .cg-notify-message-template element in '+args.templateUrl+'.'); + } + } + + angular.element(args.container).append(templateElement); + messageElements.push(templateElement); + + if (scope.$position === 'center'){ + $timeout(function(){ + scope.$centerMargin = '-' + (templateElement[0].offsetWidth /2) + 'px'; + }); + } + + scope.$close = function(){ + templateElement.css('opacity',0).attr('data-closing','true'); + layoutMessages(); + }; + + var layoutMessages = function(){ + var j = 0; + var currentY = startTop; + for(var i = messageElements.length - 1; i >= 0; i --){ + var shadowHeight = 10; + var element = messageElements[i]; + var height = element[0].offsetHeight; + var top = currentY + height + shadowHeight; + if (element.attr('data-closing')){ + top += 20; + } else { + currentY += height + verticalSpacing; + } + element.css('top',top + 'px').css('margin-top','-' + (height+shadowHeight) + 'px').css('visibility','visible'); + j ++; + } + }; + + $timeout(function(){ + layoutMessages(); + }); + + if (args.duration > 0){ + $timeout(function(){ + scope.$close(); + },args.duration); + } + + }, function(data) { + throw new Error('Template specified for cgNotify ('+args.templateUrl+') could not be loaded. ' + data); + }); + + var retVal = {}; + + retVal.close = function(){ + if (scope.$close){ + scope.$close(); + } + }; + + Object.defineProperty(retVal,'message',{ + get: function(){ + return scope.$message; + }, + set: function(val){ + scope.$message = val; + } + }); + + openNotificationsScope.push(scope); + + return retVal; + + }; + + notify.config = function(args){ + startTop = !angular.isUndefined(args.startTop) ? args.startTop : startTop; + verticalSpacing = !angular.isUndefined(args.verticalSpacing) ? args.verticalSpacing : verticalSpacing; + defaultDuration = !angular.isUndefined(args.duration) ? args.duration : defaultDuration; + defaultTemplateUrl = args.templateUrl ? args.templateUrl : defaultTemplateUrl; + position = !angular.isUndefined(args.position) ? args.position : position; + container = args.container ? args.container : container; + maximumOpen = args.maximumOpen ? args.maximumOpen : maximumOpen; + }; + + notify.closeAll = function(){ + for(var i = messageElements.length - 1; i >= 0; i --){ + var element = messageElements[i]; + element.css('opacity',0); + } + }; + + return notify; + } +]); + +angular.module('cgNotify').run(['$templateCache', function($templateCache) { + 'use strict'; + + $templateCache.put('angular-notify.html', + "
\n" + + "\n" + + "
\n" + + " {$ $message $}\n" + + "
\n" + + "\n" + + "
\n" + + " \n" + + "
\n" + + "\n" + + " \n" + + "\n" + + "
" + ); + +}]); diff --git a/xstatic/pkg/angular_notify/data/angular-notify.scss b/xstatic/pkg/angular_notify/data/angular-notify.scss new file mode 100644 index 0000000..ec993f9 --- /dev/null +++ b/xstatic/pkg/angular_notify/data/angular-notify.scss @@ -0,0 +1,83 @@ +.cg-notify-message { + position:fixed; + top:0px; + z-index: 9999; + max-width:400px; + text-align: center; + + background-color: #d9edf7; + color: #31708f; + padding: 15px; + border: 1px solid #bce8f1; + border-radius: 4px; + + -webkit-transition: top 0.5s ease-out,opacity 0.2s ease-out; + -moz-transition: top 0.5s ease-out,opacity 0.2s ease-out; + -o-transition: top 0.5s ease-out,opacity 0.2s ease-out; + transition: top 0.5s ease-out,opacity 0.2s ease-out; + + visibility:hidden; + + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); + box-shadow: 0 6px 12px rgba(0,0,0,.175); +} + +.cg-notify-message-center { + left:50%; +} + +.cg-notify-message-left { + left:15px; +} + +.cg-notify-message-right { + right:15px; +} + +.cg-notify-message a { + font-weight:bold; + color:inherit; +} + +.cg-notify-message a:hover { + color:inherit; +} + +.cg-notify-close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: 0 0; + border: 0; + font-size: 21px; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; + + position: absolute; + top: 0px; + right: 3px; + line-height: 15px; +} + +.cg-notify-close:hover, .cg-notify-close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} + +.cg-notify-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} \ No newline at end of file