Compare commits
76 Commits
Author | SHA1 | Date |
---|---|---|
Chakib Benziane | aaf4d75d44 | 9 years ago |
Chakib Benziane | 2bb247b9f7 | 9 years ago |
Chakib Benziane | 1b05f4ec63 | 9 years ago |
Chakib Benziane | 85585772e0 | 9 years ago |
Chakib Benziane | f08babe2b0 | 9 years ago |
Chakib Benziane | 15ad8a603e | 9 years ago |
Ariel Mashraki | a07d51c3e7 | 10 years ago |
Ariel Mashraki | 99764b1dc8 | 10 years ago |
Ariel Mashraki | 4ca796cddc | 10 years ago |
Ben Sinther | 144e73c581 | 10 years ago |
Ariel Mashraki | afd4abc9fb | 10 years ago |
Ariel Mashraki | 71e71fc3c0 | 10 years ago |
Ariel Mashraki | 83c8f8aabf | 10 years ago |
Eddie Monge | 0f4db7979b | 10 years ago |
Ariel Mashraki | 950450f637 | 10 years ago |
Ben Sinther | 63def516a6 | 10 years ago |
Ariel Mashraki | 0f28dadbd8 | 10 years ago |
Ariel Mashraki | e31b3eab5c | 10 years ago |
Subodh | df71bac63c | 10 years ago |
Ariel Mashraki | 6fe6f93783 | 10 years ago |
Gernot Höflechner | 1e14e3efa4 | 10 years ago |
Ariel Mashraki | 3c5e2ec435 | 10 years ago |
Ariel Mashraki | ae0c28aba9 | 10 years ago |
Ariel Mashraki | 6ae576d82e | 10 years ago |
Ariel Mashraki | e88c4f5f5f | 10 years ago |
Ariel Mashraki | 1b4fd8d451 | 10 years ago |
Ariel Mashraki | 9066f619d9 | 10 years ago |
Arthur Helmel | a71d928d0e | 10 years ago |
Ariel Mashraki | 5fc726c19c | 10 years ago |
Arthur Helmel | 8223e647c9 | 10 years ago |
Ariel Mashraki | dbd1913d9a | 10 years ago |
Brian Feister | 8e9638dccf | 10 years ago |
Ariel Mashraki | d85bdb5b24 | 10 years ago |
Ariel Mashraki | 94be1481aa | 10 years ago |
Ariel Mashraki | af9708d43b | 10 years ago |
Ariel Mashraki | 1917e5748c | 10 years ago |
Ariel Mashraki | 2d4b402739 | 10 years ago |
Ariel Mashraki | 52d04ad7ce | 10 years ago |
Ariel Mashraki | d4e3f76c38 | 10 years ago |
Gregory Pike | 9cf1e0729d | 10 years ago |
hermantran | cdf2dd07c3 | 10 years ago |
Ariel Mashraki | 6fdec3ed78 | 10 years ago |
Ariel Mashraki | 6a3c74b43a | 10 years ago |
Ariel Mashraki | a425b43caa | 10 years ago |
Gregory Pike | aef73ba676 | 10 years ago |
Ariel Mashraki | 3f3cd06bae | 10 years ago |
Ariel Mashraki | 45fd4c9d9d | 10 years ago |
Ariel Mashraki | 6d763a76c8 | 10 years ago |
Ariel Mashraki | bacadf1c0f | 10 years ago |
Ariel Mashraki | ed422c0476 | 10 years ago |
Lucas Andión Montáns | db87118a0c | 10 years ago |
Ariel Mashraki | 6db17f5ed9 | 10 years ago |
Ariel Mashraki | fe26708204 | 10 years ago |
Ariel Mashraki | ae13ec45fd | 10 years ago |
Ariel Mashraki | 5b9cd352ec | 10 years ago |
Ariel Mashraki | eeec036e9e | 10 years ago |
Ariel Mashraki | a10a1a7a05 | 10 years ago |
Ariel Mashraki | da357b763c | 10 years ago |
Ariel Mashraki | f95a2420c3 | 10 years ago |
Ariel Mashraki | 738e5cae75 | 10 years ago |
Den Teresh | 5948d2be36 | 10 years ago |
Den Teresh | 887b682815 | 10 years ago |
Kevin Salter | cbf90c4af3 | 10 years ago |
Ariel Mashraki | 36926d8cf5 | 10 years ago |
Ariel Mashraki | 97c504e7e3 | 10 years ago |
Ariel Mashraki | a8d48ff5c7 | 10 years ago |
Ariel Mashraki | 6dcc4f1a58 | 10 years ago |
Ariel Mashraki | b12cc0493d | 10 years ago |
Ariel Mashraki | d2bc39f2ba | 10 years ago |
Ariel Mashraki | 8a4bdc248b | 10 years ago |
Ariel Mashraki | 7493cd88e0 | 10 years ago |
Ariel Mashraki | 44575f4028 | 10 years ago |
Ariel Mashraki | fd2fc272fa | 10 years ago |
Gregory Pike | 4b25996bac | 10 years ago |
Ariel Mashraki | 82b59ed1b5 | 10 years ago |
Ariel Mashraki | bf33743093 | 10 years ago |
@ -0,0 +1,8 @@
|
||||
<a name="0.1.1"></a>
|
||||
# 0.1.1 (2014-10-06)
|
||||
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
- update your `index.html` file to reference angular-local-storage at its new
|
||||
path inside the `dist` directory `/angular-local-storage/dist/angular-local-storage.js`
|
@ -1,8 +1,8 @@
|
||||
Angular Local Storage
|
||||
Copyright 2013 Gregory Pike
|
||||
Copyright 2015 Gregory Pike
|
||||
|
||||
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.
|
||||
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.
|
||||
|
@ -1,60 +1,378 @@
|
||||
angular-local-storage
|
||||
=====================
|
||||
**Note to myself: Used for an other project, do not delete.**
|
||||
|
||||
An Angular module that gives you access to the browsers local storage
|
||||
An Angular module that gives you access to the browsers local storage, **v0.1.5**
|
||||
|
||||
[![Build Status](https://secure.travis-ci.org/grevory/angular-local-storage.png?branch=master)](https://travis-ci.org/grevory/)
|
||||
[![NPM version][npm-image]][npm-url]
|
||||
[![Build status][travis-image]][travis-url]
|
||||
[![Test coverage][coveralls-image]][coveralls-url]
|
||||
[![Dependency Status][david-image]][david-url]
|
||||
[![License][license-image]][license-url]
|
||||
[![Downloads][downloads-image]][downloads-url]
|
||||
|
||||
Installation:
|
||||
##Table of contents:
|
||||
- [Get Started](#get-started)
|
||||
- [Development](#development)
|
||||
- [Configuration](#configuration)
|
||||
- [setPrefix](#setprefix)
|
||||
- [setStorageType](#setstoragetype)
|
||||
- [setStorageCookie](#setstoragecookie)
|
||||
- [setStorageCookieDomain](#setstoragecookiedomain)
|
||||
- [setNotify](#setnotify)
|
||||
- [Example](#configuration-example)
|
||||
- [API Documentation](#api-documentation)
|
||||
- [isSupported](#issupported)
|
||||
- [getStorageType](#getstoragetype)
|
||||
- [set](#set)
|
||||
- [get](#get)
|
||||
- [keys](#keys)
|
||||
- [remove](#remove)
|
||||
- [clearAll](#clearall)
|
||||
- [bind](#bind)
|
||||
- [deriveKey](#derivekey)
|
||||
- [length](#length)
|
||||
- [cookie](#cookie)
|
||||
- [isSupported](#cookieissupported)
|
||||
- [set](#cookieset)
|
||||
- [get](#cookieget)
|
||||
- [remove](#cookieremove)
|
||||
- [clearAll](#cookieclearall)
|
||||
|
||||
##Get Started
|
||||
**(1)** You can install angular-local-storage using 2 different ways:<br/>
|
||||
**Git:**
|
||||
clone & build [this](https://github.com/grevory/angular-local-storage.git) repository<br/>
|
||||
**Bower:**
|
||||
```bash
|
||||
bower install angular-local-storage
|
||||
$ bower install angular-local-storage
|
||||
```
|
||||
**npm:**
|
||||
```bash
|
||||
$ npm install angular-local-storage
|
||||
```
|
||||
**(2)** Include `angular-local-storage.js` (or `angular-local-storage.min.js`) in your `index.html`, after including Angular itself.
|
||||
|
||||
Example use:
|
||||
|
||||
```javascript
|
||||
angular.module('yourModule', ['LocalStorageModule'])
|
||||
.controller('yourCtrl', [
|
||||
'$scope',
|
||||
'localStorageService',
|
||||
function($scope, localStorageService) {
|
||||
// Start fresh
|
||||
localStorageService.clearAll();
|
||||
**(3)** Add `'LocalStorageModule'` to your main module's list of dependencies.
|
||||
|
||||
// Set a key
|
||||
localStorageService.set('Favorite Sport','Ultimate Frisbee');
|
||||
When you're done, your setup should look similar to the following:
|
||||
|
||||
// Delete a key
|
||||
localStorageService.remove('Favorite Sport');
|
||||
}]);
|
||||
```html
|
||||
<!doctype html>
|
||||
<html ng-app="myApp">
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
...
|
||||
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
|
||||
<script src="bower_components/js/angular-local-storage.min.js"></script>
|
||||
...
|
||||
<script>
|
||||
var myApp = angular.module('myApp', ['LocalStorageModule']);
|
||||
|
||||
/*
|
||||
To set the prefix of your localStorage name, you can use the setPrefix method
|
||||
available on the localStorageServiceProvider
|
||||
*/
|
||||
angular.module('yourModule', ['LocalStorageModule'])
|
||||
.config(['localStorageServiceProvider', function(localStorageServiceProvider){
|
||||
localStorageServiceProvider.setPrefix('newPrefix');
|
||||
}]);
|
||||
</script>
|
||||
...
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
#### How to bind to a $scope variable:
|
||||
Usage: localStorageService.bind(scope, scopeKey, def, lsKey);
|
||||
##Configuration
|
||||
###setPrefix
|
||||
You could set a prefix to avoid overwriting any local storage variables from the rest of your app<br/>
|
||||
**Default prefix:** `ls.<your-key>`
|
||||
```js
|
||||
myApp.config(function (localStorageServiceProvider) {
|
||||
localStorageServiceProvider
|
||||
.setPrefix('yourAppName');
|
||||
});
|
||||
```
|
||||
###setStorageType
|
||||
You could change web storage type to localStorage or sessionStorage<br/>
|
||||
**Default storage:** `localStorage`
|
||||
```js
|
||||
myApp.config(function (localStorageServiceProvider) {
|
||||
localStorageServiceProvider
|
||||
.setStorageType('sessionStorage');
|
||||
});
|
||||
```
|
||||
###setStorageCookie
|
||||
Set cookie options (usually in case of fallback)<br/>
|
||||
**expiry:** number of days before cookies expire (0 = does not expire). **default:** `30`<br/>
|
||||
**path:** the web path the cookie represents. **default:** `'/'`
|
||||
```js
|
||||
myApp.config(function (localStorageServiceProvider) {
|
||||
localStorageServiceProvider
|
||||
.setStorageCookie(45, '<path>');
|
||||
});
|
||||
```
|
||||
###setStorageCookieDomain
|
||||
Set the cookie domain, since this runs inside a the `config()` block, only providers and constants can be injected. As a result, `$location` service can't be used here, use a hardcoded string or `window.location`.<br/>
|
||||
**No default value**
|
||||
```js
|
||||
myApp.config(function (localStorageServiceProvider) {
|
||||
localStorageServiceProvider
|
||||
.setStorageCookieDomain('<domain>');
|
||||
});
|
||||
```
|
||||
// Example
|
||||
$scope.anArtist = {'firstname':'Pablo', 'lastname':'Picasso'};
|
||||
|
||||
// Bind to local storage service
|
||||
localStorageService.bind($scope, 'anArtist', $scope.anArtist, 'specialArtist');
|
||||
For local testing (when you are testing on localhost) set the domain to an empty string ''. Setting the domain to 'localhost' will not work on all browsers (eg. Chrome) since some browsers only allow you to set domain cookies for registry controlled domains, i.e. something ending in .com or so, but not IPs **or intranet hostnames** like localhost. </br>
|
||||
|
||||
// get bound data:
|
||||
console.log(localStorageService.get('specialArtist'));
|
||||
###setNotify
|
||||
Send signals for each of the following actions:<br/>
|
||||
**setItem** , default: `true`<br/>
|
||||
**removeItem** , default: `false`
|
||||
```js
|
||||
myApp.config(function (localStorageServiceProvider) {
|
||||
localStorageServiceProvider
|
||||
.setNotify(true, true);
|
||||
});
|
||||
```
|
||||
###Configuration Example
|
||||
Using all together
|
||||
```js
|
||||
myApp.config(function (localStorageServiceProvider) {
|
||||
localStorageServiceProvider
|
||||
.setPrefix('myApp')
|
||||
.setStorageType('sessionStorage')
|
||||
.setNotify(true, true)
|
||||
});
|
||||
```
|
||||
##API Documentation
|
||||
##isSupported
|
||||
Checks if the browser support the current storage type(e.g: `localStorage`, `sessionStorage`).
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
if(localStorageService.isSupported) {
|
||||
//...
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###getStorageType
|
||||
**Returns:** `String`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
var storageType = localStorageService.getStorageType(); //e.g localStorage
|
||||
//...
|
||||
});
|
||||
```
|
||||
###set
|
||||
Directly adds a value to local storage.<br/>
|
||||
If local storage is not supported, use cookies instead.<br/>
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function submit(key, val) {
|
||||
return localStorageService.set(key, val);
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###get
|
||||
Directly get a value from local storage.<br/>
|
||||
If local storage is not supported, use cookies instead.<br/>
|
||||
**Returns:** `value from local storage`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function getItem(key) {
|
||||
return localStorageService.get(key);
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###keys
|
||||
Return array of keys for local storage, ignore keys that not owned.<br/>
|
||||
**Returns:** `value from local storage`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
var lsKeys = localStorageService.keys();
|
||||
//...
|
||||
});
|
||||
```
|
||||
###remove
|
||||
Remove an item from local storage by key.<br/>
|
||||
If local storage is not supported, use cookies instead.<br/>
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function removeItem(key) {
|
||||
return localStorageService.remove(key);
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###clearAll
|
||||
Remove all data for this app from local storage.<br/>
|
||||
If local storage is not supported, use cookies instead.<br/>
|
||||
**Note:** Optionally takes a regular expression string and removes matching.<br/>
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function clearNumbers(key) {
|
||||
return localStorageService.clearAll(/^\d+$/);
|
||||
}
|
||||
//...
|
||||
function clearAll() {
|
||||
return localStorageService.clearAll();
|
||||
}
|
||||
});
|
||||
```
|
||||
###bind
|
||||
Bind $scope key to localStorageService.
|
||||
**Usage:** `localStorageService.bind(scope, property, value[optional], key[optional])`
|
||||
***key:*** The corresponding key used in local storage
|
||||
**Returns:** deregistration function for this listener.
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
localStorageService.set('property', 'oldValue');
|
||||
$scope.unbind = localStorageService.bind($scope, 'property');
|
||||
|
||||
//Test Changes
|
||||
$scope.update = function(val) {
|
||||
$scope.property = val;
|
||||
$timeout(function() {
|
||||
alert("localStorage value: " + localStorageService.get('property'));
|
||||
});
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
```html
|
||||
<div ng-controller="MainCtrl">
|
||||
<p>{{property}}</p>
|
||||
<input type="text" ng-model="lsValue"/>
|
||||
<button ng-click="update(lsValue)">update</button>
|
||||
<button ng-click="unbind()">unbind</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
###deriveKey
|
||||
Return the derive key
|
||||
**Returns** `String`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
localStorageService.set('property', 'oldValue');
|
||||
//Test Result
|
||||
console.log(localStorageService.deriveKey('property')); // ls.property
|
||||
//...
|
||||
});
|
||||
```
|
||||
###length
|
||||
Return localStorageService.length, ignore keys that not owned.
|
||||
**Returns** `Number`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
var lsLength = localStorageService.length(); // e.g: 7
|
||||
//...
|
||||
});
|
||||
```
|
||||
##Cookie
|
||||
Deal with browser's cookies directly.
|
||||
##cookie.isSupported
|
||||
Checks if cookies are enabled in the browser.
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
if(localStorageService.cookie.isSupported) {
|
||||
//...
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###cookie.set
|
||||
Directly adds a value to cookies.<br/>
|
||||
**Note:** Typically used as a fallback if local storage is not supported.<br/>
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function submit(key, val) {
|
||||
return localStorageService.cookie.set(key, val);
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###cookie.get
|
||||
Directly get a value from a cookie.<br/>
|
||||
**Returns:** `value from local storage`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function getItem(key) {
|
||||
return localStorageService.cookie.get(key);
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###cookie.remove
|
||||
Remove directly value from a cookie.<br/>
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function removeItem(key) {
|
||||
return localStorageService.cookie.remove(key);
|
||||
}
|
||||
//...
|
||||
});
|
||||
```
|
||||
###cookie.clearAll
|
||||
Remove all data for this app from cookie.<br/>
|
||||
**Returns:** `Boolean`
|
||||
```js
|
||||
myApp.controller('MainCtrl', function($scope, localStorageService) {
|
||||
//...
|
||||
function clearAll() {
|
||||
return localStorageService.cookie.clearAll();
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
Check out the full demo at http://gregpike.net/demos/angular-local-storage/demo.html
|
||||
|
||||
Check out the full demo and documentation at http://gregpike.net/demos/angular-local-storage/demo.html
|
||||
##Development:
|
||||
* Don't forget about tests.
|
||||
* If you planning add some feature please create issue before.
|
||||
|
||||
To do:
|
||||
- Add tests
|
||||
- Expand Readme
|
||||
Clone the project:
|
||||
```sh
|
||||
$ git clone https://github.com/<your-repo>/angular-local-storage.git
|
||||
$ npm install
|
||||
$ bower install
|
||||
```
|
||||
Run the tests:
|
||||
```sh
|
||||
$ grunt test
|
||||
```
|
||||
**Deploy:**<br/>
|
||||
Run the build task, update version before(bower,package)
|
||||
```sh
|
||||
$ grunt dist
|
||||
$ git tag 0.*.*
|
||||
$ git push origin master --tags
|
||||
```
|
||||
|
||||
[npm-image]: https://img.shields.io/npm/v/angular-local-storage.svg?style=flat-square
|
||||
[npm-url]: https://npmjs.org/package/angular-local-storage
|
||||
[travis-image]: https://img.shields.io/travis/grevory/angular-local-storage.svg?style=flat-square
|
||||
[travis-url]: https://travis-ci.org/grevory/angular-local-storage
|
||||
[coveralls-image]: https://img.shields.io/coveralls/grevory/angular-local-storage.svg?style=flat-square
|
||||
[coveralls-url]: https://coveralls.io/r/grevory/angular-local-storage
|
||||
[david-image]: http://img.shields.io/david/grevory/angular-local-storage.svg?style=flat-square
|
||||
[david-url]: https://david-dm.org/grevory/angular-local-storage
|
||||
[license-image]: http://img.shields.io/npm/l/angular-local-storage.svg?style=flat-square
|
||||
[license-url]: LICENSE
|
||||
[downloads-image]: http://img.shields.io/npm/dm/angular-local-storage.svg?style=flat-square
|
||||
[downloads-url]: https://npmjs.org/package/angular-local-storage
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* An Angular module that gives you access to the browsers local storage
|
||||
* @version v0.0.8 - 2014-08-15
|
||||
* @version v0.1.5 - 2015-01-22
|
||||
* @link https://github.com/grevory/angular-local-storage
|
||||
* @author grevory <greg@gregpike.ca>
|
||||
* @license MIT License, http://www.opensource.org/licenses/MIT
|
||||
*/!function(a,b){"use strict";var c=b.module("LocalStorageModule",[]);c.provider("localStorageService",function(){this.prefix="ls",this.storageType="localStorage",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){this.prefix=a},this.setStorageType=function(a){this.storageType=a},this.setStorageCookie=function(a,b){this.cookie={expiry:a,path:b}},this.setStorageCookieDomain=function(a){this.cookie.domain=a},this.setNotify=function(a,b){this.notify={setItem:a,removeItem:b}},this.$get=["$rootScope","$window","$document",function(a,c,d){var e,f=this,g=f.prefix,h=f.cookie,i=f.notify,j=f.storageType;d?d[0]&&(d=d[0]):d=document,"."!==g.substr(-1)&&(g=g?g+".":"");var k=function(a){return g+a},l=function(){try{var b=j in c&&null!==c[j],d=k("__"+Math.round(1e7*Math.random()));return b&&(e=c[j],e.setItem(d,""),e.removeItem(d)),b}catch(f){return j="cookie",a.$broadcast("LocalStorageModule.notification.error",f.message),!1}}(),m=function(c,d){if(!l||"cookie"===f.storageType)return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),i.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:c,newvalue:d,storageType:"cookie"}),s(c,d);"undefined"==typeof d&&(d=null);try{(b.isObject(d)||b.isArray(d))&&(d=b.toJson(d)),e&&e.setItem(k(c),d),i.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:c,newvalue:d,storageType:f.storageType})}catch(g){return a.$broadcast("LocalStorageModule.notification.error",g.message),s(c,d)}return!0},n=function(c){if(!l||"cookie"===f.storageType)return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),t(c);var d=e?e.getItem(k(c)):null;return d&&"null"!==d?"{"===d.charAt(0)||"["===d.charAt(0)?b.fromJson(d):d:null},o=function(b){if(!l)return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),i.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:b,storageType:"cookie"}),u(b);try{e.removeItem(k(b)),i.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:b,storageType:f.storageType})}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),u(b)}return!0},p=function(){if(!l)return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),!1;var b=g.length,c=[];for(var d in e)if(d.substr(0,b)===g)try{c.push(d.substr(b))}catch(f){return a.$broadcast("LocalStorageModule.notification.error",f.Description),[]}return c},q=function(b){b=b||"";var c=g.slice(0,-1),d=new RegExp(c+"."+b);if(!l)return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),v();var f=g.length;for(var h in e)if(d.test(h))try{o(h.substr(f))}catch(i){return a.$broadcast("LocalStorageModule.notification.error",i.message),v()}return!0},r=function(){try{return navigator.cookieEnabled||"cookie"in d&&(d.cookie.length>0||(d.cookie="test").indexOf.call(d.cookie,"test")>-1)}catch(b){return a.$broadcast("LocalStorageModule.notification.error",b.message),!1}},s=function(b,c){if("undefined"==typeof c)return!1;if(!r())return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var e="",f=new Date,g="";if(null===c?(f.setTime(f.getTime()+-864e5),e="; expires="+f.toGMTString(),c=""):0!==h.expiry&&(f.setTime(f.getTime()+24*h.expiry*60*60*1e3),e="; expires="+f.toGMTString()),b){var i="; path="+h.path;h.domain&&(g="; domain="+h.domain),d.cookie=k(b)+"="+encodeURIComponent(c)+e+i+g}}catch(j){return a.$broadcast("LocalStorageModule.notification.error",j.message),!1}return!0},t=function(b){if(!r())return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var c=d.cookie&&d.cookie.split(";")||[],e=0;e<c.length;e++){for(var f=c[e];" "===f.charAt(0);)f=f.substring(1,f.length);if(0===f.indexOf(k(b)+"="))return decodeURIComponent(f.substring(g.length+b.length+1,f.length))}return null},u=function(a){s(a,null)},v=function(){for(var a=null,b=g.length,c=d.cookie.split(";"),e=0;e<c.length;e++){for(a=c[e];" "===a.charAt(0);)a=a.substring(1,a.length);var f=a.substring(b,a.indexOf("="));u(f)}},w=function(){return j},x=function(a,c,d){var e=n(c);null===e&&b.isDefined(d)?e=d:b.isObject(e)&&b.isObject(d)&&(e=b.extend(d,e)),a[c]=e,a.$watchCollection(c,function(a){m(c,a)})};return{isSupported:l,getStorageType:w,set:m,add:m,get:n,keys:p,remove:o,clearAll:q,bind:x,deriveKey:k,cookie:{set:s,add:s,get:t,remove:u,clearAll:v}}}]})}(window,window.angular);
|
||||
*/!function(a,b){"use strict";function c(a){return/^-?\d+\.?\d*$/.test(a.replace(/["']/g,""))}var d=b.isDefined,e=b.isUndefined,f=b.isNumber,g=b.isObject,h=b.isArray,i=b.extend,j=b.toJson,k=b.fromJson,l=b.module("LocalStorageModule",[]);l.provider("localStorageService",function(){this.prefix="ls",this.storageType="localStorage",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){return this.prefix=a,this},this.setStorageType=function(a){return this.storageType=a,this},this.setStorageCookie=function(a,b){return this.cookie={expiry:a,path:b},this},this.setStorageCookieDomain=function(a){return this.cookie.domain=a,this},this.setNotify=function(a,b){return this.notify={setItem:a,removeItem:b},this},this.$get=["$rootScope","$window","$document","$parse",function(a,b,l,m){var n,o=this,p=o.prefix,q=o.cookie,r=o.notify,s=o.storageType;l?l[0]&&(l=l[0]):l=document,"."!==p.substr(-1)&&(p=p?p+".":"");var t=function(a){return p+a},u=function(){try{var c=s in b&&null!==b[s],d=t("__"+Math.round(1e7*Math.random()));return c&&(n=b[s],n.setItem(d,""),n.removeItem(d)),c}catch(e){return s="cookie",a.$broadcast("LocalStorageModule.notification.error",e.message),!1}}(),v=function(b,c){if(e(c)?c=null:(g(c)||h(c)||f(+c||c))&&(c=j(c)),!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),r.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:"cookie"}),B(b,c);try{(g(c)||h(c))&&(c=j(c)),n&&n.setItem(t(b),c),r.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:o.storageType})}catch(d){return a.$broadcast("LocalStorageModule.notification.error",d.message),B(b,c)}return!0},w=function(b){if(!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),C(b);var d=n?n.getItem(t(b)):null;return d&&"null"!==d?"{"===d.charAt(0)||"["===d.charAt(0)||c(d)?k(d):d:null},x=function(b){if(!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),r.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:b,storageType:"cookie"}),D(b);try{n.removeItem(t(b)),r.removeItem&&a.$broadcast("LocalStorageModule.notification.removeitem",{key:b,storageType:o.storageType})}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),D(b)}return!0},y=function(){if(!u)return a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),!1;var b=p.length,c=[];for(var d in n)if(d.substr(0,b)===p)try{c.push(d.substr(b))}catch(e){return a.$broadcast("LocalStorageModule.notification.error",e.Description),[]}return c},z=function(b){b=b||"";var c=p.slice(0,-1),d=new RegExp(c+"."+b);if(!u||"cookie"===o.storageType)return u||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),E();var e=p.length;for(var f in n)if(d.test(f))try{x(f.substr(e))}catch(g){return a.$broadcast("LocalStorageModule.notification.error",g.message),E()}return!0},A=function(){try{return b.navigator.cookieEnabled||"cookie"in l&&(l.cookie.length>0||(l.cookie="test").indexOf.call(l.cookie,"test")>-1)}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),!1}}(),B=function(b,c){if(e(c))return!1;if((h(c)||g(c))&&(c=j(c)),!A)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var d="",f=new Date,i="";if(null===c?(f.setTime(f.getTime()+-864e5),d="; expires="+f.toGMTString(),c=""):0!==q.expiry&&(f.setTime(f.getTime()+24*q.expiry*60*60*1e3),d="; expires="+f.toGMTString()),b){var k="; path="+q.path;q.domain&&(i="; domain="+q.domain),l.cookie=t(b)+"="+encodeURIComponent(c)+d+k+i}}catch(m){return a.$broadcast("LocalStorageModule.notification.error",m.message),!1}return!0},C=function(b){if(!A)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var c=l.cookie&&l.cookie.split(";")||[],d=0;d<c.length;d++){for(var e=c[d];" "===e.charAt(0);)e=e.substring(1,e.length);if(0===e.indexOf(t(b)+"=")){var f=decodeURIComponent(e.substring(p.length+b.length+1,e.length));try{var g=JSON.parse(f);return k(g)}catch(h){return f}}}return null},D=function(a){B(a,null)},E=function(){for(var a=null,b=p.length,c=l.cookie.split(";"),d=0;d<c.length;d++){for(a=c[d];" "===a.charAt(0);)a=a.substring(1,a.length);var e=a.substring(b,a.indexOf("="));D(e)}},F=function(){return s},G=function(a,b,c,e){e=e||b;var f=w(e);return null===f&&d(c)?f=c:g(f)&&g(c)&&(f=i(c,f)),m(b).assign(a,f),a.$watch(b,function(a){v(e,a)},g(a[b]))},H=function(){for(var a=0,c=b[s],d=0;d<c.length;d++)0===c.key(d).indexOf(p)&&a++;return a};return{isSupported:u,getStorageType:F,set:v,put:v,add:v,get:w,keys:y,remove:x,clearAll:z,bind:G,deriveKey:t,length:H,cookie:{isSupported:A,set:B,add:B,get:C,remove:D,clearAll:E}}}]})}(window,window.angular);
|
@ -0,0 +1,18 @@
|
||||
/*jshint globalstrict:true*/
|
||||
'use strict';
|
||||
|
||||
var isDefined = angular.isDefined,
|
||||
isUndefined = angular.isUndefined,
|
||||
isNumber = angular.isNumber,
|
||||
isObject = angular.isObject,
|
||||
isArray = angular.isArray,
|
||||
extend = angular.extend,
|
||||
toJson = angular.toJson,
|
||||
fromJson = angular.fromJson;
|
||||
|
||||
|
||||
// Test if string is only contains numbers
|
||||
// e.g '1' => true, "'1'" => true
|
||||
function isStringNumber(num) {
|
||||
return /^-?\d+\.?\d*$/.test(num.replace(/["']/g, ''));
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
'use strict';
|
||||
//Mock localStorage
|
||||
function localStorageMock() {
|
||||
var storage = {};
|
||||
Object.defineProperties(storage, {
|
||||
setItem: {
|
||||
value: function(key, value) {
|
||||
storage[key] = value || '';
|
||||
},
|
||||
enumerable: false,
|
||||
writable: true
|
||||
},
|
||||
getItem: {
|
||||
value: function(key) {
|
||||
return storage[key];
|
||||
},
|
||||
enumerable: false,
|
||||
writable: true
|
||||
},
|
||||
removeItem: {
|
||||
value: function(key) {
|
||||
delete storage[key];
|
||||
},
|
||||
enumerable: false,
|
||||
writable: true
|
||||
},
|
||||
length: {
|
||||
get: function() {
|
||||
return Object.keys(storage).length;
|
||||
},
|
||||
enumerable: false
|
||||
},
|
||||
key: {
|
||||
value: function(i) {
|
||||
var aKeys = Object.keys(storage);
|
||||
return aKeys[i] || null;
|
||||
},
|
||||
enumerable: false
|
||||
}
|
||||
});
|
||||
return storage;
|
||||
}
|
Reference in New Issue