sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
257 lines (212 loc) • 8.26 kB
JavaScript
/*
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 ;
}
});