Angular: button-group + highlight-changes
http://angularjs.org/
HTML
<script src="http://code.angularjs.org/angular-1.0.1.js"></script>
<link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
<div ng-controller="MyCtrl">
<br>
<button-group
states="modes"
state="mode"
on-state-change="onModeChange">
</button-group>
<br>
<span highlight-changes value="mode"></span>
<br><br><br>
<button-group
states="periods"
state="period"
on-state-change="onPeriodChange">
</button-group>
<br>
<span highlight-changes value="period"></span>
</div>
JavaScript
var myApp = angular.module('myApp',[]);
myApp.directive('buttonGroup', function(){
return {
restrict: 'E',
scope: {
states: '=',
state: '=',
onStateChange: '='
},
template: '<div class="btn-group">' +
'<button class="btn" ng-repeat="s in states" ng-click="select(s, $event)">' +
'{{s}}' +
'</button>' +
'</div>',
replace: true,
controller: function($scope, $element){
// Make sure that style is applied to initial state value
$scope.$watch(function () {
return $($element).find('.btn').length; // it checks if the buttons are added to the DOM
}, function (newVal) {
// it applies the selected style to the currently defined state, if any
if (newVal > 0) {
$($element).find('.btn').each(function(index, elm){
if ($(elm).text() == $scope.state) $(elm).addClass('btn-primary');
});
}
}, true);
// Apply style changes according to selection
$scope.select = function(s, evt){
$scope.state = s;
$($element).find('.btn').removeClass('btn-primary'); // reset styles on all buttons
angular.element(evt.srcElement).addClass('btn-primary'); // apply style only to selected button
};
// Execute callback if it was provided
$scope.$watch('state', function(){
if ($scope.onStateChange){
$scope.onStateChange();
}
}, true);
}
};
});
myApp.directive('highlightChanges', function(){
return {
scope: {
value: '='
},
link: function(scope, elm, attrs, ctrl) {
scope.$watch('value', function(){
var bgColor = $(elm).css('backgroundColor');
$(elm).text(scope.value);
$(elm).css('backgroundColor', 'orange');
$(elm).animate({
backgroundColor: bgColor
},...