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