🔧 More CMS configuration

This commit is contained in:
Moritz Kröger 2019-03-28 19:36:47 +01:00
parent 048f90cb73
commit 243c839889
31 changed files with 372 additions and 142 deletions

174
package-lock.json generated
View file

@ -1255,9 +1255,9 @@
}
},
"@vue/cli-plugin-unit-jest": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.5.1.tgz",
"integrity": "sha512-VFnkM3R/Z91IWLZyKh6CLgsWaRJfhWUThkAR13q7ama8WyIFPpKAyJKM0jdsm1Gx2PnBwCm/mrjUpzK4VB0ssA==",
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.5.3.tgz",
"integrity": "sha512-6GRN3dhFXF8FTqvAylHA8fh+ii5+KoKPPz972j18V/MedYgm39qVSkDWD2sLKOueTX5SSVqk3QKyF6gy+Uhp7Q==",
"dev": true,
"requires": {
"@vue/cli-shared-utils": "^3.5.1",
@ -4326,9 +4326,9 @@
"dev": true
},
"cssstyle": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz",
"integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz",
"integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==",
"dev": true,
"requires": {
"cssom": "0.3.x"
@ -7412,6 +7412,11 @@
"integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
"dev": true
},
"highlight.js": {
"version": "9.15.6",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.6.tgz",
"integrity": "sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ=="
},
"hmac-drbg": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@ -9625,9 +9630,9 @@
"dev": true
},
"js-beautify": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.0.tgz",
"integrity": "sha512-P0skmY4IDjfLiVrx+GLDeme8w5G0R1IGXgccVU5HP2VM3lRblH7qN2LTea5vZAxrDjpZBD0Jv+ahpjwVcbz/rw==",
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.1.tgz",
"integrity": "sha512-oxxvVZdOdUfzk8IOLBF2XUZvl2GoBEfA+b0of4u2EBY/46NlXasi8JdFvazA5lCrf9/lQhTjyVy2QCUW7iq0MQ==",
"dev": true,
"requires": {
"config-chain": "^1.1.12",
@ -9795,6 +9800,14 @@
"verror": "1.10.0"
}
},
"katex": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.6.0.tgz",
"integrity": "sha1-EkGOCRIcBckgQbazuftrqyE8tvM=",
"requires": {
"match-at": "^0.1.0"
}
},
"killable": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@ -9866,6 +9879,14 @@
"type-check": "~0.3.2"
}
},
"linkify-it": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz",
"integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=",
"requires": {
"uc.micro": "^1.0.1"
}
},
"lint-staged": {
"version": "8.1.5",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.5.tgz",
@ -10367,11 +10388,97 @@
"resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz",
"integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA=="
},
"markdown-it": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.1.1.tgz",
"integrity": "sha1-ztA39Ec+6fUVOsQU933IPJG6knw=",
"requires": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
"linkify-it": "~1.2.2",
"mdurl": "~1.0.1",
"uc.micro": "^1.0.1"
}
},
"markdown-it-abbr": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz",
"integrity": "sha1-1mtTZFIcuz3Yqlna37ovtoZcj9g="
},
"markdown-it-deflist": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.0.3.tgz",
"integrity": "sha512-/BNZ8ksW42bflm1qQLnRI09oqU2847Z7MVavrR0MORyKLtiUYOMpwtlAfMSZAQU9UCvaUZMpgVAqoS3vpToJxw=="
},
"markdown-it-emoji": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz",
"integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw="
},
"markdown-it-footnote": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-2.0.0.tgz",
"integrity": "sha1-FOnE9o/xLPNU+jZa43gnboEEypQ="
},
"markdown-it-ins": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-2.0.0.tgz",
"integrity": "sha1-papqMPHi9x6Ul1Z8/f9A8f3mdIM="
},
"markdown-it-katex": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz",
"integrity": "sha1-17hqGuoLnWSW+rTnkZoY/e9YnDk=",
"requires": {
"katex": "^0.6.0"
}
},
"markdown-it-mark": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-2.0.0.tgz",
"integrity": "sha1-RqGqlHEFrtgYiXjgoBYXnkBPQsc="
},
"markdown-it-sub": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz",
"integrity": "sha1-N1/WAm6ufdywEkl/ZBEZXqHjr+g="
},
"markdown-it-sup": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz",
"integrity": "sha1-y5yf+RpSVawI8/09YyhuFd8KH8M="
},
"markdown-it-task-lists": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz",
"integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA=="
},
"markdown-it-toc-and-anchor": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz",
"integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==",
"requires": {
"clone": "^2.1.0",
"uslug": "^1.0.4"
},
"dependencies": {
"clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
}
}
},
"markdown-table": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz",
"integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw=="
},
"match-at": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/match-at/-/match-at-0.1.1.tgz",
"integrity": "sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q=="
},
"matcher": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz",
@ -10415,6 +10522,11 @@
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz",
"integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA=="
},
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -15269,10 +15381,15 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
"uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
"uglify-js": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.0.tgz",
"integrity": "sha512-kY2sHdru6BcIDg+i1SCZ1bpPhZJ6yiE0bEKLEJDC4M/lDSMhr/zVJeuEzvHJGjAXJCizSzUVh9atREf2jnR7yQ==",
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.2.tgz",
"integrity": "sha512-imog1WIsi9Yb56yRt5TfYVxGmnWs3WSGU73ieSOlMVFwhJCA9W8fqFFMMj4kgDqiS/80LGdsYnWL7O9UcjEBlg==",
"dev": true,
"optional": true,
"requires": {
@ -15463,6 +15580,11 @@
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true
},
"unorm": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/unorm/-/unorm-1.5.0.tgz",
"integrity": "sha512-sMfSWoiRaXXeDZSXC+YRZ23H4xchQpwxjpw1tmfR+kgbBCaOgln4NI0LXejJIhnBuKINrB3WRn+ZI8IWssirVw=="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@ -15592,6 +15714,14 @@
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
},
"uslug": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz",
"integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=",
"requires": {
"unorm": ">= 1.0.0"
}
},
"util": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
@ -15798,6 +15928,26 @@
"vue-style-loader": "^4.1.0"
}
},
"vue-markdown": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/vue-markdown/-/vue-markdown-2.2.4.tgz",
"integrity": "sha512-hoTX/W1UIdHZrp/b0vpHSsJXAEfWsafaQLgtE2VX4gY8O/C3L2Gabqu95gyG429rL4ML1SwGv+xsPABX7yfFIQ==",
"requires": {
"highlight.js": "^9.12.0",
"markdown-it": "^6.0.1",
"markdown-it-abbr": "^1.0.3",
"markdown-it-deflist": "^2.0.1",
"markdown-it-emoji": "^1.1.1",
"markdown-it-footnote": "^2.0.0",
"markdown-it-ins": "^2.0.0",
"markdown-it-katex": "^2.0.3",
"markdown-it-mark": "^2.0.0",
"markdown-it-sub": "^1.0.0",
"markdown-it-sup": "^1.0.0",
"markdown-it-task-lists": "^2.0.1",
"markdown-it-toc-and-anchor": "^4.1.2"
}
},
"vue-router": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz",

