Inline-PDF-Vorschauen

Ausgezeichnet! Danke @Johani. Ich kann bestätigen, dass es jetzt in allen drei Browsern funktioniert.

4 „Gefällt mir“

Fantastisch – das sind solide Verbesserungen, die eindeutig viel Arbeit erfordert haben. Vielen Dank, dass ihr uns etwas nervige Mitverschwörer aus der Welt der Selbsthosting-Lösungen angehört habt!

Funktioniert die Komponente jetzt mit S3-Uploads?

3 „Gefällt mir“

Ich habe es noch nicht getestet, aber es sollte funktionieren, wenn dein Bucket korrekt konfiguriert ist. Diese Komponente stellt eine Anfrage, um das PDF zu laden.

Solche in JavaScript getätigten Anfragen werden blockiert, wenn der Ursprung keinen Zugriff auf die Datei hat. In diesem Fall tritt ein CORS-Fehler auf. Wenn du die Konsole prüfst, siehst du wahrscheinlich etwas Ähnliches wie hier:

image

Die Komponente kann daran wenig ändern. Dies muss alles in deiner S3-Konfiguration geregelt werden. Der Ursprung – deine Discourse-Domain – muss berechtigt sein, solche Anfragen zu stellen, um CORS-Probleme zu vermeiden.

9 „Gefällt mir“

Danke! Ich werde mich gleich wieder mutig ins S3 stürzen.

Ein weiterer Vorschlag: Tab, wenn ein Leerzeichen vor dem Dateinamen steht

Mein Wunsch ist es, dass PDFs standardmäßig inline angezeigt werden und sich in einem neuen Tab öffnen, wenn ein Leerzeichen im Dateinamen enthalten ist. Das gibt Autoren die Möglichkeit, pro PDF zwischen Inline-Anzeige und Tab zu wählen, statt pro Komponente.

Vielleicht sollte die Komponenteneinstellung stattdessen lauten: „Welches Standardverhalten wünschen Sie?", und wenn ein Leerzeichen eingefügt wird, erfolgt die andere Option.

Alternativ könnte man auch abfragen, was das Leerzeichen bewirken soll (Inline / Tab / Download).

2 „Gefällt mir“

Aargh! Chrome zeigt wieder nur graue Kästen an. FF und Safari sind in Ordnung.

3 „Gefällt mir“

Sendet diese Theme-Komponente die PDF an einen externen Interpreter?
Ich habe „Secure Media" aktiviert, da ich verhindern möchte, dass Dateien von einem externen Dienst geladen werden.

1 „Gefällt mir“

Ich habe herausgefunden, dass dies auf den folgenden Code zurückzuführen ist:

<a class="attachment pdf-attachment" href="...pdf">doc.pdf
  <iframe src="blob:...\" height="500" loading="lazy" class="pdf-preview">
  </iframe>
</a>

Wenn Sie den obigen Code durch den folgenden ersetzen:

<a class="attachment pdf-attachment" href="...pdf">doc.pdf</a>
<iframe src="blob:...\" height="500" loading="lazy" class="pdf-preview"></iframe>

funktioniert es.
Ich bin mir jedoch nicht sicher, wie man dies im bestehenden Code beheben kann.

5 „Gefällt mir“

