| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | const moment = require('moment'); | 
					
						
							|  |  |  | require('moment/locale/en-gb'); | 
					
						
							|  |  |  | const editorOptions = require("./pages/page-form"); | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-31 01:44:00 +08:00
										 |  |  | moment.locale('en-gb'); | 
					
						
							| 
									
										
										
										
											2016-04-09 20:36:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 01:47:33 +08:00
										 |  |  | module.exports = function (ngApp, events) { | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ngApp.controller('ImageManagerController', ['$scope', '$attrs', '$http', '$timeout', 'imageManagerService', | 
					
						
							|  |  |  |         function ($scope, $attrs, $http, $timeout, imageManagerService) { | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.images = []; | 
					
						
							|  |  |  |             $scope.imageType = $attrs.imageType; | 
					
						
							|  |  |  |             $scope.selectedImage = false; | 
					
						
							|  |  |  |             $scope.dependantPages = false; | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  |             $scope.showing = false; | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.hasMore = false; | 
					
						
							|  |  |  |             $scope.imageUpdateSuccess = false; | 
					
						
							|  |  |  |             $scope.imageDeleteSuccess = false; | 
					
						
							| 
									
										
										
										
											2016-03-13 21:30:47 +08:00
										 |  |  |             $scope.uploadedTo = $attrs.uploadedTo; | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |             $scope.view = 'all'; | 
					
						
							| 
									
										
										
										
											2016-10-31 01:44:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |             $scope.searching = false; | 
					
						
							|  |  |  |             $scope.searchTerm = ''; | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |             let page = 0; | 
					
						
							|  |  |  |             let previousClickTime = 0; | 
					
						
							|  |  |  |             let previousClickImage = 0; | 
					
						
							|  |  |  |             let dataLoaded = false; | 
					
						
							|  |  |  |             let callback = false; | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |             let preSearchImages = []; | 
					
						
							|  |  |  |             let preSearchHasMore = false; | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |              * Used by dropzone to get the endpoint to upload to. | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |              * @returns {string} | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.getUploadUrl = function () { | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  |                 return window.baseUrl('/images/' + $scope.imageType + '/upload'); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Cancel the current search operation. | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             function cancelSearch() { | 
					
						
							|  |  |  |                 $scope.searching = false; | 
					
						
							|  |  |  |                 $scope.searchTerm = ''; | 
					
						
							|  |  |  |                 $scope.images = preSearchImages; | 
					
						
							|  |  |  |                 $scope.hasMore = preSearchHasMore; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $scope.cancelSearch = cancelSearch; | 
					
						
							| 
									
										
										
										
											2016-10-31 01:44:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Runs on image upload, Adds an image to local list of images | 
					
						
							|  |  |  |              * and shows a success message to the user. | 
					
						
							|  |  |  |              * @param file | 
					
						
							|  |  |  |              * @param data | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.uploadSuccess = function (file, data) { | 
					
						
							|  |  |  |                 $scope.$apply(() => { | 
					
						
							|  |  |  |                     $scope.images.unshift(data); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                 events.emit('success', trans('components.image_upload_success')); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             }; | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Runs the callback and hides the image manager. | 
					
						
							|  |  |  |              * @param returnData | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             function callbackAndHide(returnData) { | 
					
						
							|  |  |  |                 if (callback) callback(returnData); | 
					
						
							| 
									
										
										
										
											2016-08-31 03:05:59 +08:00
										 |  |  |                 $scope.hide(); | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Image select action. Checks if a double-click was fired. | 
					
						
							|  |  |  |              * @param image | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.imageSelect = function (image) { | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |                 let dblClickTime = 300; | 
					
						
							|  |  |  |                 let currentTime = Date.now(); | 
					
						
							|  |  |  |                 let timeDiff = currentTime - previousClickTime; | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |                 if (timeDiff < dblClickTime && image.id === previousClickImage) { | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                     // If double click
 | 
					
						
							|  |  |  |                     callbackAndHide(image); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     // If single
 | 
					
						
							|  |  |  |                     $scope.selectedImage = image; | 
					
						
							|  |  |  |                     $scope.dependantPages = false; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 previousClickTime = currentTime; | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |                 previousClickImage = image.id; | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Action that runs when the 'Select image' button is clicked. | 
					
						
							|  |  |  |              * Runs the callback and hides the image manager. | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.selectButtonClick = function () { | 
					
						
							|  |  |  |                 callbackAndHide($scope.selectedImage); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Show the image manager. | 
					
						
							|  |  |  |              * Takes a callback to execute later on. | 
					
						
							|  |  |  |              * @param doneCallback | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             function show(doneCallback) { | 
					
						
							|  |  |  |                 callback = doneCallback; | 
					
						
							|  |  |  |                 $scope.showing = true; | 
					
						
							| 
									
										
										
										
											2016-08-31 03:05:59 +08:00
										 |  |  |                 $('#image-manager').find('.overlay').css('display', 'flex').hide().fadeIn(240); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                 // Get initial images if they have not yet been loaded in.
 | 
					
						
							|  |  |  |                 if (!dataLoaded) { | 
					
						
							|  |  |  |                     fetchData(); | 
					
						
							|  |  |  |                     dataLoaded = true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             // Connects up the image manger so it can be used externally
 | 
					
						
							|  |  |  |             // such as from TinyMCE.
 | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             imageManagerService.show = show; | 
					
						
							|  |  |  |             imageManagerService.showExternal = function (doneCallback) { | 
					
						
							|  |  |  |                 $scope.$apply(() => { | 
					
						
							|  |  |  |                     show(doneCallback); | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  |             window.ImageManager = imageManagerService; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Hide the image manager | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.hide = function () { | 
					
						
							|  |  |  |                 $scope.showing = false; | 
					
						
							| 
									
										
										
										
											2016-08-31 03:05:59 +08:00
										 |  |  |                 $('#image-manager').find('.overlay').fadeOut(240); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |             let baseUrl = window.baseUrl('/images/' + $scope.imageType + '/all/'); | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Fetch the list image data from the server. | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             function fetchData() { | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |                 let url = baseUrl + page + '?'; | 
					
						
							|  |  |  |                 let components = {}; | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |                 if ($scope.uploadedTo) components['page_id'] = $scope.uploadedTo; | 
					
						
							|  |  |  |                 if ($scope.searching) components['term'] = $scope.searchTerm; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                 url += Object.keys(components).map((key) => { | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |                     return key + '=' + encodeURIComponent(components[key]); | 
					
						
							|  |  |  |                 }).join('&'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                 $http.get(url).then((response) => { | 
					
						
							|  |  |  |                     $scope.images = $scope.images.concat(response.data.images); | 
					
						
							|  |  |  |                     $scope.hasMore = response.data.hasMore; | 
					
						
							|  |  |  |                     page++; | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             $scope.fetchData = fetchData; | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Start a search operation | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.searchImages = function() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if ($scope.searchTerm === '') { | 
					
						
							|  |  |  |                     cancelSearch(); | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (!$scope.searching) { | 
					
						
							|  |  |  |                     preSearchImages = $scope.images; | 
					
						
							|  |  |  |                     preSearchHasMore = $scope.hasMore; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $scope.searching = true; | 
					
						
							|  |  |  |                 $scope.images = []; | 
					
						
							|  |  |  |                 $scope.hasMore = false; | 
					
						
							|  |  |  |                 page = 0; | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  |                 baseUrl = window.baseUrl('/images/' + $scope.imageType + '/search/'); | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |                 fetchData(); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Set the current image listing view. | 
					
						
							|  |  |  |              * @param viewName | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.setView = function(viewName) { | 
					
						
							|  |  |  |                 cancelSearch(); | 
					
						
							|  |  |  |                 $scope.images = []; | 
					
						
							|  |  |  |                 $scope.hasMore = false; | 
					
						
							|  |  |  |                 page = 0; | 
					
						
							|  |  |  |                 $scope.view = viewName; | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  |                 baseUrl = window.baseUrl('/images/' + $scope.imageType  + '/' + viewName + '/'); | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  |                 fetchData(); | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |             }; | 
					
						
							| 
									
										
										
										
											2016-04-03 21:59:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Save the details of an image. | 
					
						
							|  |  |  |              * @param event | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.saveImageDetails = function (event) { | 
					
						
							|  |  |  |                 event.preventDefault(); | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |                 let url = window.baseUrl('/images/update/' + $scope.selectedImage.id); | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |                 $http.put(url, this.selectedImage).then(response => { | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                     events.emit('success', trans('components.image_update_success')); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                 }, (response) => { | 
					
						
							| 
									
										
										
										
											2016-02-28 04:52:46 +08:00
										 |  |  |                     if (response.status === 422) { | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |                         let errors = response.data; | 
					
						
							|  |  |  |                         let message = ''; | 
					
						
							| 
									
										
										
										
											2016-02-28 04:52:46 +08:00
										 |  |  |                         Object.keys(errors).forEach((key) => { | 
					
						
							|  |  |  |                             message += errors[key].join('\n'); | 
					
						
							|  |  |  |                         }); | 
					
						
							|  |  |  |                         events.emit('error', message); | 
					
						
							|  |  |  |                     } else if (response.status === 403) { | 
					
						
							|  |  |  |                         events.emit('error', response.data.error); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                 }); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Delete an image from system and notify of success. | 
					
						
							|  |  |  |              * Checks if it should force delete when an image | 
					
						
							|  |  |  |              * has dependant pages. | 
					
						
							|  |  |  |              * @param event | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |             $scope.deleteImage = function (event) { | 
					
						
							|  |  |  |                 event.preventDefault(); | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |                 let force = $scope.dependantPages !== false; | 
					
						
							|  |  |  |                 let url = window.baseUrl('/images/' + $scope.selectedImage.id); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                 if (force) url += '?force=true'; | 
					
						
							|  |  |  |                 $http.delete(url).then((response) => { | 
					
						
							|  |  |  |                     $scope.images.splice($scope.images.indexOf($scope.selectedImage), 1); | 
					
						
							|  |  |  |                     $scope.selectedImage = false; | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                     events.emit('success', trans('components.image_delete_success')); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                 }, (response) => { | 
					
						
							|  |  |  |                     // Pages failure
 | 
					
						
							|  |  |  |                     if (response.status === 400) { | 
					
						
							|  |  |  |                         $scope.dependantPages = response.data; | 
					
						
							| 
									
										
										
										
											2016-02-28 04:52:46 +08:00
										 |  |  |                     } else if (response.status === 403) { | 
					
						
							|  |  |  |                         events.emit('error', response.data.error); | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             }; | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Simple date creator used to properly format dates. | 
					
						
							|  |  |  |              * @param stringDate | 
					
						
							|  |  |  |              * @returns {Date} | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-02-28 04:52:46 +08:00
										 |  |  |             $scope.getDate = function (stringDate) { | 
					
						
							| 
									
										
										
										
											2016-02-07 18:14:11 +08:00
										 |  |  |                 return new Date(stringDate); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-31 03:57:17 +08:00
										 |  |  |         }]); | 
					
						
							| 
									
										
										
										
											2015-12-31 02:38:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |     ngApp.controller('PageEditController', ['$scope', '$http', '$attrs', '$interval', '$timeout', '$sce', | 
					
						
							|  |  |  |         function ($scope, $http, $attrs, $interval, $timeout, $sce) { | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |         $scope.editorOptions = editorOptions(); | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |         $scope.editContent = ''; | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         $scope.draftText = ''; | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |         let pageId = Number($attrs.pageId); | 
					
						
							|  |  |  |         let isEdit = pageId !== 0; | 
					
						
							|  |  |  |         let autosaveFrequency = 30; // AutoSave interval in seconds.
 | 
					
						
							|  |  |  |         let isMarkdown = $attrs.editorType === 'markdown'; | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |         $scope.draftsEnabled = $attrs.draftsEnabled === 'true'; | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         $scope.isUpdateDraft = Number($attrs.pageUpdateDraft) === 1; | 
					
						
							|  |  |  |         $scope.isNewPageDraft = Number($attrs.pageNewDraft) === 1; | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |         // Set initial header draft text
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         if ($scope.isUpdateDraft || $scope.isNewPageDraft) { | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |             $scope.draftText = trans('entities.pages_editing_draft'); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |             $scope.draftText = trans('entities.pages_editing_page'); | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |         let autoSave = false; | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |         let currentContent = { | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             title: false, | 
					
						
							|  |  |  |             html: false | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |         if (isEdit && $scope.draftsEnabled) { | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             setTimeout(() => { | 
					
						
							|  |  |  |                 startAutoSave(); | 
					
						
							|  |  |  |             }, 1000); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |         // Actions specifically for the markdown editor
 | 
					
						
							|  |  |  |         if (isMarkdown) { | 
					
						
							|  |  |  |             $scope.displayContent = ''; | 
					
						
							|  |  |  |             // Editor change event
 | 
					
						
							|  |  |  |             $scope.editorChange = function (content) { | 
					
						
							|  |  |  |                 $scope.displayContent = $sce.trustAsHtml(content); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 02:26:13 +08:00
										 |  |  |         if (!isMarkdown) { | 
					
						
							|  |  |  |             $scope.editorChange = function() {}; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 22:10:27 +08:00
										 |  |  |         let lastSave = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * Start the AutoSave loop, Checks for content change | 
					
						
							|  |  |  |          * before performing the costly AJAX request. | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         function startAutoSave() { | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             currentContent.title = $('#name').val(); | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |             currentContent.html = $scope.editContent; | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             autoSave = $interval(() => { | 
					
						
							| 
									
										
										
										
											2016-09-18 22:10:27 +08:00
										 |  |  |                 // Return if manually saved recently to prevent bombarding the server
 | 
					
						
							|  |  |  |                 if (Date.now() - lastSave < (1000*autosaveFrequency)/2) return; | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |                 let newTitle = $('#name').val(); | 
					
						
							|  |  |  |                 let newHtml = $scope.editContent; | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |                 if (newTitle !== currentContent.title || newHtml !== currentContent.html) { | 
					
						
							|  |  |  |                     currentContent.html = newHtml; | 
					
						
							|  |  |  |                     currentContent.title = newTitle; | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |                     saveDraft(); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             }, 1000 * autosaveFrequency); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 22:10:27 +08:00
										 |  |  |         let draftErroring = false; | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * Save a draft update into the system via an AJAX request. | 
					
						
							|  |  |  |          */ | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |         function saveDraft() { | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |             if (!$scope.draftsEnabled) return; | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |             let data = { | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |                 name: $('#name').val(), | 
					
						
							|  |  |  |                 html: isMarkdown ? $sce.getTrustedHtml($scope.displayContent) : $scope.editContent | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (isMarkdown) data.markdown = $scope.editContent; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  |             let url = window.baseUrl('/ajax/page/' + pageId + '/save-draft'); | 
					
						
							| 
									
										
										
										
											2016-09-18 22:10:27 +08:00
										 |  |  |             $http.put(url, data).then(responseData => { | 
					
						
							|  |  |  |                 draftErroring = false; | 
					
						
							| 
									
										
										
										
											2016-12-20 03:16:31 +08:00
										 |  |  |                 let updateTime = moment.utc(moment.unix(responseData.data.timestamp)).toDate(); | 
					
						
							| 
									
										
										
										
											2016-04-09 21:26:42 +08:00
										 |  |  |                 $scope.draftText = responseData.data.message + moment(updateTime).format('HH:mm'); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |                 if (!$scope.isNewPageDraft) $scope.isUpdateDraft = true; | 
					
						
							| 
									
										
										
										
											2016-09-03 02:26:12 +08:00
										 |  |  |                 showDraftSaveNotification(); | 
					
						
							| 
									
										
										
										
											2016-09-18 22:10:27 +08:00
										 |  |  |                 lastSave = Date.now(); | 
					
						
							|  |  |  |             }, errorRes => { | 
					
						
							|  |  |  |                 if (draftErroring) return; | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                 events.emit('error', trans('errors.page_draft_autosave_fail')); | 
					
						
							| 
									
										
										
										
											2016-09-18 22:10:27 +08:00
										 |  |  |                 draftErroring = true; | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             }); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-03 02:26:12 +08:00
										 |  |  |         function showDraftSaveNotification() { | 
					
						
							|  |  |  |             $scope.draftUpdated = true; | 
					
						
							|  |  |  |             $timeout(() => { | 
					
						
							|  |  |  |                 $scope.draftUpdated = false; | 
					
						
							|  |  |  |             }, 2000) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         $scope.forceDraftSave = function() { | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |             saveDraft(); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-03 02:35:13 +08:00
										 |  |  |         // Listen to save draft events from editor
 | 
					
						
							|  |  |  |         $scope.$on('save-draft', saveDraft); | 
					
						
							| 
									
										
										
										
											2016-05-28 20:51:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * Discard the current draft and grab the current page | 
					
						
							|  |  |  |          * content from the system via an AJAX request. | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         $scope.discardDraft = function () { | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  |             let url = window.baseUrl('/ajax/page/' + pageId); | 
					
						
							|  |  |  |             $http.get(url).then((responseData) => { | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |                 if (autoSave) $interval.cancel(autoSave); | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                 $scope.draftText = trans('entities.pages_editing_page'); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |                 $scope.isUpdateDraft = false; | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |                 $scope.$broadcast('html-update', responseData.data.html); | 
					
						
							| 
									
										
										
										
											2016-03-25 22:41:15 +08:00
										 |  |  |                 $scope.$broadcast('markdown-update', responseData.data.markdown || responseData.data.html); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |                 $('#name').val(responseData.data.name); | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |                 $timeout(() => { | 
					
						
							|  |  |  |                     startAutoSave(); | 
					
						
							|  |  |  |                 }, 1000); | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                 events.emit('success', trans('entities.pages_draft_discarded')); | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             }); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |     }]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |     ngApp.controller('PageTagController', ['$scope', '$http', '$attrs', | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |         function ($scope, $http, $attrs) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const pageId = Number($attrs.pageId); | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |             $scope.tags = []; | 
					
						
							| 
									
										
										
										
											2016-10-31 01:44:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-15 03:02:00 +08:00
										 |  |  |             $scope.sortOptions = { | 
					
						
							|  |  |  |                 handle: '.handle', | 
					
						
							|  |  |  |                 items: '> tr', | 
					
						
							|  |  |  |                 containment: "parent", | 
					
						
							|  |  |  |                 axis: "y" | 
					
						
							|  |  |  |             }; | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |              * Push an empty tag to the end of the scope tags. | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |             function addEmptyTag() { | 
					
						
							|  |  |  |                 $scope.tags.push({ | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |                     name: '', | 
					
						
							|  |  |  |                     value: '' | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-05-15 03:02:00 +08:00
										 |  |  |             $scope.addEmptyTag = addEmptyTag; | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |              * Get all tags for the current book and add into scope. | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |             function getTags() { | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |                 let url = window.baseUrl(`/ajax/tags/get/page/${pageId}`); | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  |                 $http.get(url).then((responseData) => { | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |                     $scope.tags = responseData.data; | 
					
						
							|  |  |  |                     addEmptyTag(); | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |             getTags(); | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |              * Set the order property on all tags. | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |             function setTagOrder() { | 
					
						
							|  |  |  |                 for (let i = 0; i < $scope.tags.length; i++) { | 
					
						
							|  |  |  |                     $scope.tags[i].order = i; | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |              * When an tag changes check if another empty editable | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |              * field needs to be added onto the end. | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |              * @param tag | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |             $scope.tagChange = function(tag) { | 
					
						
							|  |  |  |                 let cPos = $scope.tags.indexOf(tag); | 
					
						
							|  |  |  |                 if (cPos !== $scope.tags.length-1) return; | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |                 if (tag.name !== '' || tag.value !== '') { | 
					
						
							|  |  |  |                     addEmptyTag(); | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |              * When an tag field loses focus check the tag to see if its | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |              * empty and therefore could be removed from the list. | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |              * @param tag | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |             $scope.tagBlur = function(tag) { | 
					
						
							|  |  |  |                 let isLast = $scope.tags.length - 1 === $scope.tags.indexOf(tag); | 
					
						
							|  |  |  |                 if (tag.name === '' && tag.value === '' && !isLast) { | 
					
						
							|  |  |  |                     let cPos = $scope.tags.indexOf(tag); | 
					
						
							|  |  |  |                     $scope.tags.splice(cPos, 1); | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-15 03:02:00 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Remove a tag from the current list. | 
					
						
							|  |  |  |              * @param tag | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.removeTag = function(tag) { | 
					
						
							|  |  |  |                 let cIndex = $scope.tags.indexOf(tag); | 
					
						
							|  |  |  |                 $scope.tags.splice(cIndex, 1); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  |         }]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ngApp.controller('PageAttachmentController', ['$scope', '$http', '$attrs', | 
					
						
							|  |  |  |         function ($scope, $http, $attrs) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const pageId = $scope.uploadedTo = $attrs.pageId; | 
					
						
							|  |  |  |             let currentOrder = ''; | 
					
						
							|  |  |  |             $scope.files = []; | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             $scope.editFile = false; | 
					
						
							|  |  |  |             $scope.file = getCleanFile(); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |             $scope.errors = { | 
					
						
							|  |  |  |                 link: {}, | 
					
						
							|  |  |  |                 edit: {} | 
					
						
							|  |  |  |             }; | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             function getCleanFile() { | 
					
						
							|  |  |  |                 return { | 
					
						
							|  |  |  |                     page_id: pageId | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // Angular-UI-Sort options
 | 
					
						
							|  |  |  |             $scope.sortOptions = { | 
					
						
							|  |  |  |                 handle: '.handle', | 
					
						
							|  |  |  |                 items: '> tr', | 
					
						
							|  |  |  |                 containment: "parent", | 
					
						
							|  |  |  |                 axis: "y", | 
					
						
							|  |  |  |                 stop: sortUpdate, | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Event listener for sort changes. | 
					
						
							|  |  |  |              * Updates the file ordering on the server. | 
					
						
							|  |  |  |              * @param event | 
					
						
							|  |  |  |              * @param ui | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             function sortUpdate(event, ui) { | 
					
						
							|  |  |  |                 let newOrder = $scope.files.map(file => {return file.id}).join(':'); | 
					
						
							|  |  |  |                 if (newOrder === currentOrder) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 currentOrder = newOrder; | 
					
						
							| 
									
										
										
										
											2016-11-12 22:12:26 +08:00
										 |  |  |                 $http.put(window.baseUrl(`/attachments/sort/page/${pageId}`), {files: $scope.files}).then(resp => { | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |                     events.emit('success', resp.data.message); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                 }, checkError('sort')); | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Used by dropzone to get the endpoint to upload to. | 
					
						
							|  |  |  |              * @returns {string} | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             $scope.getUploadUrl = function (file) { | 
					
						
							|  |  |  |                 let suffix = (typeof file !== 'undefined') ? `/${file.id}` : ''; | 
					
						
							| 
									
										
										
										
											2016-11-12 22:12:26 +08:00
										 |  |  |                 return window.baseUrl(`/attachments/upload${suffix}`); | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Get files for the current page from the server. | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             function getFiles() { | 
					
						
							| 
									
										
										
										
											2016-12-24 23:21:19 +08:00
										 |  |  |                 let url = window.baseUrl(`/attachments/get/page/${pageId}`); | 
					
						
							| 
									
										
										
										
											2016-10-11 03:30:27 +08:00
										 |  |  |                 $http.get(url).then(resp => { | 
					
						
							|  |  |  |                     $scope.files = resp.data; | 
					
						
							|  |  |  |                     currentOrder = resp.data.map(file => {return file.id}).join(':'); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                 }, checkError('get')); | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |             getFiles(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Runs on file upload, Adds an file to local file list | 
					
						
							|  |  |  |              * and shows a success message to the user. | 
					
						
							|  |  |  |              * @param file | 
					
						
							|  |  |  |              * @param data | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.uploadSuccess = function (file, data) { | 
					
						
							|  |  |  |                 $scope.$apply(() => { | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                     $scope.files.push(data); | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                 events.emit('success', trans('entities.attachments_file_uploaded')); | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Upload and overwrite an existing file. | 
					
						
							|  |  |  |              * @param file | 
					
						
							|  |  |  |              * @param data | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.uploadSuccessUpdate = function (file, data) { | 
					
						
							|  |  |  |                 $scope.$apply(() => { | 
					
						
							|  |  |  |                     let search = filesIndexOf(data); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                     if (search !== -1) $scope.files[search] = data; | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     if ($scope.editFile) { | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                         $scope.editFile = angular.copy(data); | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |                         data.link = ''; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                 events.emit('success', trans('entities.attachments_file_updated')); | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-11 03:30:27 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Delete a file from the server and, on success, the local listing. | 
					
						
							|  |  |  |              * @param file | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.deleteFile = function(file) { | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                 if (!file.deleting) { | 
					
						
							|  |  |  |                     file.deleting = true; | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2016-11-12 22:12:26 +08:00
										 |  |  |                   $http.delete(window.baseUrl(`/attachments/${file.id}`)).then(resp => { | 
					
						
							| 
									
										
										
										
											2016-10-11 03:30:27 +08:00
										 |  |  |                       events.emit('success', resp.data.message); | 
					
						
							|  |  |  |                       $scope.files.splice($scope.files.indexOf(file), 1); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                   }, checkError('delete')); | 
					
						
							| 
									
										
										
										
											2016-10-11 03:30:27 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Attach a link to a page. | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |              * @param file | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |              */ | 
					
						
							|  |  |  |             $scope.attachLinkSubmit = function(file) { | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |                 file.uploaded_to = pageId; | 
					
						
							| 
									
										
										
										
											2016-11-12 22:12:26 +08:00
										 |  |  |                 $http.post(window.baseUrl('/attachments/link'), file).then(resp => { | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                     $scope.files.push(resp.data); | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                     events.emit('success', trans('entities.attachments_link_attached')); | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |                     $scope.file = getCleanFile(); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                 }, checkError('link')); | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Start the edit mode for a file. | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |              * @param file | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |              */ | 
					
						
							|  |  |  |             $scope.startEdit = function(file) { | 
					
						
							|  |  |  |                 $scope.editFile = angular.copy(file); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                 $scope.editFile.link = (file.external) ? file.path : ''; | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Cancel edit mode | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.cancelEdit = function() { | 
					
						
							|  |  |  |                 $scope.editFile = false; | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Update the name and link of a file. | 
					
						
							|  |  |  |              * @param file | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.updateFile = function(file) { | 
					
						
							| 
									
										
										
										
											2016-11-12 22:12:26 +08:00
										 |  |  |                 $http.put(window.baseUrl(`/attachments/${file.id}`), file).then(resp => { | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |                     let search = filesIndexOf(resp.data); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                     if (search !== -1) $scope.files[search] = resp.data; | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     if ($scope.editFile && !file.external) { | 
					
						
							|  |  |  |                         $scope.editFile.link = ''; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2016-10-23 20:36:45 +08:00
										 |  |  |                     $scope.editFile = false; | 
					
						
							| 
									
										
										
										
											2016-12-31 22:27:40 +08:00
										 |  |  |                     events.emit('success', trans('entities.attachments_updated_success')); | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |                 }, checkError('edit')); | 
					
						
							| 
									
										
										
										
											2016-10-11 04:13:18 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Get the url of a file. | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             $scope.getFileUrl = function(file) { | 
					
						
							| 
									
										
										
										
											2016-11-12 22:12:26 +08:00
										 |  |  |                 return window.baseUrl('/attachments/' + file.id); | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |             }; | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * Search the local files via another file object. | 
					
						
							|  |  |  |              * Used to search via object copies. | 
					
						
							|  |  |  |              * @param file | 
					
						
							|  |  |  |              * @returns int | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             function filesIndexOf(file) { | 
					
						
							|  |  |  |                 for (let i = 0; i < $scope.files.length; i++) { | 
					
						
							| 
									
										
										
										
											2016-10-23 20:36:45 +08:00
										 |  |  |                     if ($scope.files[i].id == file.id) return i; | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /** | 
					
						
							|  |  |  |              * Check for an error response in a ajax request. | 
					
						
							| 
									
										
										
										
											2016-11-12 20:41:34 +08:00
										 |  |  |              * @param errorGroupName | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |              */ | 
					
						
							| 
									
										
										
										
											2016-10-24 00:55:48 +08:00
										 |  |  |             function checkError(errorGroupName) { | 
					
						
							|  |  |  |                 $scope.errors[errorGroupName] = {}; | 
					
						
							|  |  |  |                 return function(response) { | 
					
						
							|  |  |  |                     if (typeof response.data !== 'undefined' && typeof response.data.error !== 'undefined') { | 
					
						
							|  |  |  |                         events.emit('error', response.data.error); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (typeof response.data !== 'undefined' && typeof response.data.validation !== 'undefined') { | 
					
						
							|  |  |  |                         $scope.errors[errorGroupName] = response.data.validation; | 
					
						
							|  |  |  |                         console.log($scope.errors[errorGroupName]) | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2016-10-12 03:39:11 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-10 01:58:22 +08:00
										 |  |  |         }]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 06:12:05 +08:00
										 |  |  | }; |