/core/js/admin-panel/page.js
JavaScript | 448 lines | 313 code | 60 blank | 75 comment | 40 complexity | bd26b7dcbf82da0d6ccce8a78b3e7041 MD5 | raw file
- /**************************************************
- * Page Controller *
- * Make new pages and edit old pages. *
- **************************************************/
- angular.module('cosmo').controller('pageCtrl', ['$scope', 'REST', '$location', 'Page', '$rootScope', '$routeParams', '$upload', 'Users', function($scope, REST, $location, Page, $rootScope, $routeParams, $upload, Users){
- // Initialize variables
- $scope.page = {
- id: Page.id,
- title: Page.title,
- description: Page.description,
- url: Page.url,
- publish: Page.publish,
- scheduleDate: Page.scheduleDate,
- tags: Page.tags,
- type: Page.type,
- themePages: []
- };
- // Set the date to today if no date was set
- if(!$scope.page.scheduleDate || $location.path() === '/new')
- $scope.page.scheduleDate = new Date(); // Math.round(+new Date().getTime()/1000); Depreciate?
- // Initialize schedule date - Depreciate?
- var date = new Date($scope.page.scheduleDate * 1000);
- var hours = date.getHours() > 12 ? date.getHours() - 12 : date.getHours();
- var ampm = date.getHours() > 12 ? 'PM' : 'AM';
- var formattedDate = date.getMonth() + 1 +'/'+ date.getDate() +'/'+ date.getFullYear() +' '+ hours +':'+ date.getMinutes() +' '+ ampm;
- // $scope.page.scheduleDate = formattedDate;
- // Get the pages available to this theme
- $scope.page.themePages = Page.themePages;
- // Initialize the page type
- if(Page.type)
- $scope.page.type = Page.type;
- else
- $scope.page.type = $scope.page.themePages[0];
- // todo: Save Page.extras save locally too
- // Check if there's an unsaved version from a previous session
- var elements = ['title', 'description', 'publish', 'scheduleDate', 'header', 'subheader', 'body', 'url'];
- if($location.path() !== '/new'){ // Don't apply this to new pages
- angular.forEach(elements, function(value){
- if(localStorage.getItem($routeParams.url + value) !== Page[value] && localStorage.getItem($routeParams.url + value) !== 'null')
- $scope.newerVersion = true;
- });
- }
- // Revert to the previously saved version
- $scope.localVersion = function(){
- var elements = ['title', 'description', 'publish', 'scheduleDate', 'header', 'subheader', 'body', 'url'];
- angular.forEach(elements, function(value){
- // Restore item
- if(localStorage.getItem($routeParams.url + value) !== 'null')
- Page[value] = localStorage.getItem($routeParams.url + value);
- // Clear item from storage
- localStorage.setItem($routeParams.url + value, null);
- });
- $scope.newerVersion = false;
- $rootScope.$broadcast('contentGet');
- };
- // Delete newer version
- $scope.deleteNewerVersion = function(){
- var elements = ['title', 'description', 'publish', 'scheduleDate', 'header', 'subheader', 'body', 'url'];
- angular.forEach(elements, function(value){
- localStorage.setItem($routeParams.url + value, null);
- });
- $scope.newerVersion = false;
- };
- // Delete the page
- $scope.deletePage = function(){
- // Delete the page
- REST.content.delete({ contentID: $scope.page.id }, function(data){
- // Success message
- $translate('deleted').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText});
- });
- });
- // Delete all revisions of this page
- REST.contentRevisions.delete({ contentID: $scope.page.id });
- // Delte all extra revisions
- REST.contentRevisionsExtras.delete({ contentID: $scope.page.id });
- // Delete all extras from this page
- REST.contentExtras.delete({ contentID: $scope.page.id });
- // Delete all tags for this page
- REST.contentTags.delete({ contentID: $scope.page.id });
- // Redirect to the default new page
- $location.path('new');
- };
- // Watch for page change
- var updatePage = function() {
- $scope.page.title = Page.title;
- $scope.page.description = Page.description;
- $scope.page.url = Page.url;
- $scope.page.type = Page.type;
- $scope.page.tags = Page.tags;
- };
- updatePage();
- $scope.$on('contentGet', function(){
- updatePage();
- });
- // Update the page type
- $scope.updatePageType = function(){
- Page.type = $scope.page.type;
- $rootScope.$broadcast('settingsGet');
- };
- // Auto-generate the url from the title
- $scope.titleChange = function(){
- // Log changes to the Page object
- Page.title = $scope.page.title;
- // Only auto-generate urls for new pages
- if($scope.page.url === '/new' || $scope.page.url === 'new' || !$scope.page.url)
- $scope.autoURL = true;
- if($scope.autoURL){
- // Change spaces to hyphens, convert to lowercase, and remove punctuation
- $scope.page.url = $scope.page.title.toLowerCase().replace(/ /g, '-').replace(/[\.,\/#!$%\^&\*;:{}=_'~()\?]/g, '');
- Page.url = $scope.page.url;
- }
- };
- // Save changes to the description
- $scope.descriptionChange = function(){
- Page.description = $scope.page.description;
- };
- // Save changes to the url
- $scope.urlChange = function(){
- Page.url = $scope.page.url;
- };
- // Update page variables when they are changed
- $scope.saveLocal = function(){
- Page.title = $scope.page.title;
- Page.description = $scope.page.description;
- Page.url = $scope.page.url;
- Page.type = $scope.page.type;
- // Save to local Storage
- localStorage.setItem($routeParams.url + 'title', Page.title);
- localStorage.setItem($routeParams.url + 'description', Page.description);
- localStorage.setItem($routeParams.url + 'url', Page.url);
- localStorage.setItem($routeParams.url + 'publish', Page.publish);
- localStorage.setItem($routeParams.url + 'scheduleDate', Page.scheduleDate);
- localStorage.setItem($routeParams.url + 'type', Page.type);
- };
- // Autocomplete tags
- $scope.autocompleteTags = function(){
- var tag = $scope.page.tags[$scope.page.tags.length - 1];
- if(tag){
- REST.contentTags.query({ tag: tag }, function(data){
- $scope.page.suggestions = data;
- }, function(){ // no tag found
- $scope.page.suggestions = [];
- });
- } else
- $scope.page.suggestions = [];
- };
- // Select tag from autocomplete
- $scope.selectSuggestion = function(tag){
- var tags = angular.copy($scope.page.tags);
- tags[tags.length - 1] = tag;
- tags[tags.length] = '';
- $scope.page.tags = tags;
- $scope.page.suggestions = [];
- };
- // Save the page
- $scope.savePage = function(duplicate){
- // Check for duplicate URL
- if(duplicate && $scope.page.url === $location.path()){
- $translate('page_different_url').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText, classes: 'alert-error'});
- });
- return;
- }
- // Make sure there is a page type
- if(!$scope.page.type){
- $translate('page_no_type_selected').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText, classes: 'alert-error'});
- });
- return;
- }
- // If there's no custom title tag, use the header
- if($scope.page.title){
- if($scope.page.title.length === 0)
- $scope.page.title = Page.header;
- }
- // If there's no custom url, throw an error
- if($scope.page.url.length === 0 || $scope.page.url === 'new'){
- $translate('page_no_url').then(function(translatedText){
- $rootScope.$broadcast('notify', { message: translatedText, classes: 'alert-error' });
- });
- return;
- }
- // Get the scheduled date to publish
- var scheduleDate;
- if($scope.page.publish === 'Y' && Page.publish === 'Y') // If this was already published, don't update the published date
- scheduleDate = Page.scheduleDate;
- else if($scope.page.publish === 'Y') // If publishing now, set the publish date to the current time
- scheduleDate = Math.round(+new Date().getTime()/1000);
- else if($scope.page.publish === 'schedule'){
- scheduleDate = Date.parse($scope.page.scheduleDate).getTime()/1000;
- // Check if this is back dated
- if(Date.parse($scope.page.scheduleDate).getTime() < Math.round(+new Date().getTime()))
- $scope.page.publish = 'Y';
- else
- $scope.page.publish = 'N';
- }
- // Get the featured image URL
- if(Page.extras.featured)
- var featured = Page.extras.featured.src;
- else
- var featured = null;
- // Create a new page or a duplicate
- if($location.path() === '/new' || duplicate){
- // Save content
- REST.content.save({
- title: $scope.page.title,
- description: $scope.page.description,
- header: Page.header,
- subheader: Page.subheader,
- featured: featured,
- body: Page.body,
- url: $scope.page.url,
- type: $scope.page.type,
- published: $scope.page.publish,
- published_date: scheduleDate,
- author: Users.id
- }, newPagePromise, function(){ // Error
- $translate('page_error_saving').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText, classes: 'alert-error'});
- });
- });
- } else { // Update existing page
- var revisionID;
- // Update the page
- REST.content.update({
- contentID: $scope.page.id,
- title: $scope.page.title,
- description: $scope.page.description,
- header: Page.header,
- subheader: Page.subheader,
- featured: featured,
- body: Page.body,
- url: $scope.page.url,
- type: $scope.page.type,
- published: $scope.page.publish,
- published_date: scheduleDate,
- author: Users.id
- }, updatePagePromise, function(data){ // Error
- $translate('page_error_updating').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText, classes: 'alert-error'});
- });
- });
- }
- // Update the page after a new page was saved
- function newPagePromise(data){
- var contentID = data.id;
- // Reset variables to edit page
- $scope.page.id = contentID;
- $scope.autoURL = false;
- // Save new tags
- if($scope.page.tags){
- angular.forEach($scope.page.tags, function(value){
- REST.contentTags.save({ contentID: contentID, tag: value });
- });
- }
- // Save page as a revision
- REST.contentRevisions.save({
- contentID: contentID,
- title: $scope.page.title,
- description: $scope.page.description,
- header: Page.header,
- subheader: Page.subheader,
- featured: featured,
- body: Page.body,
- url: $scope.page.url,
- type: $scope.page.type,
- published: $scope.page.publish,
- published_date: scheduleDate,
- author: Users.id
- }, saveRevisionPromise);
- }
- // Update the page after saving a page revision
- function saveRevisionPromise(data){
- revisionID = data.id;
- var extrasCounter = {
- i: 1
- };
- // Save additional data if there is any
- if(Object.keys(Page.extras).length === 0){
- // Success message
- $translate('saved').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText});
- });
- // Redirect to new page
- $location.path($scope.page.url);
- } else {
- for(var key in Page.extras){
- // Stringify arrays and objects
- if(typeof Page.extras[key] === 'object')
- Page.extras[key] = angular.toJson(Page.extras[key]);
- // Save extra
- REST.contentExtras.save({
- contentID: contentID,
- name: key,
- extra: Page.extras[key]
- }, saveExtrasPromise, saveExtrasPromise);
- // Save extra to revisions
- REST.contentRevisionsExtras.save({
- revisionID: revisionID,
- contentID: contentID,
- name: key,
- extra: Page.extras[key]
- });
- };
- }
- $translate('page_created').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText});
- });
- }
- // Notify the user after saving the last extra
- function saveExtrasPromise(){
- // Wait for the last extra to be saved, then redirect the user
- if(extrasCounter.i === Object.keys(Page.extras).length){
- // Success message
- $translate('page_created').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText});
- });
- // Redirect to new page
- $location.path($scope.page.url);
- } else
- extrasCounter.i++;
- }
- // Update the page after it's been saved
- function updatePagePromise(data){
- // Delete old tags
- REST.contentTags.delete({ contentID: $scope.page.id }, deleteTagsPromise);
- // Save page as a revision
- REST.contentRevisions.save({
- contentID: $scope.page.id,
- title: $scope.page.title,
- description: $scope.page.description,
- header: Page.header,
- subheader: Page.subheader,
- featured: featured,
- body: Page.body,
- url: $scope.page.url,
- type: $scope.page.type,
- published: $scope.page.publish,
- published_date: $scope.page.scheduleDate,
- author: Users.id
- }, savePageRevisionPromise);
- }
- // Callback for saving a page revision
- function savePageRevisionPromise(data){
- revisionID = data.id;
- // Delete old extras
- REST.contentExtras.delete({ contentID: $scope.page.id }, deleteExtrasPromise);
- }
- // Callback after tags are deleted
- function deleteTagsPromise(){
- // Save new tags
- angular.forEach($scope.page.tags, function(value){
- REST.contentTags.save({ contentID: $scope.page.id, tag: value });
- });
- }
- // Callback after deleting extras
- function deleteExtrasPromise(){
- // Save additional data
- for (var key in Page.extras){
- if (Page.extras.hasOwnProperty(key)){
- // Stringify arrays and objects
- if(typeof Page.extras[key] === 'object')
- Page.extras[key] = angular.toJson(Page.extras[key]);
- // Save new extra
- REST.contentExtras.save({
- contentID: $scope.page.id,
- name: key,
- extra: Page.extras[key]
- }, saveExtrasPromise, saveExtrasPromise);
- // Save new extra to revisions
- REST.contentRevisionsExtras.save({
- revisionID: revisionID,
- contentID: $scope.page.id,
- name: key,
- extra: Page.extras[key]
- });
- }
- }
- // If there were no extras, notify right away
- if(!Page.extras.length) {
- $translate('page_updated').then(function(translatedText){
- $rootScope.$broadcast('notify', {message: translatedText});
- });
- }
- }
- };
- }]);