Skip to content

Instantly share code, notes, and snippets.

@popovevgeny
Last active August 29, 2015 14:17
Show Gist options
  • Select an option

  • Save popovevgeny/a2f3a0b2d3a21268f7f1 to your computer and use it in GitHub Desktop.

Select an option

Save popovevgeny/a2f3a0b2d3a21268f7f1 to your computer and use it in GitHub Desktop.
Multicolumn directive
// <div data-multicolumn-layout data-column-count="2" data-items="items">{{item}}</div>
(function () {
'use strict';
angular
.module('app')
.directive('multicolumnLayout', multicolumnLayout);
multicolumnLayout.$inject = ['$compile'];
function multicolumnLayout($compile) {
var directive = {
restrict: 'AE',
scope: {
items: '='
},
link: link
};
return directive;
////////////
function link(scope, element, attrs) {
compileTemplate(scope, element);
var maxColumns = attrs.columnCount || 3,
columnsCount,
perColumn,
columns;
scope.$watch('items', function (items) {
if (!items) {
return;
}
if (!items.length) {
scope.columns = null;
return;
}
columns = [];
columnsCount = getColumnsCount(items.length, maxColumns);
perColumn = Math.ceil(items.length / columnsCount);
for (var i = 0; i < columnsCount; i += 1) {
columns.push(items.slice(i * perColumn, ((i * 2) || 1) * perColumn));
}
scope.columns = columns;
});
}
function compileTemplate(scope, element) {
var columns, column, list, listItem,
itemTemplate = element.contents();
element.addClass('row');
columns = angular.element('<ul class="list-inline no-margin"></ul>');
column = angular.element('<li data-ng-repeat="column in columns" data-ng-class="columnClass"></li>');
list = angular.element('<ul class="list-unstyled no-margin"></ul>');
listItem = angular.element('<li data-ng-repeat="item in column"></li>');
listItem.append(itemTemplate);
list.append(listItem);
column.append(list);
columns.append(column);
element.html('');
element.append(columns);
$compile(element.contents())(scope);
}
function getColumnsCount(itemsCount, max) {
if (max === 1) {
return max;
}
var perColumn = Math.ceil(itemsCount / max);
if (perColumn < 3) {
max -= 1;
return getColumnsCount(itemsCount, max);
}
return max;
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment