Explorar o código

Add discard changes button

Ricky %!s(int64=5) %!d(string=hai) anos
pai
achega
3b3db4b142

+ 31 - 0
system/Controllers/ContentApiController.php

@@ -151,6 +151,37 @@ class ContentApiController extends ContentController
 		}
 	}
 
+	public function discardArticleChanges(Request $request, Response $response, $args)
+	{
+		# get params from call 
+		$this->params 	= $request->getParams();
+		$this->uri 		= $request->getUri();
+		
+		# set structure
+		if(!$this->setStructure($draft = true)){ return $response->withJson($this->errors, 404); }
+
+		# set item
+		if(!$this->setItem()){ return $response->withJson($this->errors, 404); }
+		
+		# set redirect url to edit page
+		$url = $this->uri->getBaseUrl() . '/tm/content/' . $this->settings['editor'] . $this->item->urlRel;
+
+		# remove the unpublished changes
+		$delete = $this->deleteContentFiles(['txt']);
+
+		if($delete)
+		{
+			# update the backend structure
+			$this->setStructure($draft = true, $cache = false);
+			
+			return $response->withJson(['data' => $this->structure, 'errors' => false, 'url' => $url], 200);
+		}
+		else
+		{
+			return $response->withJson(['data' => $this->structure, 'errors' => $this->errors], 404); 
+		}
+	}
+
 	public function deleteArticle(Request $request, Response $response, $args)
 	{
 		# get params from call 

+ 1 - 0
system/Routes/Api.php

@@ -11,6 +11,7 @@ $app->post('/api/v1/article/markdown', ContentApiController::class . ':getArticl
 $app->post('/api/v1/article/html', ContentApiController::class . ':getArticleHtml')->setName('api.article.html')->add(new RestrictApiAccess($container['router']));
 $app->post('/api/v1/article/publish', ContentApiController::class . ':publishArticle')->setName('api.article.publish')->add(new RestrictApiAccess($container['router']));
 $app->delete('/api/v1/article/unpublish', ContentApiController::class . ':unpublishArticle')->setName('api.article.unpublish')->add(new RestrictApiAccess($container['router']));
+$app->delete('/api/v1/article/discard', ContentApiController::class . ':discardArticleChanges')->setName('api.article.discard')->add(new RestrictApiAccess($container['router']));
 $app->post('/api/v1/article', ContentApiController::class . ':createArticle')->setName('api.article.create')->add(new RestrictApiAccess($container['router']));
 $app->put('/api/v1/article', ContentApiController::class . ':updateArticle')->setName('api.article.update')->add(new RestrictApiAccess($container['router']));
 $app->delete('/api/v1/article', ContentApiController::class . ':deleteArticle')->setName('api.article.delete')->add(new RestrictApiAccess($container['router']));

+ 1 - 0
system/author/editor/publish-controller.twig

@@ -1,6 +1,7 @@
 <div class="editor buttonset" id="publishController" data-published="{{ item.published }}" data-drafted="{{ item.drafted }}" v-cloak>
 	<div v-if="errors.message" class="message error">${ errors.message }</div>
 	<button v-if="raw" @click.prevent="saveDraft" id="draft" :class="draftResult" :disabled="draftDisabled"><span class="desktop">Save&nbsp;</span>Draft</button><button @click.prevent="publishDraft" id="publish" :class="publishResult" :disabled="publishDisabled">Publish</button>
+	<button @click.prevent="discardDraft" v-if="visual && !publishStatus" id="discard" :class="discardResult" :disabled="publishDisabled">Discard</button>
 	<div class="secondary">
 		<button @click.prevent="depublishArticle" class="button--secondary" :disabled="publishStatus"><span class="desktop">${publishLabel}</span><span class="mobile">${publishLabelMobile}</span></button>
 		<button @click.prevent="showModal" class="button--secondary danger"><span class="desktop">delete</span><span class="mobile">X</span></button>

+ 1 - 0
system/author/js/vue-editor.js

@@ -21,6 +21,7 @@ let editor = new Vue({
 			publishController.publishDisabled = false;
 			publishController.draftResult = "";
 			publishController.publishResult = "";
+			publishController.discardResult = "";
 		},
 	}
 });

+ 50 - 2
system/author/js/vue-publishcontroller.js

@@ -19,6 +19,7 @@ let publishController = new Vue({
 		deleteDisabled: false,
 		draftResult: "",
 		publishResult: "",
+		discardResult: "",
 		deleteResult: "",
 		publishStatus: document.getElementById("publishController").dataset.published ? false : true,
 		publishLabel: document.getElementById("publishController").dataset.published ? "online" : "offline",
@@ -83,6 +84,53 @@ let publishController = new Vue({
 				}				
 			}, method, url, this.form );
 		},
+		discardDraft: function(e) {
+			var self = this;
+
+			self.errors.message = false;
+			editor.errors = {title: false, content: false};
+			
+			self.discardResult = "load";
+			self.publishDisabled = "disabled";
+
+			var url = self.root + '/api/v1/article/discard';
+			var method 	= 'DELETE';
+
+			sendJson(function(response, httpStatus)
+			{
+				if(httpStatus == 400)
+				{
+					self.publishDisabled = false;
+					self.discardResult   = "fail";
+					self.errors.message  = "You are probably logged out. Please backup your changes, login and then try again."
+				}
+				else if(response)
+				{
+					var result = JSON.parse(response);
+
+					if(result.errors)
+					{
+						self.publishDisabled = false;
+						self.discardResult   = "fail";
+						
+						if(result.errors.title){ editor.errors.title = result.errors.title[0] }
+						if(result.errors.content){ editor.errors.content = result.errors.content[0] }
+						if(result.errors.message){ self.errors.message = result.errors.message }
+					}
+					else
+					{
+						window.location.replace(result.url);
+					}
+				}
+				else if(httpStatus != 200)
+				{
+					self.publishDisabled = false;
+					self.discardResult   = "fail";
+					self.errors.message  = "Something went wrong, please refresh the page and try again."					
+				}
+
+			}, method, url, this.form);
+		},
 		saveDraft: function(e){
 		
 			var self = this;
@@ -93,7 +141,7 @@ let publishController = new Vue({
 			self.draftResult = "load";
 		
 			var url = this.root + '/api/v1/article';
-			var method 	= 'PUT';
+			var method = 'PUT';
 			
 			this.form.title = editor.form.title;
 			this.form.content = editor.form.content;
@@ -107,7 +155,7 @@ let publishController = new Vue({
 					self.errors.message 	= "You are probably logged out. Please backup your changes, login and then try again."
 				}
 				else if(response)
-				{	
+				{
 					var result = JSON.parse(response);
 					
 					if(result.errors)