miniflux-legacy/assets/js/item.js
Mathias Kresin 1e1e35e38c IE: 'open original' doesn't open article
The 'open original' link marks the item as read but doesn't open the
article.

After double clicking one 'open original' link, all other
'open original' links open the article as expected. Sounds like the IE
blocks the 'popup' silenty here.

The following in #196 reported issues are fixed by the change as well:
- a middle click on an 'open original' link triggers the popup blocker
- original link opened via middle click is always a foreground tab
2015-01-03 23:02:59 +01:00

255 lines
8.2 KiB
JavaScript

Miniflux.Item = (function() {
function getItemID(item)
{
item_id = item.getAttribute("data-item-id");
return item_id;
}
function changeLabel(link)
{
if (link && link.hasAttribute("data-reverse-label")) {
var content = link.innerHTML;
link.innerHTML = link.getAttribute("data-reverse-label");
link.setAttribute("data-reverse-label", content);
}
}
function changeBookmarkLabel(item)
{
var link = item.querySelector("a.bookmark");
changeLabel(link);
}
function changeStatusLabel(item)
{
var link = item.querySelector("a.mark");
changeLabel(link);
}
function showItemAsRead(item)
{
if (item.getAttribute("data-hide")) {
hideItem(item);
}
else {
item.setAttribute("data-item-status", "read");
changeStatusLabel(item);
// Change action
var link = item.querySelector("a.mark");
if (link) link.setAttribute("data-action", "mark-unread");
}
}
function showItemAsUnread(item)
{
if (item.getAttribute("data-hide")) {
hideItem(item);
}
else {
item.setAttribute("data-item-status", "unread");
changeStatusLabel(item);
// Change action
var link = item.querySelector("a.mark");
if (link) link.setAttribute("data-action", "mark-read");
}
}
function hideItem(item)
{
if (Miniflux.Event.lastEventType !== "mouse") {
Miniflux.Nav.SelectNextItem();
}
item.parentNode.removeChild(item);
var pageCounter = document.getElementById("page-counter");
if (pageCounter) {
var sectionElement = document.querySelector("section.page");
var counter = parseInt(pageCounter.textContent, 10) - 1;
var articles = document.getElementsByTagName("article");
if (counter === 0 || articles.length === 0) {
window.location = location.href;
}
pageCounter.textContent = counter;
switch (sectionElement.getAttribute("data-item-page")) {
case "unread":
document.title = "Miniflux (" + counter + ")";
document.getElementById("nav-counter").textContent = counter;
break;
case "feed-items":
document.title = "(" + counter + ") " + pageCounter.parentNode.firstChild.nodeValue;
break;
default:
document.title = pageCounter.parentNode.firstChild.nodeValue + " (" + counter + ")";
}
}
}
function markAsRead(item)
{
var item_id = getItemID(item);
var request = new XMLHttpRequest();
request.onload = function() {
if (Miniflux.Nav.IsListing()) showItemAsRead(item);
};
request.open("POST", "?action=mark-item-read&id=" + item_id, true);
request.send();
}
function markAsUnread(item)
{
var item_id = getItemID(item);
var request = new XMLHttpRequest();
request.onload = function() {
if (Miniflux.Nav.IsListing()) showItemAsUnread(item);
};
request.open("POST", "?action=mark-item-unread&id=" + item_id, true);
request.send();
}
function markAsRemoved(item)
{
var item_id = getItemID(item);
var request = new XMLHttpRequest();
request.onload = function() {
if (Miniflux.Nav.IsListing()) hideItem(item);
};
request.open("POST", "?action=mark-item-removed&id=" + item_id, true);
request.send();
}
return {
MarkAsRead: markAsRead,
MarkAsUnread: markAsUnread,
MarkAsRemoved: markAsRemoved,
SwitchBookmark: function(item) {
var item_id = getItemID(item);
var value = item.getAttribute("data-item-bookmark") === "1" ? "0" : "1";
var request = new XMLHttpRequest();
request.onload = function() {
var sectionElement = document.querySelector("section.page");
if (Miniflux.Nav.IsListing() && sectionElement.getAttribute("data-item-page") === "bookmarks") {
hideItem(item);
}
else {
item.setAttribute("data-item-bookmark", value);
if (Miniflux.Nav.IsListing()) {
changeBookmarkLabel(item);
}
else {
var link = item.querySelector("a.bookmark-icon");
if (link && link.hasAttribute("data-reverse-title")) {
var title = link.getAttribute("title");
link.setAttribute("title", link.getAttribute("data-reverse-title"));
link.setAttribute("data-reverse-title", title);
}
}
}
};
request.open("POST", "?action=bookmark&id=" + item_id + "&value=" + value, true);
request.send();
},
SwitchStatus: function(item) {
var status = item.getAttribute("data-item-status");
if (status === "read") {
markAsUnread(item);
}
else if (status === "unread") {
markAsRead(item);
}
},
Show: function(item) {
var link = item.querySelector("a.show");
if (link) link.click();
},
OpenOriginal: function(item) {
var link = item.querySelector("a.original");
if (link) {
if (item.getAttribute("data-item-status") === "unread") markAsRead(item);
link.removeAttribute("data-action");
if (Miniflux.Event.lastEventType !== "mouse") {
link.click();
}
}
},
DownloadContent: function(item) {
var container = document.getElementById("download-item");
if (! container) return;
container.innerHTML = " " + container.getAttribute("data-before-message");
container.className = "loading-icon";
var request = new XMLHttpRequest();
request.onload = function() {
var response = JSON.parse(request.responseText);
container.className = "";
if (response.result) {
var content = document.getElementById("item-content");
if (content) content.innerHTML = response.content;
container.innerHTML = container.getAttribute("data-after-message");
}
else {
container.innerHTML = container.getAttribute("data-failure-message");
}
};
var item_id = getItemID(item);
request.open("POST", "?action=download-item&id=" + item_id, true);
request.send();
},
MarkListingAsRead: function(redirect) {
var articles = document.getElementsByTagName("article");
var listing = [];
for (var i = 0, ilen = articles.length; i < ilen; i++) {
listing.push(getItemID(articles[i]));
}
var request = new XMLHttpRequest();
request.onload = function() {
window.location.href = redirect;
};
request.open("POST", "?action=mark-items-as-read", true);
request.send(JSON.stringify(listing));
},
ToggleRTLMode: function() {
var tags = [
"#current-item h1",
"#item-content",
"#listing #current-item h2",
"#listing #current-item .preview"
];
for (var i = 0; i < tags.length; i++) {
var tag = document.querySelector(tags[i]);
if (tag) {
tag.dir = tag.dir == "" ? "rtl" : "";
}
}
}
};
})();