led-server/htdocs/js/angular-minicolors.js
2019-04-27 15:58:14 +02:00

155 lines
4.4 KiB
JavaScript

'format cjs';
'use strict';
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(['angular', 'jquery-minicolors'], factory);
} else if (typeof exports === 'object') {
module.exports = factory(require('angular'), require('jquery-minicolors'));
module.exports = 'minicolors';
} else {
root.angularMinicolors = factory(root.angular, root.jqueryMinicolors);
}
})(this, function(angular) {
angular.module('minicolors', []);
angular.module('minicolors').provider('minicolors', function() {
this.defaults = {
theme: 'bootstrap',
position: 'top left',
defaultValue: '',
animationSpeed: 50,
animationEasing: 'swing',
change: null,
changeDelay: 0,
control: 'hue',
hide: null,
hideSpeed: 100,
inline: false,
letterCase: 'lowercase',
opacity: false,
show: null,
showSpeed: 100
};
this.$get = function() {
return this;
};
});
angular.module('minicolors').directive('minicolors', ['minicolors', '$timeout', function(minicolors, $timeout) {
return {
require: '?ngModel',
restrict: 'A',
priority: 1, //since we bind on an input element, we have to set a higher priority than angular-default input
link: function(scope, element, attrs, ngModel) {
var inititalized = false;
//gets the settings object
var getSettings = function() {
var config = angular.extend({}, minicolors.defaults, scope.$eval(attrs.minicolors));
return config;
};
/**
* check if value is valid color value
* e.g.#fff000 or #fff
* @param color
*/
function isValidColor(color) {
return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(color);
}
function canSetValue() {
return (element.data('minicolors-settings') != null)
}
/**
* set color value as minicolors internal color value
* @param color
*/
function setMinicolorsValue(color) {
if (isValidColor(color) && canSetValue()) {
element.minicolors('value', color);
}
}
//what to do if the value changed
ngModel.$render = function() {
console.log("ngModel.$render");
//we are in digest or apply, and therefore call a timeout function
$timeout(function() {
var color = ngModel.$viewValue;
setMinicolorsValue(color);
}, 0, false);
};
//init method
var initMinicolors = function() {
if (!ngModel) {
return;
}
var settings = getSettings();
settings.change = function(hex) {
scope.$apply(function() {
if (isValidColor(hex))
ngModel.$setViewValue(hex);
});
};
//destroy the old colorpicker if one already exists
if (element.hasClass('minicolors-input')) {
element.minicolors('destroy');
element.off('blur', onBlur);
}
// Create the new minicolors widget
element.minicolors(settings);
// hook up into the jquery-minicolors onBlur event.
element.on('blur', onBlur);
// are we inititalized yet ?
//needs to be wrapped in $timeout, to prevent $apply / $digest errors
//$scope.$apply will be called by $timeout, so we don't have to handle that case
if (!inititalized) {
$timeout(function() {
var color = ngModel.$viewValue;
setMinicolorsValue(color);
}, 0);
inititalized = true;
return;
}
function onBlur(e) {
scope.$apply(function() {
var color = element.minicolors('value');
if (isValidColor(color))
ngModel.$setViewValue(color);
});
}
};
initMinicolors();
//initital call
// Watch for changes to the directives options and then call init method again
var unbindWatch = scope.$watch(getSettings, initMinicolors, true);
scope.$on('$destroy', function () {
if (element.hasClass('minicolors-input')) {
element.minicolors('destroy');
element.remove();
}
if (unbindWatch) unbindWatch();
});
}
};
}]);
});