# Der Name der Kollektion wird in der Rest-API-URL verwendet, z.B.
# /_/tibi_starter/medialib
name: medialib

# Enthält die Kollektion Felder vom Typ "file", so werden die
# hochgeladenen Dateien unter dem Ordner abgelegt, der mit
# "uploadPath" bestimmt wird.
uploadPath: ../media/medialib

meta:
    allowExportAll: true # Erlaubt das Exportieren aller Einträge in dieser Sammlung - Nur für Admins
    label: # label der Collection in der Sidebar
        de: Medienbibliothek
        en: Media Library
    muiIcon: multimedia # icon in navigation
    defaultSort:
        field: sort
        order: MANUALLY #alternativ auch ASC und DESC möglich

    backup:
        active: true # sollen backups beim verändern erstellt werden
        collectionName: backups # in welcher collection es gespeichert werden soll

    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

    # "defaultImageFilter" dient auch hier nur zur Reduzierung der
    # Bildgröße bei der Anzeige im tibi-admin (Listen).
    # Die Bildgröße für die Einbindung ins erzeugte HTML des ContentBuilder
    # hat hiermit nix zu tun.
    defaultImageFilter: xs

    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 
                      })()

    views:
        - !include fields/medialibSimpleList.yml
        - !include fields/medialibTable.yml
        - !include fields/medialibCardList.yml

    subNavigation:
        - name: modalForeign # Name des Eingabefelds oder der Ansicht.
          defaultSort: # Standard-Sortierkriterien, die angewendet werden, wenn keine anderen Sortierkriterien spezifiziert sind.
              field: "path" # Standardmäßig wird nach dem "path"-Feld sortiert.
              order: "ASC" # Standardmäßig wird in aufsteigender Reihenfolge (ASC) sortiert.
          views: # Liste der Ansichten, die in diesem Feld angezeigt werden können.
              - type: table # Es wird eine Tabellenansicht verwendet.
                mediaQuery: "(min-width: 0px)" # Die Tabellenansicht wird nur angezeigt, wenn die Bildschirmbreite mindestens 0px beträgt.
                columns: # Liste der Spalten, die in der Tabelle angezeigt werden.
                    - source: file

          defaultCallback: # Standard-Callback-Funktion, die ausgeführt wird, wenn keine andere spezifiziert ist.
              eval: | # Der Code wird als JavaScript evaluiert.
                  //js
                  (entry) => {
                      parent.selectEntry(entry)  
                  }
                  //!js

# Allgeine Zugriffsregeln auf Kollektions-Ebene werden mit dem
# "permissions" Objekt festgelegt.
permissions:
    # Unter "public" werden die Zugriffsrechte für die Öffentlichkeit
    # definiert.
    public:
        # "methods" führt die HTTP-Methoden auf, die erlaubt sind
        methods:
            # "get: true" bedeutet hier, dass jeder die Daten lesen darf
            get: true
            # "post", also Einträge erstellen, "put" = Bearbeiten und
            # "delete" = löschen darf die Öffentlichkeit nicht.
            post: false
            put: false
            delete: false
        # Ist "validProjections" definiert, sind auch nur genau die
        # aufgelisteten Projektionen erlaubt, welche zwingend mit dem
        # GET-Parameter "projection=..." ausgewählt werden müssen.
        validProjections:
            - list
            - details

    # Der Key "user" steht für ALLE Benutzer die dem Projekt
    # zugeordnet sind.
    # D.h. eine feinere Abstufung auf Benutzerebene ist mit dem
    # Key "user" allein nicht möglich.
    # Für eine feinere Abstufung können nachgelagerte Hooks
    # dienen oder die Verwendung von zugeordneten benutzerdefinierten
    # "permissions" (siehe meta Objekt).
    user:
        methods:
            get: true
            post: true
            put: true
            delete: true
        # Fehlt "validProjections", sind automatisch alle Projektionen
        # erlaubt, wobei hier auch der GET-Parameter "projection="
        # weggelassen werden darf und somit alle Felder in der Ausgabe
        # zu finden sind.

    # Folgende Brechtigung wird angewandt, wenn der Zugriff über
    # den GET-Parameter "token=" oder die Header-Anweisung "token: "
    # angefragt wird.
    # "token" ist dabei die Markierung, dass es sich um einen Token
    # handelt und "${TOKEN}" ist der benutzerdefinierte Token selbst.
    # Dieser wird hier über eine Umgebungsvariable "TOKEN" injiziert,
    # die in "config.yml.env" definiert werden kann mit "TOKEN=...".
    token:${TOKEN}:
        methods:
            get: true
            post: true
            put: true
            delete: true

    # Alle Berechtigungs-Namen, die nicht "public", "user" oder "token:..."
    # heißen, sind benutzerdefinierte Berechtigungen, die Benutzern
    # zugeordnet werden können.
    # Eine mögliche Auflistung um Vorschläge im tibi-admin anzubieten,
    # werden im Top-Level meta-Objekt der "config.yml" unter "permissions"
    # definiert.
    pages:
        methods:
            get: true
            post: true
            put: true
            delete: true

