Basic editor for main page text (tiptap, tiptap-extensions)

This commit is contained in:
Torsten 2020-01-23 14:55:39 +01:00
parent 4f75f07c0a
commit 98fc0ef0f8
9 changed files with 29053 additions and 75 deletions

View file

@ -2,8 +2,14 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="eed7de89-f054-487c-bf59-36356758942b" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/public/js/Icon.js" afterDir="false" />
<change afterPath="$PROJECT_DIR$/resources/js/views/EditPage.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/package-lock.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/js/app.js" beforeDir="false" afterPath="$PROJECT_DIR$/public/js/app.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/resources/js/app.js" beforeDir="false" afterPath="$PROJECT_DIR$/resources/js/app.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/resources/js/routes.js" beforeDir="false" afterPath="$PROJECT_DIR$/resources/js/routes.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/resources/js/views/Main.vue" beforeDir="false" afterPath="$PROJECT_DIR$/resources/js/views/Main.vue" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
@ -17,6 +23,13 @@
<executable />
</execution>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="JavaScript File" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
@ -125,7 +138,7 @@
<component name="PropertiesComponent">
<property name="ASKED_ADD_EXTERNAL_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/app/Http/Controllers" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/resources/js/views" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
@ -140,9 +153,9 @@
<recent name="$PROJECT_DIR$/public" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/resources/js/views" />
<recent name="$PROJECT_DIR$/app/Http/Controllers" />
<recent name="$PROJECT_DIR$/resources/js" />
<recent name="$PROJECT_DIR$/resources/js/views" />
<recent name="$PROJECT_DIR$/resources/js/vue" />
<recent name="$PROJECT_DIR$/resources/js/vue/components" />
</key>
@ -207,7 +220,7 @@
<workItem from="1575965115540" duration="593000" />
<workItem from="1575966299565" duration="383000" />
<workItem from="1579075615585" duration="8354000" />
<workItem from="1579595422946" duration="4917000" />
<workItem from="1579595422946" duration="14949000" />
</task>
<servers />
</component>
@ -231,13 +244,17 @@
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
</component>
<component name="WindowStateProjectService">
<state x="1371" y="133" width="1720" height="857" key="com.intellij.history.integration.ui.views.FileHistoryDialog" timestamp="1579784437079">
<screen x="1280" y="23" width="1920" height="1057" />
</state>
<state x="1371" y="133" width="1720" height="857" key="com.intellij.history.integration.ui.views.FileHistoryDialog/0.23.1280.777/1280.23.1920.1057@1280.23.1920.1057" timestamp="1579784437079" />
<state x="1903" y="197" width="673" height="708" key="find.popup" timestamp="1579597123793">
<screen x="1280" y="23" width="1920" height="1057" />
</state>
<state x="1903" y="197" width="673" height="708" key="find.popup/0.23.1280.777/1280.23.1920.1057@1280.23.1920.1057" timestamp="1579597123793" />
<state x="1905" y="258" width="670" height="676" key="search.everywhere.popup" timestamp="1579597080472">
<state x="1905" y="258" width="670" height="676" key="search.everywhere.popup" timestamp="1579787265055">
<screen x="1280" y="23" width="1920" height="1057" />
</state>
<state x="1905" y="258" width="670" height="676" key="search.everywhere.popup/0.23.1280.777/1280.23.1920.1057@1280.23.1920.1057" timestamp="1579597080472" />
<state x="1905" y="258" width="670" height="676" key="search.everywhere.popup/0.23.1280.777/1280.23.1920.1057@1280.23.1920.1057" timestamp="1579787265055" />
</component>
</project>

View file

