mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
172 lines
5.2 KiB
JavaScript
172 lines
5.2 KiB
JavaScript
/*
|
|
* Angular.js localStorage module
|
|
* https://github.com/agrublev/angularLocalStorage
|
|
*/
|
|
|
|
(function (window, angular, undefined) {
|
|
'use strict';
|
|
|
|
angular.module('angularLocalStorage', ['ngCookies']).factory('storage', ['$parse', '$cookieStore', '$window', '$log', function ($parse, $cookieStore, $window, $log) {
|
|
/**
|
|
* Global Vars
|
|
*/
|
|
var storage = (typeof $window.localStorage === 'undefined') ? undefined : $window.localStorage;
|
|
var supported = typeof storage !== 'undefined';
|
|
|
|
var privateMethods = {
|
|
/**
|
|
* Pass any type of a string from the localStorage to be parsed so it returns a usable version (like an Object)
|
|
* @param res - a string that will be parsed for type
|
|
* @returns {*} - whatever the real type of stored value was
|
|
*/
|
|
parseValue: function (res) {
|
|
var val;
|
|
try {
|
|
val = angular.fromJson(res);
|
|
if (typeof val === 'undefined') {
|
|
val = res;
|
|
}
|
|
if (val === 'true') {
|
|
val = true;
|
|
}
|
|
if (val === 'false') {
|
|
val = false;
|
|
}
|
|
if ($window.parseFloat(val) === val && !angular.isObject(val)) {
|
|
val = $window.parseFloat(val);
|
|
}
|
|
} catch (e) {
|
|
val = res;
|
|
}
|
|
return val;
|
|
}
|
|
};
|
|
|
|
var publicMethods = {
|
|
/**
|
|
* Set - let's you set a new localStorage key pair set
|
|
* @param key - a string that will be used as the accessor for the pair
|
|
* @param value - the value of the localStorage item
|
|
* @returns {*} - will return whatever it is you've stored in the local storage
|
|
*/
|
|
set: function (key, value) {
|
|
if (!supported) {
|
|
try {
|
|
$cookieStore.put(key, value);
|
|
return value;
|
|
} catch(e) {
|
|
$log.log('Local Storage not supported, make sure you have angular-cookies enabled.');
|
|
}
|
|
}
|
|
var saver = angular.toJson(value);
|
|
storage.setItem(key, saver);
|
|
return privateMethods.parseValue(saver);
|
|
},
|
|
|
|
/**
|
|
* Get - let's you get the value of any pair you've stored
|
|
* @param key - the string that you set as accessor for the pair
|
|
* @returns {*} - Object,String,Float,Boolean depending on what you stored
|
|
*/
|
|
get: function (key) {
|
|
if (!supported) {
|
|
try {
|
|
return privateMethods.parseValue($.cookie(key));
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
var item = storage.getItem(key);
|
|
return privateMethods.parseValue(item);
|
|
},
|
|
|
|
/**
|
|
* Remove - let's you nuke a value from localStorage
|
|
* @param key - the accessor value
|
|
* @returns {boolean} - if everything went as planned
|
|
*/
|
|
remove: function (key) {
|
|
if (!supported) {
|
|
try {
|
|
$cookieStore.remove(key);
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
storage.removeItem(key);
|
|
return true;
|
|
},
|
|
|
|
/**
|
|
* Bind - let's you directly bind a localStorage value to a $scope variable
|
|
* @param {Angular $scope} $scope - the current scope you want the variable available in
|
|
* @param {String} key - the name of the variable you are binding
|
|
* @param {Object} opts - (optional) custom options like default value or unique store name
|
|
* Here are the available options you can set:
|
|
* * defaultValue: the default value
|
|
* * storeName: add a custom store key value instead of using the scope variable name
|
|
* @returns {*} - returns whatever the stored value is
|
|
*/
|
|
bind: function ($scope, key, opts) {
|
|
var defaultOpts = {
|
|
defaultValue: '',
|
|
storeName: ''
|
|
};
|
|
// Backwards compatibility with old defaultValue string
|
|
if (angular.isString(opts)) {
|
|
opts = angular.extend({},defaultOpts,{defaultValue:opts});
|
|
} else {
|
|
// If no defined options we use defaults otherwise extend defaults
|
|
opts = (angular.isUndefined(opts)) ? defaultOpts : angular.extend(defaultOpts,opts);
|
|
}
|
|
|
|
// Set the storeName key for the localStorage entry
|
|
// use user defined in specified
|
|
var storeName = opts.storeName || key;
|
|
|
|
// If a value doesn't already exist store it as is
|
|
if (!publicMethods.get(storeName)) {
|
|
publicMethods.set(storeName, $parse(key)($scope) || opts.defaultValue);
|
|
} else {
|
|
// If it does exist assign it to the $scope value
|
|
$parse(key).assign($scope, publicMethods.get(storeName));
|
|
}
|
|
|
|
|
|
// Register a listener for changes on the $scope value
|
|
// to update the localStorage value
|
|
$scope.$watch(key, function (val) {
|
|
if (angular.isDefined(val)) {
|
|
publicMethods.set(storeName, val);
|
|
}
|
|
}, true);
|
|
|
|
return publicMethods.get(storeName);
|
|
},
|
|
/**
|
|
* Unbind - let's you unbind a variable from localStorage while removing the value from both
|
|
* the localStorage and the local variable and sets it to null
|
|
* @param $scope - the scope the variable was initially set in
|
|
* @param key - the name of the variable you are unbinding
|
|
* @param storeName - (optional) if you used a custom storeName you will have to specify it here as well
|
|
*/
|
|
unbind: function($scope,key,storeName) {
|
|
storeName = storeName || key;
|
|
$parse(key).assign($scope, null);
|
|
$scope.$watch(key, function () { });
|
|
publicMethods.remove(storeName);
|
|
},
|
|
/**
|
|
* Clear All - let's you clear out ALL localStorage variables, use this carefully!
|
|
*/
|
|
clearAll: function() {
|
|
storage.clear();
|
|
}
|
|
};
|
|
|
|
return publicMethods;
|
|
}]);
|
|
|
|
})(window, window.angular);
|