# Projektionen der Daten werden via GET-Parameter "projection=..."
# referenziert.
# "projections" is ein Objekt, dass die Namen der Projektionen
# als Key führt.
projections:
    # dashboard = name der Projektion

    dashboard:
        # "select" definiert als Keys die Felder, die beim Abruf
        # dieser Projektion in den Ausgabe-Daten enthalten sind.
        # Felder werden über die Punkt-Notation referenziert.
        select:
        # keine auflistung von feldern, da alle felder ausgewählt werden
    details:
        # Alternativ kann "select" auch Auschlussregeln definieren.
        # Eine Mischung von Inkludieren und Auschluss ist NICHT
        # möglich.
        select:
            file: 0
    list:
        select:
            file: 1
            alt: 1
hooks:
    # Hooks für die Methode "get"
    #get:
    # "read"-Schritt wird ausgeführt, bevor die Daten von der Datenbank
    # gelesen werden.
    #read:
    #"type" ist derzeit immer "javascript"
    #  type: javascript
    #"file" zeigt auf die Datei mit dem Javascript-Code relativ zum
    #Ordner der "config.yml" Datei.
    #  file: hooks/democol/get_read.js
    #"return"-Schritt wird ausgeführt, bevor die gelesenen Daten über
    #HTTP übertragen werden.
    #return:
    #  type: javascript
    #  file: hooks/democol/get_return.js
    # Hooks für die Methode "post"
    post:
        # "bind" wird ausgeführt, bevor die übertragenen Daten in eine
        # Objekt-Struktur umgewandelt werden.
        # Der tibi-server erwarten nach diesem Schritt gültige JSON-Daten,
        # d.h. sollte es möglich gemacht werden, dass andere Daten übertragen
        # werden, sind diese in diesem Hook abzufangen und zu verarbeiten.

        #bind:
        #  type: javascript
        #  file: hooks/democol/post_bind.js
        # "validate" wird ausgeführt, bevor die Daten validiert werden.
        #validate:
        #  type: javascript
        #  file: hooks/democol/post_validate.js
        # "create" wird ausgeführt, bevor das Objekt/Dokument in der Datenbank
        # angelegt wird.
        #create:
        #  type: javascript
        #  file: hooks/democol/post_create.js
        # "return" wird ausgeführt, bevor die Serverantwort über HTTP
        # übertragen wird.
        return:
            type: javascript
            file: hooks/clear_cache.js
    put:
        #bind:
        #  type: javascript
        #  file: hooks/democol/put_bind.js
        #validate:
        #  type: javascript
        #  file: hooks/democol/put_validate.js
        # "bind" und "validate" habe die gleiche Bedeutung wie Hooks der
        # Methode "post".
        # "update" wird ausgeführt bevor das Objekt in der Datenbank
        # aktualisiert wird.
        #update:
        #   type: javascript
        #   file: hooks/democol/put_update.js
        # "return" wird auch hier vor der Serverantwort ausgeführt.
        return:
            type: javascript
            file: hooks/clear_cache.js

imageFilter: !include fields/imageFilter.yml

# "fields" stellen die Eigentliche Struktur der Kollektion dar.
# "fields" ist als Array angelegt um eine Standard-Sortierung
# im tibi-admin vorzugeben.
fields:
    # Das Einbinden von Feldern über extra Dateien bietet sich nur
    # an, wenn das jeweilige Feld mehrfach von dieser oder anderen
    # Kollektionen verwendet wird.
    # Auf die möglichen Definitionen wird im Kapitel "fields"
    # eingegangen.
    - !include fields/file.yml

    - 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

    - !include fields/manualSort.yml