View file

@ -20,6 +20,7 @@
"vue": "^2.6.6",
"vue-feather-icons": "^4.10.0",
"vue-i18n": "^8.9.0",
"vue-markdown": "^2.2.4",
"vue-router": "^3.0.1",
"vue-svgicon": "^3.2.4",
"vuex": "^3.0.1"
@ -28,7 +29,7 @@
"@vue/cli-plugin-babel": "^3.5.0",
"@vue/cli-plugin-eslint": "^3.5.0",
"@vue/cli-plugin-pwa": "^3.5.0",
"@vue/cli-plugin-unit-jest": "^3.5.0",
"@vue/cli-plugin-unit-jest": "^3.5.3",
"@vue/cli-service": "^3.5.0",
"@vue/eslint-config-standard": "^4.0.0",
"@vue/test-utils": "1.0.0-beta.29",

View file

@ -94,6 +94,12 @@ collections:
- {label: "Page URL", name: "url", widget: "string"}
- {label: "Site Name", name: "title", widget: "string"}
- {label: "Headline", name: "headline", widget: "string"}
- label: "Questions"
name: "questions"
widget: "list"
fields:
- {label: "Title", name: "title", widget: "string"}
- {label: "Answer", name: "answer", widget: "markdown"}
# PRESS
- name: "press"
label: "[Page] Press"
@ -135,7 +141,12 @@ collections:
- {label: "Page URL", name: "url", widget: "string"}
- {label: "Site Name", name: "title", widget: "string"}
- {label: "Headline", name: "headline", widget: "string"}
- {label: "Content", name: "content", widget: "markdown"}
- label: "Topics"
name: "topics"
widget: "list"
fields:
- {label: "Title", name: "title", widget: "string"}
- {label: "Content", name: "content", widget: "markdown"}
# IMPRINT
- name: "imprint"
label: "[Page] Imprint"
@ -156,10 +167,16 @@ collections:
- {label: "Page URL", name: "url", widget: "string"}
- {label: "Site Name", name: "title", widget: "string"}
- {label: "Headline", name: "headline", widget: "string"}
- label: "Content"
name: "content"
widget: "list"
fields:
- {label: "Title", name: "title", widget: "string"}
- {label: "Content", name: "content", widget: "markdown"}
# 404
- name: "fourzerofour"
label: "[Page] 404"
description: "Error page when the user (accidentally) reaches a non-existant page."
description: "Error page when the user (accidentally) reaches a nonexistent page."
folder: "src/app/404/content"
format: "json"
create: true
@ -183,19 +200,19 @@ collections:
files:
- label: "Site Info"
name: "info"
format: 'json'
format: "json"
file: "src/data/setup/info.json"
fields:
- {label: Site Name, name: sitename, widget: string}
- {label: Site Description, name: sitedescription, widget: string}
- label: "Social Media"
name: "connect"
format: 'json'
format: "json"
file: "src/data/setup/socialmedia.json"
fields:
- label: 'Links'
name: 'socialMedia'
widget: 'list'
- label: "Links"
name: "socialMedia"
widget: "list"
fields:
- {label: Link Name, name: name, widget: string}
- {label: URL, name: url, widget: string}
- {label: "Link Name", name: "name", widget: "string"}
- {label: "URL", name: "url", widget: "string"}

