UNPKG

sheercms

Version:

Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.

451 lines (399 loc) 14.1 kB
app.controller('MenuController', function($scope, MenuService, ContentService, TemplateService, $modal) { $scope.data = { title: "Menus", menus: [], message: "", messageType: "", selectedId: null, editMenu: null, levels: [], parent: null, items: [], templates: [], menuIcon: "/cms/static/images/icons/32/menu_item.png" }; $scope.buttons = { back: false, newMenu: true, addItem: false, save: false, properties: false, refresh: true }; $scope.refresh = function() { var selMenu = $scope.data.editMenu ? $scope.data.editMenu.name : null; loadMenus(selMenu, true, false); }; $scope.showNewMenu = function() { var name = prompt("Enter the new menu name:"); if (name) { clearMessage(); MenuService.create(name).then(function(data) { //reload the menus loadMenus(name, false, false); //edit the new menu if (data.menu) editMenu(data.menu._id); }); } }; $scope.changeMenu = function(menu) { clearMessage(); $scope.data.selectedId = menu._id; editMenu($scope.data.selectedId); }; $scope.expand = function(item) { $scope.data.levels.push(item); $scope.data.parent = item; updateButtons(); }; $scope.back = function(index) { if ($scope.data.levels.length > 0) { if (index == null) { $scope.data.levels.pop(); //remove the last item in the array } else if (index < $scope.data.levels.length - 1) { //remove everything after that index $scope.data.levels = $scope.data.levels.splice(0, index + 1); } else return; if ($scope.data.levels.length > 0) $scope.data.parent = $scope.data.levels[$scope.data.levels.length - 1]; else $scope.data.parent = $scope.data.editMenu; updateButtons(); } }; $scope.props = function() { var modalInstance = $modal.open({ templateUrl: 'MenuPropsDialog', controller: MenuPropsDialogController, resolve: { menu: function () { //send over a copy var m = $scope.data.editMenu; return { name: m.name, templateId: m.templateId }; }, templates: function() { return $scope.data.templates; } } }); modalInstance.result.then(function(value) { try { if (value) { //update the original var m = $scope.data.editMenu; m.name = value.name; m.templateId = value.templateId; } } catch(e) { console.error(e); } }); }; $scope.addItem = function(parent) { if (parent == null) parent = $scope.data.parent; var modalInstance = $modal.open({ templateUrl: 'MenuItemDialog', controller: MenuItemDialogController, resolve: { item: function () { return null; } } }); modalInstance.result.then(function(value) { try { if (value) { var item = new MenuItem(null); copyItem(value, item); if (parent) { //add this item to the current/selected menu item if (parent.items == null) parent.items = []; //make sure there isn't already an item with this URL at this level if (item.url && item.url.length > 0) { for (var i = 0; i < parent.items.length; i++) { var a = parent.items[i]; if (a.url && a.url.toLowerCase() == item.url.toLowerCase()) { if (confirm("There is already a menu item with this URL in the list. Continue to add this item?")) break; else return; } } } else if (!confirm("This item does not have a URL. Continue to add this item?")) { return; } parent.items.push(item); parent.childCount = parent.items.length; updateButtons(); } } } catch(e) { console.error(e); } }); }; $scope.move = function(updown, index) { var parent = $scope.data.parent; if (updown == 'up') { if (index > 0) { var item = parent.items[index]; parent.items[index] = parent.items[index - 1]; parent.items[index - 1] = item; } } else { if (index < parent.items.length - 1) { var item = parent.items[index]; parent.items[index] = parent.items[index + 1]; parent.items[index + 1] = item; } } }; $scope.editItem = function(item) { var modalInstance = $modal.open({ templateUrl: 'MenuItemDialog', controller: MenuItemDialogController, resolve: { item: function () { //send over a copy return new MenuItem(item); } } }); modalInstance.result.then(function(value) { try { if (value) { //update the original copyItem(value, item); } } catch(e) { console.error(e); } }); }; $scope.removeItem = function(item) { var q = "Are you sure you want to remove this menu item: " + item.text; if (item.childCount > 0) q = "WARNING: This menu item has children! \n" + q; if (confirm(q)) { if ($scope.data.parent && $scope.data.parent.items && item) { for (var i = 0; i < $scope.data.parent.items.length; i++) { if ($scope.data.parent.items[i] == item) { $scope.data.parent.items.splice(i, 1); $scope.data.parent.childCount = $scope.data.parent.items.length; if ($scope.data.parent.childCount == 0) $scope.back(); updateButtons(); break; } } } } }; $scope.saveMenu = function() { MenuService.save($scope.data.editMenu).then(function(result) { if (result && result.success) { setMessage("Menu saved successfully!", "alert-success"); //reload the menus dropdown loadMenus(null, false, false); } else if (result) setMessage(result.message, "alert-danger"); else setMessage("Error saving the menu.", "alert-danger"); }); }; $scope.deleteMenu = function() { if (confirm('Are you sure you want to delete this menu?')) { clearMessage(); MenuService.delete($scope.data.selectedId).then(function(result) { if (result && result.success == true) { $scope.data.selectedId = null; $scope.data.editMenu = null; $scope.data.parent = null; $scope.data.menus = result.menus; setMessage("Menu deleted successfully.", "alert-success"); updateButtons(); } else if (result) { setMessage(result.message, "alert-danger"); } else { setMessage("Error deleting this menu.", "alert-danger"); } }); } }; function init() { //$scope.$parent.resize('.menu-view'); resize(); loadMenus(null, true, true); loadTemplates(); } function updateButtons() { if ($scope.data.editMenu) { $scope.buttons.back = $scope.data.levels.length > 0; $scope.buttons.newMenu = true; $scope.buttons.save = true; $scope.buttons.addItem = true; $scope.buttons.properties = true; $scope.buttons.delete = true; } else { $scope.buttons.back = false; $scope.buttons.newMenu = true; $scope.buttons.save = false; $scope.buttons.addItem = false; $scope.buttons.properties = false; $scope.buttons.delete = false; } } function loadMenus(selectName, clearMsg, useCache) { if (clearMsg === null || clearMsg === true) clearMessage(); MenuService.list(useCache).then(function(data) { if (data.success) { for(var i = 0; i < data.menus.length; i++) { var m = data.menus[i]; if (selectName == m.name) { $scope.data.selectedId = m._id; } } $scope.data.menus = data.menus; } else { setMessage(data.message, "alert-danger"); } }); } function loadTemplates() { TemplateService.list(true).then(function(data) { if (data.success === true) { var arr = []; for(var i = 0; i < data.templates.length; i++) { //TODO: do some filtering arr.push(data.templates[i]); } $scope.data.templates = arr; } else { setMessage(data.message, "alert-danger"); } }); } function editMenu(id) { if (id) { MenuService.getMenu(id).then(function (result) { if (result && result.success == true) { $scope.data.editMenu = result.menu; $scope.data.parent = $scope.data.editMenu; updateButtons(); } else if (result) { setMessage(result.message, 'alert-danger'); } else { setMessage("Error loading menu to edit.", "alert-danger"); } }); } }; function copyItem(source, dest) { dest.contentId = source.contentId; dest.text = source.text; dest.url = source.url; dest.class = source.class; dest.tooltip = source.tooltip; dest.target = source.target; } function clearMessage() { $scope.data.message = ""; $scope.data.messageType = ""; } function setMessage(msg, type) { $scope.data.message = msg; $scope.data.messageType = type; } function resize() { $scope.$parent.resize('.main-view', '.main-view-left'); } init(); function MenuItem(item) { var self = this; if (item) { self.contentId = item.contentId; self.text = item.text; self.url = item.url; self.target = item.target; self.class = item.class; self.tooltip = item.tooltip; } self.items = []; self.childCount = 0; } }); var MenuItemDialogController = function ($scope, $modalInstance, item) { $scope.data = { item: {}, contentItem: { contentId: null, name: "", url: "" }, newWindow: false }; $scope.ok = function() { if ($scope.data.contentItem) { $scope.data.item.contentId = $scope.data.contentItem.contentId; if ($scope.data.contentItem.url && $scope.data.contentItem.url.trim().length > 0) $scope.data.item.url = $scope.data.contentItem.url; } $scope.data.item.target = $scope.data.newWindow == true ? "_blank" : ""; $modalInstance.close($scope.data.item); }; $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; $scope.$watch("data.contentItem.contentId", function(newValue, oldValue) { if ($scope.data.contentItem && $scope.data.contentItem.contentId) { if ($scope.data.item == null) $scope.data.item = {}; $scope.data.item.url = $scope.data.contentItem.url; if ($scope.data.item.text == null || $scope.data.item.text.length == 0) $scope.data.item.text = $scope.data.contentItem.name; } }); function init() { if (item) { $scope.data.item = item; $scope.data.newWindow = (item.target == '_blank'); } else { $scope.data.item = {}; } } init(); }; var MenuPropsDialogController = function ($scope, $modalInstance, menu, templates) { $scope.menu = menu; $scope.templates = templates; $scope.ok = function() { $modalInstance.close($scope.menu); }; $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; };