Edit page for posts w/ update to api.
This commit is contained in:
109
frontend/pages/EditPage.vue
Normal file
109
frontend/pages/EditPage.vue
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h1>Admin page</h1>
|
||||||
|
|
||||||
|
<h2 contenteditable @input="updateTitle">{{ localTitle }}</h2>
|
||||||
|
<div class="container">
|
||||||
|
<textarea v-model="localMarkdown"></textarea>
|
||||||
|
|
||||||
|
<div class="markdown-body" v-html="html"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button @click="updatePost">Update post</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
id: this.$route.params.id || 2,
|
||||||
|
localMarkdown: undefined,
|
||||||
|
html: undefined,
|
||||||
|
post: undefined
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetchPost();
|
||||||
|
this.getPostHTML();
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
localMarkdown(newValue, oldValue) {
|
||||||
|
return
|
||||||
|
if (newValue) {
|
||||||
|
this.getPostHTML()
|
||||||
|
.then(html => this.html = html)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
updateTitle(event) {
|
||||||
|
this.localTitle = event.target.innerText;
|
||||||
|
console.log(this.localTitle)
|
||||||
|
},
|
||||||
|
fetchPost() {
|
||||||
|
const url = `/api/post/${this.id}`
|
||||||
|
|
||||||
|
return fetch(url)
|
||||||
|
.then(resp => resp.json())
|
||||||
|
.then(response => {
|
||||||
|
this.post = response.post;
|
||||||
|
this.localTitle = response.post.title;
|
||||||
|
this.localMarkdown = response.post.markdown;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
updatePost() {
|
||||||
|
const url = `/api/post/${this.id}`;
|
||||||
|
const options = {
|
||||||
|
method: "PUT",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
title: this.localTitle,
|
||||||
|
markdown: this.localMarkdown
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
return fetch(url, options)
|
||||||
|
.then(resp => resp.json())
|
||||||
|
.then(console.log)
|
||||||
|
.then(_ => this.getPostHTML())
|
||||||
|
},
|
||||||
|
getPostHTML() {
|
||||||
|
const url = `/api/post/${this.id}/render`;
|
||||||
|
|
||||||
|
return fetch(url)
|
||||||
|
.then(resp => resp.json())
|
||||||
|
.then(response => this.html = response.markdown)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 3rem;
|
||||||
|
margin-top: 4rem;
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
width: 90vw;
|
||||||
|
margin: 0 auto;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea, .markdown-body {
|
||||||
|
width: 48%;
|
||||||
|
min-height: 70vh;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import LandingPage from '@/pages/LandingPage';
|
import LandingPage from '@/pages/LandingPage';
|
||||||
import PostPage from '@/pages/PostPage';
|
import PostPage from '@/pages/PostPage';
|
||||||
|
import EditPage from '@/pages/EditPage';
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
@@ -9,6 +10,10 @@ const routes = [
|
|||||||
{
|
{
|
||||||
path: "/post/:id",
|
path: "/post/:id",
|
||||||
component: PostPage
|
component: PostPage
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/edit/:id",
|
||||||
|
component: EditPage
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
const humanReadableDate = (date) => {
|
const humanReadableDate = (date) => {
|
||||||
|
date = new Date(date)
|
||||||
const day = date.getDate();
|
const day = date.getDate();
|
||||||
const month = date.toLocaleString('default', { month: 'long' });
|
const month = date.toLocaleString('default', { month: 'long' });
|
||||||
const year = date.getFullYear();
|
const year = date.getFullYear();
|
||||||
|
|||||||
Reference in New Issue
Block a user