UNPKG

sheercms

Version:

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

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