UNPKG

sheercms

Version:

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

257 lines (212 loc) 8.26 kB
/* Angular Controller for the WYSIWYG Editor Dialogs */ var app = angular.module('app', ['angularFileUpload', 'ui.bootstrap', 'angular-data.DSCacheFactory']); app.controller('EditorItemSelectorController', function($scope, $q, ContentService, GroupService, DialogService) { $scope.dialog = { message: "", messageType: "", disableOk: true }; $scope.data = { allowedStatuses: 'SMP', items: [], groups: [], group: null, selectedItem: null, selectionLabel: "", uploadCount: 0, showingRecent: false, selectFirstItem: false }; $scope.paging = { pageSize: 12, pageNum: 1, pageCount: 0, paginate: function(num) { loadItems($scope.data.group._id, num); } }; $scope.init = function(branch) { $scope.data.selectionLabel = "Selected Item:"; $scope.editorType = getUrlParam("editor"); $scope.funcNum = getUrlParam('CKEditorFuncNum'); loadGroups(branch).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]; } }); }; $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 () { var items = []; if ($scope.data.selectedItem) { var item = $scope.data.selectedItem; if ($scope.editorType == 'tinymce') { parent.tinymce.activeEditor.windowManager.getParams().result(item.url); parent.tinymce.activeEditor.windowManager.close(); } else { window.opener.CKEDITOR.tools.callFunction($scope.funcNum, item.url); window.close(); } } }; $scope.cancel = function () { if ($scope.editorType == 'tinymce') parent.tinymce.activeEditor.windowManager.close(); else window.close(); }; $scope.upload = function() { if ($scope.data.group) { DialogService.showFileSelector(function (files) { if (files && files.length > 0) { $scope.data.uploading = true; ContentService.upload($scope.data.group._id, files, true, onUploadProgress, onUploadError).then(function (result) { $scope.data.uploading = false; showRecent(true); //loadItems($scope.data.group._id, $scope.paging.pageNum); }); } }); } }; 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'); } $scope.selectItem = function(item) { if (isEnabled(item)) { $scope.data.selectedItem = item; } }; $scope.unSelectItem = function(item) { $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(branch) { var d = $q.defer(); GroupService.list(branch, null).then(function(result) { if (result && result.success === true) { //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) $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"; } } $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, selectFirstItem) { $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"; } } $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 getUrlParam( paramName ) { var reParam = new RegExp( '(?:[\?&]|&)' + paramName + '=([^&]+)', 'i' ) ; var match = window.location.search.match(reParam) ; return ( match && match.length > 1 ) ? match[ 1 ] : null ; } });