cleanup
This commit is contained in:
@@ -1,51 +0,0 @@
|
||||
name: action
|
||||
|
||||
# Metaangaben zur Kollektion welche in der Admin-UI verwendet werden können
|
||||
meta:
|
||||
openapi:
|
||||
disabled: true
|
||||
# Navigationseintrag in der Admin-UI
|
||||
label: { de: "Action", en: "Action" }
|
||||
# Icon (Material UI) für den Navigationseintrag
|
||||
muiIcon: web
|
||||
views:
|
||||
# Mobile Darstellung
|
||||
- type: simpleList
|
||||
mediaQuery: "(max-width:599px)"
|
||||
primaryText: id
|
||||
|
||||
# Desktop
|
||||
- type: table
|
||||
mediaQuery: "(min-width:600px)"
|
||||
columns:
|
||||
- id
|
||||
|
||||
permissions:
|
||||
# öffentlicher Zugriff
|
||||
public:
|
||||
methods:
|
||||
# Liste und Einzeleinträge lesen
|
||||
# checked via hook
|
||||
get: false
|
||||
# neuen Eintrag anlegen
|
||||
post: true
|
||||
# Eintrag editieren
|
||||
put: false
|
||||
# Eintrag löschen
|
||||
delete: false
|
||||
# zum Projekt zugeordneter Benutzer ohne Zusatzberechtigungen
|
||||
user:
|
||||
methods:
|
||||
get: false
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
|
||||
hooks:
|
||||
post:
|
||||
create:
|
||||
type: javascript
|
||||
file: hooks/action/post_create.js
|
||||
|
||||
# Feldliste der Kollektion
|
||||
fields: []
|
||||
@@ -29,42 +29,35 @@ hooks:
|
||||
create:
|
||||
type: javascript
|
||||
file: hooks/backups/post_create.js
|
||||
return:
|
||||
type: javascript
|
||||
file: hooks/clear_cache.js
|
||||
put:
|
||||
return:
|
||||
type: javascript
|
||||
file: hooks/clear_cache.js
|
||||
|
||||
fields:
|
||||
- name: collectionName
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Collection Name
|
||||
en: Collection Name
|
||||
label:
|
||||
de: Collection Name
|
||||
en: Collection Name
|
||||
|
||||
- name: entryId
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Entry ID
|
||||
en: Entry ID
|
||||
de: Entry ID
|
||||
en: Entry ID
|
||||
|
||||
- name: versionNr
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
de: Version Nr
|
||||
en: Version Nr
|
||||
de: Version Nr
|
||||
en: Version Nr
|
||||
|
||||
- name: manipulatedBy
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Manipulated By
|
||||
en: Manipulated By
|
||||
de: Manipulated By
|
||||
en: Manipulated By
|
||||
|
||||
- name: eventDescription
|
||||
type: string
|
||||
@@ -73,59 +66,58 @@ fields:
|
||||
widget: select
|
||||
choices:
|
||||
- id: create
|
||||
name:
|
||||
de: Erstellt
|
||||
en: Create
|
||||
name:
|
||||
de: Erstellt
|
||||
en: Create
|
||||
- id: update
|
||||
name:
|
||||
de: Update
|
||||
en: Update
|
||||
name:
|
||||
de: Update
|
||||
en: Update
|
||||
- id: delete
|
||||
name:
|
||||
de: Gelöscht
|
||||
en: Delete
|
||||
name:
|
||||
de: Gelöscht
|
||||
en: Delete
|
||||
- id: recreate
|
||||
name:
|
||||
de: Wiederhergestellt
|
||||
en: Recreate
|
||||
de: Wiederhergestellt
|
||||
en: Recreate
|
||||
- id: activate
|
||||
name:
|
||||
de: Aktiviert
|
||||
en: Activate
|
||||
name:
|
||||
de: Aktiviert
|
||||
en: Activate
|
||||
|
||||
- name: updateLogs
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Veränderungen
|
||||
en: Update Logs
|
||||
label:
|
||||
de: Veränderungen
|
||||
en: Update Logs
|
||||
|
||||
subFields:
|
||||
- name: field
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Feldname
|
||||
en: Fieldname
|
||||
label:
|
||||
de: Feldname
|
||||
en: Fieldname
|
||||
|
||||
- name: previous
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Vorheriger Wert
|
||||
en: Previous Value
|
||||
label:
|
||||
de: Vorheriger Wert
|
||||
en: Previous Value
|
||||
|
||||
- name: current
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
|
||||
de: Aktueller Wert
|
||||
en: Current Value
|
||||
label:
|
||||
de: Aktueller Wert
|
||||
en: Current Value
|
||||
|
||||
- name: entry
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Eintrag
|
||||
en: Entry
|
||||
de: Eintrag
|
||||
en: Entry
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
name: bannerSlide
|
||||
|
||||
meta:
|
||||
allowExportAll: true
|
||||
label:
|
||||
de: Banner
|
||||
en: Banner
|
||||
muiIcon: label
|
||||
backup:
|
||||
active: true
|
||||
collectionName: backups
|
||||
defaultSort:
|
||||
field: name
|
||||
order: ASC
|
||||
|
||||
views: &views
|
||||
- type: table
|
||||
columns:
|
||||
- source: text
|
||||
filter: true
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: true
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
|
||||
fields:
|
||||
- name: text
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Inhalt
|
||||
en: Content
|
||||
@@ -1,221 +0,0 @@
|
||||
name: content
|
||||
meta:
|
||||
label: Inhalt
|
||||
muiIcon: tableOfContents
|
||||
allowExportAll: true
|
||||
backup:
|
||||
active: true
|
||||
collectionName: backups
|
||||
defaultSort:
|
||||
field: insertTime
|
||||
order: DESC
|
||||
views:
|
||||
- type: simpleList
|
||||
selectionPriority: 0
|
||||
primaryText: name
|
||||
secondaryText: path
|
||||
mediaQuery: "(min-width: 0px)"
|
||||
tertiaryText: type
|
||||
- type: table
|
||||
selectionPriority: 1
|
||||
mediaQuery: "(min-width: 700px)"
|
||||
columns:
|
||||
- source: active
|
||||
name: Aktiv
|
||||
filter: true
|
||||
- source: type
|
||||
name: Typ
|
||||
filter: true
|
||||
- source: name
|
||||
name: Name
|
||||
filter: true
|
||||
- source: path
|
||||
name: Pfad
|
||||
filter: true
|
||||
|
||||
tablist:
|
||||
activeTab: general
|
||||
tabs:
|
||||
- name: general
|
||||
label:
|
||||
de: Allgemein
|
||||
en: General
|
||||
subFields:
|
||||
- source: active
|
||||
- source: type
|
||||
- source: name
|
||||
- source: question
|
||||
- source: path
|
||||
- source: alternativePaths
|
||||
- source: products
|
||||
|
||||
- name: block
|
||||
label:
|
||||
de: Inhalt
|
||||
en: Content
|
||||
subFields:
|
||||
- source: blocks
|
||||
|
||||
- name: meta
|
||||
label:
|
||||
de: Meta
|
||||
en: Meta
|
||||
subFields:
|
||||
- source: meta
|
||||
|
||||
subNavigation:
|
||||
- name: modalForeign
|
||||
defaultSort:
|
||||
field: name
|
||||
order: ASC
|
||||
views:
|
||||
- type: table
|
||||
columns:
|
||||
- source: active
|
||||
name: Aktiv
|
||||
filter: true
|
||||
- source: name
|
||||
name: Name
|
||||
filter: true
|
||||
setDefault:
|
||||
field: type
|
||||
value: block
|
||||
defaultCallback:
|
||||
eval: |
|
||||
(entry) => {
|
||||
parent.selectEntry(entry)
|
||||
}
|
||||
|
||||
- name: page
|
||||
label:
|
||||
de: Seiten
|
||||
en: pages
|
||||
muiIcon: book-open-page-variant
|
||||
defaultSort:
|
||||
field: insertTime
|
||||
order: DESC
|
||||
setDefault:
|
||||
field: type
|
||||
value: page
|
||||
views:
|
||||
- type: table
|
||||
columns:
|
||||
- source: active
|
||||
name: Aktiv
|
||||
filter: true
|
||||
- source: name
|
||||
name: Name
|
||||
filter: true
|
||||
- source: path
|
||||
name: Pfad
|
||||
filter: true
|
||||
filter:
|
||||
type: page
|
||||
|
||||
- name: block
|
||||
label:
|
||||
de: Blöcke
|
||||
en: blocks
|
||||
muiIcon: view-grid
|
||||
defaultSort:
|
||||
# field: "sort"
|
||||
# order: "MANUALLY"
|
||||
field: insertTime
|
||||
order: DESC
|
||||
setDefault:
|
||||
field: type
|
||||
value: block
|
||||
views:
|
||||
- type: table
|
||||
columns:
|
||||
- source: active
|
||||
name: Aktiv
|
||||
filter: true
|
||||
- source: name
|
||||
name: Name
|
||||
filter: true
|
||||
|
||||
filter:
|
||||
type: block
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: true
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
|
||||
projections:
|
||||
navigation:
|
||||
select:
|
||||
path: 1
|
||||
|
||||
fields:
|
||||
- !include fields/active.yml
|
||||
- !include fields/contentType.yml
|
||||
|
||||
- name: products
|
||||
type: number[]
|
||||
meta:
|
||||
label:
|
||||
de: Produkte
|
||||
en: Products
|
||||
widget: foreignKey
|
||||
dependsOn:
|
||||
eval: $.type == "product"
|
||||
foreign:
|
||||
collection: bigCommerceProduct
|
||||
id: bigCommerceId
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
|
||||
- name: name
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Name
|
||||
en: Name
|
||||
helperText:
|
||||
de: "Der Name wird nur intern verwendet."
|
||||
en: "The name is only used internally."
|
||||
containerProps:
|
||||
layout:
|
||||
breakAfter: true
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- type: string
|
||||
name: path
|
||||
index: [single]
|
||||
meta:
|
||||
label:
|
||||
de: Pfad
|
||||
en: Path
|
||||
helperText:
|
||||
de: "Ein Pfad sollte mit einem / starten und ohne enden."
|
||||
en: "A path should start with a / and end without one."
|
||||
dependsOn:
|
||||
eval: $.type == "page"
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- !include fields/contentBlocks.yml
|
||||
- !include fields/contentMeta.yml
|
||||
indexes:
|
||||
- name: fulltext # Ein eindeutiger Name für den Index. Es ist optional, wird jedoch empfohlen, um den Index später leicht identifizieren zu können.
|
||||
key: # Bestimmt, auf welche Felder der Index angewendet werden soll. Dies kann ein einfacher String sein, wenn der Index nur ein Feld umfasst, oder ein Array von Strings, wenn der Index mehrere Felder umfasst.
|
||||
- $text:$**
|
||||
@@ -1,35 +0,0 @@
|
||||
- name: title
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Titel
|
||||
en: Title
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: description
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Beschreibung
|
||||
en: Description
|
||||
inputProps:
|
||||
multiline: true
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: keywords
|
||||
type: string
|
||||
meta:
|
||||
inputProps:
|
||||
multiline: true
|
||||
label:
|
||||
de: Schlüsselwörter
|
||||
en: Keywords
|
||||
@@ -1,16 +0,0 @@
|
||||
type: boolean
|
||||
name: active
|
||||
meta:
|
||||
label:
|
||||
de: Aktiv
|
||||
en: Active
|
||||
helperText:
|
||||
de: Ist dies Aktiviert, so wird der Inhalt verfügbar.
|
||||
en: If this is activated, the content will be available.
|
||||
defaultValue: true
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
@@ -1,3 +0,0 @@
|
||||
backup:
|
||||
active: true # sollen backups beim verändern erstellt werden
|
||||
collectionName: backups # in welcher collection es gespeichert werden soll
|
||||
@@ -1,72 +0,0 @@
|
||||
name: callToActionButtons
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Call to Action
|
||||
en: Call to Action
|
||||
subFields:
|
||||
- name: buttonText
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Button-Text
|
||||
en: Button Text
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: page
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Button-Link (URL)
|
||||
en: Button link (URL)
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: ctaType
|
||||
type: number
|
||||
meta:
|
||||
label: Button Farbe
|
||||
widget: select
|
||||
choices:
|
||||
- id: 0
|
||||
name: Primär
|
||||
- id: 1
|
||||
name: Sekundär
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: buttonTarget
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Button-Link (Ziel)
|
||||
en: Button link (Target)
|
||||
widget: select
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
choices:
|
||||
- name:
|
||||
de: im gleichen Fenster
|
||||
en: in the same window
|
||||
id: _self
|
||||
- name:
|
||||
de: in einem neuen Fenster
|
||||
en: in a new window
|
||||
id: _blank
|
||||
@@ -1,464 +0,0 @@
|
||||
x-block-full-preview: &block-full-preview
|
||||
eval: |
|
||||
//js
|
||||
(async () => {
|
||||
const {ContentBlock, getRenderedElement} = await import($projectBase + "_/assets/dist/admin.mjs?t=" + $project?.updateTime)
|
||||
const container = getRenderedElement(ContentBlock, {
|
||||
props: {
|
||||
block: Object.assign({}, $this, {
|
||||
}),
|
||||
apiBase: $projectBase,
|
||||
},
|
||||
addCss: [
|
||||
$projectBase + "_/assets/dist/index.css",
|
||||
$projectBase + "_/assets/dist/admin.css",
|
||||
],
|
||||
})
|
||||
let style = "max-width: 1900px; background-color: white;"
|
||||
// if (!$this?.aktiv) {
|
||||
// style += "opacity: 0.5;"
|
||||
// }
|
||||
container.style = style
|
||||
return container
|
||||
})()
|
||||
//!js
|
||||
|
||||
x-block-light-preview: &block-light-preview
|
||||
eval: |
|
||||
//js
|
||||
"<div style=\"padding-left: 30px;\"><b>" +
|
||||
($this.headline || "") + "</b>" +
|
||||
($this.type ?
|
||||
" <small>Blocktyp: " +
|
||||
{
|
||||
"columns": "Spalten",
|
||||
"predefinedBlock": "Vordefinierter Block",
|
||||
|
||||
}[$this.type] +
|
||||
"</small>" :
|
||||
"") +
|
||||
($this.anchorId ?
|
||||
" <small>#" + $this.anchorId +
|
||||
"</small>" :
|
||||
"") +
|
||||
"<br>" +
|
||||
($this.subline || "") +
|
||||
"</div>"
|
||||
//!js
|
||||
raw: true
|
||||
|
||||
name: blocks
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Inhalt
|
||||
en: Content
|
||||
#widget: containerLessObjectArray
|
||||
widget: previewBasedObjectArray
|
||||
pathStep:
|
||||
title: Inhalt
|
||||
preview: *block-full-preview
|
||||
folding:
|
||||
previewFolded: *block-full-preview
|
||||
previewUnfolded: *block-light-preview
|
||||
metaElements:
|
||||
tablist:
|
||||
tabs:
|
||||
- name: allgemein
|
||||
label: Allgemein
|
||||
subFields:
|
||||
- source: topline
|
||||
- source: headline
|
||||
- source: headlineH1
|
||||
- source: doublyLined
|
||||
- source: subline
|
||||
- source: anchorId
|
||||
- source: headlineLink
|
||||
- source: headlineLinkText
|
||||
- name: callToAction
|
||||
label: Call to Action
|
||||
subFields:
|
||||
- source: callToActionButtons
|
||||
- name: paddingBackground
|
||||
label: Hintergrund und Abstand
|
||||
subFields:
|
||||
- source: background
|
||||
- source: padding
|
||||
- source: contentWidth
|
||||
- source: crinkledSection
|
||||
- source: additionalHeightBottom
|
||||
|
||||
subFields:
|
||||
########################### globale Einstellungen ###########################
|
||||
- name: headline
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Überschrift
|
||||
en: Headline
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: headlineH1
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Überschrift als H1
|
||||
en: Headline as H1
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: headlineLink
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Überschrift-Link
|
||||
en: Headline-Link
|
||||
foreign:
|
||||
collection: content
|
||||
id: path
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: headlineLinkText
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Überschrift-Link
|
||||
en: Headline-Link
|
||||
foreign:
|
||||
collection: content
|
||||
id: path
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- !include ./callToActionButton.yml
|
||||
- name: doublyLined
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Doppelt unterstrichen
|
||||
en: Doubly underlined
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: subline
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Unterzeile
|
||||
en: Subline
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: topline
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Topline
|
||||
en: Topline
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: anchorId
|
||||
type: string
|
||||
meta:
|
||||
# dependsOn:
|
||||
# eval: |
|
||||
# (function() {
|
||||
# return $parent?.type !== 'predefinedBlock'
|
||||
# })()
|
||||
label:
|
||||
de: Anker-ID
|
||||
en: Anchor ID
|
||||
helperText:
|
||||
de: Der Block kann über diese Anker-Id direkt über links mit URL#Anker-ID angesprungen werden.
|
||||
en: The block can be jumped directly via links with URL#AnchorID.
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: crinkledSection
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Geknitterter Abschnitt
|
||||
en: crinkled Section
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: background
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Hintergrund
|
||||
en: Background
|
||||
subFields:
|
||||
- name: color
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Hintergrundfarbe
|
||||
en: Background color
|
||||
widget: select
|
||||
choices:
|
||||
- name:
|
||||
de: weiß / transparent
|
||||
en: white / transparent
|
||||
id: white
|
||||
|
||||
- name:
|
||||
de: schwarz
|
||||
en: black
|
||||
id: black
|
||||
defaultValue: white
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: image
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Hintergrundbild
|
||||
en: Background Image
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: medialib
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render: !include ../lib/foreignMediaRender.yml
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: minHeight
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Mindesthöhe
|
||||
en: Min height
|
||||
widget: select
|
||||
choices:
|
||||
- name:
|
||||
de: keine
|
||||
en: none
|
||||
id: "none"
|
||||
|
||||
- name:
|
||||
de: Normale höhe
|
||||
en: Normal height
|
||||
id: normal
|
||||
|
||||
- name:
|
||||
de: erweiterte Höhe
|
||||
en: extended height
|
||||
id: extended
|
||||
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: headerHeightUp
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Um höhe des Header nach oben
|
||||
en: Header up
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: overlay
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Overlay
|
||||
en: Overlay
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: noVerticalPadding
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Kein vertikaler Innenabstand
|
||||
en: No vertical padding
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
helperText:
|
||||
de: Nur nötig, wenn man nicht mit den "geknittertem Abschnitt" arbeitet
|
||||
en: Only not necessary if you work with the "crinkled section"
|
||||
- name: noHorizontalMargin
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Kein horizontaler Außenabstand
|
||||
en: No horizontal margin
|
||||
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: contentWidth
|
||||
type: number
|
||||
meta:
|
||||
widget: select
|
||||
label:
|
||||
de: Breite
|
||||
en: Width
|
||||
choices:
|
||||
- id: 0
|
||||
name:
|
||||
de: 100%
|
||||
en: 100%
|
||||
- id: 1
|
||||
name:
|
||||
de: Schmal
|
||||
en: Narrow
|
||||
- id: 2
|
||||
name:
|
||||
de: normal
|
||||
en: normal
|
||||
|
||||
- name: type
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Typ
|
||||
en: Type
|
||||
widget: select
|
||||
containerProps:
|
||||
layout:
|
||||
breakBefore: true
|
||||
breakAfter: true
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
defaultValue: columns
|
||||
choices:
|
||||
- name:
|
||||
de: keine Auswahl
|
||||
en: no selection
|
||||
id: ""
|
||||
|
||||
- name:
|
||||
de: Text- und Bild-Spalten
|
||||
en: Text and image columns
|
||||
id: columns
|
||||
|
||||
- name:
|
||||
de: Vordefinierter Block
|
||||
en: Predefined Block
|
||||
id: predefinedBlock
|
||||
|
||||
- name:
|
||||
de: Produkt Slider
|
||||
en: Product Slider
|
||||
id: productSlider
|
||||
|
||||
- name:
|
||||
de: Haupt Homepage
|
||||
en: Main Homepage
|
||||
id: homepage
|
||||
|
||||
- name:
|
||||
de: Geteilte Homepage
|
||||
en: Splitted Homepage
|
||||
id: splittedHomepage
|
||||
|
||||
- name:
|
||||
de: Verbessere Dich Spalte
|
||||
en: Improve Yourself Column
|
||||
id: improveYourselfDescription
|
||||
|
||||
- name:
|
||||
de: Chapter Preview
|
||||
en: Chapter Preview
|
||||
id: selfImprovementChapterPreview
|
||||
|
||||
- name:
|
||||
de: Bewertungsvorschau
|
||||
en: Rating Preview
|
||||
id: ratingPreview
|
||||
|
||||
- name: StepNr
|
||||
id: stepNr
|
||||
|
||||
- name: additionalHeightBottom
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Zusätzliche Höhe unten
|
||||
en: Additional height bottom
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
########################### Blöcke ############################
|
||||
###############################################################
|
||||
- !include ./contentBlocks/columns.yml
|
||||
- !include ./contentBlocks/predefined.yml
|
||||
- !include ./contentBlocks/productSlider.yml
|
||||
- !include ./contentBlocks/MainHomepage.yml
|
||||
- !include ./contentBlocks/SplittedHompage.yml
|
||||
- !include ./contentBlocks/ImproveYourselfDescription.yml
|
||||
- !include ./contentBlocks/selfImprovementChapter.yml
|
||||
- !include ./contentBlocks/ratingsPreview.yml
|
||||
- !include ./contentBlocks/stepNr.yml
|
||||
@@ -1,70 +0,0 @@
|
||||
name: cta
|
||||
type: object
|
||||
meta:
|
||||
label: Call To Action Zeile
|
||||
dependsOn:
|
||||
eval: $parent.type == 'cta'
|
||||
subFields:
|
||||
- name: upperHeadline
|
||||
type: string
|
||||
meta:
|
||||
label: Über Überschrift
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-6"
|
||||
large: "col-6"
|
||||
|
||||
- name: description
|
||||
type: string
|
||||
meta:
|
||||
label: Überschrift beschreibung
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-6"
|
||||
large: "col-6"
|
||||
|
||||
- name: whiteHeadline
|
||||
type: string
|
||||
meta:
|
||||
label: Weißer Teil Überschrift
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-6"
|
||||
large: "col-6"
|
||||
|
||||
- name: redHeadline
|
||||
type: string
|
||||
meta:
|
||||
label: Roter Teil Überschrift
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-6"
|
||||
large: "col-6"
|
||||
|
||||
- name: headlineArrangement
|
||||
type: string
|
||||
meta:
|
||||
label: Headline Anordnung
|
||||
widget: select
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-12"
|
||||
small: "col-12"
|
||||
large: "col-12"
|
||||
choices:
|
||||
- id: row
|
||||
name: in einer Zeile
|
||||
|
||||
- id: column
|
||||
name: in einer Spalte
|
||||
|
||||
- !include ../callToActionButton.yml
|
||||
@@ -1,54 +0,0 @@
|
||||
name: improveYourselfDescription
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Verbessere dich Beschreibung
|
||||
en: Improve Yourself Description
|
||||
dependsOn:
|
||||
eval: $parent.type === 'improveYourselfDescription'
|
||||
subFields:
|
||||
- name: upperDescription
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Obere Beschreibung
|
||||
en: Upper Description
|
||||
widget: richtext
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: lowerDescription
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Untere Beschreibung
|
||||
en: Lower Description
|
||||
widget: richtext
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: image
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Bild
|
||||
en: Image
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: medialib
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
@@ -1,28 +0,0 @@
|
||||
name: mainHomepage
|
||||
type: object
|
||||
meta:
|
||||
label: Hauptseite
|
||||
dependsOn:
|
||||
eval: $parent.type == 'homepage'
|
||||
subFields:
|
||||
- name: type
|
||||
type: string
|
||||
meta:
|
||||
label: Typ
|
||||
widget: select
|
||||
choices:
|
||||
- id: cta
|
||||
name: Call To Action
|
||||
|
||||
- !include CTACol.yml
|
||||
- name: image
|
||||
type: string
|
||||
meta:
|
||||
label: Bild
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: medialib
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
@@ -1,23 +0,0 @@
|
||||
name: splittedHomepage
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Geteilte Homepage
|
||||
en: Splitted Homepage Block
|
||||
dependsOn:
|
||||
eval: $parent.type === 'splittedHomepage'
|
||||
subFields:
|
||||
- name: chapters
|
||||
type: string[]
|
||||
meta:
|
||||
label:
|
||||
de: Kapitel
|
||||
en: Chapters
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: selfImprovementChapter
|
||||
id: id
|
||||
sort: name
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
@@ -1,265 +0,0 @@
|
||||
x-column-preview: &column-preview
|
||||
eval: |
|
||||
//js
|
||||
(async () => {
|
||||
const {ColumnsColumn, getRenderedElement} = await import($projectBase + "_/assets/dist/admin.mjs?t=" + $project?.updateTime)
|
||||
let c = ColumnsColumn
|
||||
const container = getRenderedElement(c, {
|
||||
props: {
|
||||
column: Object.assign({}, $this, {
|
||||
}),
|
||||
apiBase: $projectBase,
|
||||
},
|
||||
addCss: [
|
||||
$projectBase + "_/assets/dist/index.css",
|
||||
$projectBase + "_/assets/dist/admin.css",
|
||||
],
|
||||
})
|
||||
let style = "background-color: white;"
|
||||
style += "width: 600px;"
|
||||
// if (!$this?.aktiv) {
|
||||
// style += "opacity: 0.5;"
|
||||
// }
|
||||
container.style = style
|
||||
return container
|
||||
})()
|
||||
//!js
|
||||
|
||||
name: columns
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Spalten
|
||||
en: columns
|
||||
dependsOn:
|
||||
eval: $parent.type == 'columns'
|
||||
pathStep:
|
||||
title: Spalten
|
||||
direction: horizontal
|
||||
widget: previewBasedObjectArray
|
||||
preview: *column-preview
|
||||
folding:
|
||||
previewFolded: *column-preview
|
||||
previewUnfolded:
|
||||
eval: |
|
||||
"<div style=\"padding-left: 30px;\">" + ($this.type == "image" ? "Bild" : "Text") + "-Spalte (Breite: " + ($this.colWidth ? $this.colWidth + "/12" : "automatisch" ) + ")</div>"
|
||||
raw: true
|
||||
defaultValue:
|
||||
eval: |
|
||||
[{type: "text", colWidth: 0}]
|
||||
metaElements:
|
||||
- type
|
||||
- colWidth
|
||||
- verticalAlign
|
||||
subFields:
|
||||
- name: type
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Typ
|
||||
en: Type
|
||||
widget: select
|
||||
defaultValue: text
|
||||
choices:
|
||||
- name:
|
||||
de: Text
|
||||
en: Text
|
||||
id: text
|
||||
|
||||
- name:
|
||||
de: Bild
|
||||
en: Image
|
||||
id: image
|
||||
|
||||
- name:
|
||||
de: CTA
|
||||
en: CTA
|
||||
id: cta
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-4"
|
||||
small: "col-12"
|
||||
large: "col-4"
|
||||
- name: colWidth
|
||||
type: number
|
||||
meta:
|
||||
widget: select
|
||||
label:
|
||||
de: Spaltenbreite
|
||||
en: Column width
|
||||
choices:
|
||||
- id: -1
|
||||
name:
|
||||
de: automatische Breite
|
||||
en: auto
|
||||
- id: 6
|
||||
name:
|
||||
de: 1/2
|
||||
en: 1/2
|
||||
- id: 4
|
||||
name:
|
||||
de: 1/3
|
||||
en: 1/3
|
||||
defaultValue: -1
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-4"
|
||||
small: "col-12"
|
||||
large: "col-4"
|
||||
- name: verticalAlign
|
||||
type: string
|
||||
meta:
|
||||
widget: select
|
||||
label:
|
||||
de: vertikale Ausrichtung
|
||||
en: vertical alignment
|
||||
choices:
|
||||
- id: top
|
||||
name:
|
||||
de: oben
|
||||
en: top
|
||||
- id: middle
|
||||
name:
|
||||
de: mittig
|
||||
en: middle
|
||||
- id: bottom
|
||||
name:
|
||||
de: unten
|
||||
en: bottom
|
||||
defaultValue: top
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-4"
|
||||
small: "col-12"
|
||||
large: "col-4"
|
||||
- name: text
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Text
|
||||
en: text
|
||||
widget: richtext
|
||||
dependsOn:
|
||||
eval: $parent.type == 'text'
|
||||
|
||||
- name: images
|
||||
type: string[]
|
||||
meta:
|
||||
label:
|
||||
de: Bild
|
||||
en: Image
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: medialib
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render: !include ../../lib/foreignMediaRender.yml
|
||||
dependsOn:
|
||||
eval: $parent.type == 'image'
|
||||
|
||||
- name: imageMobileBackground
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Bild auf Mobilgeräten in hintergrund
|
||||
en: Image on mobile devices in background
|
||||
dependsOn:
|
||||
eval: $parent.type == 'image'
|
||||
- name: forceFullHeight
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: volle Bildhöhe erzwingen
|
||||
en: full Force image height
|
||||
dependsOn:
|
||||
eval: $parent.type == 'image'
|
||||
|
||||
- name: imageHoverEffect
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Bild hover effekt
|
||||
en: Image hover effect
|
||||
dependsOn:
|
||||
eval: $parent.type == 'image'
|
||||
- name: links
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Links
|
||||
en: Links
|
||||
folding:
|
||||
force: true
|
||||
previewFolded:
|
||||
eval: |
|
||||
"<div style=\"padding-left: 30px;\">Link: <b>" + ($this.text || "") + "</b></div>"
|
||||
raw: true
|
||||
dependsOn:
|
||||
eval: $parent.type == 'text'
|
||||
subFields:
|
||||
- name: text
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Text
|
||||
en: Text
|
||||
- name: url
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: URL
|
||||
en: URL
|
||||
- name: target
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Ziel
|
||||
en: Target
|
||||
widget: select
|
||||
choices:
|
||||
- name:
|
||||
de: im gleichen Fenster
|
||||
en: in the same window
|
||||
id: _self
|
||||
- name:
|
||||
de: in einem neuen Fenster
|
||||
en: in a new window
|
||||
id: _blank
|
||||
- name: style
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Stil
|
||||
en: Style
|
||||
widget: select
|
||||
defaultValue: primary
|
||||
choices:
|
||||
- name:
|
||||
de: primär (roter Hintergrund)
|
||||
en: primary (red background)
|
||||
id: primary
|
||||
|
||||
- name:
|
||||
de: sekundär (rote Schrift)
|
||||
en: secondary (red text)
|
||||
id: secondary
|
||||
|
||||
- id: tertiary
|
||||
name:
|
||||
de: normaler Link (graue Schrift)
|
||||
en: normal link (grey text)
|
||||
|
||||
- name:
|
||||
de: externer Link (Icon links)
|
||||
en: external link (icon left)
|
||||
id: external
|
||||
|
||||
- name:
|
||||
de: Download Link (Icon links)
|
||||
en: download link (icon left)
|
||||
id: download
|
||||
|
||||
- !include ./CTACol.yml
|
||||
@@ -1,28 +0,0 @@
|
||||
name: predefinedBlock
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Vordefinierter Block
|
||||
en: Predefined Block
|
||||
dependsOn:
|
||||
eval: |
|
||||
(function() {
|
||||
return $parent?.type === 'predefinedBlock'
|
||||
})()
|
||||
subFields:
|
||||
- name: id
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Inhalt
|
||||
en: Include
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: content
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render:
|
||||
eval: |
|
||||
(function() {
|
||||
return $foreignEntry?.name || $foreignEntry?.id
|
||||
})()
|
||||
@@ -1,85 +0,0 @@
|
||||
name: productSlider
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Produktslider
|
||||
en: Product Slider
|
||||
dependsOn:
|
||||
eval: $parent.type === 'productSlider'
|
||||
subFields:
|
||||
- name: productSource
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Produktdatenquelle
|
||||
en: Product Data Source
|
||||
widget: select
|
||||
choices:
|
||||
- name:
|
||||
de: Manuelle Auswahl
|
||||
en: Manual Selection
|
||||
id: manual
|
||||
|
||||
- name:
|
||||
de: Kategorie Id
|
||||
en: Category id
|
||||
id: category
|
||||
|
||||
- name:
|
||||
de: Bestseller
|
||||
en: Bestseller
|
||||
id: bestseller
|
||||
|
||||
- name:
|
||||
de: Neue Produkte
|
||||
en: New Products
|
||||
id: newProducts
|
||||
|
||||
- name:
|
||||
de: Hervorgehoben
|
||||
en: Featured
|
||||
id: featured
|
||||
|
||||
- name:
|
||||
de: Angebote
|
||||
en: Discounted
|
||||
id: discounted
|
||||
|
||||
- name: productIds
|
||||
type: number[]
|
||||
meta:
|
||||
label:
|
||||
de: Produkt IDs
|
||||
en: Product IDs
|
||||
dependsOn:
|
||||
eval: $parent.productSource === 'manual' || $parent.productSource === "discounted"
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: bigCommerceProduct
|
||||
id: bigCommerceId
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
|
||||
- name: categoryId
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Kategorie
|
||||
en: Category
|
||||
dependsOn:
|
||||
eval: $parent.productSource === 'category'
|
||||
|
||||
- !include ../callToActionButton.yml
|
||||
- name: headline
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Überschrift
|
||||
en: Headline
|
||||
- name: topLine
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Top Line
|
||||
en: Top Line
|
||||
@@ -1,25 +0,0 @@
|
||||
name: ratingsPreview
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Bewertungsvorschau
|
||||
en: Ratings Preview
|
||||
dependsOn:
|
||||
eval: $parent.type === 'ratingPreview'
|
||||
subFields:
|
||||
- name: ratings
|
||||
type: object[]
|
||||
meta:
|
||||
widget: containerLessObjectArray
|
||||
subFields:
|
||||
- name: rating
|
||||
type: string
|
||||
meta:
|
||||
label: rating
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: rating
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
@@ -1,35 +0,0 @@
|
||||
name: selfImprovementChapterPreview
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Vorschau
|
||||
en: Preview
|
||||
dependsOn:
|
||||
eval: $parent.type === 'selfImprovementChapterPreview'
|
||||
subFields:
|
||||
- name: chapter
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Kapitel
|
||||
en: Chapter
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: selfImprovementChapter
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
- name: previewImage
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Vorschaubild
|
||||
en: Preview Image
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: medialib
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
@@ -1,73 +0,0 @@
|
||||
name: steps
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Stepp Nr
|
||||
en: Step Nr
|
||||
dependsOn:
|
||||
eval: $parent.type === 'stepNr' || !$parent.type
|
||||
subFields:
|
||||
- name: horizontal
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Horizontal
|
||||
en: Horizontal
|
||||
|
||||
- name: color
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Farbe
|
||||
en: Color
|
||||
widget: select
|
||||
choices:
|
||||
- name: red
|
||||
id: red
|
||||
|
||||
- name: items
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Items
|
||||
en: Items
|
||||
widget: containerLessObjectArray
|
||||
subFields:
|
||||
- name: nr
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
de: Nr
|
||||
en: Nr
|
||||
|
||||
- name: title
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Titel
|
||||
en: Title
|
||||
|
||||
- name: descriptions
|
||||
type: string[]
|
||||
meta:
|
||||
widget: string
|
||||
useDefaultArray: true
|
||||
label:
|
||||
de: Beschreibung
|
||||
en: Description
|
||||
inputProps:
|
||||
multiline: true
|
||||
|
||||
- name: image
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Bild
|
||||
en: Image
|
||||
widget: foreignKey
|
||||
foreign:
|
||||
collection: medialib
|
||||
id: id
|
||||
subNavigation: 0
|
||||
render:
|
||||
defaultCollectionViews: true
|
||||
@@ -1,103 +0,0 @@
|
||||
name: meta
|
||||
type: object
|
||||
meta:
|
||||
label:
|
||||
de: Meta Agaben
|
||||
en: Meta Data
|
||||
helperText:
|
||||
de: Diese Angaben werden für die Suchmaschinenoptimierung verwendet.
|
||||
en: These data are used for search engine optimization.
|
||||
dependsOn:
|
||||
eval: $?.type != "block"
|
||||
subFields:
|
||||
- name: title
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Titel
|
||||
en: Title
|
||||
helperText:
|
||||
de: Alternativ wird der Name verwendet.
|
||||
en: Alternatively the name is used.
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
- name: description
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Beschreibung
|
||||
en: Description
|
||||
inputProps:
|
||||
multiline: true
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: keywords
|
||||
type: string
|
||||
meta:
|
||||
inputProps:
|
||||
multiline: true
|
||||
label:
|
||||
de: Schlüsselwörter
|
||||
en: Keywords
|
||||
|
||||
- name: isArticle
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Ist Artikel
|
||||
en: Is Article
|
||||
helperText:
|
||||
de: "Wenn aktiviert, wird der Inhalt als Artikel behandelt."
|
||||
en: "If activated, the content is treated as an article."
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: hasFAQ
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Hat FAQ
|
||||
en: Has FAQ
|
||||
helperText:
|
||||
de: "Wenn aktiviert, wird der Inhalt als FAQ behandelt."
|
||||
en: "If activated, the content is treated as a FAQ."
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
- name: FAQ
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: FAQ
|
||||
en: FAQ
|
||||
subFields:
|
||||
- name: question
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Frage
|
||||
en: Question
|
||||
|
||||
- name: answer
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Antwort
|
||||
en: Answer
|
||||
inputProps:
|
||||
multiline: true
|
||||
@@ -1,35 +0,0 @@
|
||||
type: string
|
||||
name: type
|
||||
meta:
|
||||
label:
|
||||
de: Inhaltstyp
|
||||
en: Content Type
|
||||
widget: select
|
||||
defaultValue: page
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
choices:
|
||||
- name:
|
||||
de: Seite
|
||||
en: Page
|
||||
id: page
|
||||
|
||||
- name:
|
||||
de: Block
|
||||
en: Block
|
||||
id: block
|
||||
|
||||
- name:
|
||||
de: Helpcenter Frage
|
||||
en: Helpcenter Question
|
||||
id: helpcenterQuestion
|
||||
|
||||
- name: Blog
|
||||
id: blog
|
||||
|
||||
- name: product
|
||||
id: product
|
||||
@@ -1,11 +0,0 @@
|
||||
name: emailCC
|
||||
type: string[]
|
||||
meta:
|
||||
label:
|
||||
de: Email CC
|
||||
en: Email CC
|
||||
widget: string
|
||||
useDefaultArray: true
|
||||
helperText:
|
||||
de: "Bsp: zyx@gmail.com"
|
||||
en: "E.g.: zyx@gmail.com"
|
||||
@@ -1,40 +0,0 @@
|
||||
name: excludeDays
|
||||
type: string[]
|
||||
meta:
|
||||
label: Auszuschließende Wochentage
|
||||
widget: checkboxArray
|
||||
choices:
|
||||
- id: monday
|
||||
name:
|
||||
de: Montag
|
||||
en: Monday
|
||||
|
||||
- id: tuesday
|
||||
name:
|
||||
de: Dienstag
|
||||
en: Tuesday
|
||||
|
||||
- id: wednesday
|
||||
name:
|
||||
de: Mittwoch
|
||||
en: Wednesday
|
||||
|
||||
- id: thursday
|
||||
name:
|
||||
de: Donnerstag
|
||||
en: Thursday
|
||||
|
||||
- id: friday
|
||||
name:
|
||||
de: Freitag
|
||||
en: Friday
|
||||
|
||||
- id: saturday
|
||||
name:
|
||||
de: Samstag
|
||||
en: Saturday
|
||||
|
||||
- id: sunday
|
||||
name:
|
||||
de: Sonntag
|
||||
en: Sunday
|
||||
@@ -1,6 +0,0 @@
|
||||
name: file
|
||||
type: file
|
||||
meta:
|
||||
label:
|
||||
de: Datei
|
||||
en: File
|
||||
@@ -1,13 +0,0 @@
|
||||
name: from
|
||||
type: date
|
||||
meta:
|
||||
label:
|
||||
de: Von
|
||||
en: From
|
||||
widget: date
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
@@ -1,11 +0,0 @@
|
||||
name: sort
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
de: Manuelle Sortierung
|
||||
en: Manual Sorting
|
||||
inputProps:
|
||||
{ readonly: true, placeholder: { de: "Wert wird automatisch gesetzt", en: "Value is set automatically" } }
|
||||
helperText:
|
||||
de: Dieses Feld wird für die manuelle Sortierung benötigt. Sobald ein Eintrag per Drag&Drop verschoben wurde, wird die neue Position innerhalb der Liste eingetragen.
|
||||
en: This field is required for manual sorting. As soon as an entry is moved using Drag&Drop, the new position is entered in the list.
|
||||
@@ -1,41 +0,0 @@
|
||||
type: cardList
|
||||
mediaQuery: "(min-width: 1200px)"
|
||||
selectionPriority: 1
|
||||
fileDropArea:
|
||||
label:
|
||||
{
|
||||
de: "Ziehen Sie Dateien per Drag and Drop hierher oder klicken Sie, um Dateien auszuwählen.",
|
||||
en: "Drag and drop some files here, or click to upload.",
|
||||
}
|
||||
helperText: { de: "Maximale Uploadgröße: 1,54 MB", en: "Maximum upload size: 1.54MB" }
|
||||
targetField: file
|
||||
pageAsDropArea: false
|
||||
|
||||
fields:
|
||||
- source: file
|
||||
name:
|
||||
de: Datei
|
||||
en: File
|
||||
filter: true
|
||||
- source: category
|
||||
name:
|
||||
de: Kategorie
|
||||
en: Category
|
||||
filter: true
|
||||
- source: tags
|
||||
name:
|
||||
de: Tags
|
||||
en: Tags
|
||||
foreign: true
|
||||
filter: true
|
||||
- source: title
|
||||
name:
|
||||
de: Titel
|
||||
en: Title
|
||||
filter: true
|
||||
- source: updateTime
|
||||
type: datetime
|
||||
label:
|
||||
de: letztes Update
|
||||
en: last update
|
||||
filter: true
|
||||
@@ -1,25 +0,0 @@
|
||||
type: simpleList
|
||||
mediaQuery: "(min-width: 0px)"
|
||||
defaultSelect: false
|
||||
selectionPriority: 3 #gibt an, wenn mediaQuery passt, mit welcher priorität es default mäßig ausgewählt sein soll, je niedriger, desto wichtiger
|
||||
fileDropArea:
|
||||
label:
|
||||
{
|
||||
de: "Ziehen Sie Dateien per Drag and Drop hierher oder klicken Sie, um Dateien auszuwählen.",
|
||||
en: "Drag and drop some files here, or click to upload.",
|
||||
}
|
||||
helperText: { de: "Maximale Uploadgröße: 1,54 MB", en: "Maximum upload size: 1.54MB" }
|
||||
targetField: file # gibt an, in welches feld die datei hochgeladen werden soll
|
||||
pageAsDropArea: false # wenn true, wird filedrop area garnicht erst angezeigt, da die ganze seite drag n drop funktionalität hat
|
||||
|
||||
primaryText:
|
||||
source: file
|
||||
filter: true
|
||||
|
||||
secondaryText:
|
||||
source: alt
|
||||
filter: true
|
||||
|
||||
tertiaryText:
|
||||
source: category
|
||||
filter: true
|
||||
@@ -1,41 +0,0 @@
|
||||
type: table
|
||||
mediaQuery: "(min-width: 800px)"
|
||||
defaultSelect: false
|
||||
selectionPriority: 2
|
||||
fileDropArea:
|
||||
label:
|
||||
{
|
||||
de: "Ziehen Sie Dateien per Drag and Drop hierher oder klicken Sie, um Dateien auszuwählen.",
|
||||
en: "Drag and drop some files here, or click to upload.",
|
||||
}
|
||||
helperText: { de: "Maximale Uploadgröße: 1,54 MB", en: "Maximum upload size: 1.54MB" }
|
||||
targetField: file
|
||||
pageAsDropArea: false
|
||||
columns:
|
||||
- source: file
|
||||
name:
|
||||
de: Datei
|
||||
en: File
|
||||
filter: true
|
||||
- source: category
|
||||
name:
|
||||
de: Kategorie
|
||||
en: Category
|
||||
filter: true
|
||||
- source: tags
|
||||
name:
|
||||
de: Tags
|
||||
en: Tags
|
||||
foreign: true
|
||||
filter: true
|
||||
- source: title
|
||||
name:
|
||||
de: Titel
|
||||
en: Title
|
||||
filter: true
|
||||
- source: updateTime
|
||||
type: datetime
|
||||
label:
|
||||
de: letztes Update
|
||||
en: last update
|
||||
filter: true
|
||||
@@ -1,10 +0,0 @@
|
||||
multiupload:
|
||||
fields:
|
||||
- source: category # gibt an, welche Felder in der Modalansicht bearbeitet werden können, wenn die Eigenschaft nicht festgelegt ist, werden automatisch alle Felder ausgewählt
|
||||
prefilledFields: # gibt an, welche Felder in der Modalansicht vorbefüllt werden können, wenn die Eigenschaft nicht festgelegt ist, werden automatisch alle Felder ausgewählt
|
||||
- source: title
|
||||
defaultValue: # extrahiert den namen des files und fügt ihn in das feld "title" ein
|
||||
eval: |
|
||||
(function(){
|
||||
return "Title" + $file.name
|
||||
})()
|
||||
@@ -1,17 +0,0 @@
|
||||
name: pageTitle
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Titel der Seite
|
||||
en: Page Title
|
||||
helperText:
|
||||
de: "Dieser Titel wird in der Seite als h1 angezeigt."
|
||||
en: "This title is displayed in the page as h1."
|
||||
dependsOn:
|
||||
eval: $.type == "page"
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
@@ -1,9 +0,0 @@
|
||||
name: text
|
||||
type: string
|
||||
meta:
|
||||
widget: richtext
|
||||
label:
|
||||
de: Text
|
||||
en: text
|
||||
dependsOn:
|
||||
eval: $parent.contentType == 'text'
|
||||
@@ -1,13 +0,0 @@
|
||||
raw: true
|
||||
eval: |
|
||||
//js
|
||||
(function() {
|
||||
let out = ""
|
||||
if ($foreignEntry?.file?.src && $foreignEntry?.file?.type?.startsWith("image/")) {
|
||||
out += "<img src='" + $projectBase + "medialib/" + $foreignEntry.id + "/" + $foreignEntry.file.src + "?filter=s' style='max-width: 100%;' /><br>"
|
||||
}
|
||||
out += $foreignEntry?.title || ""
|
||||
|
||||
return out
|
||||
})()
|
||||
//!js
|
||||
@@ -1,55 +0,0 @@
|
||||
# Der Key des Objektes definiert den Namen des Filters.
|
||||
# Jeder Filter ist eine Liste von Bildmanipulationen, die
|
||||
# nacheinander angewandt werden.
|
||||
# Die manipulierten Bilder werden gecachet. Ein nachträgliches
|
||||
# Anpassen der Filter erfordert also das Löschen der gecachten
|
||||
# Dateien welche sich jeweils neben den original Bilddateien
|
||||
# im "uploadPath" der Kollektion befinden.
|
||||
xs:
|
||||
- fit: true
|
||||
height: 90
|
||||
width: 90
|
||||
resampling: lanczos
|
||||
quality: 90
|
||||
skipLargerDimension: true
|
||||
skipLargerFilesize: true
|
||||
s:
|
||||
- fit: true
|
||||
height: 300
|
||||
width: 300
|
||||
resampling: lanczos
|
||||
quality: 90
|
||||
skipLargerDimension: true
|
||||
skipLargerFilesize: true
|
||||
m:
|
||||
- fit: true
|
||||
height: 600
|
||||
width: 600
|
||||
resampling: lanczos
|
||||
quality: 90
|
||||
skipLargerDimension: true
|
||||
skipLargerFilesize: true
|
||||
l:
|
||||
- fit: true
|
||||
height: 1200
|
||||
width: 1200
|
||||
resampling: lanczos
|
||||
quality: 90
|
||||
skipLargerDimension: true
|
||||
skipLargerFilesize: true
|
||||
xl:
|
||||
- fit: true
|
||||
height: 2000
|
||||
width: 2000
|
||||
resampling: lanczos
|
||||
quality: 90
|
||||
skipLargerDimension: true
|
||||
skipLargerFilesize: true
|
||||
xxl:
|
||||
- fit: true
|
||||
height: 4000
|
||||
width: 4000
|
||||
resampling: lanczos
|
||||
quality: 90
|
||||
skipLargerDimension: true
|
||||
skipLargerFilesize: true
|
||||
@@ -1,38 +0,0 @@
|
||||
type: cardList
|
||||
mediaQuery: "(min-width: 1200px)"
|
||||
selectionPriority: 1
|
||||
fileDropArea:
|
||||
label:
|
||||
{
|
||||
de: "Ziehen Sie Dateien per Drag and Drop hierher oder klicken Sie, um Dateien auszuwählen.",
|
||||
en: "Drag and drop some files here, or click to upload.",
|
||||
}
|
||||
helperText: { de: "Maximale Uploadgröße: 1,54 MB", en: "Maximum upload size: 1.54MB" }
|
||||
targetField: file
|
||||
pageAsDropArea: false
|
||||
|
||||
fields:
|
||||
- source: title
|
||||
name:
|
||||
de: Titel
|
||||
en: Title
|
||||
filter: true
|
||||
- source: file
|
||||
name: Datei
|
||||
- source: tags
|
||||
name:
|
||||
de: Tags
|
||||
en: Tags
|
||||
filter:
|
||||
type: foreignKey
|
||||
- source: updateTime
|
||||
type: datetime
|
||||
filter: false
|
||||
label:
|
||||
de: letztes Update
|
||||
en: last update
|
||||
- source: file.type
|
||||
name:
|
||||
de: Dateityp
|
||||
en: Filetype
|
||||
filter: true
|
||||
@@ -1,26 +0,0 @@
|
||||
type: simpleList
|
||||
mediaQuery: "(min-width: 0px)"
|
||||
defaultSelect: false
|
||||
selectionPriority: 3 #gibt an, wenn mediaQuery passt, mit welcher priorität es default mäßig ausgewählt sein soll, je niedriger, desto wichtiger
|
||||
fileDropArea:
|
||||
label:
|
||||
{
|
||||
de: "Ziehen Sie Dateien per Drag and Drop hierher oder klicken Sie, um Dateien auszuwählen.",
|
||||
en: "Drag and drop some files here, or click to upload.",
|
||||
}
|
||||
helperText: { de: "Maximale Uploadgröße: 1,54 MB", en: "Maximum upload size: 1.54MB" }
|
||||
targetField: file # gibt an, in welches feld die datei hochgeladen werden soll
|
||||
pageAsDropArea: false # wenn true, wird filedrop area garnicht erst angezeigt, da die ganze seite drag n drop funktionalität hat
|
||||
|
||||
primaryText:
|
||||
source: file
|
||||
# filter: true
|
||||
|
||||
secondaryText:
|
||||
source: title
|
||||
filter: true
|
||||
|
||||
tertiaryText:
|
||||
source: tags
|
||||
filter:
|
||||
type: foreignKey
|
||||
@@ -1,35 +0,0 @@
|
||||
type: table
|
||||
mediaQuery: "(min-width: 800px)"
|
||||
defaultSelect: false
|
||||
selectionPriority: 2
|
||||
fileDropArea:
|
||||
label:
|
||||
{
|
||||
de: "Ziehen Sie Dateien per Drag and Drop hierher oder klicken Sie, um Dateien auszuwählen.",
|
||||
en: "Drag and drop some files here, or click to upload.",
|
||||
}
|
||||
helperText: { de: "Maximale Uploadgröße: 1,54 MB", en: "Maximum upload size: 1.54MB" }
|
||||
targetField: file
|
||||
pageAsDropArea: false
|
||||
columns:
|
||||
- source: file
|
||||
name:
|
||||
de: Datei
|
||||
en: File
|
||||
filter: true
|
||||
- source: tags
|
||||
name:
|
||||
de: Tags
|
||||
en: Tags
|
||||
filter:
|
||||
type: foreignKey
|
||||
- source: file.type
|
||||
label:
|
||||
de: Dateityp
|
||||
en: Filetype
|
||||
filter: true
|
||||
- source: updateTime
|
||||
type: datetime
|
||||
label:
|
||||
de: letztes Update
|
||||
en: last update
|
||||
@@ -1,6 +0,0 @@
|
||||
quickEdit: # Erlaubt das Bearbeiten von Einträgen in der Listenansicht, ohne dass eine neue Seite geöffnet wird
|
||||
enabled: true
|
||||
fields: # felder, die in dieser Ansicht bearbeitet werden können
|
||||
- title
|
||||
- alt
|
||||
- file
|
||||
@@ -1,6 +0,0 @@
|
||||
name: fulltextindex # Ein eindeutiger Name für den Index. Es ist optional, wird jedoch empfohlen, um den Index später leicht identifizieren zu können.
|
||||
key: # Bestimmt, auf welche Felder der Index angewendet werden soll. Dies kann ein einfacher String sein, wenn der Index nur ein Feld umfasst, oder ein Array von Strings, wenn der Index mehrere Felder umfasst.
|
||||
- $text:$** # definiert einen Volltextindex über alle Felder. Der spezielle Operator $text wird verwendet, um einen Volltextindex zu erstellen, und der Operator $\*\* bezeichnet alle Felder in der Sammlung.
|
||||
background: true
|
||||
unique: false # Wenn auf true gesetzt, erzwingt dies, dass der Index eindeutige Werte enthält. Wenn Sie versuchen, einen Eintrag mit einem bereits indizierten Wert hinzuzufügen, wird ein Fehler ausgelöst.
|
||||
defaultLanguage: german # Wird verwendet, um die Sprache für Textindizes festzulegen. Dies ist wichtig für die Volltextsuche, da verschiedene Sprachen unterschiedliche Tokenisierungs- und Stemmungsregeln haben.
|
||||
@@ -1,153 +0,0 @@
|
||||
name: lighthouse
|
||||
|
||||
meta:
|
||||
label: Lighthouse
|
||||
hideInNavigation: true
|
||||
muiIcon: web
|
||||
views:
|
||||
- type: table
|
||||
mediaQuery: "(min-width: 600px)"
|
||||
columns:
|
||||
- source: insertTime
|
||||
filter: true
|
||||
- source: perfomance
|
||||
filter: true
|
||||
- source: accessibility
|
||||
filter: true
|
||||
- source: bestPractices
|
||||
filter: true
|
||||
- source: seo
|
||||
filter: true
|
||||
- type: simpleList
|
||||
mediaQuery: "(max-width: 599px)"
|
||||
primaryText: insertTime
|
||||
secondaryText: performance
|
||||
tertiaryText: accessibility
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: false
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
|
||||
projections:
|
||||
dashboard:
|
||||
|
||||
hooks:
|
||||
post:
|
||||
create:
|
||||
type: javascript
|
||||
file: hooks/lighthouse/post_create.js
|
||||
|
||||
indexes:
|
||||
- !include lib/textIndex.yml
|
||||
|
||||
fields:
|
||||
- name: analyzedPaths
|
||||
type: string[]
|
||||
meta:
|
||||
label:
|
||||
de: Analysierten Pfade
|
||||
en: Analyzed Paths
|
||||
- name: performance
|
||||
type: number
|
||||
meta:
|
||||
label: Performance
|
||||
- name: accessibility
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: Accessibility
|
||||
de: Zugänglichkeit
|
||||
- name: bestPractices
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: Best Practices
|
||||
de: Beste Praktiken
|
||||
- name: seo
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: SEO
|
||||
de: SEO
|
||||
- name: lighthouseMetrics
|
||||
type: object
|
||||
meta:
|
||||
label: Lighthouse Metrics
|
||||
subFields:
|
||||
- name: FCPS
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: First Contentful Paint Score
|
||||
de: Erster Inhaltlicher Anstrich Score
|
||||
- name: FCPV
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: First Contentful Paint Value
|
||||
de: Erster Inhaltlicher Anstrich Wert
|
||||
- name: FMPV
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
de: Erster Bedeutungsvoller Anstrich Wert
|
||||
en: First Meaningful Paint Value
|
||||
|
||||
- name: FMPS
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: First Meaningful Paint Score
|
||||
de: Erster Bedeutungsvoller Anstrich Score
|
||||
|
||||
- name: SIS
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: Speed Index Score
|
||||
de: Geschwindigkeitsindex Score
|
||||
|
||||
- name: SIV
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: Speed Index Value
|
||||
de: Geschwindigkeitsindex Wert
|
||||
|
||||
- name: TTIS
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: Time to Interactive Score
|
||||
de: Zeit bis zur Interaktion Score
|
||||
|
||||
- name: TTIV
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: Time to Interactive Value
|
||||
de: Zeit bis zur Interaktion Wert
|
||||
|
||||
- name: FPIDS
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
de: Erste potenzielle Eingabe Verzögerung Score
|
||||
en: First Potential Input Delay Score
|
||||
|
||||
- name: FPIDV
|
||||
type: number
|
||||
meta:
|
||||
label:
|
||||
en: First Potential Input Delay Value
|
||||
de: Erste potenzielle Eingabe Verzögerung Wert
|
||||
@@ -1,32 +0,0 @@
|
||||
name: lighthouseSubpath
|
||||
|
||||
meta:
|
||||
label: Lighthouse Subpaths
|
||||
hideInNavigation: true
|
||||
muiIcon: web
|
||||
views:
|
||||
- type: table
|
||||
columns:
|
||||
- source: lighthouseSubpath
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: false
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
|
||||
fields:
|
||||
- type: string
|
||||
name: lighthouseSubpath
|
||||
meta:
|
||||
label:
|
||||
de: Zu analysierenden Pfad
|
||||
en: Path to analyze
|
||||
@@ -1,210 +0,0 @@
|
||||
name: medialib
|
||||
uploadPath: ../media/medialib
|
||||
|
||||
meta:
|
||||
allowExportAll: true
|
||||
label:
|
||||
de: Medienbibliothek
|
||||
en: Media Library
|
||||
muiIcon: multimedia
|
||||
defaultSort:
|
||||
field: sort
|
||||
order: MANUALLY
|
||||
|
||||
backup:
|
||||
active: true
|
||||
collectionName: backups
|
||||
|
||||
quickEdit:
|
||||
enabled: true
|
||||
fields:
|
||||
- title
|
||||
- alt
|
||||
- file
|
||||
- tags
|
||||
defaultImageFilter: xs
|
||||
multiupload:
|
||||
fields:
|
||||
- source: category
|
||||
prefilledFields:
|
||||
- source: title
|
||||
defaultValue:
|
||||
eval: |
|
||||
(function(){
|
||||
return $file.name.split(".")[0]
|
||||
})()
|
||||
- source: alt
|
||||
defaultValue:
|
||||
eval: |
|
||||
(function(){
|
||||
return $file.name.split(".")[0]
|
||||
})()
|
||||
views: &views
|
||||
- !include fields/medialibSimpleList.yml
|
||||
- !include fields/medialibTable.yml
|
||||
- !include fields/medialibCardList.yml
|
||||
|
||||
subNavigation:
|
||||
- name: modalForeign
|
||||
defaultSort:
|
||||
field: "path"
|
||||
order: "ASC"
|
||||
views: *views
|
||||
defaultCallback:
|
||||
eval: |
|
||||
//js
|
||||
(entry) => {
|
||||
parent.selectEntry(entry)
|
||||
}
|
||||
//!js
|
||||
|
||||
- name: websiteContent
|
||||
label: Inhalt
|
||||
muiIcon: accountGroup
|
||||
setDefault:
|
||||
field: type
|
||||
value: websiteContent
|
||||
defaultSort:
|
||||
field: "sort"
|
||||
order: "MANUALLY"
|
||||
views: *views
|
||||
filter:
|
||||
"type": "websiteContent"
|
||||
|
||||
- name: other
|
||||
label: Andere
|
||||
muiIcon: accountGroup
|
||||
defaultSort:
|
||||
field: "sort"
|
||||
order: "MANUALLY"
|
||||
views: *views
|
||||
filter:
|
||||
"type": { $ne: "websiteContent" }
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: false
|
||||
delete: true
|
||||
validProjections:
|
||||
- list
|
||||
- details
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
token:${TOKEN}:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
pages:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
|
||||
projections:
|
||||
dashboard:
|
||||
select:
|
||||
details:
|
||||
select:
|
||||
file: 0
|
||||
list:
|
||||
select:
|
||||
file: 1
|
||||
alt: 1
|
||||
hooks:
|
||||
put:
|
||||
return:
|
||||
type: javascript
|
||||
file: hooks/clear_cache.js
|
||||
delete:
|
||||
delete:
|
||||
type: javascript
|
||||
file: hooks/medialib/delete_delete.js
|
||||
|
||||
imageFilter: !include lib/imageFilter.yml
|
||||
|
||||
fields:
|
||||
- !include fields/file.yml
|
||||
- name: type
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Typ
|
||||
en: Type
|
||||
widget: select
|
||||
choices:
|
||||
- name: websiteContent
|
||||
id: websiteContent
|
||||
- name: returnOrderFoto
|
||||
id: returnOrderFoto
|
||||
|
||||
- name: alt
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Alternativtext
|
||||
en: Alternative text
|
||||
helperText:
|
||||
de: Der Alternativtext wird angezeigt, wenn die Datei nicht geladen werden kann.
|
||||
en: The alternative text is displayed if the file cannot be loaded.
|
||||
|
||||
- name: title
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Titel
|
||||
en: Title
|
||||
helperText:
|
||||
de: Der Titel wird angezeigt, wenn die Datei geladen wird.
|
||||
en: The title is displayed when the file is loaded.
|
||||
|
||||
- name: category
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Kategorie
|
||||
en: Category
|
||||
|
||||
- name: tags
|
||||
type: string[]
|
||||
meta:
|
||||
label:
|
||||
de: Tags
|
||||
en: Tags
|
||||
widget: foreignKey
|
||||
filter:
|
||||
type: foreignKey
|
||||
foreign:
|
||||
collection: tag
|
||||
id: id
|
||||
sort: name
|
||||
subNavigation: 0
|
||||
render:
|
||||
raw: true
|
||||
eval: |
|
||||
//js
|
||||
$foreignEntry?.name
|
||||
//!js
|
||||
- name: comment
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Kommentar
|
||||
en: Comment
|
||||
inputProps:
|
||||
multiline: true
|
||||
|
||||
- !include fields/manualSort.yml
|
||||
indexes:
|
||||
- name: fulltext # Ein eindeutiger Name für den Index. Es ist optional, wird jedoch empfohlen, um den Index später leicht identifizieren zu können.
|
||||
key: # Bestimmt, auf welche Felder der Index angewendet werden soll. Dies kann ein einfacher String sein, wenn der Index nur ein Feld umfasst, oder ein Array von Strings, wenn der Index mehrere Felder umfasst.
|
||||
- $text:$**
|
||||
@@ -1,93 +0,0 @@
|
||||
name: module
|
||||
|
||||
meta:
|
||||
label: Module
|
||||
allowExportAll: true
|
||||
backup:
|
||||
active: true
|
||||
collectionName: backups
|
||||
|
||||
views:
|
||||
- type: table
|
||||
columns:
|
||||
- source: type
|
||||
name: Typ
|
||||
filter: true
|
||||
- source: label
|
||||
name: Label
|
||||
filter: true
|
||||
- source: germanLabelTranslation
|
||||
name: Deutsche Übersetzung
|
||||
filter: true
|
||||
|
||||
subNavigation:
|
||||
- name: modal
|
||||
views:
|
||||
- type: table
|
||||
columns:
|
||||
- source: type
|
||||
defaultCallback:
|
||||
eval: |
|
||||
//js
|
||||
(entry) => { // Diese Funktion nimmt den Eintrag (entry) als Argument.
|
||||
parent.selectEntry(entry) // Die Funktion selectEntry auf dem übergeordneten Objekt wird mit dem Eintrag als Argument aufgerufen.
|
||||
}
|
||||
//!js
|
||||
hooks:
|
||||
post:
|
||||
return:
|
||||
type: javascript
|
||||
file: hooks/clear_cache.js
|
||||
put:
|
||||
return:
|
||||
type: javascript
|
||||
file: hooks/clear_cache.js
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: true
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
|
||||
fields:
|
||||
- name: type
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Modultyp
|
||||
en: Module Type
|
||||
helperText:
|
||||
de: "Wählen Sie den Typ des Moduls aus."
|
||||
en: "Choose the type of the module."
|
||||
widget: select
|
||||
choices:
|
||||
- name: Größen Label
|
||||
id: sizeLabel
|
||||
|
||||
- name: label
|
||||
type: string
|
||||
index: [single, unique]
|
||||
meta:
|
||||
label:
|
||||
de: Label
|
||||
en: Label
|
||||
|
||||
- name: germanLabelTranslation
|
||||
index: [single, unique]
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Deutsche Übersetzung
|
||||
en: German Translation
|
||||
indexes:
|
||||
- name: fulltext # Ein eindeutiger Name für den Index. Es ist optional, wird jedoch empfohlen, um den Index später leicht identifizieren zu können.
|
||||
key: # Bestimmt, auf welche Felder der Index angewendet werden soll. Dies kann ein einfacher String sein, wenn der Index nur ein Feld umfasst, oder ein Array von Strings, wenn der Index mehrere Felder umfasst.
|
||||
- $text:$**
|
||||
@@ -1,165 +0,0 @@
|
||||
name: navigation
|
||||
uploadPath: ../media/navigation
|
||||
|
||||
meta:
|
||||
label: "Navigation"
|
||||
muiIcon: navigation
|
||||
views:
|
||||
- type: simpleList
|
||||
mediaQuery: "(max-width:599px)"
|
||||
primaryText: tree
|
||||
|
||||
- type: table
|
||||
mediaQuery: "(min-width:600px)"
|
||||
columns:
|
||||
- source: tree
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: true
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: false
|
||||
put: true
|
||||
delete: false
|
||||
|
||||
x-folding: &folding
|
||||
previewUnfolded:
|
||||
eval: |
|
||||
$this?.name + ' (Ziel: ' + ($this?.external ? $this?.externalUrl || '' : ($this?.page || '') + ($this?.hash ? '#' + $this.hash : '')) + ')' + ($this?.elements?.length ? ' <small>' + $this?.elements?.length + ' Sub-Navigationselement(e)</small>' : '')
|
||||
raw: true
|
||||
previewFolded:
|
||||
eval: |
|
||||
$this?.name + ' (Ziel: ' + ($this?.external ? $this?.externalUrl || '' : ($this?.page || '') + ($this?.hash ? '#' + $this.hash : '')) + ')' + ($this?.elements?.length ? ' <small>' + $this?.elements?.length + ' Sub-Navigationselement(e)</small>' : '')
|
||||
raw: true
|
||||
|
||||
x-elemente: &elemente
|
||||
name: elements
|
||||
type: object[]
|
||||
meta:
|
||||
label:
|
||||
de: Elemente
|
||||
en: elements
|
||||
folding: *folding
|
||||
|
||||
x-name: &name
|
||||
name: name
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Name
|
||||
en: name
|
||||
helperText:
|
||||
de: Dieser Name wird zur Anzeige in der Navigation verwendet.
|
||||
en: This name is used for display in the navigation.
|
||||
|
||||
x-page: &page
|
||||
name: page
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Seite pfad
|
||||
en: page path
|
||||
dependsOn:
|
||||
eval: |
|
||||
!$parent?.external
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
x-hash: &hash
|
||||
name: hash
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Anker
|
||||
en: anchor
|
||||
dependsOn:
|
||||
eval: |
|
||||
!$parent?.external
|
||||
helperText:
|
||||
de: Geben Sie hier den Anker ein, zu dem der Link führen soll. (ohne '#' am Anfang)
|
||||
en: Enter the anchor to which the link should lead. (without '#' at the beginning)
|
||||
containerProps:
|
||||
layout:
|
||||
size:
|
||||
default: "col-6"
|
||||
small: "col-12"
|
||||
large: "col-6"
|
||||
|
||||
x-external: &external
|
||||
name: external
|
||||
type: boolean
|
||||
meta:
|
||||
label:
|
||||
de: Externer Link
|
||||
en: external link
|
||||
helperText:
|
||||
de: Wenn aktiviert, wird der Link in einem neuen Tab geöffnet.
|
||||
en: If activated, the link will be opened in a new tab.
|
||||
|
||||
x-externalUrl: &externalUrl
|
||||
name: externalUrl
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Externer Link
|
||||
en: external link
|
||||
dependsOn:
|
||||
eval: |
|
||||
$parent?.external
|
||||
helperText:
|
||||
de: Geben Sie hier die URL ein, zu der der Link führen soll.
|
||||
en: Enter the URL to which the link should lead.
|
||||
|
||||
fields:
|
||||
- name: tree
|
||||
type: number
|
||||
meta:
|
||||
label: Baum
|
||||
widget: select
|
||||
helperText:
|
||||
de: Die Servicenavigation sollte Seiten wie bspw. die Datneschutzerklärung oder das Impressum umfassen.
|
||||
en: The service navigation should include pages such as the data protection declaration or the imprint.
|
||||
defaultValue: 0
|
||||
choices:
|
||||
- id: 0
|
||||
name:
|
||||
de: Hauptnavigation
|
||||
en: main navigation
|
||||
- id: 1
|
||||
name:
|
||||
de: Service Navigation
|
||||
en: Service Navigation
|
||||
|
||||
- id: 2
|
||||
name:
|
||||
de: Rechtliche Navigation
|
||||
en: Legal Navigation
|
||||
|
||||
- <<: *elemente
|
||||
subFields:
|
||||
- *name
|
||||
- *external
|
||||
- *page
|
||||
- *hash
|
||||
- *externalUrl
|
||||
- <<: *elemente
|
||||
subFields:
|
||||
- *name
|
||||
- *external
|
||||
- *page
|
||||
- *hash
|
||||
- *externalUrl
|
||||
indexes:
|
||||
- name: fulltext # Ein eindeutiger Name für den Index. Es ist optional, wird jedoch empfohlen, um den Index später leicht identifizieren zu können.
|
||||
key: # Bestimmt, auf welche Felder der Index angewendet werden soll. Dies kann ein einfacher String sein, wenn der Index nur ein Feld umfasst, oder ein Array von Strings, wenn der Index mehrere Felder umfasst.
|
||||
- $text:$**
|
||||
@@ -1,66 +0,0 @@
|
||||
########################################################################
|
||||
# SSR Dummy collections
|
||||
########################################################################
|
||||
|
||||
name: ssr
|
||||
meta:
|
||||
label: { de: "SSR Dummy", en: "ssr dummy" }
|
||||
muiIcon: server
|
||||
rowIdentTpl: { twig: "{{ id }}" }
|
||||
|
||||
views:
|
||||
- type: simpleList
|
||||
mediaQuery: "(max-width: 600px)"
|
||||
primaryText: id
|
||||
secondaryText: insertTime
|
||||
tertiaryText: path
|
||||
- type: table
|
||||
columns:
|
||||
- id
|
||||
- insertTime
|
||||
- source: path
|
||||
filter: true
|
||||
- source: validUntil
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: false
|
||||
put: false
|
||||
delete: true
|
||||
|
||||
hooks:
|
||||
get:
|
||||
read:
|
||||
type: javascript
|
||||
file: hooks/ssr/get_read.js
|
||||
post:
|
||||
bind:
|
||||
type: javascript
|
||||
file: hooks/ssr/post_bind.js
|
||||
|
||||
fields:
|
||||
- name: path
|
||||
type: string
|
||||
index: [single, unique]
|
||||
|
||||
- name: content
|
||||
type: string
|
||||
meta:
|
||||
inputProps:
|
||||
multiline: true
|
||||
|
||||
- name: validUntil
|
||||
type: date
|
||||
index: [single]
|
||||
meta:
|
||||
label:
|
||||
de: Gültig bis
|
||||
en: Valid until
|
||||
@@ -1,54 +0,0 @@
|
||||
name: tag
|
||||
uploadPath: ../media/tag
|
||||
|
||||
meta:
|
||||
allowExportAll: true
|
||||
label:
|
||||
de: Tags
|
||||
en: Tags
|
||||
muiIcon: label
|
||||
|
||||
defaultSort:
|
||||
field: name
|
||||
order: ASC
|
||||
|
||||
views: &views
|
||||
- type: table
|
||||
columns:
|
||||
- source: name
|
||||
filter: true
|
||||
subNavigation:
|
||||
- name: modalForeign
|
||||
defaultSort:
|
||||
field: name
|
||||
order: ASC
|
||||
views: *views
|
||||
defaultCallback:
|
||||
eval: |
|
||||
//js
|
||||
(entry) => {
|
||||
parent.selectEntry(entry)
|
||||
}
|
||||
//!js
|
||||
|
||||
permissions:
|
||||
public:
|
||||
methods:
|
||||
get: false
|
||||
post: false
|
||||
put: false
|
||||
delete: false
|
||||
user:
|
||||
methods:
|
||||
get: true
|
||||
post: true
|
||||
put: true
|
||||
delete: true
|
||||
|
||||
fields:
|
||||
- name: name
|
||||
type: string
|
||||
meta:
|
||||
label:
|
||||
de: Name
|
||||
en: Name
|
||||
@@ -20,20 +20,7 @@ meta:
|
||||
|
||||
collections:
|
||||
- !include collections/contact.yml
|
||||
- !include collections/banner.yml
|
||||
- !include collections/content.yml
|
||||
- !include collections/medialib.yml
|
||||
- !include collections/navigation.yml
|
||||
- !include collections/tag.yml
|
||||
- !include collections/action.yml
|
||||
- !include collections/module.yml
|
||||
- !include collections/ssr.yml
|
||||
- !include collections/lighthouseSubpath.yml
|
||||
- !include collections/lighthouse.yml
|
||||
- !include collections/backups.yml
|
||||
|
||||
jobs:
|
||||
- !include jobs/lighthouse.yml
|
||||
assets:
|
||||
- !include assets/logo.yml
|
||||
- !include assets/dist.yml
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
const { frontendBase, jwtSecret, logoPath, noReplyEmail, operatorEmail, serverBaseURL } = require("../config")
|
||||
const { getCustomerById } = require("../lib/bigcommerceRestAPI")
|
||||
const { createNewsletterSubscriber, checkIfNewsletterSubscriber } = require("../lib/omnisendRestApi")
|
||||
const { cryptchaCheck } = require("../lib/utils")
|
||||
;(function () {
|
||||
const operation = context.data.operation
|
||||
if (operation === "requestPasswordReset") {
|
||||
cryptchaCheck()
|
||||
requestPasswordReset()
|
||||
} else if (operation === "checkUsernameTaken") {
|
||||
const username = context.data.username
|
||||
const user = context.db.find("bigCommerceCustomer", {
|
||||
filter: { username: username.toLowerCase() },
|
||||
})[0]
|
||||
|
||||
throw {
|
||||
status: 200,
|
||||
data: !!user,
|
||||
}
|
||||
} else if (operation === "reportRecord") {
|
||||
const customerId = context.data.customerId
|
||||
if (!customerId) {
|
||||
throw {
|
||||
status: 400,
|
||||
message: "customerId is required",
|
||||
}
|
||||
}
|
||||
const recordTitle = context.data.record
|
||||
|
||||
context.smtp.sendMail({
|
||||
to: operatorEmail,
|
||||
from: noReplyEmail,
|
||||
fromName: "BinKrassDuFass",
|
||||
replyTo: noReplyEmail,
|
||||
subject: "Record Reported",
|
||||
plain: "Record reported, customer ID: " + customerId + ", record: " + recordTitle,
|
||||
})
|
||||
throw {
|
||||
status: 200,
|
||||
message: "Record reported",
|
||||
}
|
||||
} else if (operation === "subscribeToNewsletter") {
|
||||
if (!context.data.email) {
|
||||
throw {
|
||||
status: 400,
|
||||
message: "Email is required",
|
||||
}
|
||||
}
|
||||
createNewsletterSubscriber(context.data.email?.toLowerCase())
|
||||
throw {
|
||||
status: 200,
|
||||
message: "Newsletter subscriber created",
|
||||
}
|
||||
} else if (operation === "checkIfNewsletterSubscriber") {
|
||||
const email = context.data.email
|
||||
const isSubscriber = checkIfNewsletterSubscriber(email.toLowerCase())
|
||||
throw {
|
||||
status: 200,
|
||||
data: isSubscriber,
|
||||
}
|
||||
}
|
||||
})()
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} tibiId
|
||||
* @param {string} bigCommerceId
|
||||
* @param {string} key
|
||||
* @returns {string}
|
||||
*/
|
||||
function buildPwResetToken(tibiId, bigCommerceId, key) {
|
||||
return context.jwt.create(
|
||||
{
|
||||
tibiId: tibiId,
|
||||
bigCommerceId: bigCommerceId,
|
||||
check: key,
|
||||
},
|
||||
{
|
||||
secret: jwtSecret,
|
||||
validityDuration: 60 * 60 * 24 * 90, // 90 days
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
function requestPasswordReset() {
|
||||
const random256BitString = Math.random().toString(36).substring(2, 34)
|
||||
const email = context.data.email
|
||||
if (!email) {
|
||||
throw {
|
||||
status: 400,
|
||||
message: "Email is required",
|
||||
}
|
||||
}
|
||||
let customer = context.db.find("bigCommerceCustomer", {
|
||||
filter: { email: email?.toLowerCase() },
|
||||
})[0]
|
||||
if (!customer) {
|
||||
const customerBigCommerce = getCustomerById(null, email)
|
||||
if (!customerBigCommerce) {
|
||||
throw {
|
||||
status: 404,
|
||||
message: "Customer not found",
|
||||
}
|
||||
}
|
||||
const username = customerBigCommerce.form_fields.find((field) => field.name === "username")?.value
|
||||
customer = context.db.create("bigCommerceCustomer", {
|
||||
bigCommerceId: customerBigCommerce.id,
|
||||
email: customerBigCommerce.email.toLowerCase(),
|
||||
username: username ? username?.toLowerCase() : Math.random().toString(36).substring(2, 15),
|
||||
})
|
||||
}
|
||||
|
||||
const pwResetToken = buildPwResetToken(customer.id, customer.bigCommerceId, random256BitString)
|
||||
const store = {
|
||||
logo: `${serverBaseURL}${logoPath}`,
|
||||
frontendBase,
|
||||
pwReset: `${frontendBase}profile/reset-password?token=${pwResetToken}`,
|
||||
}
|
||||
const html = context.tpl.execute(context.fs.readFile("templates/requestPWReset.html"), {
|
||||
store,
|
||||
})
|
||||
|
||||
context.smtp.sendMail({
|
||||
to: email,
|
||||
from: operatorEmail,
|
||||
fromName: "BinKrassDuFass",
|
||||
replyTo: noReplyEmail,
|
||||
subject: "Passwort Zurücksetzen",
|
||||
html,
|
||||
})
|
||||
context.db.update("bigCommerceCustomer", customer.id, {
|
||||
currentToken: random256BitString,
|
||||
})
|
||||
throw {
|
||||
status: 200,
|
||||
message: "Password reset email sent",
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
const { validateFields } = require("./validateFields")
|
||||
;(function () {
|
||||
if (context?.data?.formular?.honey) {
|
||||
throw { status: 400, error: "Bot detection" }
|
||||
}
|
||||
delete context.data.formular.honey
|
||||
/**
|
||||
* @type {Array<[string, FormObj]>}
|
||||
*/
|
||||
let values = Object.entries(context?.data?.formular)
|
||||
let validation = validateFields(values)
|
||||
if (validation.length) {
|
||||
throw { status: 400, error: validation }
|
||||
}
|
||||
})()
|
||||
@@ -1,79 +0,0 @@
|
||||
;(function () {
|
||||
/** @type {FormObj} */
|
||||
let formular = context?.data?.formular
|
||||
|
||||
/** @type {TempFormBefore | TempFormAfter} */
|
||||
let tempForm = {}
|
||||
|
||||
let formTitle = `${formular.formTitle}`
|
||||
delete formular.formTitle
|
||||
delete formular["agreement"]
|
||||
delete formular["honey"]
|
||||
|
||||
formular?.formRows?.forEach(
|
||||
/** @param {string} rowName */
|
||||
(rowName) => {
|
||||
tempForm[rowName] = {}
|
||||
}
|
||||
)
|
||||
|
||||
/**
|
||||
* @param {[string, any]} e
|
||||
* @returns {any}
|
||||
*/
|
||||
let getValue = (e) => {
|
||||
if (e[0].includes("numberLabel")) return e[1][0]
|
||||
return e[1]
|
||||
}
|
||||
|
||||
/** @type {TempFormIndices} */
|
||||
let indices = {}
|
||||
|
||||
Object.entries(formular).forEach((e) => {
|
||||
if (e[0] === "formRows") return
|
||||
|
||||
let key = e[0].split("_")
|
||||
let newKey = key[key.length - 1]
|
||||
|
||||
// @ts-ignore
|
||||
let rowName = formular?.formRows[Number(key[key.length - 2])]
|
||||
let index = isNaN(Number(key[key.length - 3])) ? 100 : Number(key[key.length - 3])
|
||||
|
||||
if (!rowName) return
|
||||
if (!tempForm[rowName]) tempForm[rowName] = {}
|
||||
|
||||
// @ts-ignore
|
||||
if (tempForm[rowName][newKey]) {
|
||||
// @ts-ignore
|
||||
tempForm[rowName][newKey][0] += "\\" + getValue(e)
|
||||
} else {
|
||||
// @ts-ignore
|
||||
tempForm[rowName][newKey] = [getValue(e), newKey[0] === "n", newKey.includes("invalid")]
|
||||
indices[rowName] = { ...indices[rowName], [newKey]: index }
|
||||
}
|
||||
})
|
||||
|
||||
// Now iterate over tempForm to sort fields in each row
|
||||
Object.entries(tempForm).forEach(([rowName, fields]) => {
|
||||
tempForm[rowName] = Object.entries(fields)
|
||||
.sort((a, b) => indices[rowName][a[0]] - indices[rowName][b[0]])
|
||||
.reduce((acc, [key, val]) => ({ ...acc, [key]: val }), {})
|
||||
})
|
||||
|
||||
Object.keys(tempForm).forEach((row) => {
|
||||
tempForm[row] = Object.entries(tempForm[row])
|
||||
})
|
||||
|
||||
// @ts-ignore
|
||||
delete tempForm[undefined]
|
||||
context.smtp.sendMail({
|
||||
to: "allkids.erfurt@gmail.com",
|
||||
from: "mail@webmakers.de",
|
||||
subject: "AllKids " + formTitle,
|
||||
html: context.tpl.execute(context.fs.readFile("templates/form_mail.html"), {
|
||||
context: context,
|
||||
formularRows: Object.entries(tempForm),
|
||||
formTitle: formTitle,
|
||||
}),
|
||||
})
|
||||
})()
|
||||
@@ -1,80 +0,0 @@
|
||||
/**
|
||||
* @param {Array<[string, FormObj]>} fieldsArray
|
||||
* @returns {(string | (() => void))[][]}
|
||||
*/
|
||||
function validateFields(fieldsArray) {
|
||||
/**@type {(string | (() => void))[][]} */
|
||||
const errors = []
|
||||
/**@type {number} */
|
||||
let selectedGroup
|
||||
|
||||
const numberRegex = /^[+]?([.]\d+|\d+([.]\d+)?)$/
|
||||
const emailRegex =
|
||||
/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/
|
||||
const dateRegex = /^\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$/
|
||||
const timeRegex = /^\d{1,2}:\d{2}-\d{1,2}:\d{2}$/
|
||||
const phoneRegex = /^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$/
|
||||
|
||||
const wholeBlockInvalid = () => {
|
||||
const blockContainer = document.getElementsByClassName("blockContainer")[0]
|
||||
blockContainer.classList.add("invalidBlocks")
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} value
|
||||
* @param {any} field
|
||||
* @param {HTMLElement} element
|
||||
*/
|
||||
const validateNumber = (value, field, element) => {
|
||||
if (!numberRegex.test(`${value}`)) {
|
||||
errors.push(["block", () => element.classList.add("border-red")])
|
||||
}
|
||||
}
|
||||
|
||||
fieldsArray.forEach(([field, value]) => {
|
||||
if (field === "blockGroups" || field.includes("numberLabel")) {
|
||||
if (!field.includes("numberLabel")) return
|
||||
// @ts-ignore
|
||||
const [elementValue, element, group] = value
|
||||
|
||||
if (!elementValue) return
|
||||
|
||||
if (selectedGroup !== undefined) {
|
||||
if (group !== selectedGroup) {
|
||||
errors.push(["block", wholeBlockInvalid])
|
||||
} else {
|
||||
validateNumber(elementValue, field, element)
|
||||
}
|
||||
} else {
|
||||
selectedGroup = group
|
||||
validateNumber(elementValue, field, element)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
errors.push(["Eingabe ist erforderlich.", field])
|
||||
} else if (field.includes("number_")) {
|
||||
if (!numberRegex.test(`${value}`)) {
|
||||
errors.push(["Ungültiger numerischer Wert.", field])
|
||||
}
|
||||
} else if (field.includes("agreement_")) {
|
||||
if (value !== true) errors.push(["Bitte das Kontrollkästchen anklicken.", field])
|
||||
} else if (field.includes("Email_")) {
|
||||
if (!emailRegex.test(value)) errors.push(["Ungültiges E-Mail-Format.", field])
|
||||
} else if (field.includes("date_")) {
|
||||
if (!dateRegex.test(value)) errors.push(["Ungültiges Datumsformat.", field])
|
||||
} else if (field.includes("times_")) {
|
||||
if (!timeRegex.test(value)) errors.push(["Ungültiges Zeitformat.", field])
|
||||
} else if (field.includes("Telefon_")) {
|
||||
if (!phoneRegex.test(value)) errors.push(["Ungültiges Telefonnummernformat.", field])
|
||||
}
|
||||
})
|
||||
|
||||
return errors
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
validateFields,
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
var { setUpQuery, calculateAverageDynamically, run } = require("../lib/utils")
|
||||
;(function () {
|
||||
let subPaths = context.db.find("lighthouseSubpath")
|
||||
let urls = []
|
||||
for (let i = 0; i < subPaths.length; i++) {
|
||||
urls.push(setUpQuery(subPaths[i].lighthouseSubpath))
|
||||
}
|
||||
let dbObjs = []
|
||||
urls.forEach((url) => {
|
||||
console.log("URL:", url)
|
||||
dbObjs.push(run(url))
|
||||
})
|
||||
let dbObject = calculateAverageDynamically(dbObjs)
|
||||
dbObject.analyzedPaths = [...subPaths].map((subPath) => subPath.lighthouseSubpath)
|
||||
return { data: dbObject }
|
||||
})()
|
||||
@@ -1,160 +0,0 @@
|
||||
const { jwtSecret, jwtValidityDuration } = require("../config")
|
||||
const { validateCredentials, getCustomerById } = require("../lib/bigcommerceRestAPI")
|
||||
const { getRefreshToken, createTibiCustomer } = require("../lib/utils")
|
||||
|
||||
;(function () {
|
||||
function deleteRefreshTokenCookie() {
|
||||
context.cookie.set("bkdfRefreshToken", "", {
|
||||
maxAge: -1,
|
||||
httpOnly: true,
|
||||
path: "/api",
|
||||
})
|
||||
}
|
||||
|
||||
if (context.request().query("logout")) {
|
||||
deleteRefreshTokenCookie()
|
||||
throw {
|
||||
status: 200,
|
||||
message: "ok",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
context.data.email = context?.data?.email?.toLowerCase()
|
||||
const { email, password } = context.data
|
||||
let bigCommerceId
|
||||
|
||||
if (!email || !password) {
|
||||
const rT = getRefreshToken()
|
||||
console.log(JSON.stringify(rT), "refreshtoken")
|
||||
|
||||
if (rT) {
|
||||
/** @type {JWTRefreshClaims} */ // @ts-ignore
|
||||
const refreshClaims = rT.claims
|
||||
|
||||
if (!rT.valid) {
|
||||
throw {
|
||||
status: 403,
|
||||
error: "token: " + rT.error,
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
|
||||
bigCommerceId = refreshClaims && refreshClaims.bigCommerceId
|
||||
if (!bigCommerceId) {
|
||||
deleteRefreshTokenCookie()
|
||||
throw {
|
||||
status: 403,
|
||||
error: "token: inavlid claims",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
deleteRefreshTokenCookie()
|
||||
throw {
|
||||
status: 403,
|
||||
error: "missing email and/or password",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** @type {Customer[]} */ // @ts-ignore
|
||||
let [customer] = context.db.find("bigCommerceCustomer", {
|
||||
filter: bigCommerceId
|
||||
? { bigCommerceId }
|
||||
: {
|
||||
email,
|
||||
},
|
||||
})
|
||||
|
||||
if (!customer) {
|
||||
if (!bigCommerceId && email) {
|
||||
const customerByEmail = getCustomerById(undefined, email, true)
|
||||
if (customerByEmail) {
|
||||
createTibiCustomer(customerByEmail)
|
||||
;[customer] = context.db.find("bigCommerceCustomer", {
|
||||
filter: bigCommerceId
|
||||
? { bigCommerceId }
|
||||
: {
|
||||
email,
|
||||
},
|
||||
})
|
||||
} else {
|
||||
deleteRefreshTokenCookie()
|
||||
throw {
|
||||
status: 403,
|
||||
error: "login failed",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
deleteRefreshTokenCookie()
|
||||
throw {
|
||||
status: 403,
|
||||
error: "login failed",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!bigCommerceId) {
|
||||
// login via username/password
|
||||
const validate = validateCredentials(email, password)
|
||||
const passwordOK = validate.is_valid
|
||||
if (!passwordOK) {
|
||||
deleteRefreshTokenCookie()
|
||||
throw {
|
||||
status: 403,
|
||||
error: "login failed",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (customer.locked) {
|
||||
deleteRefreshTokenCookie()
|
||||
throw {
|
||||
status: 403,
|
||||
error: "customer locked",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
|
||||
/** @type {JWTLoginClaims} */
|
||||
const loginClaims = {
|
||||
tibiId: customer.id,
|
||||
bigCommerceId: customer.bigCommerceId,
|
||||
email: customer.email,
|
||||
}
|
||||
|
||||
const token = context.jwt.create(loginClaims, {
|
||||
secret: jwtSecret,
|
||||
validityDuration: jwtValidityDuration,
|
||||
})
|
||||
|
||||
const refreshTokenMaxAge = 60 * 60 * 24 // 24h
|
||||
/** @type {JWTRefreshClaims} */
|
||||
const refreshClaims = {
|
||||
tibiId: customer.id,
|
||||
bigCommerceId: customer.bigCommerceId,
|
||||
r: 1,
|
||||
}
|
||||
const nextRefreshToken = context.jwt.create(refreshClaims, {
|
||||
secret: jwtSecret,
|
||||
validityDuration: refreshTokenMaxAge,
|
||||
})
|
||||
|
||||
context.cookie.set("bkdfRefreshToken", nextRefreshToken, {
|
||||
maxAge: refreshTokenMaxAge - 60 * 60, // 1h earlier expire
|
||||
httpOnly: true,
|
||||
path: "/api",
|
||||
})
|
||||
|
||||
throw {
|
||||
status: 200,
|
||||
customer,
|
||||
created: new Date(),
|
||||
token,
|
||||
log: false,
|
||||
}
|
||||
})()
|
||||
@@ -1,25 +0,0 @@
|
||||
const { withAccount } = require("../lib/utils")
|
||||
;(function () {
|
||||
if (context.user.auth()) return {}
|
||||
withAccount((login) => {
|
||||
const id = context.request().param("id")
|
||||
const user = context.db.find("bigCommerceCustomer", {
|
||||
filter: {
|
||||
$or: [
|
||||
{
|
||||
"personalRecords.recording": id,
|
||||
},
|
||||
{
|
||||
"personalRecords.thumbnail": id,
|
||||
},
|
||||
],
|
||||
},
|
||||
})[0]
|
||||
if (login.tibiId !== user.id) {
|
||||
return {
|
||||
status: 403,
|
||||
message: "You are not authorized to delete this media",
|
||||
}
|
||||
}
|
||||
})
|
||||
})()
|
||||
@@ -1,205 +0,0 @@
|
||||
const utils = require("../lib/utils")
|
||||
|
||||
const { release } = require("../config-client")
|
||||
|
||||
const { ssrValidatePath } = require("../config")
|
||||
const { ssrRequest, ssrRequestBigCommerce } = require("../lib/ssr-server")
|
||||
;(function () {
|
||||
var request = context.request()
|
||||
|
||||
var trackingCall = request.header("x-ssr-skip")
|
||||
if (trackingCall) {
|
||||
// skip tracking
|
||||
// no cache header
|
||||
context.response.header("Cache-Control", "no-cache, no-store, must-revalidate")
|
||||
throw {
|
||||
status: parseInt(trackingCall),
|
||||
html: "",
|
||||
log: false,
|
||||
}
|
||||
}
|
||||
|
||||
let url = request.query("url") || request.header("x-ssr-url") || "/"
|
||||
const noCache = request.query("noCache")
|
||||
|
||||
const trace_id = context.debug.sentryTraceId()
|
||||
/**
|
||||
* @param {string} content
|
||||
*/
|
||||
function addSentryTrace(content) {
|
||||
return content.replace("</head>", '<meta name="sentry-trace" content="' + trace_id + '" /></head>')
|
||||
}
|
||||
|
||||
context.response.header("sentry-trace", trace_id)
|
||||
const auth = context.user.auth()
|
||||
if (auth && auth.role == 0) {
|
||||
} else if (url) {
|
||||
/** @type {Date} */ // @ts-ignore
|
||||
context.ssrCacheValidUntil = null
|
||||
|
||||
var comment = ""
|
||||
|
||||
url = url.split("?")[0]
|
||||
comment += "url: " + url
|
||||
|
||||
if (url && url.length > 1) {
|
||||
url = url.replace(/\/$/, "")
|
||||
}
|
||||
if (url == "/index" || !url) {
|
||||
url = "/" // see .htaccess
|
||||
}
|
||||
|
||||
function useCache(/** @type {string} */ _url) {
|
||||
var cache =
|
||||
!noCache &&
|
||||
context.db.find("ssr", {
|
||||
filter: {
|
||||
path: _url,
|
||||
},
|
||||
})
|
||||
|
||||
if (cache && cache.length) {
|
||||
// check that entry is still allowed to be published
|
||||
const validUntil = cache[0].validUntil ? new Date(cache[0].validUntil.unixMilli()) : null
|
||||
|
||||
if (!validUntil || validUntil > new Date()) {
|
||||
// use cache
|
||||
context.response.header("X-SSR-Cache", "true")
|
||||
throw {
|
||||
status: 200,
|
||||
log: false,
|
||||
html: addSentryTrace(cache[0].content),
|
||||
}
|
||||
} else {
|
||||
// cache is invalid, delete it
|
||||
context.response.header("X-SSR-Cache", "invalid")
|
||||
context.db.delete("ssr", cache[0].id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// validate url
|
||||
var status = 200
|
||||
|
||||
var pNorender = false
|
||||
var pNotfound = false
|
||||
|
||||
const pR = ssrValidatePath(url)
|
||||
if (pR === -1) {
|
||||
// pNotfound = true
|
||||
// comment += ", notFound"
|
||||
} else if (!pR) {
|
||||
pNorender = true
|
||||
comment += ", noRender"
|
||||
} else if (typeof pR === "string") {
|
||||
url = pR
|
||||
comment += ", cache url: " + url
|
||||
}
|
||||
|
||||
if (noCache) {
|
||||
comment += ", noCache"
|
||||
}
|
||||
|
||||
if (!pNorender && !pNotfound) {
|
||||
// check if we have a cache
|
||||
useCache(url)
|
||||
}
|
||||
|
||||
let head = ""
|
||||
let html = ""
|
||||
let error = ""
|
||||
|
||||
comment += ", path: " + url
|
||||
|
||||
var cacheIt = false
|
||||
if (pNorender) {
|
||||
html = "<!-- NO SSR RENDERING -->"
|
||||
} else if (pNotfound) {
|
||||
status = 404
|
||||
html = "404 NOT FOUND"
|
||||
} else {
|
||||
// @ts-ignore
|
||||
context.ssrCache = {}
|
||||
// @ts-ignore
|
||||
context.ssrRequest = ssrRequest
|
||||
// @ts-ignore
|
||||
context.ssrRequestBigCommerce = ssrRequestBigCommerce
|
||||
|
||||
try {
|
||||
// if error, output plain html without prerendering
|
||||
// @ts-ignore
|
||||
const app = require("../lib/app.server")
|
||||
|
||||
const rendered = app.default.render({
|
||||
url: url,
|
||||
})
|
||||
head = rendered.head
|
||||
html = rendered.html
|
||||
|
||||
head +=
|
||||
"\n\n" +
|
||||
"<script>window.__SSR_CACHE__ = " +
|
||||
// @ts-ignore
|
||||
JSON.stringify(context.ssrCache) +
|
||||
"</script>"
|
||||
|
||||
// status from webapp
|
||||
// @ts-ignore
|
||||
if (context.is404) {
|
||||
status = 404
|
||||
} else {
|
||||
cacheIt = true
|
||||
}
|
||||
} catch (/** @type {any} */ e) {
|
||||
utils.log(e.message)
|
||||
utils.log(e.stack)
|
||||
error = "error: " + e.message + "\n\n" + e.stack
|
||||
|
||||
// utils.log(e)
|
||||
// for (var property in e) {
|
||||
// utils.log(property + ": " + e[property])
|
||||
// }
|
||||
// error = JSON.stringify(e)
|
||||
}
|
||||
}
|
||||
|
||||
var tpl = context.fs.readFile("templates/spa.html")
|
||||
tpl = tpl.replace("<!--HEAD-->", head)
|
||||
tpl = tpl.replace("<!--HTML-->", html)
|
||||
tpl = tpl.replace("<!--SSR.ERROR-->", error ? "<!--" + error + "-->" : "")
|
||||
tpl = tpl.replace("<!--SSR.COMMENT-->", comment ? "<!--" + comment + "-->" : "")
|
||||
|
||||
if (cacheIt && !noCache) {
|
||||
// save cache
|
||||
const existing = context.db.find("ssr", {
|
||||
filter: {
|
||||
path: url,
|
||||
},
|
||||
})
|
||||
if (existing && existing.length) {
|
||||
context.db.delete("ssr", existing[0].id)
|
||||
}
|
||||
|
||||
context.db.create("ssr", {
|
||||
path: url,
|
||||
content: tpl,
|
||||
// @ts-ignore
|
||||
validUntil: context.ssrCacheValidUntil,
|
||||
})
|
||||
}
|
||||
|
||||
throw {
|
||||
status: status,
|
||||
log: false,
|
||||
html: addSentryTrace(tpl),
|
||||
}
|
||||
} else {
|
||||
// only admins are allowed
|
||||
throw {
|
||||
status: 403,
|
||||
message: "invalid auth",
|
||||
auth: auth,
|
||||
release: release,
|
||||
}
|
||||
}
|
||||
})()
|
||||
@@ -1,25 +0,0 @@
|
||||
const { release } = require("../config-client")
|
||||
var utils = require("../lib/utils")
|
||||
|
||||
;(function () {
|
||||
if (context.request().query("clear")) {
|
||||
console.log("CLEARING SSR CACHE")
|
||||
var removed = utils.clearSSRCache()
|
||||
var stats = {
|
||||
status: 200,
|
||||
message: "ok",
|
||||
removed: removed,
|
||||
release: release,
|
||||
}
|
||||
|
||||
utils.log(stats)
|
||||
|
||||
throw stats
|
||||
}
|
||||
|
||||
throw {
|
||||
status: 500,
|
||||
message: "ssr is only a dummy collection",
|
||||
release: release,
|
||||
}
|
||||
})()
|
||||
@@ -1,25 +0,0 @@
|
||||
const { bigcommerceApiOAuth, serverBaseURL, bigcommerceStoreHash } = require("../config.js")
|
||||
const { deletePrintfulWebhook } = require("../lib/printfulRestAPI.js")
|
||||
;(function () {
|
||||
const data = context.data
|
||||
if (context?.user?.auth()?.id) {
|
||||
const webhook = context.db.find("webhook", {
|
||||
filter: {
|
||||
_id: context.request().param("id"),
|
||||
},
|
||||
})[0]
|
||||
|
||||
if (webhook.type === "printful") {
|
||||
deletePrintfulWebhook(webhook.scope)
|
||||
} else {
|
||||
let url = `https://api.bigcommerce.com/stores/${bigcommerceStoreHash}/v3/hooks/${webhook.webhookId}`
|
||||
|
||||
let options = {
|
||||
method: "DELETE",
|
||||
headers: { "Content-Type": "application/json", "X-Auth-Token": bigcommerceApiOAuth },
|
||||
}
|
||||
|
||||
const response = context.http.fetch(url, options).body.json()
|
||||
}
|
||||
}
|
||||
})()
|
||||
@@ -1,266 +0,0 @@
|
||||
const { bigcommerceApiOAuth, serverBaseURL, bigcommerceStoreHash } = require("../config.js")
|
||||
let { clearSSRCache, createTibiCustomer, updateTibiCustomer } = require("../lib/utils")
|
||||
const {
|
||||
getProductImages,
|
||||
getOrderProductsById,
|
||||
getProductById,
|
||||
getCustomerById,
|
||||
getOrderById,
|
||||
createInternalOrderObject,
|
||||
} = require("../lib/bigcommerceRestAPI.js")
|
||||
const { createPrintfulWebhook, getPrintfulOrderShipments } = require("../lib/printfulRestAPI.js")
|
||||
const { postPurchase } = require("../lib/facebookRestAPI.js")
|
||||
;(function () {
|
||||
const data = context.data
|
||||
if (context?.user?.auth()?.id) {
|
||||
if (context.data.type === "printful") {
|
||||
createPrintfulWebhook(context.data.scope)
|
||||
return
|
||||
} else {
|
||||
let url = `https://api.bigcommerce.com/stores/${bigcommerceStoreHash}/v3/hooks`
|
||||
|
||||
let options = {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json", "X-Auth-Token": bigcommerceApiOAuth },
|
||||
body: JSON.stringify({
|
||||
scope: context?.data?.scope,
|
||||
destination: `${serverBaseURL}webhook`,
|
||||
is_active: context?.data?.active,
|
||||
events_history_enabled: true,
|
||||
headers: { token: "super_secure_and_extremely_secret_big_commerce_webhook_token_123" },
|
||||
}),
|
||||
}
|
||||
|
||||
const response = context.http.fetch(url, options).body.json()
|
||||
const hookResponse = {
|
||||
data: context.data,
|
||||
}
|
||||
// @ts-ignore
|
||||
hookResponse.data.webhookId = response.data.id
|
||||
return hookResponse
|
||||
}
|
||||
}
|
||||
if (data) {
|
||||
if (data?.type === "order_updated") {
|
||||
const bigCommerceOrderId = data?.data?.order?.external_id
|
||||
const order = context.db.find("bigCommerceOrder", {
|
||||
filter: {
|
||||
bigCommerceId: Number(bigCommerceOrderId),
|
||||
},
|
||||
})[0]
|
||||
if (order) {
|
||||
context.db.update("bigCommerceOrder", order.id, {
|
||||
status: data?.data?.order?.status,
|
||||
statusSetAt: new Date().toISOString(),
|
||||
})
|
||||
}
|
||||
throw {
|
||||
status: 200,
|
||||
data: {
|
||||
message: "",
|
||||
},
|
||||
}
|
||||
} else if (data?.type == "shipment_sent") {
|
||||
const bigCommerceOrderId = data?.data?.order?.external_id
|
||||
|
||||
const printfulOrderShipments = getPrintfulOrderShipments(Number(bigCommerceOrderId))
|
||||
|
||||
const order = context.db.find("bigCommerceOrder", {
|
||||
filter: {
|
||||
bigCommerceId: Number(bigCommerceOrderId),
|
||||
},
|
||||
})[0]
|
||||
if (order) {
|
||||
context.db.update("bigCommerceOrder", order.id, {
|
||||
shipments: (printfulOrderShipments || []).map((shipped) => {
|
||||
return {
|
||||
trackingUrl: shipped.tracking_url,
|
||||
trackingNumber: data?.data?.shipment?.tracking_number,
|
||||
carrier: shipped.carrier,
|
||||
sentAt: new Date(),
|
||||
}
|
||||
}),
|
||||
})
|
||||
}
|
||||
throw {
|
||||
status: 200,
|
||||
data: {
|
||||
message: "",
|
||||
},
|
||||
}
|
||||
} else if (data?.scope?.includes("product")) {
|
||||
if (data.scope.includes("product/deleted")) {
|
||||
handleProductDeleted(data.data.id)
|
||||
clearSSRCache()
|
||||
} else {
|
||||
const product = getProductById(data?.data?.id)
|
||||
const productImage = getProductImages(data?.data?.id)
|
||||
|
||||
if (data.scope.includes("product/created") && product?.id) {
|
||||
handleProductCreateOrUpdate(product, productImage)
|
||||
}
|
||||
if (data.scope.includes("product/updated") && product?.id) {
|
||||
handleProductCreateOrUpdate(product, productImage)
|
||||
}
|
||||
clearSSRCache()
|
||||
}
|
||||
throw {
|
||||
status: 200,
|
||||
data: {
|
||||
message: "",
|
||||
},
|
||||
}
|
||||
} else if (data?.scope?.includes("order")) {
|
||||
if (data.scope.includes("order/statusUpdated")) {
|
||||
if (data.data.status.new_status_id == 11) {
|
||||
const internalOrderReference = createInternalOrderObject(data.data.id)
|
||||
// make sure the order doesn't already exist
|
||||
const orderExists = context.db.find("bigCommerceOrder", {
|
||||
filter: {
|
||||
bigCommerceId: Number(data.data.id),
|
||||
},
|
||||
})
|
||||
if (!orderExists.length) context.db.create("bigCommerceOrder", internalOrderReference)
|
||||
else context.db.update("bigCommerceOrder", orderExists[0].id, internalOrderReference)
|
||||
/*
|
||||
not necessary for now, as bigcommerce itself takes care of it
|
||||
try {
|
||||
if (!orderExists) {
|
||||
postPurchase(internalOrderReference.cost.replace(",", "."))
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}*/
|
||||
} else {
|
||||
const order = context.db.find("bigCommerceOrder", {
|
||||
filter: {
|
||||
bigCommerceId: data.data.id,
|
||||
},
|
||||
})[0]
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {any} orderStatus
|
||||
* @returns {PrintfulStates | false}
|
||||
*/
|
||||
function mapOrderStatusToPrintful(orderStatus) {
|
||||
switch (orderStatus.new_status_id) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 7:
|
||||
case 11:
|
||||
return "draft" // Unvollständig
|
||||
case 6:
|
||||
return "failed" // Abgelehnt
|
||||
case 10:
|
||||
return "fulfilled" // Versandt, Versand ausstehend, Abgeschlossen
|
||||
case 3:
|
||||
return "partial" // Teilweise Versandt, Teilweise erstattet
|
||||
case 12:
|
||||
case 13:
|
||||
return "onhold" // Manuelle Überprüfung erforderlich, Umstritten (closest match)
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
if (order && mapOrderStatusToPrintful(data.data.status) !== false) {
|
||||
context.db.update("bigCommerceOrder", order.id, {
|
||||
status: mapOrderStatusToPrintful(data.data.status),
|
||||
statusSetAt: new Date().toISOString(),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
throw {
|
||||
status: 200,
|
||||
data: {
|
||||
message: "",
|
||||
},
|
||||
}
|
||||
} else if (data?.scope?.includes("customer")) {
|
||||
let internalCustomer
|
||||
if (data.data?.id)
|
||||
/** @type {Customer} */
|
||||
internalCustomer =
|
||||
context.db.find("bigCommerceCustomer", {
|
||||
filter: {
|
||||
bigCommerceId: data.data.id,
|
||||
},
|
||||
})?.[0] || null
|
||||
|
||||
if (data.scope.includes("customer/deleted") && !!internalCustomer) {
|
||||
context.db.delete("bigCommerceCustomer", internalCustomer.id)
|
||||
} else {
|
||||
const customer = getCustomerById(data?.data?.id)
|
||||
|
||||
if (!internalCustomer && customer?.id) {
|
||||
createTibiCustomer(customer)
|
||||
} else if (data.scope.includes("customer/updated") && !!internalCustomer) {
|
||||
updateTibiCustomer(customer, internalCustomer)
|
||||
}
|
||||
}
|
||||
throw {
|
||||
status: 200,
|
||||
data: {
|
||||
message: "",
|
||||
},
|
||||
}
|
||||
} else
|
||||
throw {
|
||||
status: 403,
|
||||
error: "Forbidden",
|
||||
}
|
||||
} else
|
||||
throw {
|
||||
status: 403,
|
||||
error: "Forbidden",
|
||||
}
|
||||
})()
|
||||
|
||||
/**
|
||||
* Handles both product creation and update by checking if the product exists and then
|
||||
* creating or updating the record accordingly.
|
||||
*
|
||||
* @param {V2OrderProductsResponseBase} [product] The product data.
|
||||
* @param { ProductImage[]} [productImage] The product image data.
|
||||
*/
|
||||
function handleProductCreateOrUpdate(product, productImage) {
|
||||
const internalProduct =
|
||||
context.db.find("bigCommerceProduct", {
|
||||
filter: {
|
||||
bigCommerceId: Number(product?.id),
|
||||
},
|
||||
})?.[0] || null
|
||||
if (internalProduct) {
|
||||
// If the product exists, update it.
|
||||
context.db.update("bigCommerceProduct", internalProduct.id || "", {
|
||||
productName: product?.name_customer || product?.name,
|
||||
bigCommerceSKU: product?.sku,
|
||||
previewImage: productImage?.[0]?.url_thumbnail,
|
||||
bigCommerceId: Number(product?.id),
|
||||
})
|
||||
} else {
|
||||
// If the product does not exist, create it.
|
||||
context.db.create("bigCommerceProduct", {
|
||||
productName: product?.name_customer || product?.name,
|
||||
bigCommerceSKU: product?.sku,
|
||||
previewImage: productImage?.[0]?.url_thumbnail,
|
||||
bigCommerceId: Number(product?.id),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles product deletion by removing the product record if it exists.
|
||||
* @param { V2OrderProductsResponseBase } [id] The product data to delete.
|
||||
*/
|
||||
function handleProductDeleted(id) {
|
||||
const internalProduct = context.db.find("bigCommerceProduct", {
|
||||
filter: {
|
||||
bigCommerceId: Number(id),
|
||||
},
|
||||
})[0]
|
||||
if (internalProduct) {
|
||||
context.db.delete("bigCommerceProduct", internalProduct.id || "")
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
const { bigcommerceApiOAuth, serverBaseURL, bigcommerceStoreHash } = require("../config.js")
|
||||
;(function () {
|
||||
const data = context.data
|
||||
if (context?.user?.auth()?.id) {
|
||||
if (context.data.type === "printful") {
|
||||
throw {
|
||||
status: 500,
|
||||
message: "Printful webhooks update are not supported",
|
||||
}
|
||||
} else {
|
||||
let url = `https://api.bigcommerce.com/stores/${bigcommerceStoreHash}/v3/hooks/${context.data.webhookId}`
|
||||
|
||||
let options = {
|
||||
method: "PUT",
|
||||
headers: { "Content-Type": "application/json", "X-Auth-Token": bigcommerceApiOAuth },
|
||||
body: JSON.stringify({
|
||||
scope: context?.data?.scope,
|
||||
destination: `${serverBaseURL}webhook`,
|
||||
is_active: context?.data?.active,
|
||||
events_history_enabled: true,
|
||||
headers: { token: "super_secure_and_extremely_secret_big_commerce_webhook_token_123" },
|
||||
}),
|
||||
}
|
||||
|
||||
const response = context.http.fetch(url, options).body.json()
|
||||
}
|
||||
}
|
||||
})()
|
||||
@@ -1,16 +0,0 @@
|
||||
var { setUpQuery, calculateAverageDynamically, run } = require("../hooks/lib/utils")
|
||||
;(function () {
|
||||
console.log("Running lighthouse job")
|
||||
let subPaths = context.db.find("lighthouseSubpath")
|
||||
let urls = []
|
||||
for (let i = 0; i < subPaths.length; i++) {
|
||||
urls.push(setUpQuery(subPaths[i].lighthouseSubpath))
|
||||
}
|
||||
let dbObjs = []
|
||||
urls.forEach((url) => {
|
||||
dbObjs.push(run(url))
|
||||
})
|
||||
let dbObject = calculateAverageDynamically(dbObjs)
|
||||
dbObject.analyzedPaths = [...subPaths].map((subPath) => subPath.lighthouseSubpath)
|
||||
context.db.create("lighthouse", dbObject)
|
||||
})()
|
||||
@@ -1,14 +0,0 @@
|
||||
# Jedem Job muss ein "cron" Eintrag zugeordnet werden, der die
|
||||
# Ausführungszeitpunkte definiert.
|
||||
# Das cron-Schema ist dem üblichen Linux cron-Schema nachempfunden.
|
||||
cron: "0 0 * * 1"
|
||||
|
||||
# "type" des Jobs ist derzeit immer "javascript" mit der "file"-Referenz
|
||||
# relativ zur "config.yml".
|
||||
type: javascript
|
||||
file: jobs/lighthouse.js
|
||||
# Es können beliebige "meta"-Daten hinterlegt werden, die im Javascript
|
||||
# des Jobs über "context.job.meta" abgerufen werden können.
|
||||
|
||||
meta:
|
||||
name: Lighthouse job
|
||||
@@ -1,8 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<body>
|
||||
<h1>Neue Bewertung</h1>
|
||||
<label>Tibi Admin Link:</label>
|
||||
<a href="{{config.tibiUrl}}{{context.data.tibiLink}}" target="_blank"> hier Klicken </a><br />
|
||||
</body>
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
BKDF: Neue Bewertung eingetroffen.
|
||||
@@ -1,456 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
lang="en"
|
||||
xml:lang="en"
|
||||
>
|
||||
<head>
|
||||
<meta
|
||||
http-equiv="Content-Type"
|
||||
content="text/html; charset=utf-8"
|
||||
/>
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width"
|
||||
/>
|
||||
|
||||
<style type="text/css">
|
||||
@media only screen {
|
||||
html {
|
||||
background: #fff;
|
||||
min-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
body,
|
||||
table,
|
||||
tr,
|
||||
td,
|
||||
th,
|
||||
div,
|
||||
h1,
|
||||
p,
|
||||
img {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
min-width: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
h1,
|
||||
p,
|
||||
a,
|
||||
span,
|
||||
img {
|
||||
color: #f3eed9;
|
||||
font-family: Montserrat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
|
||||
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
-moz-hyphens: auto;
|
||||
-webkit-hyphens: auto;
|
||||
hyphens: auto;
|
||||
line-height: 1.57143;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 28px;
|
||||
font-weight: 500;
|
||||
line-height: 1.21429;
|
||||
}
|
||||
|
||||
h1:not(:last-child),
|
||||
p:not(:last-child) {
|
||||
margin: 0 0 32px;
|
||||
margin: 0 0 32px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #d1e7e0;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
display: block;
|
||||
outline: 0;
|
||||
text-align: center;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-bottom: 1px solid #eceaea;
|
||||
}
|
||||
|
||||
.preheader {
|
||||
display: none;
|
||||
font-size: 1px;
|
||||
line-height: 1px;
|
||||
max-height: 0;
|
||||
max-width: 0;
|
||||
mso-hide: all;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.body {
|
||||
background: #0d0c0c;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.body > tr > td {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container,
|
||||
.column {
|
||||
margin: 0 auto;
|
||||
margin: 0 auto;
|
||||
width: 544px;
|
||||
}
|
||||
|
||||
.column td,
|
||||
.column th {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.column--md-9 {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.column--md-3 {
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.expander {
|
||||
padding: 0 !important;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.spacer--16 td {
|
||||
font-size: 16px;
|
||||
height: 16px;
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.spacer--24 td {
|
||||
font-size: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.spacer--32 td {
|
||||
font-size: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.spacer--40 td {
|
||||
font-size: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.delimiter th {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.delimiter__image,
|
||||
.delimiter__image-block {
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
.logo td {
|
||||
padding: 24px 0;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
color: #f3eed9;
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
color: #f3eed9;
|
||||
text-decoration: none;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.logo span {
|
||||
color: #f3eed9;
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.store p {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.store a {
|
||||
color: #d1e7e0;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
border: 1px solid #d1e7e0;
|
||||
border-radius: 4px;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: #d1e7e0;
|
||||
padding: 3px 15px;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 599px) {
|
||||
img {
|
||||
height: auto !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.column {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
height: auto !important;
|
||||
padding-left: 15px !important;
|
||||
padding-right: 15px !important;
|
||||
}
|
||||
|
||||
.column--xs-12 {
|
||||
display: inline-block !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.delimiter__image {
|
||||
width: 48px !important;
|
||||
}
|
||||
|
||||
.store th {
|
||||
padding-bottom: 16px !important;
|
||||
}
|
||||
|
||||
.store p {
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
margin-left: auto !important;
|
||||
margin-right: auto !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<span class="preheader"></span>
|
||||
|
||||
<table class="body">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table class="logo">
|
||||
<tr>
|
||||
<th>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
src="{{store.logo}}"
|
||||
alt="BinKrassDuFass"
|
||||
/>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<h1>Deine Widerrufsanfrage ist eingegangen.</h1>
|
||||
|
||||
<p>
|
||||
Hallo, deine Anfrage für den Widerruf ist bei uns
|
||||
eingegangen. Wir werden diese innerhalb weniger Tage prüfen
|
||||
und dann in deinem Konto einen Versandschein zur Verfügung
|
||||
stellen. Bitte prüfe regelmäßig den Status deiner Retoure.
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<table class="delimiter">
|
||||
<tr>
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--24">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column column--md-9 column--xs-12">
|
||||
<table class="store">
|
||||
<tr>
|
||||
<th>
|
||||
<p>
|
||||
<strong>BinKrassDuFass</strong>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>{{store.frontendBase}}</a
|
||||
>
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="column column--md-3 column--xs-12">
|
||||
<table class="store-button">
|
||||
<tr>
|
||||
<th>
|
||||
<a href="{{store.frontendBase}}">
|
||||
<strong>Shoppen</strong>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- prevent Gmail on iOS font size manipulation -->
|
||||
<div style="display: none; white-space: nowrap; font: 15px courier; line-height: 0"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,454 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
lang="en"
|
||||
xml:lang="en"
|
||||
>
|
||||
<head>
|
||||
<meta
|
||||
http-equiv="Content-Type"
|
||||
content="text/html; charset=utf-8"
|
||||
/>
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width"
|
||||
/>
|
||||
|
||||
<style type="text/css">
|
||||
@media only screen {
|
||||
html {
|
||||
background: #fff;
|
||||
min-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
body,
|
||||
table,
|
||||
tr,
|
||||
td,
|
||||
th,
|
||||
div,
|
||||
h1,
|
||||
p,
|
||||
img {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
min-width: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
h1,
|
||||
p,
|
||||
a,
|
||||
span,
|
||||
img {
|
||||
color: #f3eed9;
|
||||
font-family: Montserrat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
|
||||
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
-moz-hyphens: auto;
|
||||
-webkit-hyphens: auto;
|
||||
hyphens: auto;
|
||||
line-height: 1.57143;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 28px;
|
||||
font-weight: 500;
|
||||
line-height: 1.21429;
|
||||
}
|
||||
|
||||
h1:not(:last-child),
|
||||
p:not(:last-child) {
|
||||
margin: 0 0 32px;
|
||||
margin: 0 0 32px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #d1e7e0;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
display: block;
|
||||
outline: 0;
|
||||
text-align: center;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-bottom: 1px solid #eceaea;
|
||||
}
|
||||
|
||||
.preheader {
|
||||
display: none;
|
||||
font-size: 1px;
|
||||
line-height: 1px;
|
||||
max-height: 0;
|
||||
max-width: 0;
|
||||
mso-hide: all;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.body {
|
||||
background: #0d0c0c;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.body > tr > td {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container,
|
||||
.column {
|
||||
margin: 0 auto;
|
||||
margin: 0 auto;
|
||||
width: 544px;
|
||||
}
|
||||
|
||||
.column td,
|
||||
.column th {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.column--md-9 {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.column--md-3 {
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.expander {
|
||||
padding: 0 !important;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.spacer--16 td {
|
||||
font-size: 16px;
|
||||
height: 16px;
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.spacer--24 td {
|
||||
font-size: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.spacer--32 td {
|
||||
font-size: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.spacer--40 td {
|
||||
font-size: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.delimiter th {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.delimiter__image,
|
||||
.delimiter__image-block {
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
.logo td {
|
||||
padding: 24px 0;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
color: #f3eed9;
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
color: #f3eed9;
|
||||
text-decoration: none;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.logo span {
|
||||
color: #f3eed9;
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.store p {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.store a {
|
||||
color: #d1e7e0;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
border: 1px solid #d1e7e0;
|
||||
border-radius: 4px;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: #d1e7e0;
|
||||
padding: 3px 15px;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 599px) {
|
||||
img {
|
||||
height: auto !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.column {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
height: auto !important;
|
||||
padding-left: 15px !important;
|
||||
padding-right: 15px !important;
|
||||
}
|
||||
|
||||
.column--xs-12 {
|
||||
display: inline-block !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.delimiter__image {
|
||||
width: 48px !important;
|
||||
}
|
||||
|
||||
.store th {
|
||||
padding-bottom: 16px !important;
|
||||
}
|
||||
|
||||
.store p {
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
margin-left: auto !important;
|
||||
margin-right: auto !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<span class="preheader"></span>
|
||||
|
||||
<table class="body">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table class="logo">
|
||||
<tr>
|
||||
<th>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
src="{{store.logo}}"
|
||||
alt="BinKrassDuFass"
|
||||
/>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<h1>Deine Widerrufsanfrage wurde zurückgezogen.</h1>
|
||||
|
||||
<p>
|
||||
Hallo, deine Widerrufsanfrage wurde erfolgreich
|
||||
zurückgezogen.
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<table class="delimiter">
|
||||
<tr>
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--24">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column column--md-9 column--xs-12">
|
||||
<table class="store">
|
||||
<tr>
|
||||
<th>
|
||||
<p>
|
||||
<strong>BinKrassDuFass</strong>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>{{store.frontendBase}}</a
|
||||
>
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="column column--md-3 column--xs-12">
|
||||
<table class="store-button">
|
||||
<tr>
|
||||
<th>
|
||||
<a href="{{store.frontendBase}}">
|
||||
<strong>Shoppen</strong>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- prevent Gmail on iOS font size manipulation -->
|
||||
<div style="display: none; white-space: nowrap; font: 15px courier; line-height: 0"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,456 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
lang="en"
|
||||
xml:lang="en"
|
||||
>
|
||||
<head>
|
||||
<meta
|
||||
http-equiv="Content-Type"
|
||||
content="text/html; charset=utf-8"
|
||||
/>
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width"
|
||||
/>
|
||||
|
||||
<style type="text/css">
|
||||
@media only screen {
|
||||
html {
|
||||
background: #fff;
|
||||
min-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
body,
|
||||
table,
|
||||
tr,
|
||||
td,
|
||||
th,
|
||||
div,
|
||||
h1,
|
||||
p,
|
||||
img {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
min-width: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
h1,
|
||||
p,
|
||||
a,
|
||||
span,
|
||||
img {
|
||||
color: #f3eed9;
|
||||
font-family: Montserrat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
|
||||
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
-moz-hyphens: auto;
|
||||
-webkit-hyphens: auto;
|
||||
hyphens: auto;
|
||||
line-height: 1.57143;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 28px;
|
||||
font-weight: 500;
|
||||
line-height: 1.21429;
|
||||
}
|
||||
|
||||
h1:not(:last-child),
|
||||
p:not(:last-child) {
|
||||
margin: 0 0 32px;
|
||||
margin: 0 0 32px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #d1e7e0;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
display: block;
|
||||
outline: 0;
|
||||
text-align: center;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-bottom: 1px solid #eceaea;
|
||||
}
|
||||
|
||||
.preheader {
|
||||
display: none;
|
||||
font-size: 1px;
|
||||
line-height: 1px;
|
||||
max-height: 0;
|
||||
max-width: 0;
|
||||
mso-hide: all;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.body {
|
||||
background: #0d0c0c;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.body > tr > td {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container,
|
||||
.column {
|
||||
margin: 0 auto;
|
||||
margin: 0 auto;
|
||||
width: 544px;
|
||||
}
|
||||
|
||||
.column td,
|
||||
.column th {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.column--md-9 {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.column--md-3 {
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.expander {
|
||||
padding: 0 !important;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.spacer--16 td {
|
||||
font-size: 16px;
|
||||
height: 16px;
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.spacer--24 td {
|
||||
font-size: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.spacer--32 td {
|
||||
font-size: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.spacer--40 td {
|
||||
font-size: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.delimiter th {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.delimiter__image,
|
||||
.delimiter__image-block {
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
.logo td {
|
||||
padding: 24px 0;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
color: #f3eed9;
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
color: #f3eed9;
|
||||
text-decoration: none;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.logo span {
|
||||
color: #f3eed9;
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.store p {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.store a {
|
||||
color: #d1e7e0;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
border: 1px solid #d1e7e0;
|
||||
border-radius: 4px;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: #d1e7e0;
|
||||
padding: 3px 15px;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 599px) {
|
||||
img {
|
||||
height: auto !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.column {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
height: auto !important;
|
||||
padding-left: 15px !important;
|
||||
padding-right: 15px !important;
|
||||
}
|
||||
|
||||
.column--xs-12 {
|
||||
display: inline-block !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.delimiter__image {
|
||||
width: 48px !important;
|
||||
}
|
||||
|
||||
.store th {
|
||||
padding-bottom: 16px !important;
|
||||
}
|
||||
|
||||
.store p {
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
margin-left: auto !important;
|
||||
margin-right: auto !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<span class="preheader"></span>
|
||||
|
||||
<table class="body">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table class="logo">
|
||||
<tr>
|
||||
<th>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
src="{{store.logo}}"
|
||||
alt="BinKrassDuFass"
|
||||
/>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<h1>Deine Bestellung wurde erfolgreich widerrufen.</h1>
|
||||
|
||||
<p>
|
||||
Hallo, deine Bestellung wurde erfolgreich widerrufen. Wir
|
||||
haben deine Bestellung storniert und der Betrag wird dir in
|
||||
Kürze auf dein ursprüngliches Zahlungsmittel
|
||||
zurückerstattet.
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<table class="delimiter">
|
||||
<tr>
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--24">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column column--md-9 column--xs-12">
|
||||
<table class="store">
|
||||
<tr>
|
||||
<th>
|
||||
<p>
|
||||
<strong>BinKrassDuFass</strong>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>{{store.frontendBase}}</a
|
||||
>
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="column column--md-3 column--xs-12">
|
||||
<table class="store-button">
|
||||
<tr>
|
||||
<th>
|
||||
<a href="{{store.frontendBase}}">
|
||||
<strong>Shoppen</strong>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- prevent Gmail on iOS font size manipulation -->
|
||||
<div style="display: none; white-space: nowrap; font: 15px courier; line-height: 0"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,459 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
lang="en"
|
||||
xml:lang="en"
|
||||
>
|
||||
<head>
|
||||
<meta
|
||||
http-equiv="Content-Type"
|
||||
content="text/html; charset=utf-8"
|
||||
/>
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width"
|
||||
/>
|
||||
|
||||
<style type="text/css">
|
||||
@media only screen {
|
||||
html {
|
||||
background: #fff;
|
||||
min-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
body,
|
||||
table,
|
||||
tr,
|
||||
td,
|
||||
th,
|
||||
div,
|
||||
h1,
|
||||
p,
|
||||
img {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
min-width: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
h1,
|
||||
p,
|
||||
a,
|
||||
span,
|
||||
img {
|
||||
color: #f3eed9;
|
||||
font-family: Montserrat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
|
||||
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
-moz-hyphens: auto;
|
||||
-webkit-hyphens: auto;
|
||||
hyphens: auto;
|
||||
line-height: 1.57143;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 28px;
|
||||
font-weight: 500;
|
||||
line-height: 1.21429;
|
||||
}
|
||||
|
||||
h1:not(:last-child),
|
||||
p:not(:last-child) {
|
||||
margin: 0 0 32px;
|
||||
margin: 0 0 32px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #d1e7e0;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
display: block;
|
||||
outline: 0;
|
||||
text-align: center;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-bottom: 1px solid #eceaea;
|
||||
}
|
||||
|
||||
.preheader {
|
||||
display: none;
|
||||
font-size: 1px;
|
||||
line-height: 1px;
|
||||
max-height: 0;
|
||||
max-width: 0;
|
||||
mso-hide: all;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.body {
|
||||
background: #0d0c0c;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.body > tr > td {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container,
|
||||
.column {
|
||||
margin: 0 auto;
|
||||
margin: 0 auto;
|
||||
width: 544px;
|
||||
}
|
||||
|
||||
.column td,
|
||||
.column th {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.column--md-9 {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.column--md-3 {
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.expander {
|
||||
padding: 0 !important;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.spacer--16 td {
|
||||
font-size: 16px;
|
||||
height: 16px;
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.spacer--24 td {
|
||||
font-size: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.spacer--32 td {
|
||||
font-size: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.spacer--40 td {
|
||||
font-size: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.delimiter th {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.delimiter__image,
|
||||
.delimiter__image-block {
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
.logo td {
|
||||
padding: 24px 0;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
color: #f3eed9;
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
color: #f3eed9;
|
||||
text-decoration: none;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.logo span {
|
||||
color: #f3eed9;
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.store p {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.store a {
|
||||
color: #d1e7e0;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
border: 1px solid #d1e7e0;
|
||||
border-radius: 4px;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: #d1e7e0;
|
||||
padding: 3px 15px;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 599px) {
|
||||
img {
|
||||
height: auto !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.column {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
height: auto !important;
|
||||
padding-left: 15px !important;
|
||||
padding-right: 15px !important;
|
||||
}
|
||||
|
||||
.column--xs-12 {
|
||||
display: inline-block !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.delimiter__image {
|
||||
width: 48px !important;
|
||||
}
|
||||
|
||||
.store th {
|
||||
padding-bottom: 16px !important;
|
||||
}
|
||||
|
||||
.store p {
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
margin-left: auto !important;
|
||||
margin-right: auto !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<span class="preheader"></span>
|
||||
|
||||
<table class="body">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table class="logo">
|
||||
<tr>
|
||||
<th>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
src="{{store.logo}}"
|
||||
alt="BinKrassDuFass"
|
||||
/>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<h1>Dein Code zum ändern des Passworts</h1>
|
||||
|
||||
<p>
|
||||
Hallo, du hast dein Passwort vergessen und möchtest es
|
||||
zurücksetzen? Dann Clicke hier:
|
||||
<a href="{{store.pwReset}}">Passwort Zurüksetzen</a>
|
||||
|
||||
Solltest du dein Passwort nicht zurücksetzen wollen,
|
||||
ignoriere diese E-Mail einfach. Dein Account ist weiterhin
|
||||
sicher.
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<table class="delimiter">
|
||||
<tr>
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--24">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column column--md-9 column--xs-12">
|
||||
<table class="store">
|
||||
<tr>
|
||||
<th>
|
||||
<p>
|
||||
<strong>BinKrassDuFass</strong>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>{{store.frontendBase}}</a
|
||||
>
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="column column--md-3 column--xs-12">
|
||||
<table class="store-button">
|
||||
<tr>
|
||||
<th>
|
||||
<a href="{{store.frontendBase}}">
|
||||
<strong>Shoppen</strong>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- prevent Gmail on iOS font size manipulation -->
|
||||
<div style="display: none; white-space: nowrap; font: 15px courier; line-height: 0"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,108 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0"
|
||||
/>
|
||||
<meta
|
||||
http-equiv="X-UA-Compatible"
|
||||
content="IE=edge"
|
||||
/>
|
||||
<title>BinKrassDuFass</title>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
href="/assets/img/apple-touch-icon.png"
|
||||
/>
|
||||
<meta
|
||||
name="google-site-verification"
|
||||
content="275yXOPP-tYplMaTZw1HQ0-DfNDm4RjtY1YRYBWqIvI"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="/assets/img/favicon-32x32.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="16x16"
|
||||
href="/assets/img/favicon-16x16.png"
|
||||
/>
|
||||
<link
|
||||
rel="manifest"
|
||||
href="/assets/img/site.webmanifest"
|
||||
/>
|
||||
<link
|
||||
rel="shortcut icon"
|
||||
href="/assets/img/favicon.ico"
|
||||
/>
|
||||
<meta
|
||||
name="msapplication-TileColor"
|
||||
content="#da532c"
|
||||
/>
|
||||
<meta
|
||||
name="msapplication-config"
|
||||
content="/assets/img/browserconfig.xml"
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
content="#0D0C0C"
|
||||
/>
|
||||
<base href="/" />
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="/dist/index.css?t=__TIMESTAMP__"
|
||||
/>
|
||||
<link
|
||||
rel="dns-prefetch"
|
||||
href="//analytics.google.com"
|
||||
/>
|
||||
<link
|
||||
rel="dns-prefetch"
|
||||
href="https://store-punbvyqteo.mybigcommerce.com"
|
||||
/>
|
||||
<link
|
||||
rel="preconnect"
|
||||
href="https://store-punbvyqteo.mybigcommerce.com"
|
||||
/>
|
||||
<link
|
||||
rel="dns-prefetch"
|
||||
href="//cdn.bigcommerce.com"
|
||||
/>
|
||||
<meta
|
||||
name="apple-mobile-web-app-status-bar-style"
|
||||
content="black-translucent"
|
||||
/>
|
||||
|
||||
<!--HEAD-->
|
||||
|
||||
<!--PRELOAD-->
|
||||
</head>
|
||||
<body>
|
||||
<div id="appContainer"><!--HTML--></div>
|
||||
<script
|
||||
type="module"
|
||||
src="/dist/index.mjs?t=__TIMESTAMP__"
|
||||
></script>
|
||||
<script
|
||||
nomodule
|
||||
src="/dist/index.es5.js?t=__TIMESTAMP__"
|
||||
></script>
|
||||
<script
|
||||
src="//cc.webmakers.de/cc.js"
|
||||
defer
|
||||
id="ccScript"
|
||||
data-cc-tags="googleAnalytics,metaPixel"
|
||||
data-cc-privacy-policy-url="/datenschutz"
|
||||
data-cc-secondary-color="#c4253e"
|
||||
data-cc-necessary-cookies="likecmsSession"
|
||||
></script>
|
||||
</body>
|
||||
|
||||
<!--SSR.ERROR-->
|
||||
<!--SSR.COMMENT-->
|
||||
</html>
|
||||
@@ -1,455 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
lang="en"
|
||||
xml:lang="en"
|
||||
>
|
||||
<head>
|
||||
<meta
|
||||
http-equiv="Content-Type"
|
||||
content="text/html; charset=utf-8"
|
||||
/>
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width"
|
||||
/>
|
||||
|
||||
<style type="text/css">
|
||||
@media only screen {
|
||||
html {
|
||||
background: #fff;
|
||||
min-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
body,
|
||||
table,
|
||||
tr,
|
||||
td,
|
||||
th,
|
||||
div,
|
||||
h1,
|
||||
p,
|
||||
img {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
min-width: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
h1,
|
||||
p,
|
||||
a,
|
||||
span,
|
||||
img {
|
||||
color: #f3eed9;
|
||||
font-family: Montserrat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
|
||||
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
-moz-hyphens: auto;
|
||||
-webkit-hyphens: auto;
|
||||
hyphens: auto;
|
||||
line-height: 1.57143;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 28px;
|
||||
font-weight: 500;
|
||||
line-height: 1.21429;
|
||||
}
|
||||
|
||||
h1:not(:last-child),
|
||||
p:not(:last-child) {
|
||||
margin: 0 0 32px;
|
||||
margin: 0 0 32px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #d1e7e0;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
display: block;
|
||||
outline: 0;
|
||||
text-align: center;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-bottom: 1px solid #eceaea;
|
||||
}
|
||||
|
||||
.preheader {
|
||||
display: none;
|
||||
font-size: 1px;
|
||||
line-height: 1px;
|
||||
max-height: 0;
|
||||
max-width: 0;
|
||||
mso-hide: all;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.body {
|
||||
background: #0d0c0c;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.body > tr > td {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container,
|
||||
.column {
|
||||
margin: 0 auto;
|
||||
margin: 0 auto;
|
||||
width: 544px;
|
||||
}
|
||||
|
||||
.column td,
|
||||
.column th {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.column--md-9 {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.column--md-3 {
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.expander {
|
||||
padding: 0 !important;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.spacer--16 td {
|
||||
font-size: 16px;
|
||||
height: 16px;
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.spacer--24 td {
|
||||
font-size: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.spacer--32 td {
|
||||
font-size: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.spacer--40 td {
|
||||
font-size: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.delimiter th {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.delimiter__image,
|
||||
.delimiter__image-block {
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
.logo td {
|
||||
padding: 24px 0;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
color: #f3eed9;
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo img {
|
||||
color: #f3eed9;
|
||||
text-decoration: none;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.logo span {
|
||||
color: #f3eed9;
|
||||
font-size: 36px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.store p {
|
||||
margin: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.store a {
|
||||
color: #d1e7e0;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
border: 1px solid #d1e7e0;
|
||||
border-radius: 4px;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: #d1e7e0;
|
||||
padding: 3px 15px;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 599px) {
|
||||
img {
|
||||
height: auto !important;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.column {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
height: auto !important;
|
||||
padding-left: 15px !important;
|
||||
padding-right: 15px !important;
|
||||
}
|
||||
|
||||
.column--xs-12 {
|
||||
display: inline-block !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.delimiter__image {
|
||||
width: 48px !important;
|
||||
}
|
||||
|
||||
.store th {
|
||||
padding-bottom: 16px !important;
|
||||
}
|
||||
|
||||
.store p {
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
.store-button a {
|
||||
margin-left: auto !important;
|
||||
margin-right: auto !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<span class="preheader"></span>
|
||||
|
||||
<table class="body">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table class="logo">
|
||||
<tr>
|
||||
<th>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>
|
||||
<img
|
||||
src="{{store.logo}}"
|
||||
alt="BinKrassDuFass"
|
||||
/>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<h1>Deine Widerrufsanfrage wurde bearbeitet.</h1>
|
||||
|
||||
<p>
|
||||
Hallo, du hast eine Widerrufsanfrage für deine Bestellung
|
||||
gestellt. Wir haben deine Anfrage bearbeitet, schau dir den
|
||||
Status deiner Anfrage bitte in deinem Profil an.
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--40">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="container">
|
||||
<tr>
|
||||
<td>
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column">
|
||||
<table>
|
||||
<tr>
|
||||
<th>
|
||||
<table class="delimiter">
|
||||
<tr>
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
|
||||
<th>
|
||||
<hr />
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--24">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="row">
|
||||
<tr>
|
||||
<th class="column column--md-9 column--xs-12">
|
||||
<table class="store">
|
||||
<tr>
|
||||
<th>
|
||||
<p>
|
||||
<strong>BinKrassDuFass</strong>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a
|
||||
href="{{store.frontendBase}}"
|
||||
target="_blank"
|
||||
>{{store.frontendBase}}</a
|
||||
>
|
||||
</p>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<th class="column column--md-3 column--xs-12">
|
||||
<table class="store-button">
|
||||
<tr>
|
||||
<th>
|
||||
<a href="{{store.frontendBase}}">
|
||||
<strong>Shoppen</strong>
|
||||
</a>
|
||||
</th>
|
||||
|
||||
<th class="expander"></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="spacer spacer--16">
|
||||
<tr>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- prevent Gmail on iOS font size manipulation -->
|
||||
<div style="display: none; white-space: nowrap; font: 15px courier; line-height: 0"></div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user