WebUI: add headers to RSS entry viewer

Introduced Author, 'Open link' headers.
Note that the Author and 'Open link' are not mandatory fields in RSS/Atom feeds. So these
headers will only be displayed when the feed includes them.

PR #22503.
This commit is contained in:
Chocobo1 2025-04-08 15:47:47 +08:00 committed by GitHub
commit f0b9a17566
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -60,12 +60,15 @@
#rssTorrentDetailsName { #rssTorrentDetailsName {
flex-shrink: 0; flex-shrink: 0;
font-weight: bold;
background-color: var(--color-background-blue); background-color: var(--color-background-blue);
padding: 0; padding: 0;
color: var(--color-text-white); color: var(--color-text-white);
} }
#rssTorrentDetailsDate { #rssTorrentDetailsAuthor,
#rssTorrentDetailsDate,
#rssTorrentDetailsLink {
flex-shrink: 1; flex-shrink: 1;
background-color: var(--color-background-default); background-color: var(--color-background-default);
} }
@ -429,33 +432,72 @@
markArticleAsRead(pathByFeedId.get(feedUid), articleID); markArticleAsRead(pathByFeedId.get(feedUid), articleID);
clearDetails(); clearDetails();
const article = feedData[feedUid].filter((article) => article.id === articleID)[0]; const article = feedData[feedUid].find((article) => (article.id === articleID));
if (article) { if (article === undefined)
$("rssDetailsView").append((() => { return;
const torrentName = document.createElement("p");
torrentName.textContent = article.title;
torrentName.id = "rssTorrentDetailsName";
return torrentName;
})());
$("rssDetailsView").append((() => {
const torrentDate = document.createElement("div");
torrentDate.id = "rssTorrentDetailsDate";
const torrentDateDesc = document.createElement("b"); const detailsView = document.getElementById("rssDetailsView");
torrentDateDesc.textContent = "QBT_TR(Date: )QBT_TR[CONTEXT=RSSWidget]";
torrentDate.append(torrentDateDesc);
const torrentDateData = document.createElement("span"); const articleTitle = article.title;
torrentDateData.textContent = new Date(article.date).toLocaleString(); if (articleTitle !== undefined) {
torrentDate.append(torrentDateData); const torrentName = document.createElement("p");
torrentName.textContent = articleTitle;
torrentName.id = "rssTorrentDetailsName";
return torrentDate; detailsView.append(torrentName);
})());
// Place in iframe with sandbox attribute to prevent js execution
const torrentDescription = document.createRange().createContextualFragment('<iframe sandbox id="rssDescription"></iframe>');
$("rssDetailsView").append(torrentDescription);
document.getElementById("rssDescription").srcdoc = `<html><head><link rel="stylesheet" type="text/css" href="css/style.css"></head><body>${article.description}</body></html>`;
} }
const articleDate = article.date;
if (articleDate !== undefined) {
const torrentDate = document.createElement("div");
torrentDate.id = "rssTorrentDetailsDate";
const torrentDateDesc = document.createElement("b");
torrentDateDesc.textContent = "QBT_TR(Date: )QBT_TR[CONTEXT=RSSWidget]";
torrentDate.append(torrentDateDesc);
const torrentDateData = document.createElement("span");
torrentDateData.textContent = new Date(articleDate).toLocaleString();
torrentDate.append(torrentDateData);
detailsView.append(torrentDate);
}
const articleAuthor = article.author;
if (articleAuthor !== undefined) {
const divElement = document.createElement("div");
divElement.id = "rssTorrentDetailsAuthor";
const header = document.createElement("b");
header.textContent = "QBT_TR(Author: )QBT_TR[CONTEXT=RSSWidget]";
divElement.append(header);
const span = document.createElement("span");
span.textContent = articleAuthor;
divElement.append(span);
detailsView.append(divElement);
}
const articleLink = article.link;
if (articleLink !== undefined) {
const divElement = document.createElement("div");
divElement.id = "rssTorrentDetailsLink";
const anchorElement = document.createElement("a");
anchorElement.href = articleLink;
anchorElement.textContent = "QBT_TR(Open link)QBT_TR[CONTEXT=RSSWidget]";
anchorElement.target = "_blank";
anchorElement.style = "font-weight: bold;";
divElement.append(anchorElement);
detailsView.append(divElement);
}
// Place in iframe with sandbox attribute to prevent js execution
const torrentDescription = document.createRange().createContextualFragment('<iframe sandbox id="rssDescription"></iframe>');
$("rssDetailsView").append(torrentDescription);
document.getElementById("rssDescription").srcdoc = `<html><head><link rel="stylesheet" type="text/css" href="css/style.css"></head><body>${article.description}</body></html>`;
}; };
const updateRssFeedList = () => { const updateRssFeedList = () => {