UNPKG

sheercms

Version:

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

565 lines (502 loc) 18.8 kB
app.controller('PackageController', function($scope, PackageService, ContentService, TemplateService, ContentTypeService, DialogService, $modal) { $scope.data = { title: "Packages", packages: [], message: "", messageType: "", selectedId: null, view: 'list', tab: 'props', packageIcon: "/cms/static/images/icons/32/package.png", downloadUrl: null, overwriteValuesPkg: ['yes', 'no'], overwriteValues: ['default', 'yes', 'no'], needsSaving: false, isAuthorized: false }; $scope.package = null; $scope.buttons = { back: false, newPackage: true, addGroup: false, addContent: false, addMedia: false, addTemplate: false, addContentType: false, save: false, delete: false, build: false, refresh: true, removeItems: false, install: true, validate: false }; $scope.checks = { allContent: false, allMedia: false, allTypes: false, allTemplates: false, allGroups: false }; $scope.back = function() { clearMessage(); if ($scope.data.needsSaving === true && !confirm('This package needs saving! Do you want to continue and lose your changes?')) { return; } $scope.package = null; $scope.data.view = 'list'; $scope.data.downloadUrl = null; updateButtons(); }; $scope.setTab = function(name) { $scope.data.tab = name; }; $scope.addItem = function(type) { clearMessage(); if (type === 'content' || type === 'media') { var options = { branch: type, title: 'Select Content Items', multiple: true, statuses: 'NSMPD', onSuccess: function(items) { var count = 0; if (items && items.length > 0) { for(var i = 0; i < items.length; i++) { var item = items[i]; var success = addItemToPackage(type, item.contentId, item.name, 'default'); if (success === true) count++; } showAddMessage(count); } } }; DialogService.openItemSelector(options); } else if (type === 'group') { DialogService.openGroupSelector('content,media', 'Select a group to add to the package', function(group) { var success = addItemToPackage('group', group._id, group.name, 'default'); var c = success === true ? 1 : 0; showAddMessage(c); }); } else if (type === 'template') { TemplateService.openTemplateSelector('Select Templates', 'Select one or more templates to add to the package:', true, function(value) { if (value && value.length > 0) { var c = 0; for(var i = 0; i < value.length; i++) { var t = value[i]; var success = addItemToPackage('template', t._id, t.name, false, 'default'); if (success === true) c++; } showAddMessage(c); } }); } else if (type === 'type') { ContentTypeService.openContentTypeSelector('Select Content Types', 'Select one or more types to add to the package:', true, function(value) { if (value && value.length > 0) { var c = 0; for(var i = 0; i < value.length; i++) { var t = value[i]; var success = addItemToPackage('type', t._id, t.name, false, 'default'); if (success === true) c++; } showAddMessage(c); } }); } }; function showAddMessage(count) { if (count === 0) setMessage('No items were added to the package.', 'alert-danger'); else if (count === 1) setMessage('1 item successfully added to the package.', 'alert-info'); else setMessage(count + ' items successfully added to the package.', 'alert-info'); } $scope.savePackage = function() { setMessage('Saving package...', 'alert-info'); PackageService.update($scope.package).then(function(data) { if (data) { if (data.success === true) { setMessage('Package saved successfully.', 'alert-success'); $scope.data.needsSaving = false; } else { setMessage(data.message, 'alert-danger'); } } else { setMessage('Error saving the package!', 'alert-danger'); } }); }; $scope.editPackage = function(id) { clearMessage(); PackageService.getPackage(id).then(function(data) { if (data) { if (data.success === true) { if (data.package) { $scope.data.needsSaving = false; $scope.package = data.package; $scope.data.view = 'details'; updateButtons(); } else { setMessage('Package not found!', 'alert-danger'); } } else { setMessage(data.message, 'alert-danger'); } } else { setMessage('Package not found!', 'alert-danger'); } }); }; $scope.toggleCheck = function(item) { if (item.checked === false) { if (item.itemType === 'content') $scope.checks.allContent = false; else if (item.itemType === 'media') $scope.checks.allMedia = false; else if (item.itemType === 'type') $scope.checks.allTypes = false; else if (item.itemType === 'template') $scope.checks.allTemplates = false; else if (item.itemType === 'group') $scope.checks.allGroups = false; } }; $scope.toggleCheckAll = function(type) { if ($scope.package.items) { for (var i = 0; i < $scope.package.items.length; i++) { var item = $scope.package.items[i]; if (item.itemType === type) { if (type === 'content') item.checked = $scope.checks.allContent; else if (type === 'media') item.checked = $scope.checks.allMedia; else if (type === 'type') item.checked = $scope.checks.allTypes; else if (type === 'template') item.checked = $scope.checks.allTemplates; else if (type === 'group') item.checked = $scope.checks.allGroups; } } } }; $scope.removeItems = function() { clearMessage(); if (confirm('Are you sure you want to remove the checked items on the current tab from this package?')) { if ($scope.package.items) { var type = $scope.data.tab; var arr = []; for(var i = 0; i < $scope.package.items.length; i++) { var item = $scope.package.items[i]; if (item.itemType !== type || item.checked !== true) { arr.push(item); } } $scope.package.items = arr; $scope.data.needsSaving = true; } } }; $scope.deletePackage = function() { clearMessage(); if ($scope.package && confirm('Are you sure you want to delete this package?')) { setMessage('Deleting package...', 'alert-info'); var id = $scope.package._id; PackageService.delete(id).then(function(data) { if (data) { if (data.success === true) { setMessage('Package deleted successfully.', 'alert-success'); //reload the packages list loadPackages(false); $scope.data.needsSaving = false; $scope.back(); } else { setMessage(data.message, 'alert-danger'); } } else { setMessage('Error deleting the package!', 'alert-danger'); } }); } }; $scope.showNewPackage = function() { var name = prompt("Enter the new package name:"); if (name) { clearMessage(); PackageService.create(name).then(function(data) { //reload the packages loadPackages(false); //edit the new package if (data.package) $scope.package(data.package._id); }); } }; $scope.refresh = function() { loadPackages(false); }; $scope.validate = function() { clearMessage(); if ($scope.package) { if ($scope.data.needsSaving === true) { alert('You must save the package before validating it!'); return; } setMessage('Validating package...', 'alert-info'); var id = $scope.package._id; PackageService.validate(id).then(function(data) { if (data) { if (data.success === true) { var msgType = data.valid === true ? 'alert-success' : 'alert-danger'; var msg = data.message; if (data.valid === false) msg += ' The invalid items are displayed in red.'; setMessage(msg, msgType); if (data.valid === false && data.invalidItems && $scope.package.items) { //clear all invalid flags for(var j = 0; j < $scope.package.items; j++) { var item = $scope.package.items[j]; item.invalid = false; } //mark the invalid package items for(var i = 0; i < data.invalidItems.length; i++) { var invalidItem = data.invalidItems[i]; console.log('invalid item: ' + invalidItem.itemId); for(var j = 0; j < $scope.package.items.length; j++) { var item = $scope.package.items[j]; if (item.itemId == invalidItem.itemId) { item.invalid = true; break; } } } } } else { setMessage(data.message, 'alert-danger'); } } else { setMessage('Error validating the package!', 'alert-danger'); } }); } }; $scope.build = function() { clearMessage(); if ($scope.package) { if ($scope.data.needsSaving === true) { alert('You must save the package before building it!'); return; } setMessage('Building package...', 'alert-info'); var id = $scope.package._id; PackageService.build(id).then(function(data) { if (data) { if (data.success === true) { setMessage(data.message, 'alert-success'); $scope.data.downloadUrl = '/cms/packages/download?id=' + id; } else { setMessage(data.message, 'alert-danger'); } } else { setMessage('Error building the package!', 'alert-danger'); } }); } }; $scope.installPackage = function() { var modalInstance = $modal.open({ templateUrl: 'InstallPackageDialog', controller: InstallPackageDialogController, windowClass: 'large-dialog', resolve: { } }); modalInstance.result.then(function (value) { //success }, function () { //cancelled }); }; function init() { $scope.$parent.resize('.package-view'); if ($scope.global.isAdmin === true) { $scope.data.isAuthorized = true; loadPackages(); } else { $scope.data.isAuthorized = false; } } function addItemToPackage(type, id, name, overwrite) { if ($scope.package) { var pkg = $scope.package; if (!pkg.items) pkg.items = []; //make sure this item isn't already in the package for(var i = 0; i < pkg.items.length; i++) { var item = pkg.items[i]; if (item.itemId === id) return false; } pkg.items.push(new PackageItem(type, id, name, overwrite)); $scope.data.needsSaving = true; return true; //success } return null; } function loadPackages(useCache) { PackageService.list(useCache).then(function(data) { if (data.success) { $scope.data.packages = data.packages; } else { setMessage(data.message, "alert-danger"); } }); } function updateButtons() { if ($scope.package) { $scope.buttons.back = true; $scope.buttons.newPackage = false; $scope.buttons.save = true; $scope.buttons.addGroup = true; $scope.buttons.addContent = true; $scope.buttons.addMedia = true; $scope.buttons.addTemplate = true; $scope.buttons.addContentType = true; $scope.buttons.delete = true; $scope.buttons.build = true; $scope.buttons.refresh = false; $scope.buttons.removeItems = true; $scope.buttons.install = false; $scope.buttons.validate = true; } else { $scope.buttons.back = false; $scope.buttons.newPackage = true; $scope.buttons.save = false; $scope.buttons.addGroup = false; $scope.buttons.addContent = false; $scope.buttons.addMedia = false; $scope.buttons.addTemplate = false; $scope.buttons.addContentType = false; $scope.buttons.delete = false; $scope.buttons.build = false; $scope.buttons.refresh = true; $scope.buttons.removeItems = false; $scope.buttons.install = true; $scope.buttons.validate = false; } } function clearMessage() { $scope.data.message = ""; $scope.data.messageType = ""; } function setMessage(msg, type) { $scope.data.message = msg; $scope.data.messageType = type; } function PackageItem(type, id, name, overwrite) { var self = this; self.itemType = type; self.itemId = id; self.name = name; self.overwrite = overwrite || 'default'; } init(); }); var InstallPackageDialogController = function ($scope, $modalInstance, PackageService) { $scope.dialog = { title: "Install a Package", message: "", messageType: "" }; $scope.uploadData = { files: [], hasFiles: false, uploadProgress: 0, installProgress: 0, uploading: false, results: null }; $scope.onFileSelect = function($files) { if ($files && $files.length > 0) { $scope.uploadData.files = $files; $scope.uploadData.hasFiles = true; } else $scope.clearFiles(); }; $scope.clearFiles = function() { $scope.uploadData.files = []; $scope.uploadData.hasFiles = false; $scope.uploadData.uploadProgress = 0; $scope.uploadData.installProgress = 0; $scope.uploadData.uploading = false; }; $scope.ok = function() { clearMessage(); if ($scope.uploadData.hasFiles === true) { startInstall(); } else { setMessage("You must select a package file to upload.", "alert-danger"); } }; $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; function clearMessage() { $scope.dialog.message = ""; $scope.dialog.messageType = ""; } function setMessage(msg, type) { $scope.dialog.message = msg; $scope.dialog.messageType = type; } function startInstall() { var file = $scope.uploadData.files[0]; $scope.uploadData.uploadProgress = 0; $scope.uploadData.installProgress = 0; $scope.uploadData.uploading = true; $scope.uploadData.results = null; PackageService.upload(file, onUploadProgress, onUploadError).then(function(result) { $scope.clearFiles(); if (result.success === true) { setMessage('Upload complete!', 'alert-success'); $scope.uploadData.results = result.results; } else { setMessage(result.message, 'alert-danger'); } }); }; function onUploadProgress(filename, loaded, total) { var per = parseInt(100.0 * loaded / total); $scope.uploadData.uploadProgress = per; console.log('package upload percent: ' + per); } function onUploadError(filename, msg) { setMessage(msg, 'alert-danger'); $scope.clearFiles(); } };