document.addEventListener('DOMContentLoaded', function () { // // Initialize stuff // var grid = null; var docElem = document.documentElement; var demo = document.querySelector('.grid-demo'); var gridElement = demo.querySelector('.grid'); var filterField = demo.querySelector('.filter-field'); var searchField = demo.querySelector('.search-field'); var sortField = demo.querySelector('.sort-field'); var layoutField = demo.querySelector('.layout-field'); var addItemsElement = demo.querySelector('.add-more-items'); var characters = 'abcdefghijklmnopqrstuvwxyz'; var filterOptions = ['test']; var dragOrder = []; var uuid = 0; var filterFieldValue; var sortFieldValue; var layoutFieldValue; var searchFieldValue; // // Grid helper functions // function initDemo() { initGrid(); // Reset field values. //searchField.value = ''; [filterField].forEach(function (field) { field.value = field.querySelectorAll('option')[0].value; }); // Set inital search query, active filter, active sort value and active layout. //searchFieldValue = searchField.value.toLowerCase(); filterFieldValue = filterField.value; sortFieldValue = 'title';//sortField.value; layoutFieldValue = 'left-top-fillgaps'; //layoutField.value; // Search field binding. // searchField.addEventListener('keyup', function () { // var newSearch = searchField.value.toLowerCase(); // if (searchFieldValue !== newSearch) { // searchFieldValue = newSearch; // filter(); // } // }); // Filter, sort and layout bindings. filterField.addEventListener('change', filter); //sortField.addEventListener('change', sort); //layoutField.addEventListener('change', changeLayout); // sortField.change(); //sortField.value = 'title'; //sort(); //changeLayout(); } function initGrid() { var dragCounter = 0; grid = new Muuri(gridElement, { //items: generateElements(20), layoutDuration: 400, fillGaps: true, layoutEasing: 'ease', dragEnabled: false, dragSortInterval: 50, dragContainer: document.body, dragStartPredicate: function (item, event) { sortFieldValue = 'title'; var isDraggable = sortFieldValue === 'order'; var isRemoveAction = elementMatches(event.target, '.card-remove, .card-remove i'); return isDraggable && !isRemoveAction ? Muuri.ItemDrag.defaultStartPredicate(item, event) : false; }, dragReleaseDuration: 400, dragReleseEasing: 'ease' }) .on('dragStart', function () { ++dragCounter; docElem.classList.add('dragging'); }) .on('dragEnd', function () { if (--dragCounter < 1) { docElem.classList.remove('dragging'); } }) .on('move', updateIndices) .on('sort', updateIndices); } function filter() { filterFieldValue = filterField.value; grid.filter(function (item) { var element = item.getElement(); var isSearchMatch = !searchFieldValue ? true : (element.getAttribute('data-title') || '').toLowerCase().indexOf(searchFieldValue) > -1; var isFilterMatch = !filterFieldValue ? true : (element.getAttribute('data-color') || '') === filterFieldValue; return isSearchMatch && isFilterMatch; }); } function sort() { //sortField.value = 'title'; // Do nothing if sort value did not change. //var currentSort = sortField.value; // If we are changing from "order" sorting to something else // let's store the drag order. // if (sortFieldValue === 'order') { // dragOrder = grid.getItems(); // } // Sort the items. grid.sort( //currentSort === 'title' ? compareItemTitle : compareItemTitle() //currentSort === 'color' ? compareItemColor : // dragOrder ); // Update indices and active sort value. updateIndices(); sortFieldValue = currentSort; console.log(sortField.value); } function addItems() { // Generate new elements. var newElems = generateElements(5); // Set the display of the new elements to "none" so it will be hidden by // default. newElems.forEach(function (item) { item.style.display = 'none'; }); // Add the elements to the grid. var newItems = grid.add(newElems); // Update UI indices. updateIndices(); // Sort the items only if the drag sorting is not active. if (sortFieldValue !== 'order') { grid.sort(sortFieldValue === 'title' ? compareItemTitle : compareItemColor); dragOrder = dragOrder.concat(newItems); } // Finally filter the items. filter(); } function removeItem(e) { var elem = elementClosest(e.target, '.item'); grid.hide(elem, {onFinish: function (items) { var item = items[0]; grid.remove(item, {removeElements: true}); if (sortFieldValue !== 'order') { var itemIndex = dragOrder.indexOf(item); if (itemIndex > -1) { dragOrder.splice(itemIndex, 1); } } }}); updateIndices(); } function changeLayout() { layoutFieldValue = layoutField.value; // layoutFieldValue = 'left-top-fillgaps'; grid._settings.layout = { // horizontal: false, // alignRight: layoutFieldValue.indexOf('right') > -1, // alignBottom: layoutFieldValue.indexOf('bottom') > -1, // fillGaps: true fillGaps: true, horizontal: false, alignRight: true, alignBottom: false, }; grid.layout(); } // // Generic helper functions // function generateElements(amount) { var ret = []; for (var i = 0; i < amount; i++) { ret.push(generateElement( ++uuid, generateRandomWord(2), getRandomItem(filterOptions), getRandomInt(1, 2), getRandomInt(1, 2) )); } return ret; } function generateElement(id, title, color, width, height) { var itemElem = document.createElement('div'); var classNames = 'item h' + height + ' w' + width + ' ' + color; var itemTemplate = '' + '