diff --git a/api/collections/action.yml b/api/collections/action.yml deleted file mode 100644 index 903f8b1..0000000 --- a/api/collections/action.yml +++ /dev/null @@ -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: [] diff --git a/api/collections/backups.yml b/api/collections/backups.yml index 55288cd..f3ce1b3 100644 --- a/api/collections/backups.yml +++ b/api/collections/backups.yml @@ -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 diff --git a/api/collections/banner.yml b/api/collections/banner.yml deleted file mode 100644 index 20fbf38..0000000 --- a/api/collections/banner.yml +++ /dev/null @@ -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 diff --git a/api/collections/content.yml b/api/collections/content.yml deleted file mode 100644 index 1c5073c..0000000 --- a/api/collections/content.yml +++ /dev/null @@ -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:$** diff --git a/api/collections/fieldLists/meta.yml b/api/collections/fieldLists/meta.yml deleted file mode 100644 index dd78def..0000000 --- a/api/collections/fieldLists/meta.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/active.yml b/api/collections/fields/active.yml deleted file mode 100644 index 2762305..0000000 --- a/api/collections/fields/active.yml +++ /dev/null @@ -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" diff --git a/api/collections/fields/backup.yml b/api/collections/fields/backup.yml deleted file mode 100644 index 25ce855..0000000 --- a/api/collections/fields/backup.yml +++ /dev/null @@ -1,3 +0,0 @@ -backup: - active: true # sollen backups beim verändern erstellt werden - collectionName: backups # in welcher collection es gespeichert werden soll diff --git a/api/collections/fields/callToActionButton.yml b/api/collections/fields/callToActionButton.yml deleted file mode 100644 index 6872a95..0000000 --- a/api/collections/fields/callToActionButton.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentBlocks.yml b/api/collections/fields/contentBlocks.yml deleted file mode 100644 index 5d17991..0000000 --- a/api/collections/fields/contentBlocks.yml +++ /dev/null @@ -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 - "
" + - ($this.headline || "") + "" + - ($this.type ? - "     Blocktyp: " + - { - "columns": "Spalten", - "predefinedBlock": "Vordefinierter Block", - - }[$this.type] + - "" : - "") + - ($this.anchorId ? - "     #" + $this.anchorId + - "" : - "") + - "
" + - ($this.subline || "") + - "
" - //!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 diff --git a/api/collections/fields/contentBlocks/CTACol.yml b/api/collections/fields/contentBlocks/CTACol.yml deleted file mode 100644 index f8c145d..0000000 --- a/api/collections/fields/contentBlocks/CTACol.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentBlocks/ImproveYourselfDescription.yml b/api/collections/fields/contentBlocks/ImproveYourselfDescription.yml deleted file mode 100644 index efe1b16..0000000 --- a/api/collections/fields/contentBlocks/ImproveYourselfDescription.yml +++ /dev/null @@ -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" diff --git a/api/collections/fields/contentBlocks/MainHomepage.yml b/api/collections/fields/contentBlocks/MainHomepage.yml deleted file mode 100644 index ba217a6..0000000 --- a/api/collections/fields/contentBlocks/MainHomepage.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentBlocks/SplittedHompage.yml b/api/collections/fields/contentBlocks/SplittedHompage.yml deleted file mode 100644 index 7e20614..0000000 --- a/api/collections/fields/contentBlocks/SplittedHompage.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentBlocks/columns.yml b/api/collections/fields/contentBlocks/columns.yml deleted file mode 100644 index 95495d5..0000000 --- a/api/collections/fields/contentBlocks/columns.yml +++ /dev/null @@ -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: | - "
" + ($this.type == "image" ? "Bild" : "Text") + "-Spalte (Breite: " + ($this.colWidth ? $this.colWidth + "/12" : "automatisch" ) + ")
" - 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: | - "
Link: " + ($this.text || "") + "
" - 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 diff --git a/api/collections/fields/contentBlocks/predefined.yml b/api/collections/fields/contentBlocks/predefined.yml deleted file mode 100644 index 6c1c6eb..0000000 --- a/api/collections/fields/contentBlocks/predefined.yml +++ /dev/null @@ -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 - })() diff --git a/api/collections/fields/contentBlocks/productSlider.yml b/api/collections/fields/contentBlocks/productSlider.yml deleted file mode 100644 index 90a00e1..0000000 --- a/api/collections/fields/contentBlocks/productSlider.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentBlocks/ratingsPreview.yml b/api/collections/fields/contentBlocks/ratingsPreview.yml deleted file mode 100644 index c52e77f..0000000 --- a/api/collections/fields/contentBlocks/ratingsPreview.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentBlocks/selfImprovementChapter.yml b/api/collections/fields/contentBlocks/selfImprovementChapter.yml deleted file mode 100644 index 466e0f9..0000000 --- a/api/collections/fields/contentBlocks/selfImprovementChapter.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentBlocks/stepNr.yml b/api/collections/fields/contentBlocks/stepNr.yml deleted file mode 100644 index 2107200..0000000 --- a/api/collections/fields/contentBlocks/stepNr.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentMeta.yml b/api/collections/fields/contentMeta.yml deleted file mode 100644 index 3c4024b..0000000 --- a/api/collections/fields/contentMeta.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/contentType.yml b/api/collections/fields/contentType.yml deleted file mode 100644 index aa3869a..0000000 --- a/api/collections/fields/contentType.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/emailCC.yml b/api/collections/fields/emailCC.yml deleted file mode 100644 index b32faf2..0000000 --- a/api/collections/fields/emailCC.yml +++ /dev/null @@ -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" diff --git a/api/collections/fields/excludedDays.yml b/api/collections/fields/excludedDays.yml deleted file mode 100644 index d331cdf..0000000 --- a/api/collections/fields/excludedDays.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/file.yml b/api/collections/fields/file.yml deleted file mode 100644 index 1716eb0..0000000 --- a/api/collections/fields/file.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: file -type: file -meta: - label: - de: Datei - en: File diff --git a/api/collections/fields/from.yml b/api/collections/fields/from.yml deleted file mode 100644 index cd2d2ae..0000000 --- a/api/collections/fields/from.yml +++ /dev/null @@ -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" diff --git a/api/collections/fields/imageTitle.yml b/api/collections/fields/imageTitle.yml deleted file mode 100644 index e69de29..0000000 diff --git a/api/collections/fields/manualSort.yml b/api/collections/fields/manualSort.yml deleted file mode 100644 index 383c01c..0000000 --- a/api/collections/fields/manualSort.yml +++ /dev/null @@ -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. diff --git a/api/collections/fields/medialibCardList.yml b/api/collections/fields/medialibCardList.yml deleted file mode 100644 index cf5563d..0000000 --- a/api/collections/fields/medialibCardList.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/medialibSimpleList.yml b/api/collections/fields/medialibSimpleList.yml deleted file mode 100644 index d1893c9..0000000 --- a/api/collections/fields/medialibSimpleList.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/medialibTable.yml b/api/collections/fields/medialibTable.yml deleted file mode 100644 index e33215e..0000000 --- a/api/collections/fields/medialibTable.yml +++ /dev/null @@ -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 diff --git a/api/collections/fields/mutliupload.yml b/api/collections/fields/mutliupload.yml deleted file mode 100644 index 39018c8..0000000 --- a/api/collections/fields/mutliupload.yml +++ /dev/null @@ -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 - })() diff --git a/api/collections/fields/pageTitle.yml b/api/collections/fields/pageTitle.yml deleted file mode 100644 index 068be6d..0000000 --- a/api/collections/fields/pageTitle.yml +++ /dev/null @@ -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" diff --git a/api/collections/fields/text.yml b/api/collections/fields/text.yml deleted file mode 100644 index f2f4ca4..0000000 --- a/api/collections/fields/text.yml +++ /dev/null @@ -1,9 +0,0 @@ -name: text -type: string -meta: - widget: richtext - label: - de: Text - en: text - dependsOn: - eval: $parent.contentType == 'text' diff --git a/api/collections/lib/foreignMediaRender.yml b/api/collections/lib/foreignMediaRender.yml deleted file mode 100644 index 4cc5925..0000000 --- a/api/collections/lib/foreignMediaRender.yml +++ /dev/null @@ -1,13 +0,0 @@ -raw: true -eval: | - //js - (function() { - let out = "" - if ($foreignEntry?.file?.src && $foreignEntry?.file?.type?.startsWith("image/")) { - out += "
" - } - out += $foreignEntry?.title || "" - - return out - })() - //!js diff --git a/api/collections/lib/imageFilter.yml b/api/collections/lib/imageFilter.yml deleted file mode 100644 index 55b2325..0000000 --- a/api/collections/lib/imageFilter.yml +++ /dev/null @@ -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 diff --git a/api/collections/lib/medialib_CardList.yml b/api/collections/lib/medialib_CardList.yml deleted file mode 100644 index 7615ce2..0000000 --- a/api/collections/lib/medialib_CardList.yml +++ /dev/null @@ -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 diff --git a/api/collections/lib/medialib_SimpleList.yml b/api/collections/lib/medialib_SimpleList.yml deleted file mode 100644 index a501d04..0000000 --- a/api/collections/lib/medialib_SimpleList.yml +++ /dev/null @@ -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 diff --git a/api/collections/lib/medialib_Table.yml b/api/collections/lib/medialib_Table.yml deleted file mode 100644 index 2af8371..0000000 --- a/api/collections/lib/medialib_Table.yml +++ /dev/null @@ -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 diff --git a/api/collections/lib/quickEditMedialib.yml b/api/collections/lib/quickEditMedialib.yml deleted file mode 100644 index 3724277..0000000 --- a/api/collections/lib/quickEditMedialib.yml +++ /dev/null @@ -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 diff --git a/api/collections/lib/textIndex.yml b/api/collections/lib/textIndex.yml deleted file mode 100644 index 41938ba..0000000 --- a/api/collections/lib/textIndex.yml +++ /dev/null @@ -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. diff --git a/api/collections/lighthouse.yml b/api/collections/lighthouse.yml deleted file mode 100644 index 7863c4e..0000000 --- a/api/collections/lighthouse.yml +++ /dev/null @@ -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 diff --git a/api/collections/lighthouseSubpath.yml b/api/collections/lighthouseSubpath.yml deleted file mode 100644 index 60bcba4..0000000 --- a/api/collections/lighthouseSubpath.yml +++ /dev/null @@ -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 diff --git a/api/collections/medialib.yml b/api/collections/medialib.yml deleted file mode 100644 index 4e35f19..0000000 --- a/api/collections/medialib.yml +++ /dev/null @@ -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:$** diff --git a/api/collections/module.yml b/api/collections/module.yml deleted file mode 100644 index 1d8e9bc..0000000 --- a/api/collections/module.yml +++ /dev/null @@ -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:$** diff --git a/api/collections/navigation.yml b/api/collections/navigation.yml deleted file mode 100644 index e476a13..0000000 --- a/api/collections/navigation.yml +++ /dev/null @@ -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 ? ' ' + $this?.elements?.length + ' Sub-Navigationselement(e)' : '') - raw: true - previewFolded: - eval: | - $this?.name + ' (Ziel: ' + ($this?.external ? $this?.externalUrl || '' : ($this?.page || '') + ($this?.hash ? '#' + $this.hash : '')) + ')' + ($this?.elements?.length ? ' ' + $this?.elements?.length + ' Sub-Navigationselement(e)' : '') - 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:$** diff --git a/api/collections/ssr.yml b/api/collections/ssr.yml deleted file mode 100644 index 97565a5..0000000 --- a/api/collections/ssr.yml +++ /dev/null @@ -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 diff --git a/api/collections/tag.yml b/api/collections/tag.yml deleted file mode 100644 index 29561b2..0000000 --- a/api/collections/tag.yml +++ /dev/null @@ -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 diff --git a/api/config.yml b/api/config.yml index da7873b..ae9d287 100644 --- a/api/config.yml +++ b/api/config.yml @@ -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 diff --git a/api/hooks/action/post_create.js b/api/hooks/action/post_create.js deleted file mode 100644 index 3a052b6..0000000 --- a/api/hooks/action/post_create.js +++ /dev/null @@ -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", - } -} diff --git a/api/hooks/forms/post_create.js b/api/hooks/forms/post_create.js deleted file mode 100644 index 6fa08e0..0000000 --- a/api/hooks/forms/post_create.js +++ /dev/null @@ -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 } - } -})() diff --git a/api/hooks/forms/post_return.js b/api/hooks/forms/post_return.js deleted file mode 100644 index ff59b4c..0000000 --- a/api/hooks/forms/post_return.js +++ /dev/null @@ -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, - }), - }) -})() diff --git a/api/hooks/forms/validateFields.js b/api/hooks/forms/validateFields.js deleted file mode 100644 index e205b43..0000000 --- a/api/hooks/forms/validateFields.js +++ /dev/null @@ -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, -} diff --git a/api/hooks/lighthouse/post_create.js b/api/hooks/lighthouse/post_create.js deleted file mode 100644 index e3f1038..0000000 --- a/api/hooks/lighthouse/post_create.js +++ /dev/null @@ -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 } -})() diff --git a/api/hooks/login/post_create.js b/api/hooks/login/post_create.js deleted file mode 100644 index 60699fa..0000000 --- a/api/hooks/login/post_create.js +++ /dev/null @@ -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, - } -})() diff --git a/api/hooks/medialib/delete_delete.js b/api/hooks/medialib/delete_delete.js deleted file mode 100644 index bfef954..0000000 --- a/api/hooks/medialib/delete_delete.js +++ /dev/null @@ -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", - } - } - }) -})() diff --git a/api/hooks/ssr/get_read.js b/api/hooks/ssr/get_read.js deleted file mode 100644 index 2679577..0000000 --- a/api/hooks/ssr/get_read.js +++ /dev/null @@ -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("", '') - } - - 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 = "" - } 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" + - "" - - // 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) - tpl = tpl.replace("", html) - tpl = tpl.replace("", error ? "" : "") - tpl = tpl.replace("", 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, - } - } -})() diff --git a/api/hooks/ssr/post_bind.js b/api/hooks/ssr/post_bind.js deleted file mode 100644 index 5f03fc6..0000000 --- a/api/hooks/ssr/post_bind.js +++ /dev/null @@ -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, - } -})() diff --git a/api/hooks/webhook/delete_delete.js b/api/hooks/webhook/delete_delete.js deleted file mode 100644 index 387ca28..0000000 --- a/api/hooks/webhook/delete_delete.js +++ /dev/null @@ -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() - } - } -})() diff --git a/api/hooks/webhook/post_create.js b/api/hooks/webhook/post_create.js deleted file mode 100644 index f2c74b2..0000000 --- a/api/hooks/webhook/post_create.js +++ /dev/null @@ -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 || "") - } -} diff --git a/api/hooks/webhook/put_update.js b/api/hooks/webhook/put_update.js deleted file mode 100644 index 6509eac..0000000 --- a/api/hooks/webhook/put_update.js +++ /dev/null @@ -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() - } - } -})() diff --git a/api/jobs/lighthouse.js b/api/jobs/lighthouse.js deleted file mode 100644 index 421bfc9..0000000 --- a/api/jobs/lighthouse.js +++ /dev/null @@ -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) -})() diff --git a/api/jobs/lighthouse.yml b/api/jobs/lighthouse.yml deleted file mode 100644 index e1ad567..0000000 --- a/api/jobs/lighthouse.yml +++ /dev/null @@ -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 diff --git a/api/templates/operator_rating_body.de-DE.html b/api/templates/operator_rating_body.de-DE.html deleted file mode 100644 index e927a66..0000000 --- a/api/templates/operator_rating_body.de-DE.html +++ /dev/null @@ -1,8 +0,0 @@ - - - -

