"use strict"; /*global define, socket, app, bootbox, templates, ajaxify, RELATIVE_PATH*/ define('admin/manage/categories', function() { var Categories = {}, newCategoryId = -1, sortables, itemTemplate; Categories.init = function() { $.get(RELATIVE_PATH + '/templates/admin/partials/categories/category-item.tpl', function(data){ itemTemplate = data; socket.emit('admin.categories.getAll', function(error, payload){ if(error){ return app.alertError(error.message); } Categories.render(payload); }); }); $('button[data-action="create"]').on('click', Categories.create); }; Categories.create = function() { bootbox.prompt('Category Name', function(name) { if (!name) { return; } socket.emit('admin.categories.create', { name: name, description: '', icon: 'fa-comments' }, function(err, data) { if(err) { return app.alertError(err.message); } app.alert({ alert_id: 'category_created', title: 'Created', message: 'Category successfully created!', type: 'success', timeout: 2000 }); ajaxify.go('admin/manage/categories/' + data.cid); }); }); }; Categories.render = function(categories){ var container = $('.categories'); if(!categories || categories.length == 0){ $('
') .addClass('alert alert-info text-center') .text('You have no active categories.') .appendTo(container); }else{ sortables = {}; renderList(categories, 0, container, 0); } }; function itemDidAdd(e){ newCategoryId = e.to.dataset.cid; } function itemDragDidEnd(e){ var isCategoryUpdate = (newCategoryId != -1); //Update needed? if((e.newIndex != undefined && e.oldIndex != e.newIndex) || isCategoryUpdate){ var parentCategory = isCategoryUpdate ? sortables[newCategoryId] : sortables[e.from.dataset.cid], modified = {}, i = 0, list = parentCategory.toArray(), len = list.length; for(i; i < len; ++i) { modified[list[i]] = { order: (i + 1) } } if(isCategoryUpdate){ modified[e.item.dataset.cid]['parentCid'] = newCategoryId; } newCategoryId = -1 socket.emit('admin.categories.update', modified); } } /** * Render categories - recursively * * @param categories {array} categories tree * @param level {number} current sub-level of rendering * @param container {object} parent jquery element for the list * @param parentId {number} parent category identifier */ function renderList(categories, level, container, parentId){ var i = 0, len = categories.length, category, marginLeft = 48, listItem; var list = $('