@Johani
Der Fehler bezieht sich auf den folgenden Code, Zeile 34 bis 41:

        const setUpPreviewType = (pdf) => {
          if (previewMode === "Inline") {
            const preview = createPreviewElement();
            pdf.classList.add("pdf-attachment");
            pdf.append(preview);

            return preview;
          }
4 „Gefällt mir“

Diese Lösung scheint für alle Browser zu funktionieren.

4 „Gefällt mir“

pdf.parentNode.append(preview); scheint zu funktionieren (aber im Fall mehrerer PDFs werden die Vorschauen unter allen Links angezeigt, nicht unter jedem einzelnen).

3 „Gefällt mir“

Aber wenn der parentNode der Absatz ist, sollte dies kein Problem sein, da sich der Link und das iframe innerhalb des Absatz-Tags befinden.

Um dieses Problem zu umgehen, können Sie einfach eine neue Zeile zwischen die Anhänge einfügen:

[doc1.pdf|attachment](...)

[doc2.pdf|attachment](...)

Mit Ihrer Lösung wird die PDF-Vorschau auch in Chrome korrekt angezeigt.

3 „Gefällt mir“

Ich habe gerade einige Änderungen gepusht.

Ja, das ergibt mehr Sinn, als die Datei einfach zu ignorieren. So wird es nach dem Update funktionieren:

  1. Wenn du die Einstellung auf „Neuer Tab" setzt, fügt die Komponente keine Vorschau in Beiträgen ein. Wenn du auf den Link klickst, öffnet sich das PDF in einem neuen Tab.

  2. Wenn du die Einstellung auf „Inline" setzt, fügt die Komponente standardmäßig für alle PDFs eine Vorschau im Beitrag ein. Wenn der Dateiname mit einem Leerzeichen beginnt, wird keine Vorschau eingefügt, aber beim Klicken auf den Link öffnet sich das PDF in einem neuen Tab, anstatt heruntergeladen zu werden.

    Alle nativen Browser-PDF-Viewer verfügen über eine Download-Schaltfläche, sodass du sie dort herunterladen kannst, falls gewünscht.

Danke für das Debugging und die Details @sharewoodsDavid. Es stellt sich heraus, dass <iframe>-Tags innerhalb von <a>-Tags die Validierung nicht bestehen.

Das Element iframe darf nicht als Nachkomme des Elements a erscheinen.

Deine Lösung ist also genau richtig. Ich habe diese Änderung im oben genannten PR vorgenommen.

Wenn du ein Element nach einem anderen Element hinzufügen möchtest, kannst du after() wie folgt verwenden:

someElement.after(newElement)

Wenn du ein Element vor einem anderen Element hinzufügen möchtest, kannst du insertBefore() wie folgt verwenden:

// parentNode: der Parent des Elements, vor das du einfügen möchtest
// newNode: das Element, das du einfügen möchtest
// referenceNode: das Element, vor das du einfügen möchtest

parentNode.insertBefore(newNode, referenceNode)

Nein. Es sind keine externen Dienste beteiligt. So funktioniert es:

  1. Ein Benutzer besucht einen Beitrag mit einem PDF-Anhang.
  2. Der Browser des Benutzers fordert den Anhang an.
  3. Der Server sendet ihn an den Browser des Benutzers.
  4. Der Browser des Benutzers liest ihn mit dem integrierten PDF-Viewer.

Das ist alles.

7 „Gefällt mir“

Perfekt – danke @Johani. Bestätigt, dass es in Chrome, FF und Safari funktioniert. :+1:

3 „Gefällt mir“

Das ist großartig! Vielen Dank. Ich habe es installiert und es funktioniert! Genau das, wonach ich gesucht habe.

5 „Gefällt mir“

Wird dies rückwirkend auf bereits im Forum gepostete PDFs angewendet?

2 „Gefällt mir“

Ich habe gerade auf meiner Testseite getestet, und es scheint, dass es auch für die vorhandenen funktioniert, ohne dass „HTML neu erstellt“ werden muss. :+1:

6 „Gefällt mir“

Ich habe letzte Woche ein Update in der Quelle gesehen, daher gehe ich davon aus, dass diese Komponente funktioniert. Aber leider hat sie bei mir in keinem Browser funktioniert. Liegt es vielleicht an den sicheren “Medieneinstellungen”? Bin ich der Einzige, der das nicht zum Laufen bringt, oder ist das ein häufiges Problem?

2 „Gefällt mir“

Hat bei mir auch nie funktioniert.

2 „Gefällt mir“

Die Komponente funktioniert gut. Welches Problem/welchen Fehler sehen Sie?

3 „Gefällt mir“

Ich habe nur einen gewöhnlichen Download-Link für eine Datei gesehen. Ich habe nicht weiter gegraben, weil es für mich nicht so wichtig war, es wäre schön zu haben, nichts weiter. Also, tut mir leid, aber ich kann das nicht weiter aufhellen.

Bearbeiten

Nun, ich habe es noch einmal überprüft – das letzte Mal war vor einiger Zeit.

DiscourseHub zeigt dies (iPad) und keine Fehler in den Protokollen von Discourse:

Aber als ich versuchte, Safari zu benutzen, zeigte es die allererste Seite, aber nicht die zweite.

1 „Gefällt mir“