sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
206 lines (173 loc) • 6.45 kB
JavaScript
var LinkSelectorController = function ($scope, $q, $modalInstance, ContentService, GroupService, HelperService, title, statuses, value, groups, onLoadItems) {
$scope.dialog = {
title: title || "Link Selector",
selectedItem: null,
message: "",
messageType: "",
disableOk: true
};
$scope.data = {
allowedStatuses: statuses,
items: [],
groups: [],
group: null,
selectedItem: null,
selectionLabel: "Selected Item:"
};
$scope.linkProps = {
text: "",
newWindow: false,
tooltip: "",
cssClass: ""
};
$scope.paging = {
pageSize: 10,
pageNum: 1,
pageCount: 0,
paginate: function(num) {
loadItems($scope.data.group._id, num);
}
};
$scope.$watch(function(scope) {
return scope.data.group;
},
function() {
if ($scope.data.group)
loadItems($scope.data.group._id, 1);
}
);
$scope.ok = function () {
if ($scope.data.selectedItem !== null) {
var item = $scope.data.selectedItem;
var props = $scope.linkProps;
var obj = {
contentId: item.contentId,
name: item.name,
url: item.url,
text: props.text,
tooltip: props.tooltip,
cssClass: props.cssClass,
target: props.newWindow === true ? "_blank" : ""
};
$modalInstance.close(obj);
}
else {
$modalInstance.close(null);
}
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
$scope.selectItem = function(item) {
if (isEnabled(item)) {
if ($scope.data.selectedItem === null || item.contentId !== $scope.data.selectedItem.contentId) {
$scope.data.selectedItem = item;
$scope.linkProps.text = item.name;
}
}
};
$scope.unSelectItem = function() {
$scope.data.selectedItem = null;
};
function isEnabled(item) {
if ($scope.data.allowedStatuses === null || $scope.data.allowedStatuses.indexOf(item.status) < 0)
return false;
else
return true;
}
function loadGroups() {
var d = $q.defer();
GroupService.list("content,media", null).then(function(result) {
if (result && result.success === true) {
//load groups hash
var hash = HelperService.toBoolHash(groups);
var hasGroups = (groups && groups.length > 0);
//only add groups that the user has read access to
$scope.data.groups = [];
for(var i = 0; i < result.groups.length; i++) {
var g = result.groups[i];
if (g.rights && g.rights.read == true) {
if (hasGroups === true) {
//see if this group is in the groups hash
if (hash[g.name] === true)
$scope.data.groups.push(g);
}
else
$scope.data.groups.push(g);
}
}
} else if (result) {
setMessage(result.message, 'alert-danger', false);
} else {
setMessage('An unknown error occurred.', 'alert-danger', false);
}
d.resolve();
});
return d.promise;
}
function loadItems(groupId, pageNumber) {
$scope.paging.pageNum = pageNumber;
//load the items in this group
ContentService.getItems(groupId, pageNumber, $scope.paging.pageSize, true).then(function(data) {
setMessage(data.message, data.success == true ? "alert-success" : "alert-danger");
if (data.success && data.items) {
for(var i = 0; i < data.items.length; i++) {
var item = data.items[i];
item.statusCss = ContentService.getItemStatusCss(item.status);
item.ui = {};
item.ui.enabled = true;
if (!isEnabled(item)) {
item.ui.enabled = false;
item.ui.tooltip = "This item cannot be selected due to it's status";
}
}
if (onLoadItems && typeof onLoadItems === 'function')
onLoadItems(data.items);
$scope.data.items = data.items;
//set the paging data
$scope.paging.pageCount = Math.ceil(data.total / $scope.paging.pageSize);
$scope.paging.pageNum = pageNumber;
}
else
$scope.data.items = [];
});
};
function clearMessage() {
$scope.dialog.message = "";
$scope.dialog.messageType = "";
}
function setMessage(msg, type) {
$scope.dialog.message = msg;
$scope.dialog.messageType = type;
}
function init()
{
if (value) {
$scope.linkProps.text = value.text;
$scope.linkProps.tooltip = value.tooltip;
$scope.linkProps.cssClass = value.cssClass;
$scope.linkProps.newWindow = value.target === "_blank";
if (value.contentId && value.contentId.length > 0) {
//load the content item
ContentService.getContent(value.contentId, false).then(function(result) {
if (result && result.success && result.item) {
$scope.data.selectedItem = result.item;
}
else if (result && result.success === false) {
setMessage(result.message, "alert-danger");
}
else {
setMessage("Could not load the selected item: " + value.contentId);
}
});
}
}
loadGroups().then(function() {
if ($scope.data.groups && $scope.data.groups.length > 0) {
//load the items from the first group in the list
$scope.data.group = $scope.data.groups[0];
}
});
}
init();
};