UNPKG

sheercms

Version:

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

304 lines (253 loc) 9.95 kB
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(); };