sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
451 lines (399 loc) • 14.1 kB
JavaScript
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');
};
};