sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
353 lines (304 loc) • 11.1 kB
JavaScript
app.controller('EditController', function($scope, $q, $routeParams, $location, $timeout, $filter, ContentService, TemplateService, DialogService) {
$scope.data = {
title: "Edit Content: ",
listPageNum: 1,
imagePreviewUrl: ""
};
$scope.message = "";
$scope.messageType = ""; //alert-success, alert-warning, alert-info, alert-danger
$scope.item = null;
$scope.rights = null;
$scope.allTemplates = [];
$scope.templates = [];
$scope.group = null;
$scope.status = {
text: "",
css: ""
};
$scope.editData = {
//templates: [],
tab: '#general',
tags: "",
parents: []
};
$scope.buttons = {
back: true,
save: true,
publish: true,
unpublish: true,
delete: true,
restore: false,
viewPage: true,
deleteForever: false,
download: false,
design: false,
changeMedia: false
};
/* CKEditor */
$scope.editorOptions = {
language: 'en',
uiColor: '#000000'
};
$scope.showTab = function(v) {
$scope.editData.tab = v;
};
$scope.save = function() {
runCommand('save', null);
};
$scope.publish = function() {
runCommand('publish', null);
};
$scope.unpublish = function() {
if (confirm('Are you sure you want to unpublish and remove this content from the website?')) {
runCommand('unpublish', null);
}
};
$scope.changeMedia = function() {
DialogService.showFileSelector(function (files) {
if (files && files.length > 0) {
$scope.data.uploading = true;
setMessage("Uploading files...please wait...", "alert-info");
ContentService.changeMedia($scope.item.groupId, $scope.item.contentId, files[0], onUploadProgress, onUploadError).then(function (result) {
$scope.data.uploading = false;
if (result.success === true) {
setMessage("Upload complete!", "alert-success");
updateData(result.item);
timeoutClearMessage();
}
});
}
});
};
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.viewPage = function() {
//open the page in a new tab
window.open($scope.item.url, '_blank');
};
$scope.delete = function() {
if ($scope.item.status == 'D') //deleted
{
if (confirm("Are you sure you want to delete this content item FOREVER?")) {
runCommand('delete', {forever:true}).then(function(result) {
if (result == true)
$scope.back();
});
}
}
else if (confirm("Are you sure you want to delete this content item?")) {
runCommand('delete', {forever:false});
}
};
$scope.restore = function() {
if ($scope.item.status == 'D') {
runCommand('restore', null);
}
};
$scope.back = function() {
var path = $scope.group === null ? '/content' : '/' + $scope.group.branch;
if ($scope.group) {
$location.search("groupId", $scope.group._id);
$location.search("page", $scope.data.listPageNum);
}
$location.path(path);
};
function runCommand(cmd, options) {
var d = $q.defer();
//first fix the tags
setItemTags();
ContentService.runCommand(cmd, options, $scope.item).then(function(result) {
if (result && result.success == true) {
setMessage(result.message, 'alert-success');
updateData(result.item);
timeoutClearMessage();
d.resolve(true);
} else if (result) {
setMessage(result.message, 'alert-danger');
d.resolve(false);
} else {
setMessage('An unknown error occurred.', 'alert-danger');
d.resolve(false);
}
});
return d.promise;
}
function getItemTags() {
if ($scope.item && $scope.item.tags)
$scope.editData.tags = $scope.item.tags.join(' ');
else
$scope.editData.tags = "";
}
function setItemTags() {
$scope.item.tags = [];
var tags = $scope.editData.tags;
if (tags && tags.length > 0) {
tags = tags.replace(',', ' ').replace(';', ' ').replace(' ', ' ').replace(' ', ' ');
$scope.item.tags = tags.split(' ');
}
}
function updateData(item) {
if (item) {
$scope.item.modified = item.modified;
$scope.item.modifiedBy = item.modifiedBy;
$scope.item.url = item.url;
$scope.item.status = item.status;
$scope.item.filePath = item.filePath;
updatePreview();
updateStatus(item);
updateButtons(item);
getItemTags();
}
}
function updateStatus(item) {
if (item.status === 'N') {
$scope.status.text = 'New';
$scope.status.css = 'label-default';
}
else if (item.status === 'S') {
$scope.status.text = 'Saved';
$scope.status.css = 'label-info';
}
else if (item.status === 'P') {
$scope.status.text = 'Published';
$scope.status.css = 'label-success';
}
else if (item.status === 'M') {
$scope.status.text = 'Modified';
$scope.status.css = 'label-warning';
}
else if (item.status === 'D') {
$scope.status.text = 'Deleted';
$scope.status.css = 'label-danger';
}
}
function updateButtons(item) {
$scope.buttons.back = true;
if ($scope.rights) {
var rights = $scope.rights;
$scope.buttons.save = item.status !== 'D' && rights.update;
$scope.buttons.publish = item.status !== 'D' && rights.publish;
$scope.buttons.unpublish = (item.status === 'P' || item.status === 'M') && rights.publish;
$scope.buttons.viewPage = (item.status === 'P' || item.status === 'M') && item.templateId != null && rights.read;
$scope.buttons.download = item.branch === 'media' && rights.read;
$scope.buttons.delete = item.status !== 'D' && rights.delete;
$scope.buttons.deleteForever = item.status === 'D' && $scope.global.isAdmin;
$scope.buttons.restore = item.status === 'D' && rights.update;
$scope.buttons.design = ContentService.canDesign(item) && rights.update;
$scope.buttons.changeMedia = item.branch === 'media' && rights.update;
}
else {
$scope.buttons.save = false;
$scope.buttons.publish = false;
$scope.buttons.unpublish = false;
$scope.buttons.viewPage = false;
$scope.buttons.download = false;
$scope.buttons.delete = false;
$scope.buttons.deleteForever = false;
$scope.buttons.restore = false;
$scope.buttons.design = false;
$scope.buttons.changeMedia = false;
}
}
function timeoutClearMessage() {
$timeout(function() {
clearMessage();
}, 4000);
}
function clearMessage() {
$scope.message = "";
$scope.messageType = "";
}
function setMessage(msg, type) {
$scope.message = msg;
$scope.messageType = type;
}
function loadContent(contentId) {
ContentService.getContent(contentId, true).then(function(data) {
if (data && data.success === true && data.item) {
clearMessage();
$scope.item = data.item;
$scope.group = data.group;
$scope.rights = data.rights;
if (!$scope.item.fields)
$scope.item.fields = {};
updateStatus(data.item);
updateButtons(data.item);
updatePreview();
getItemTags();
filterTemplates();
}
else if (data) {
$scope.item = null;
setMessage(data.message, 'alert-danger');
}
});
}
function updatePreview() {
$scope.data.imagePreviewUrl = $scope.item.url + '?cmsmode=preview&t=' + new Date().getTime();
}
function filterTemplates() {
//only show the templates that are allowed by the content type
var arr = [];
arr.push({
_id: '',
name: ''
});
var found = false;
var type = $scope.item.type;
if (type && type.templates && type.templates.length > 0 && $scope.allTemplates && $scope.allTemplates.length > 0) {
var obj = {};
for (var i = 0; i < type.templates.length; i++) {
var tId = type.templates[i];
for (var j = 0; j < $scope.allTemplates.length; j++) {
if ($scope.allTemplates[j]._id == tId) {
var t = $scope.allTemplates[j];
arr.push({
_id: t._id,
name: t.name
});
if ($scope.item.templateId == tId)
found = true;
break;
}
}
}
}
//if this item's template wasn't found, then add a 'Not Found' list item
if (found === false && $scope.item.templateId) {
arr.push({
_id: $scope.item.templateId,
name: '(Template Not Found)'
});
}
if (!$scope.item.templateId)
$scope.item.templateId = '';
$scope.templates = arr;
}
function init() {
resize();
//get the list page number form the search query string
$scope.data.listPageNum = $location.search().page;
//clear the search querystring
for (prop in $location.search()) {
//don't remove the page param
if (prop !== 'page')
$location.search(prop, null);
}
$scope.$parent.resize('.content-edit-view');
clearMessage();
setMessage('Loading content properties...', 'alert-info');
TemplateService.list(true).then(function (data) {
$scope.allTemplates = data.templates;
loadContent($routeParams.contentId);
});
}
function resize() {
$scope.$parent.resize('.main-view', '.main-view-left');
}
init();
});