@ -3511,6 +3511,14 @@
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
"dev": true
},
"fault": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fault/-/fault-1.0.3.tgz",
"integrity": "sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA==",
"requires": {
"format": "^0.2.2"
}
},
"faye-websocket": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
@ -3667,6 +3675,11 @@
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
"dev": true
},
"format": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
"integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs="
},
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@ -4578,6 +4591,11 @@
"integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
"dev": true
},
"highlight.js": {
"version": "9.16.2",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.16.2.tgz",
"integrity": "sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw=="
},
"hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@ -5566,6 +5584,15 @@
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
"dev": true
},
"lowlight": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.13.0.tgz",
"integrity": "sha512-bFXLa+UO1eM3zieFAcNqf6rTQ1D5ERFv64/euQbbH/LT3U9XXwH6tOrgUAGWDsQ1QgN3ZhgOcv8p3/S+qKGdTQ==",
"requires": {
"fault": "^1.0.2",
"highlight.js": "~9.16.0"
}
},
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -6233,9 +6260,9 @@
}
},
"orderedmap": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.0.tgz",
"integrity": "sha512-abUlPCcmyI/17BWWoUWeAbnniTFUZuczP6iowD9XMBcUoD9jRtUO6w+KXkw64TDk+iHdyDfTAjIH7mTRzhXcaw=="
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz",
"integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ=="
},
"original": {
"version": "1.0.2",
@ -7247,6 +7274,14 @@
"integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
"dev": true
},
"prosemirror-collab": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.2.2.tgz",
"integrity": "sha512-tBnHKMLgy5Qmx9MYVcLfs3pAyjtcqYYDd9kp3y+LSiQzkhMQDfZSV3NXWe4Gsly32adSef173BvObwfoSQL5MA==",
"requires": {
"prosemirror-state": "^1.0.0"
}
},
"prosemirror-commands": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.2.tgz",
@ -7278,6 +7313,16 @@
"prosemirror-view": "^1.0.0"
}
},
"prosemirror-history": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.1.2.tgz",
"integrity": "sha512-erhxYS5gm/6MiXP8jUoJBgc8IbaqjHDVPl9KGg5JrMZOSSOwHv85+4Fb0Q7sYtv2fYwAjOSw/kSA9vkxJ6wOwA==",
"requires": {
"prosemirror-state": "^1.2.2",
"prosemirror-transform": "^1.0.0",
"rope-sequence": "^1.3.0"
}
},
"prosemirror-inputrules": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz",
@ -7830,6 +7875,11 @@
"inherits": "^2.0.1"
}
},
"rope-sequence": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz",
"integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg=="
},
"run-queue": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
@ -8859,6 +8909,34 @@
"tiptap-utils": "^1.8.3"
}
},
"tiptap-extensions": {
"version": "1.28.6",
"resolved": "https://registry.npmjs.org/tiptap-extensions/-/tiptap-extensions-1.28.6.tgz",
"integrity": "sha512-hkYKJHxkqmeIRyuOaVvsrC/IcoXZmBw/Gx4JJHPiCAKvLQyjgYZpNjbVH9nIgdlxLvVjFDVBoPWGHy00qGp8qQ==",
"requires": {
"lowlight": "1.13.0",
"prosemirror-collab": "1.2.2",
"prosemirror-history": "1.1.2",
"prosemirror-model": "1.8.2",
"prosemirror-state": "1.3.2",
"prosemirror-tables": "1.0.0",
"prosemirror-transform": "1.2.2",
"prosemirror-utils": "0.9.6",
"prosemirror-view": "1.13.4",
"tiptap": "^1.26.6",
"tiptap-commands": "^1.12.5"
},
"dependencies": {
"prosemirror-transform": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.2.tgz",
"integrity": "sha512-expO11jAsxaHk2RdZtzPsumc1bAAZi4UiXwTLQbftsdnIUWZE5Snyag595p1lx/B8QHUZ6tYWWOaOkzXKoJmYw==",
"requires": {
"prosemirror-model": "^1.0.0"
}
}
}
},
"tiptap-utils": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/tiptap-utils/-/tiptap-utils-1.8.3.tgz",

View file

@ -24,6 +24,7 @@
},
"dependencies": {
"tiptap": "^1.26.6",
"tiptap-extensions": "^1.28.6",
"vue-router": "^3.1.5",
"vuex": "^3.1.2"
}

112
motorradig/public/js/Icon.js vendored Normal file
View file

