(js) New sgToggleGrid directive

This directive allows to transform the tiles of a md-grid-list to toggle
buttons.
pull/91/head
Francis Lachapelle 2015-05-19 16:05:11 -04:00
parent 9222bf80ef
commit f6f704ddd8
2 changed files with 111 additions and 0 deletions

View File

@ -0,0 +1,93 @@
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
(function() {
'use strict';
/*
* sgToggleGrid - Convert the tiles of a grid to toggle buttons
* @memberof SOGo.Common
* @restrict attribute
* @param {object} sgToggleGrid - the model of the source objects
* @param {string} [sgToggleGridAttr] - the attribute that specifies if an object is enabled (toggled)
* @ngInject
* @example:
<md-grid-list md-cols="7" md-row-height="1:1"
sg-toggle-grid="editor.event.repeat.days"
sg-toggle-grid-attr="day">..</md-grid-list>
*/
sgToggleGrid.$inject = ['$parse'];
function sgToggleGrid($parse) {
return {
restrict: 'A',
link: link
};
function link(scope, iElement, attrs, ctrl) {
var tiles = iElement.find('md-grid-tile'),
tile,
i,
modelDays,
modelAttr,
ensureInitRunsOnce;
ensureInitRunsOnce = scope.$watch(function() {
// Parse attribute until it returns a valid object
return $parse(attrs.sgToggleGrid)(scope);
}, function(days) {
if (angular.isDefined(days)) {
var flattenedDays = days;
modelDays = days;
if (attrs.sgToggleGridAttr) {
modelAttr = attrs.sgToggleGridAttr;
flattenedDays = _.pluck(days, attrs.sgToggleGridAttr);
}
_.each(tiles, function(o) {
var tile = angular.element(o);
if (_.contains(flattenedDays, tile.attr('value'))) {
tile.addClass('sg-active');
}
});
ensureInitRunsOnce();
}
});
for (i = 0; i < tiles.length; i++) {
tile = angular.element(tiles[i]);
tile.addClass('iconButton');
tile.find('figure').addClass('md-icon');
tile.on('click', function() {
// Toggle class on click event and call toggle function
var tile = angular.element(this),
day = tile.attr('value');
tile.toggleClass('sg-active');
toggle(day);
});
}
function toggle(day) {
var i = _.findIndex(modelDays, function(o) {
if (modelAttr)
return o[modelAttr] == day;
else
return o == day;
});
if (i < 0) {
if (modelAttr) {
var o = {};
o[modelAttr] = day;
modelDays.push(o);
}
else
modelDays.push(day);
}
else
modelDays.splice(i, 1);
}
}
}
angular
.module('SOGo.Common')
.directive('sgToggleGrid', sgToggleGrid);
})();

View File

@ -1 +1,19 @@
@import "extends";
// See sgToggleGrid directive
[sg-toggle-grid] {
md-grid-tile {
border-radius: 5%;
&.iconButton {
&:hover {
background-color: sg-color($sogoBlue, 600);
color: #fff;
cursor: pointer;
}
}
&.sg-active, &.sg-active:hover {
background-color: sg-color($sogoBlue, 300);
color: #fff;
}
}
}