Neue Bewertung

- - hier Klicken
- - diff --git a/api/templates/operator_rating_subject.de-DE.txt b/api/templates/operator_rating_subject.de-DE.txt deleted file mode 100644 index 8006a97..0000000 --- a/api/templates/operator_rating_subject.de-DE.txt +++ /dev/null @@ -1 +0,0 @@ -BKDF: Neue Bewertung eingetroffen. \ No newline at end of file diff --git a/api/templates/orderReturnRequestApproval.html b/api/templates/orderReturnRequestApproval.html deleted file mode 100644 index ff20744..0000000 --- a/api/templates/orderReturnRequestApproval.html +++ /dev/null @@ -1,456 +0,0 @@ - - - - - - - - - - - - - - - - -
- - - - -
 
- - - - - -
- - - - -
- - - - - - - -
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
-

Deine Widerrufsanfrage ist eingegangen.

- -

- 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. -

-
-
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
- - - - - - -
-
-
-
-
-
-
- - - - - -
 
- - - - - - - -
- - - - - - -
-

- BinKrassDuFass -

- -

- {{store.frontendBase}} -

-
-
- - - - - - -
- - Shoppen - -
-
-
- - - - - -
 
-
- - -
- - diff --git a/api/templates/orderReturnRequestRevoked.html b/api/templates/orderReturnRequestRevoked.html deleted file mode 100644 index 9f17f4e..0000000 --- a/api/templates/orderReturnRequestRevoked.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - - - - -
- - - - -
 