@ -0,0 +1,112 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ({
/***/ "./resources/js/views/components/Icon.js":
/*!***********************************************!*\
!*** ./resources/js/views/components/Icon.js ***!
\***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
throw new Error("Module build failed (from ./node_modules/babel-loader/lib/index.js):\nError: ENOENT: no such file or directory, open '/Users/tschneider/dev/repo/motorradig/motorradig/resources/js/views/components/Icon.js'");
/***/ }),
/***/ 1:
/*!*****************************************************!*\
!*** multi ./resources/js/views/components/Icon.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! /Users/tschneider/dev/repo/motorradig/motorradig/resources/js/views/components/Icon.js */"./resources/js/views/components/Icon.js");
/***/ })
/******/ });

File diff suppressed because it is too large Load diff

View file

@ -7,10 +7,12 @@
import Vue from 'vue';
import VueRouter from 'vue-router';
import Vuex from 'vuex';
import { Editor } from 'tiptap'
window.Vue=require('vue');
window.axios=require('axios');
import {routes} from './routes.js';
import {store} from './store.js';

View file

@ -1,6 +1,7 @@
import Login from "./views/auth/Login";
import Register from "./views/auth/Register";
import Main from "./views/Main";
import EditPage from "./views/EditPage";
import Vue from 'vue';
import VueRouter from "vue-router";
@ -9,6 +10,7 @@ export const routes= [
{ path:'', name : 'main', component: Main },
{ path:'/login', name : 'Login', component: Login },
{ path:'/register', name : 'register', component: Register },
{ path:'/edit_page', name : 'edit_page', component: EditPage },
];
Vue.use(VueRouter);

View file

@ -0,0 +1,131 @@
<template>
<div id="root">
<div class="title level-item has-text-centered">Motorrad IG
</div>
<div class="has-text-centered">
<button class="button" @click="changeMainText('Über uns')" >Über uns</button>
<button class="button" @click="changeMainText('Aktuelles')" >Aktuelles</button>
<button class="button" @click="changeMainText('Mitgliedsantrag')">Mitgliedsantrag</button>
<span v-if="!this.$store.state.user.hasOwnProperty('role')"><button class="button" @click="changeMainText('Tourplan')" >Tourplan (Beispiel)</button></span>
<span v-else-if="this.$store.state.user.role==='GUEST'"><button class="button" @click="changeMainText('Tourplan')" >Tourplan (Gast)</button></span>
<span v-else-if="this.$store.state.user.role==='MEMBER'"><button class="button" @click="changeMainText('Tourplan')" >Tourplan (komplett)</button></span>
<span v-else-if="this.$store.state.user.role==='ADMIN'"><button class="button" @click="changeMainText('Tourplan')" >Tourplan (komplett)</button></span>
<button class="button" @click="changeMainText('Wetter')" >Wetter</button>
<button class="button" @click="changeMainText('Links')" >Links</button>
<button class="button" @click="changeMainText('Impressum')" >Impressum</button>
<router-link class="button" :to="{ name: 'Login' }">Log-In</router-link>
</div>
<p>&nbsp;</p>
<div>
<editor-menu-bar :editor="editor" v-slot="{ commands, isActive }">
<div class="menubar">
<button :class="{ 'is-active': isActive.bold() }" @click="commands.bold">
Bold
</button>
<button :class="{ 'is-active': isActive.underline() }" @click="commands.bold">
Underline
</button>
</div>
</editor-menu-bar>
<editor-content :editor="editor" />
</div>
</div>
</template>
<script>
import { Editor, EditorContent, EditorMenuBar } from 'tiptap'
import {
Blockquote,
CodeBlock,
HardBreak,
Heading,
HorizontalRule,
OrderedList,
BulletList,
ListItem,
TodoItem,
TodoList,
Bold,
Code,
Italic,
Link,
Strike,
Underline,
History,
} from 'tiptap-extensions'
export default {
components: {
EditorContent,
EditorMenuBar,
},
data() {
return {
editor: new Editor({
extensions: [
new Blockquote(),
new BulletList(),
new CodeBlock(),
new HardBreak(),
new Heading({ levels: [1, 2, 3] }),
new HorizontalRule(),
new ListItem(),
new OrderedList(),
new TodoItem(),
new TodoList(),
new Link(),
new Bold(),
new Code(),
new Italic(),
new Strike(),
new Underline(),
new History(),
],
content: `
<h2>
Hi there,
</h2>
<p>
this is a very <em>basic</em> example of tiptap.
</p>
<pre><code>body { display: none; }</code></pre>
<ul>
<li>
A regular list
</li>
<li>
With regular items 👏
</li>
</ul>
<blockquote>
It's amazing 👏
<br />
– mom
</blockquote>
`,
}),
}
},
beforeDestroy() {
this.editor.destroy()
},
}
</script>

