-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathng-bs-animated-button.js
116 lines (108 loc) · 5.29 KB
/
ng-bs-animated-button.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
'use strict';
angular.module('jp.ng-bs-animated-button', []).
directive('jpNgBsAnimatedButton', [ '$timeout', function($timeout) {
return {
restrict: 'AE',
replace: true,
scope: {
isSubmitting: '=',
result: '=',
options: '=?',
formIsInvalid: '&'
},
controller: [ '$scope', function($scope) {
$scope.options = $scope.options || {};
$scope.options = {
buttonDefaultClass: $scope.options.buttonDefaultClass || 'btn-primary',
buttonSubmittingClass: $scope.options.buttonSubmittingClass || 'btn-primary',
buttonSuccessClass: $scope.options.buttonSuccessClass || 'btn-primary',
buttonErrorClass: $scope.options.buttonErrorClass || 'btn-danger',
buttonSizeClass: $scope.options.buttonSizeClass || null,
buttonDefaultText: $scope.options.buttonDefaultText || 'Submit',
buttonSubmittingText: $scope.options.buttonSubmittingText || 'Submitting...',
buttonSuccessText: $scope.options.buttonSuccessText || 'Completed',
buttonErrorText: $scope.options.buttonErrorText || 'There was an error',
buttonInitialIcon: $scope.options.buttonInitialIcon || 'glyphicon glyphicon-plus',
buttonSubmittingIcon: $scope.options.buttonSubmittingIcon || 'glyphicon glyphicon-refresh',
buttonSuccessIcon: $scope.options.buttonSuccessIcon || 'glyphicon glyphicon-ok',
buttonErrorIcon: $scope.options.buttonErrorIcon || 'glyphicon glyphicon-remove',
animationCompleteTime: $scope.options.animationCompleteTime || '2000',
iconsPosition: $scope.options.iconsPosition || 'left',
onlyIcons: $scope.options.onlyIcons || false
};
}],
template:
'<button type="submit" class="btn {{buttonClass}} {{buttonSize}} {{onlyIcons}} btn-ng-bs-animated clearfix" ng-disabled="formIsInvalid()">' +
'<div class="icons pull-{{iconsPosition}}">' +
'<span class="{{buttonInitialIcon}} icon-initial"></span>' +
'<span class="{{buttonSubmittingIcon}} icon-spinner icon-submit hidden"></span>' +
'<span class="{{buttonSuccessIcon}} icon-result icon-success hidden"></span>' +
'<span class="{{buttonErrorIcon}} icon-result icon-error hidden"></span>' +
'</div>' +
'<div class="text {{buttonTextFloatClass}}">{{buttonText}}</div>' +
'</button>',
link: function(scope, element) {
var el = element;
var icons = {
initial: angular.element(el[0].querySelector('.icon-initial')),
submitting: angular.element(el[0].querySelector('.icon-submit')),
result: angular.element(el[0].querySelectorAll('.icon-result')),
success: angular.element(el[0].querySelector('.icon-success')),
error: angular.element(el[0].querySelector('.icon-error'))
};
var endAnimation = function() {
scope.result = null;
scope.buttonClass = scope.options.buttonDefaultClass;
scope.buttonText = scope.options.buttonDefaultText;
el.removeClass('is-active').attr('disabled', false);
icons.result.addClass('hidden');
};
var setButtonTextFloatClass = function() {
if (scope.iconsPosition === 'left') {
return 'pull-right';
} else {
return 'pull-left';
}
};
scope.buttonClass = scope.options.buttonDefaultClass;
scope.buttonSize = scope.options.buttonSizeClass;
scope.iconsPosition = scope.options.iconsPosition;
scope.buttonInitialIcon = scope.options.buttonInitialIcon;
scope.buttonSubmittingIcon = scope.options.buttonSubmittingIcon;
scope.buttonSuccessIcon = scope.options.buttonSuccessIcon;
scope.buttonErrorIcon = scope.options.buttonErrorIcon;
scope.iconsPosition = scope.options.iconsPosition;
scope.buttonText = scope.options.buttonDefaultText;
scope.buttonTextFloatClass = setButtonTextFloatClass();
if(scope.options.onlyIcons){
scope.onlyIcons = 'icons-only';
};
scope.$watch('isSubmitting', function(newValue) {
if (newValue) {
scope.buttonClass = scope.options.buttonSubmittingClass;
scope.buttonText = scope.options.buttonSubmittingText;
el.attr('disabled', true).addClass('is-active');
icons.submitting.removeClass('hidden');
}
}, true).bind(this);
scope.$watch('result', function(newValue) {
scope.isSubmitting = null;
if (newValue === 'success') {
scope.buttonClass = scope.options.buttonSuccessClass;
scope.buttonText = scope.options.buttonSuccessText;
icons.submitting.addClass('hidden');
icons.success.removeClass('hidden');
$timeout(endAnimation, scope.options.animationCompleteTime);
}
if (newValue === 'error') {
scope.buttonClass = scope.options.buttonErrorClass;
scope.buttonText = scope.options.buttonErrorText;
icons.submitting.addClass('hidden');
icons.error.removeClass('hidden');
$timeout(endAnimation, scope.options.animationCompleteTime);
}
}, true).bind(this);
}
};
}]
);