X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/59ce228c2e01288846d823d563e31a1ba357b63d..refs/pull/84/head:/resources/assets/js/controllers.js diff --git a/resources/assets/js/controllers.js b/resources/assets/js/controllers.js index 305e0c3c1..dbd2e1ae6 100644 --- a/resources/assets/js/controllers.js +++ b/resources/assets/js/controllers.js @@ -4,6 +4,7 @@ module.exports = function (ngApp, events) { ngApp.controller('ImageManagerController', ['$scope', '$attrs', '$http', '$timeout', 'imageManagerService', function ($scope, $attrs, $http, $timeout, imageManagerService) { + $scope.images = []; $scope.imageType = $attrs.imageType; $scope.selectedImage = false; @@ -12,6 +13,8 @@ module.exports = function (ngApp, events) { $scope.hasMore = false; $scope.imageUpdateSuccess = false; $scope.imageDeleteSuccess = false; + $scope.uploadedTo = $attrs.uploadedTo; + var page = 0; var previousClickTime = 0; var dataLoaded = false; @@ -213,49 +216,115 @@ module.exports = function (ngApp, events) { }]); - ngApp.controller('PageEditController', ['$scope', '$http', '$attrs', '$interval', function ($scope, $http, $attrs, $interval) { + ngApp.controller('PageEditController', ['$scope', '$http', '$attrs', '$interval', '$timeout', '$sce', + function ($scope, $http, $attrs, $interval, $timeout, $sce) { $scope.editorOptions = require('./pages/page-form'); - $scope.editorHtml = ''; + $scope.editContent = ''; $scope.draftText = ''; var pageId = Number($attrs.pageId); var isEdit = pageId !== 0; + var autosaveFrequency = 30; // AutoSave interval in seconds. + var isMarkdown = $attrs.editorType === 'markdown'; + $scope.isUpdateDraft = Number($attrs.pageUpdateDraft) === 1; + $scope.isNewPageDraft = Number($attrs.pageNewDraft) === 1; + + // Set inital header draft text + if ($scope.isUpdateDraft || $scope.isNewPageDraft) { + $scope.draftText = 'Editing Draft' + } else { + $scope.draftText = 'Editing Page' + }; + + var autoSave = false; + + var currentContent = { + title: false, + html: false + }; if (isEdit) { - startAutoSave(); + setTimeout(() => { + startAutoSave(); + }, 1000); } - $scope.editorChange = function() { - $scope.draftText = ''; + // Actions specifically for the markdown editor + if (isMarkdown) { + $scope.displayContent = ''; + // Editor change event + $scope.editorChange = function (content) { + $scope.displayContent = $sce.trustAsHtml(content); + } } - function startAutoSave() { - var currentTitle = $('#name').val(); - var currentHtml = $scope.editorHtml; + if (!isMarkdown) { + $scope.editorChange = function() {}; + } - console.log('Starting auto save'); + /** + * Start the AutoSave loop, Checks for content change + * before performing the costly AJAX request. + */ + function startAutoSave() { + currentContent.title = $('#name').val(); + currentContent.html = $scope.editContent; - $interval(() => { + autoSave = $interval(() => { var newTitle = $('#name').val(); - var newHtml = $scope.editorHtml; + var newHtml = $scope.editContent; - if (newTitle !== currentTitle || newHtml !== currentHtml) { - currentHtml = newHtml; - currentTitle = newTitle; - saveDraftUpdate(newTitle, newHtml); + if (newTitle !== currentContent.title || newHtml !== currentContent.html) { + currentContent.html = newHtml; + currentContent.title = newTitle; + saveDraft(); } - }, 1000*5); + + }, 1000 * autosaveFrequency); } - function saveDraftUpdate(title, html) { - $http.put('/ajax/page/' + pageId + '/save-draft', { - name: title, - html: html - }).then((responseData) => { - $scope.draftText = 'Draft saved' - }) + /** + * Save a draft update into the system via an AJAX request. + * @param title + * @param html + */ + function saveDraft() { + var data = { + name: $('#name').val(), + html: isMarkdown ? $sce.getTrustedHtml($scope.displayContent) : $scope.editContent + }; + + if (isMarkdown) data.markdown = $scope.editContent; + + $http.put('/ajax/page/' + pageId + '/save-draft', data).then((responseData) => { + $scope.draftText = responseData.data.message; + if (!$scope.isNewPageDraft) $scope.isUpdateDraft = true; + }); } + $scope.forceDraftSave = function() { + saveDraft(); + }; + + /** + * Discard the current draft and grab the current page + * content from the system via an AJAX request. + */ + $scope.discardDraft = function () { + $http.get('/ajax/page/' + pageId).then((responseData) => { + if (autoSave) $interval.cancel(autoSave); + $scope.draftText = 'Editing Page'; + $scope.isUpdateDraft = false; + $scope.$broadcast('html-update', responseData.data.html); + $scope.$broadcast('markdown-update', responseData.data.markdown || responseData.data.html); + $('#name').val(responseData.data.name); + $timeout(() => { + startAutoSave(); + }, 1000); + events.emit('success', 'Draft discarded, The editor has been updated with the current page content'); + }); + }; + }]); }; \ No newline at end of file