sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
304 lines (253 loc) • 9.95 kB
JavaScript
var ImageSelectorController = function ($scope, $q, $modalInstance, $timeout, ContentService, GroupService, DialogService, HelperService, value, title, statuses, groups, onLoadItems) {
$scope.dialog = {
title: "",
selectedItem: null,
message: "",
messageType: "",
disableOk: true
};
$scope.data = {
allowedStatuses: statuses,
items: [],
groups: [],
group: null,
selectedItem: null,
selectionLabel: "",
uploadMsg: null,
showingRecent: false,
selectFirstItem: false
};
$scope.paging = {
pageSize: 9,
pageNum: 1,
pageCount: 0,
paginate: function(num) {
loadItems($scope.data.group._id, num);
}
};
$scope.imageProps = {
alt: "",
tooltip: "",
cssClass: ""
};
$scope.$watch(function(scope) {
return scope.data.group;
},
function() {
if ($scope.data.group)
loadItems($scope.data.group._id, 1);
}
);
$scope.$watch(function(scope) {
return scope.data.showingRecent;
},
function() {
if ($scope.data.group) {
if ($scope.data.showingRecent === true)
loadRecentItems($scope.data.group._id, $scope.paging.pageSize);
else
loadItems($scope.data.group._id, 1);
}
}
);
$scope.ok = function () {
if ($scope.data.selectedItem !== null) {
var item = $scope.data.selectedItem;
var props = $scope.imageProps;
var obj = {
contentId: item.contentId,
name: item.name,
url: item.url,
alt: props.alt,
tooltip: props.tooltip,
cssClass: props.cssClass
};
$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.imageProps.alt = item.name;
}
}
};
$scope.unSelectItem = function() {
$scope.data.selectedItem = null;
};
$scope.upload = function() {
if ($scope.data.group) {
DialogService.showFileSelector(function (files) {
if (files && files.length > 0) {
$scope.data.uploading = true;
$scope.data.uploadMsg = "Uploading files...please wait...";
ContentService.upload($scope.data.group._id, files, true, onUploadProgress, onUploadError).then(function (result) {
$scope.data.uploading = false;
$scope.data.uploadMsg = "Upload complete!";
showRecent(true);
//loadItems($scope.data.group._id, $scope.paging.pageNum);
$timeout(function() {
$scope.data.uploadMsg = null;
}, 5000);
});
}
});
}
};
function showRecent(selectFirstItem) {
if ($scope.data.group) {
ContentService.clearCacheByGroup($scope.data.group._id);
$scope.data.selectFirstItem = selectFirstItem;
if ($scope.data.showingRecent === true)
loadRecentItems($scope.data.group._id, $scope.paging.pageSize);
else
$scope.data.showingRecent = true;
}
}
function onUploadProgress(name, index, loaded, total) {
var per = parseInt(100.0 * loaded / total);
console.log('percent: ' + per + ' ;' + name + '; ' + index);
}
function onUploadError(name, index, message) {
setMessage(message, 'alert-danger');
}
function isEnabled(item) {
if ($scope.data.allowedStatuses === null || $scope.data.allowedStatuses.indexOf(item.status) < 0)
return false;
else
return true;
}
function loadGroups(branch) {
var d = $q.defer();
GroupService.list(branch, 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 loadRecentItems(groupId, count) {
$scope.data.items = [];
$scope.data.showingRecent = true;
//load the items in this group
ContentService.getRecentItems(groupId, count).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;
if ($scope.data.selectFirstItem === true && $scope.data.items && $scope.data.items.length > 0) {
$scope.selectItem($scope.data.items[0]);
$scope.data.selectFirstItem = false;
}
//set the paging data
$scope.paging.pageNum = 1;
$scope.paging.pageCount = 1;
}
});
}
function clearMessage() {
$scope.dialog.message = "";
$scope.dialog.messageType = "";
}
function setMessage(msg, type) {
$scope.dialog.message = msg;
$scope.dialog.messageType = type;
}
function init()
{
$scope.dialog.title = title || "Image Selector";
$scope.data.selectionLabel = "Selected Image:";
if (value) {
$scope.imageProps.alt = value.alt;
$scope.imageProps.tooltip = value.tooltip;
$scope.imageProps.cssClass = value.cssClass;
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("media").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();
};