70 lines
No EOL
1.9 KiB
JavaScript
70 lines
No EOL
1.9 KiB
JavaScript
/**
|
|
* An element which allows for editing intervals.
|
|
*/
|
|
angular.module('quay').directive('intervalInput', function () {
|
|
return {
|
|
templateUrl: '/static/directives/interval-input.html',
|
|
controllerAs: 'vm',
|
|
replace: true,
|
|
scope: {
|
|
'seconds': '=seconds',
|
|
},
|
|
restrict: 'C',
|
|
controller: function($scope) {
|
|
|
|
let vm = this;
|
|
|
|
vm.seconds = null;
|
|
vm.selectedPeriod = null;
|
|
vm.quantity = null;
|
|
|
|
vm.periods = [
|
|
{ 'label': 'seconds', 'seconds': 1 },
|
|
{ 'label': 'minutes', 'seconds': 60 },
|
|
{ 'label': 'hours', 'seconds': 60 * 60 },
|
|
{ 'label': 'days', 'seconds': 60 * 60 * 24 },
|
|
{ 'label': 'weeks', 'seconds': 60 * 60 * 24 * 7 }
|
|
]
|
|
|
|
let findMatchingPeriod = function(seconds) {
|
|
for (let i = vm.periods.length - 1; i >= 0; i--) {
|
|
let period = vm.periods[i];
|
|
if (seconds % period.seconds == 0) {
|
|
return period;
|
|
}
|
|
}
|
|
|
|
return vm.periods[0]; // Fall-back to seconds if no matching period was found.
|
|
}
|
|
|
|
let calculateQuantity = function(seconds, secondsInPeriod) {
|
|
if (seconds == 0) { return 0; }
|
|
return seconds / secondsInPeriod;
|
|
}
|
|
|
|
vm.updateSeconds = function() {
|
|
vm.seconds = vm.quantity * vm.selectedPeriod.seconds;
|
|
$scope.seconds = vm.seconds;
|
|
}
|
|
|
|
$scope.$watch('seconds', function(newValue, oldValue) {
|
|
|
|
if (vm.selectedPeriod == null) {
|
|
vm.selectedPeriod = vm.periods[0];
|
|
}
|
|
|
|
if (newValue == NaN) {
|
|
vm.seconds = 0;
|
|
$scope.seconds = vm.seconds;
|
|
}
|
|
|
|
if (newValue !== oldValue) {
|
|
vm.seconds = newValue;
|
|
vm.selectedPeriod = findMatchingPeriod(vm.seconds);
|
|
vm.quantity = calculateQuantity(vm.seconds, vm.selectedPeriod.seconds);
|
|
}
|
|
|
|
});
|
|
}
|
|
};
|
|
}); |