View file

@ -21,21 +21,26 @@
<button class="button" @click="changeMainText('Impressum')" >Impressum</button>
<router-link class="button" :to="{ name: 'Login' }">Log-In</router-link>
<span v-if="this.$store.state.user.role==='ADMIN'"><button class="button">Administration</button></span>
</div>
<p>&nbsp;</p>
<div>
<p id="main" visible="true" style="text-align:center;">Das alte Problem: Die Sonne scheint und Dein Motorrad ruft,<br/>
<p id="main" visible="true" style="text-align:center;">Das alte Problem: Die Sonne scheint und Dein Motorrad
ruft,<br/>
doch alle Deine Freunde sind plötzlich verhindert.<br/><br/>
Die Idee!!<br/><br/>
Selber anrufen und angerufen werden.<br/>
Einmal im Jahr erhältst Du eine Liste aller IG-Mitglieder inkl. Telefonnummern.<br/>
</p>
<p visible="true" style="text-align:center;"> Einmal im Jahr erhältst Du eine Liste aller IG-Mitglieder
inkl. Telefonnummern.<br/>
Die Erscheinungstermine unserer Mitgliederliste + News sind natürlich auf die Motorrad-Saison<br/>
abgestimmt, ca: März, Juni und September (Saisonstart, -mitte, -ende). Für Eure (Urlaubs) Planung und<br/>
abgestimmt, ca: März, Juni und September (Saisonstart, -mitte, -ende). Für Eure (Urlaubs) Planung
und<br/>
damit der Winter nicht zu lange wird, halten wir in der November- Dezember-Ausgabe schon den<br/>
Tourenkalender für das nächste Jahr für Euch bereit. Zusätzlich eröffnet Dir die Liste die Möglichkeit zur<br/>
Tourenkalender für das nächste Jahr für Euch bereit. Zusätzlich eröffnet Dir die Liste die Möglichkeit
zur<br/>
Teilnahme an einem regelmäßigen Stammtisch, gemeinsame Ausfahrten an Wochenenden, einer<br/>
Urlaubsbörse sowie Saisonauftakt- und Jahrestreffen. Eigeninitiative ist hierbei erwünscht.<br/>
@ -43,11 +48,14 @@
müssen wir einmal jährlich einen Selbstkostenbeitrag in Höhe von 20,- EUR erheben.<br/>
Diese Kosten entstehen durch Werbung, Porto, Erfassungsmaterialien etc..<br/>
Hast Du jetzt immer noch eine positive Einstellung zu dieser Idee? Dann nichts wie hin.<br/>
Stammtisch Düsseldorf: Wir treffen uns jeden 2. Mittwoch im Monat ab ca. 19 Uhr in der<br/>
Trattoria and Bar Antonio, Roßstr. 87, 40476 Düsseldorf-Derendorf, Tel.: 0211/43637525.<br/>
Stadtplan und Anfahrt mit öffentlichen Verkehrsmitteln findet ihr unter:<br/>
<a href="http://www.douro-restaurant.de/">http://www.douro-restaurant.de/</a>. Das Douro befindet sich direkt neben der Kirche.<br/>
Stammtisch Düsseldorf: Wir treffen uns jeden 2. Mittwoch im Monat ab ca. 19 Uhr in:<br/>
Tannenbaum Düsseldorf:<br/>
<br/>
<a href="https://www.tannenbaum-duesseldorf.de/">https://www.tannenbaum-duesseldorf.de/</a>. Das Douro befindet sich
direkt neben der Kirche.<br/>
Parkmöglichkeiten sind im Umkreis um den Italiener genügend vorhanden.<br/>
<span v-if="this.$store.state.user.role==='ADMIN'"><br/><button class="button" @click="editPage">Text bearbeiten</button></span>
</p>
</div>
@ -85,6 +93,9 @@
console.log("Logout unsuccessful.");
console.log(error);
})
},
editPage() {
this.$router.push('/edit_page');
}
}
,