View file

@ -1,7 +1,7 @@
<template>
<section>
<h1>{{ $t('fourzerofour.headline') }}</h1>
<p>{{ $t('fourzerofour.content') }}</p>
<v-markdown :source="$t('fourzerofour.content')" />
<router-link class="btn" :to="{ path: '/' }">
{{ $t('fourzerofour.button') }}
</router-link>

View file

@ -1,5 +1,5 @@
{
"language": "de",
"language": "en",
"title": "404",
"headline": "404 — Whoops! Something went wrong.",
"content": "Content to be written.",

View file

@ -1,4 +1,4 @@
import loadContent from '@/helper/content'
import { loadContent } from '@/helper/content'
export default loadContent(
'fourzerofour',

View file

@ -1,16 +1,13 @@
import FourZeroFour from './components/index'
import { getTranslatedTitles } from '@/helper/content'
import i18n from './i18n'
export default [
{
path: '*',
name: '404',
component: FourZeroFour,
component: () => import('./components/index' /* webpackChunkName: "404" */),
meta: {
title: {
de: i18n.de.fourzerofour.title,
en: i18n.en.fourzerofour.title
}
title: getTranslatedTitles(i18n, 'fourzerofour')
}
}
]

View file

@ -1,4 +1,3 @@
import About from './components/index'
import i18n from './i18n'
export default [
@ -6,7 +5,7 @@ export default [
path: '/uber-uns',
alias: '/about-us',
name: 'about',
component: About,
component: () => import('./components/index' /* webpackChunkName: "about" */),
meta: {
title: {
de: i18n.de.about.pageTitle,

View file

@ -1,7 +1,3 @@
import Index from './components/index'
import EuroMat from './components/euromat'
import Emphasis from './components/emphasis'
import Results from './components/results'
import i18n from './i18n'
import { storageAvailable } from '@/helper/storage'
@ -16,12 +12,12 @@ export default [
{
path: '/thesen',
alias: '/theses',
component: Index,
component: () => import('./components/index' /* webpackChunkName: "euromat" */),
children: [
{
path: '',
name: 'euromat',
component: EuroMat,
component: () => import('./components/euromat' /* webpackChunkName: "euromat" */),
meta: {
title: {
de: i18n.de.euromat.euromat.pageTitle,
@ -33,7 +29,7 @@ export default [
path: 'gewichtung',
alias: 'emphasis',
name: 'emphasis',
component: Emphasis,
component: () => import('./components/emphasis' /* webpackChunkName: "euromat" */),
beforeEnter: hasAnswers,
meta: {
title: {
@ -46,7 +42,7 @@ export default [
path: 'ergebnis',
alias: 'results',
name: 'results',
component: Results,
component: () => import('./components/results' /* webpackChunkName: "euromat" */),
beforeEnter: hasAnswers,
meta: {
title: {

View file

@ -4,9 +4,7 @@
<ul>
<li v-for="question of $t('faq.questions')" :key="question.title + question.answer">
<h2>{{ question.title }}</h2>
<p v-for="answer of question.answer" :key="answer">
{{ answer }}
</p>
<v-markdown :source="question.answer" />
</li>
</ul>
</section>

View file

@ -1,6 +1,16 @@
{
"language": "de",
"title": "FAQ",
"url": "faq",
"title": "Häufig gestellte Fragen",
"headline": "FAQ",
"content": ""
"questions": [
{
"title": "Konzept",
"answer": "Der EUROMAT präsentiert insgesamt 30 Thesen zur Europapolitik denen Sie zustimmen, die Sie ablehnen oder die Sie mit neutral kommentieren können. Ihre Antworten werden anschließend mit den Positionen der Parteien abgeglichen, und daraus wird ein Ranking auf Basis der prozentuellen Übereinstimmung mit der jeweiligen Partei erstellt. Für die Zusammenstellung von Thesen und Antworten wurden die aktuell sechs größten Parteien kontaktiert: CDU/CSU, SPD, Bündnis90/Die Grünen, DIE LINKE, FDP and AFD. Von diesen sechs Parteien haben uns insgesamt fünf geantwortet. Da wir von der AFD im Vorfeld leider keine Stellungnahme zu den einzelnen Thesen des EUROMAT erhalten haben, konnten wir Sie daher nicht für die weitere Auswertung berücksichtigen."
},
{
"title": "Methodik",
"answer": "Das Berechnungsmodell des EUROMAT basiert auf dem Rechenmodell der Bundeszentrale für politische Bildung, welches unter folgender lizenzfrei zur Verfügung steht: Creative Commons BY-NC-ND 3.0"
}
]
}

View file

@ -1,6 +1,16 @@
{
"language": "en",
"title": "FAQ",
"url": "faq",
"title": "Frequently Asked Questions",
"headline": "FAQ",
"content": ""
"questions": [
{
"title": "Concept",
"answer": "In total, EUROMAT presents 30 statements on European policy which you choose to agree, disagree or react neutrally to. Ultimately, your answers will be compared against the positions of the German parties, and the results matched on percentage basis. For the compilation of statements and answers the six biggest parties have been contacted: CDU/CSU, SPD, Bündnis90/Die Grünen, DIE LINKE, FDP and AFD. Five of those six parties have responded to our questionnaire. As we have not received a formal reply from AFD in time, we could not include them in the further EUROMAT evaluation."
},
{
"title": "Methodology",
"answer": "Das Berechnungsmodell des EUROMAT basiert auf dem Rechenmodell der Bundeszentrale für politische Bildung, welches unter folgender lizenzfrei zur Verfügung steht: Creative Commons BY-NC-ND 3.0"
}
]
}

View file

@ -1,44 +1,6 @@
export default {
de: {
faq: {
pageTitle: 'FAQ',
headline: 'FAQ',
questions: [
{
title: 'Konzept',
answer: [
'Der EUROMAT präsentiert insgesamt 30 Thesen zur Europapolitik denen Sie zustimmen, die Sie ablehnen oder die Sie mit neutral kommentieren können. Ihre Antworten werden anschließend mit den Positionen der Parteien abgeglichen, und daraus wird ein Ranking auf Basis der prozentuellen Übereinstimmung mit der jeweiligen Partei erstellt.',
'Für die Zusammenstellung von Thesen und Antworten wurden die aktuell sechs größten Parteien kontaktiert: CDU/CSU, SPD, Bündnis90/Die Grünen, DIE LINKE, FDP and AFD. Von diesen sechs Parteien haben uns insgesamt fünf geantwortet. Da wir von der AFD im Vorfeld leider keine Stellungnahme zu den einzelnen Thesen des EUROMAT erhalten haben, konnten wir Sie daher nicht für die weitere Auswertung berücksichtigen.'
]
},
{
title: 'Methodik',
answer: [
'Das Berechnungsmodell des EUROMAT basiert auf dem Rechenmodell der Bundeszentrale für politische Bildung, welches unter folgender lizenzfrei zur Verfügung steht: Creative Commons BY-NC-ND 3.0'
]
}
]
}
},
en: {
faq: {
pageTitle: 'FAQ',
headline: 'FAQ',
questions: [
{
title: 'Concept',
answer: [
'In total, EUROMAT presents 30 statements on European policy which you choose to agree, disagree or react neutrally to. Ultimately, your answers will be compared against the positions of the German parties, and the results matched on percentage basis.',
'For the compilation of statements and answers the six biggest parties have been contacted: CDU/CSU, SPD, Bündnis90/Die Grünen, DIE LINKE, FDP and AFD. Five of those six parties have responded to our questionnaire. As we have not received a formal reply from AFD in time, we could not include them in the further EUROMAT evaluation.'
]
},
{
title: 'Methodology',
answer: [
'The computation model of EUROMAT follows the calculation scheme by Bundeszentrale für politische Bildung that is freely available under the following license: Creative Commons BY-NC-ND 3.0'
]
}
]
}
}
}
import { loadContent } from '@/helper/content'
export default loadContent(
'faq',
require.context('./content', false, /\.json$/)
)

View file

@ -1,17 +1,14 @@
import FAQ from './components/index'
import { getTranslatedTitles } from '@/helper/content'
import i18n from './i18n'
export default [
{
path: '/faq',
alias: '/alias',
// alias: getTranslatedAliases(i18n, 'faq'),
name: 'faq',
component: FAQ,
component: () => import('./components/index' /* webpackChunkName: "faq" */),
meta: {
title: {
de: i18n.de.faq.pageTitle,
en: i18n.en.faq.pageTitle
}
title: getTranslatedTitles(i18n, 'faq')
}
}
]

View file

@ -1,4 +1,3 @@
import Imprint from './components/index'
import i18n from './i18n'
export default [
@ -6,7 +5,7 @@ export default [
path: '/impressum',
alias: '/imprint',
name: 'imprint',
component: Imprint,
component: () => import('./components/index' /* webpackChunkName: "misc" */),
meta: {
title: {
de: i18n.de.imprint.pageTitle,

View file

@ -3,9 +3,7 @@
<div class="intro-content">
<h1>{{ $t('intro.headline') }}</h1>
<p>
{{ $t('intro.content') }}
</p>
<v-markdown :source="$t('intro.content')" />
<router-link class="btn" :to="{ path: thesesPath }">
{{ $t('intro.button') }}

View file

@ -1,4 +1,4 @@
import loadContent from '@/helper/content'
import { loadContent } from '@/helper/content'
export default loadContent(
'intro',

View file

@ -1,11 +1,10 @@
import Intro from './components/index'
import i18n from './i18n'
export default [
{
path: '/',
name: 'intro',
component: Intro,
component: () => import('./components/index' /* webpackChunkName: "intro" */),
meta: {
title: {
de: i18n.de.intro.title,

View file

@ -1,4 +1,4 @@
import loadContent from '@/helper/content'
import { loadContent } from '@/helper/content'
export default loadContent(
'party',

View file

@ -1,17 +1,15 @@
import Party from './components/index'
import { DEFAULT_LOCALE } from '@/config'
import { getTranslatedTitles, getTranslatedAliases } from '@/helper/content'
import i18n from './i18n'
export default [
{
path: `/${i18n.de.party.url}/:token`,
alias: `/${i18n.en.party.url}/:token`,
path: `/${i18n[DEFAULT_LOCALE].party.url}/:token`,
alias: getTranslatedAliases(i18n, 'party').map(alias => `${alias}/:token`),
name: 'party',
component: Party,
component: () => import('./components/index' /* webpackChunkName: "party" */),
meta: {
title: {
de: i18n.de.party.title,
en: i18n.en.party.title
}
title: getTranslatedTitles(i18n, 'party')
}
}
]

View file

@ -1,7 +1,7 @@
<template>
<section>
<h1>{{ $t('press.headline') }}</h1>
<p>{{ $t('press.content') }}</p>
<v-markdown :source="$t('press.content')" />
<a class="btn" href="mailto:hello@euromat.info">
hello@euromat.info <feather-mail />
</a>

View file

@ -1,4 +1,4 @@
import loadContent from '@/helper/content'
import { loadContent } from '@/helper/content'
export default loadContent(
'press',

View file

@ -1,17 +1,15 @@
import Press from './components/index'
import { DEFAULT_LOCALE } from '@/config'
import { getTranslatedTitles, getTranslatedAliases } from '@/helper/content'
import i18n from './i18n'
export default [
{
path: '/' + i18n.de.press.url,
alias: '/' + i18n.en.press.url,
path: '/' + i18n[DEFAULT_LOCALE].press.url,
alias: getTranslatedAliases(i18n, 'press'),
name: 'press',
component: Press,
component: () => import('./components/index' /* webpackChunkName: "press" */),
meta: {
title: {
de: i18n.de.press.title,
en: i18n.en.press.title
}
title: getTranslatedTitles(i18n, 'press')
}
}
]

View file

@ -6,9 +6,7 @@
<h2 v-if="index !== 0">
{{ topic.title }}
</h2>
<p v-for="content of topic.content" :key="content">
{{ content }}
</p>
<v-markdown :source="topic.content" />
</li>
</ul>
</section>

View file

@ -3,5 +3,38 @@
"url": "datenschutz",
"title": "Datenschutz",
"headline": "Datenschutz",
"content": ""
"topics": [
{
"title": "Datenschutz",
"content": "Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung. Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder E-Mail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Datenwerden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben. Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriffdurch Dritte ist nichtmöglich."
},
{
"title": "Erhebung und Speicherung personenbezogener Daten",
"content": "Personenbezogene Daten wie Name, Username und zusätzliche Metadaten wie z. B. Anschrift, Telefonnummer und Email-Adresse (Bestandsdaten) werden erhoben, wenn und soweit dies im Rahmen der Begründung und Abwicklung eines Vertragsverhältnisses sowie für dessen inhaltliche Ausgestaltung oder Änderung erforderlich ist. Diese Daten werden in der Regel in elektronischen Anmeldeformularen erhoben. Mit vollständiger Abwicklung des Vertrages werden Ihre Daten für die weitere Verwendung gesperrt und nach Ablauf der steuer- und handelsrechtlichen Vorschriften gelöscht, sofern Sie nicht ausdrücklich in die weitere Nutzung Ihrer Dateneingewilligt haben."
},
{
"title": "Auskunft, Löschung und Sperrung",
"content": "Sie haben jederzeit das Recht auf unentgeltliche Auskunft über Ihre gespeicherten personenbezogenen Daten, deren Herkunft und Empfänger und den Zweck der Datenverarbeitung sowie ein Recht auf Berichtigung, Sperrung oder Löschung dieser Daten. Hierzu sowie zu weiteren Fragen zum Thema personenbezogene Daten können Sie sich jederzeit unter der im Impressum angegebenen Adresse des Berliner Büros an uns wenden."
},
{
"title": "Übermittlung von Daten an Dritte",
"content": "Eine Weitergabe Ihrer personenbezogenen Daten an Dritte erfolgt grundsätzlich nur, sofern dies zur Erbringung unserer Dienstleistung oder zur Vertragsdurchführung notwendig ist und Sie ausdrücklich eingewilligt haben."
},
{
"title": "Datenschutzerklärung für die Nutzung von Facebook-Plugins (Like-Button)",
"content": "Auf unseren Seiten sind Plugins des sozialen Netzwerks Facebook, Anbieter Facebook Inc., 1 Hacker Way, Menlo Park, California 94025, USA, integriert. Die Facebook-Plugins erkennen Sie an dem Facebook-Logo oder dem „Like-Button“(„Gefällt mir“) auf unserer Seite. Eine Übersicht über die Facebook-Plugins finden Sie hier: http://developers.facebook.com/docs/plugins/. Wenn Sie unsere Seiten besuchen, wird über das Plugin eine direkte Verbindung zwischen Ihrem Browser und dem Facebook-Server hergestellt. Facebook erhält dadurch die Information, dass Sie mit Ihrer IP-Adresse unsere Seite besucht haben. Wenn Sie den Facebook „Like-Button“ anklicken während Sie in Ihrem Facebook-Account eingeloggt sind, können Sie die Inhalte unserer Seiten auf Ihrem Facebook- Profil verlinken. Dadurch kann Facebook den Besuch unserer Seiten Ihrem Benutzerkonto zuordnen. Wir weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der übermittelten Daten sowie deren Nutzung durch Facebook erhalten. Weitere Informationen hierzu finden Sie in der Datenschutzerklärung von Facebook unter http://de-de.facebook.com/policy.php. Wenn Sie nicht wünschen, dass Facebook den Besuch unserer Seiten Ihrem Facebook- Nutzerkonto zuordnen kann, loggen Sie sich bitte aus Ihrem Facebook-Benutzerkonto aus."
},
{
"title": "Datenschutzerklärung für die Nutzung von Twitter",
"content": "Auf unseren Seiten sind Funktionen des Dienstes Twitter eingebunden. Diese Funktionen werden angeboten durch die Twitter Inc., 1355 Market Street, Suite 900, San Francisco, CA 94103, USA. Durch das Benutzen von Twitter und der Funktion „Re-Tweet“ werden die von Ihnen besuchten Webseiten mit Ihrem Twitter-Account verknüpft und anderen Nutzern bekannt gegeben. Dabei werden auch Daten an Twitter übertragen. Wir weisen darauf hin, dass wir als Anbieter der Seiten keine Kenntnis vom Inhalt der übermittelten Daten sowie deren Nutzung durch Twitter erhalten. Weitere Informationen hierzu finden Sie in der Datenschutzerklärung von Twitter unter: http://twitter.com/privacy. Ihre Datenschutzeinstellungen bei Twitter können Sie in den Konto-Einstellungen unterhttp://twitter.com/account/settings ändern."
},
{
"title": "Datenschutzerklärung für den Webanalysedienst Google Analytics",
"content": "Diese Website benutzt Google Analytics, einen Webanalysedienst der Google Inc. (“Google”). Google Analytics verwendet sog. “Cookies”, Textdateien, die auf Ihrem Computer gespeichert werden und die eine Analyse der Benutzung der Website durch Sie ermöglichen. Die durch den Cookie erzeugten Informationen über Ihre Benutzung dieser Website werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert. Wir haben die IP-Anonymisierung aktiviert. Auf dieser Webseite wird Ihre IP-Adresse von Google daher innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um Ihre Nutzung der Website auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen. Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Sie können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Sie können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf Ihre Nutzung der Website bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: http://tools.google.com/dlpage/gaoptout?hl=de"
},
{
"title": "Abrufbarkeit der Datenschutzerklärung",
"content": "Sie können die Datenschutzerklärung jederzeit von jeder Seite dieses Internetangebots unter dem Link „Impressum“ abrufen. Bitte nehmen Sie zur Kenntnis, dass Änderungen des Angebots, gesetzliche und rechtliche Neuerungen sowie ggf. nachträglich erkannte Regelungslücken Änderungen dieser Datenschutzerklärung erforderlich werden lassen können."
}
]
}

View file

@ -3,5 +3,34 @@
"url": "privacy",
"title": "Data privacy",
"headline": "Data privacy",
"content": ""
"topics": [
{
"title": "Data privacy",
"content": "We would like to inform you about our privacy policy. You will find information about the collection and use of personal data when using our website. In doing so, we observe the data protection law applicable to Germany. You can access this statement at any time on our website. We expressly point out that data transmission on the Internet (for example, by e-mail communication) has security gaps and can not be completely protected against access by third parties. The use of the contact data of our imprint for commercial advertising is expressly not desired, unless we had previously given our written consent or a business relationship already exists. The provider and all persons mentioned on this website hereby do not allow any commercial use and disclosure of their data."
},
{
"title": "Personal information",
"content": "You can visit our website without giving personal data. If personal data (such as name, address or e-mail address) is collected on our pages, this is done on a voluntary basis. This data will not be passed to third parties without your express consent. If a contractual relationship between you and us is modified, or if you ask us to make an inquiry, we collect and use your personal data as far as this is necessary (stock data). We collect, process and use personal data as far as this is necessary to enable you to make use of the website (usage data). All personal data will only be stored as long as this is necessary for the purpose mentioned (processing your request or handling a contract). This takes account of tax and commercial storage periods. On the order of the competent authorities, we may provide information on this data (inventory data) in individual cases, as far as this is necessary for the purposes of law enforcement, security, the fulfillment of the statutory tasks of the constitutional protection authorities or the military shielding service or the enforcement of intellectual property rights."
},
{
"title": "Commenting Features",
"content": "In the context of the commentary function, we collect personal data (eg name, e-mail) only to answer your comment/s on a contribution of ours. When you publish a comment, the email address you provide is saved but not published. Your name will be published if you have not written under pseudonym."
},
{
"title": "Privacy Policy for the Facebook plug-in (“Like”)",
"content": "This website uses plug-ins from the Facebook.com company, which are provided by the company Facebook Inc., 1601 S. California Avenue, Palo Alto, CA 94304 in the USA. Users of our website, on which the Facebook plugin (“like” button) is installed, are hereby informed that the plugin connects to Facebook, whereby a transmission to your browser is carried out, so the plugin on The web page. Furthermore, the usage data is passed on to the Facebook servers, which contain information about your website visits on our homepage. For logged in Facebook users, this means that the usage data is assigned to your personal Facebook account. If you are actively using the Facebook plug-in as a logged-in Facebook user (for example, by clicking the “Like” button or using the comment feature), this data will be transferred to your Facebook account and published. This can only be done by logging out of your Facebook account. For more information on Facebooks data usage, please refer to the Privacy Policy on Facebook at http://de-en.facebook.com/policy.php."
},
{
"title": "Privacy Policy for use of the webmessage service twitter.com",
"content": "We have also integrated the webmessage service twitter.com on our website. This is provided by the Twitter Inc., 1355 Market St, Suite 900, San Francisco, CA 94103, USA. Twitter offers the so-called “Tweet” function. So you can publish 140 characters long messages with web pages in their own Twitter account. If you use the “Tweet” feature of Twitter on our websites, the respective website will be linked to your account on Twitter and publicized there if necessary. Data is also transmitted to Twitter. We are not aware of the content of the transmitted data and its use by Twitter. For more information, please visit Twitters privacy policy: http://twitter.com/privacy. Follow the link below to setup your privacy settings: http://twitter.com/account/settings."
},
{
"title": "Privacy Policy for the Google Analytics web analytics service",
"content": "This website uses Google Analytics, a web analytics service provided by Google, Inc. (“Google”). Google Analytics uses so-called “cookies”, text files that are stored on your computer and which allow an analysis of the use of the website by you. The information generated by the cookie about your use of this website is generally transferred to a Google server in the USA and stored there. We have enabled IP anonymization. On this website, your IP address will therefore be abridged by Google within the Member States of the European Union or in other States Parties to the Agreement on the European Economic Area. Only in exceptional cases is the full IP address transferred to a Google server in the US and shortened there. On behalf of the operator of this website, Google will use this information to evaluate your use of the website, to compile reports on website activity, and to provide other services related to website usage and internet usage against the website operator. The IP address provided by your browser as part of Google Analytics will not be merged with other Google data. You can prevent cookies from being saved by setting your browser software accordingly; However, we would point out that in this case you may not be able to use all the functions of this website in full. In addition, you may prevent Google from collecting and processing the data (including your IP address) related to your use of the Website (including your IP address), as well as the processing of such data by Google, by downloading the browser plug-in available under the following link And install: http://tools.google.com/dlpage/gaoptout?hl=en"
},
{
"title": "Right to withdraw personal information",
"content": "You have the right at any time to inquire about the data collected about you free of charge. You have the right at all times to revoke your consent to the use of your specified personal data with effect for the future. For further information please contact the provider under the contact data in the imprint."
}
]
}

View file

@ -1,4 +1,4 @@
import loadContent from '@/helper/content'
import { loadContent } from '@/helper/content'
export default loadContent(
'privacy',

View file

@ -1,17 +1,15 @@
import Privacy from './components/index'
import { DEFAULT_LOCALE } from '@/config'
import { getTranslatedTitles, getTranslatedAliases } from '@/helper/content'
import i18n from './i18n'
export default [
{
path: '/' + i18n.de.privacy.url,
alias: '/' + i18n.en.privacy.url,
path: '/' + i18n[DEFAULT_LOCALE].privacy.url,
alias: getTranslatedAliases(i18n, 'privacy'),
name: 'privacy',
component: Privacy,
component: () => import('./components/index' /* webpackChunkName: "misc" */),
meta: {
title: {
de: i18n.de.privacy.title,
en: i18n.en.privacy.title
}
title: getTranslatedTitles(i18n, 'privacy')
}
}
]

View file

@ -1,7 +1,7 @@
<template>
<div class="app-menu">
<ul class="top-menu">
<li v-for="item of main" :key="item.label">
<li v-for="(item, index) of main" :key="item.label + index">
<router-link tag="a" :to="item.route">
{{ item.label }}
</router-link>

View file

@ -0,0 +1,18 @@
<template>
<vue-markdown :source="source" />
</template>
<script>
import VueMarkdown from 'vue-markdown'
export default {
name: 'Markdown',
components: {
VueMarkdown
},
props: {
source: { type: String, required: true }
}
}
</script>

View file

@ -1,4 +1,6 @@
export default function loadContent (prefix, requireContent) {
import { DEFAULT_LOCALE } from '@/config'
export function loadContent (prefix, requireContent) {
if (!prefix || !requireContent) {
throw new Error('loadContent: prefix and requireContent are both required!')
}
@ -11,3 +13,26 @@ export default function loadContent (prefix, requireContent) {
return accumulator
}, {})
}
export function getTranslatedTitles (data, section) {
return {
title: Object.keys(data).reduce((acc, cur) => {
const title = data[cur][section].title
if (!title) {
console.warning(`Property "title" doesn't exist on i18n.de.${section}`)
}
acc[cur] = title
return acc
}, {})
}
}
export function getTranslatedAliases (data, section) {
return [...new Set(
Object.keys(data)
.filter(lang => lang !== DEFAULT_LOCALE)
.map(lang => '/' + data[lang][section].url)
.filter(Boolean)
)]
}