- - - - - -
- - - - -
- - - - - - - -
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
-

Deine Widerrufsanfrage wurde zurückgezogen.

- -

- Hallo, deine Widerrufsanfrage wurde erfolgreich - zurückgezogen. -

-
-
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
- - - - - - -
-
-
-
-
-
-
- - - - - -
 
- - - - - - - -
- - - - - - -
-

- BinKrassDuFass -

- -

- {{store.frontendBase}} -

-
-
- - - - - - -
- - Shoppen - -
-
-
- - - - - -
 
-
- - -
- - diff --git a/api/templates/orderRevokedApproval.html b/api/templates/orderRevokedApproval.html deleted file mode 100644 index f600525..0000000 --- a/api/templates/orderRevokedApproval.html +++ /dev/null @@ -1,456 +0,0 @@ - - - - - - - - - - - - - - - - -
- - - - -
 
- - - - - -
- - - - -
- - - - - - - -
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
-

Deine Bestellung wurde erfolgreich widerrufen.

- -

- 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. -

-
-
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
- - - - - - -
-
-
-
-
-
-
- - - - - -
 
- - - - - - - -
- - - - - - -
-

- BinKrassDuFass -

- -

- {{store.frontendBase}} -

-
-
- - - - - - -
- - Shoppen - -
-
-
- - - - - -
 
-
- - -
- - diff --git a/api/templates/requestPWReset.html b/api/templates/requestPWReset.html deleted file mode 100644 index e63fae8..0000000 --- a/api/templates/requestPWReset.html +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - - - - - - - - - - - -
- - - - -
 
- - - - - -
- - - - -
- - - - - - - -
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
-

Dein Code zum ändern des Passworts

- -

- Hallo, du hast dein Passwort vergessen und möchtest es - zurücksetzen? Dann Clicke hier: - Passwort Zurüksetzen - - Solltest du dein Passwort nicht zurücksetzen wollen, - ignoriere diese E-Mail einfach. Dein Account ist weiterhin - sicher. -

-
-
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
- - - - - - -
-
-
-
-
-
-
- - - - - -
 
- - - - - - - -
- - - - - - -
-

- BinKrassDuFass -

- -

- {{store.frontendBase}} -

-
-
- - - - - - -
- - Shoppen - -
-
-
- - - - - -
 
-
- - -
- - diff --git a/api/templates/spa.html b/api/templates/spa.html deleted file mode 100644 index 78e3323..0000000 --- a/api/templates/spa.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - BinKrassDuFass - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - diff --git a/api/templates/statusUpdateReturnRequest.html b/api/templates/statusUpdateReturnRequest.html deleted file mode 100644 index 0bf937f..0000000 --- a/api/templates/statusUpdateReturnRequest.html +++ /dev/null @@ -1,455 +0,0 @@ - - - - - - - - - - - - - - - - -
- - - - -
 
- - - - - -
- - - - -
- - - - - - - -
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
-

Deine Widerrufsanfrage wurde bearbeitet.

- -

- 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. -

-
-
-
- - - - - -
 
- - - - - -
- - - - -
- - - - - - -
- - - - - - -
-
-
-
-
-
-
- - - - - -
 
- - - - - - - -
- - - - - - -
-

- BinKrassDuFass -

- -

- {{store.frontendBase}} -

-
-
- - - - - - -
- - Shoppen - -
-
-
- - - - - -
 
-
- - -
- -