Uncategorized feeds
This commit is contained in:
parent
90c873314b
commit
92c797d7d9
21
src/demo.rs
21
src/demo.rs
@ -4,30 +4,35 @@ use crate::user::User;
|
|||||||
struct DemoFeed {
|
struct DemoFeed {
|
||||||
name: &'static str,
|
name: &'static str,
|
||||||
url: &'static str,
|
url: &'static str,
|
||||||
category: &'static str,
|
category: Option<&'static str>,
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEMO_FEEDS: [DemoFeed; 4] = [
|
const DEMO_FEEDS: [DemoFeed; 5] = [
|
||||||
DemoFeed {
|
DemoFeed {
|
||||||
name: "XKCD",
|
name: "XKCD",
|
||||||
url: "https://xkcd.com/atom.xml",
|
url: "https://xkcd.com/atom.xml",
|
||||||
category: "Webcomic",
|
category: Some("Webcomic"),
|
||||||
},
|
},
|
||||||
DemoFeed {
|
DemoFeed {
|
||||||
name: "Isidore & Friends",
|
name: "Isidore & Friends",
|
||||||
url: "https://isidore.webcomic.ws/rss/",
|
url: "https://isidore.webcomic.ws/rss/",
|
||||||
category: "Webcomic",
|
category: Some("Webcomic"),
|
||||||
},
|
},
|
||||||
DemoFeed {
|
DemoFeed {
|
||||||
name: "Astral Codex Ten",
|
name: "Astral Codex Ten",
|
||||||
url: "https://www.astralcodexten.com/feed",
|
url: "https://www.astralcodexten.com/feed",
|
||||||
category: "Substack",
|
category: Some("Substack"),
|
||||||
},
|
},
|
||||||
DemoFeed {
|
DemoFeed {
|
||||||
name: "BBC News",
|
name: "BBC News",
|
||||||
url: "https://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml",
|
url: "https://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml",
|
||||||
category: "News",
|
category: Some("News"),
|
||||||
},
|
},
|
||||||
|
DemoFeed {
|
||||||
|
name: "Astronomy Picture of the Day (APOD)",
|
||||||
|
url: "https://apod.nasa.gov/apod.rss",
|
||||||
|
category: None,
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
pub async fn setup_demo_data(pool: &sqlx::SqlitePool) {
|
pub async fn setup_demo_data(pool: &sqlx::SqlitePool) {
|
||||||
@ -61,7 +66,9 @@ pub async fn setup_demo_data(pool: &sqlx::SqlitePool) {
|
|||||||
demo_feed.url.parse().unwrap(),
|
demo_feed.url.parse().unwrap(),
|
||||||
demo.id,
|
demo.id,
|
||||||
);
|
);
|
||||||
feed.categorization = vec![demo_feed.category.to_string()];
|
if let Some(category) = demo_feed.category {
|
||||||
|
feed.categorization = vec![category.to_string()];
|
||||||
|
}
|
||||||
|
|
||||||
feed.write_to_database(pool)
|
feed.write_to_database(pool)
|
||||||
.await
|
.await
|
||||||
|
@ -618,3 +618,16 @@ button:disabled {
|
|||||||
.user-menu-item#logoutButton:hover {
|
.user-menu-item#logoutButton:hover {
|
||||||
background-color: rgba(244, 63, 63, 0.1);
|
background-color: rgba(244, 63, 63, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.feed-category {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feed-category-header {
|
||||||
|
color: var(--primary-red);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
margin: 0;
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
}
|
||||||
|
@ -150,6 +150,7 @@ async function handleFeeds() {
|
|||||||
const feedList = document.getElementById('feedList');
|
const feedList = document.getElementById('feedList');
|
||||||
|
|
||||||
if (feeds) {
|
if (feeds) {
|
||||||
|
console.log('Loaded feeds:', feeds);
|
||||||
feedList.innerHTML = '';
|
feedList.innerHTML = '';
|
||||||
|
|
||||||
if (feeds.length === 0) {
|
if (feeds.length === 0) {
|
||||||
@ -158,8 +159,43 @@ async function handleFeeds() {
|
|||||||
emptyMessage.textContent = 'No feeds added yet';
|
emptyMessage.textContent = 'No feeds added yet';
|
||||||
feedList.appendChild(emptyMessage);
|
feedList.appendChild(emptyMessage);
|
||||||
} else {
|
} else {
|
||||||
|
// Group feeds by category
|
||||||
|
const feedsByCategory = {};
|
||||||
|
const uncategorizedFeeds = [];
|
||||||
|
|
||||||
feeds.forEach(feed => {
|
feeds.forEach(feed => {
|
||||||
feedList.appendChild(openFeed(feed));
|
const category = feed.categorization.length > 0 ? feed.categorization[0] : null;
|
||||||
|
if (category) {
|
||||||
|
if (!feedsByCategory[category]) {
|
||||||
|
feedsByCategory[category] = [];
|
||||||
|
}
|
||||||
|
feedsByCategory[category].push(feed);
|
||||||
|
} else {
|
||||||
|
uncategorizedFeeds.push(feed);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sort categories alphabetically, but keep "Uncategorized" at the end
|
||||||
|
const sortedCategories = Object.keys(feedsByCategory).sort((a, b) => a.localeCompare(b));
|
||||||
|
sortedCategories.push("<No Category>");
|
||||||
|
feedsByCategory["<No Category>"] = uncategorizedFeeds;
|
||||||
|
|
||||||
|
// Create category sections
|
||||||
|
sortedCategories.forEach(category => {
|
||||||
|
const categorySection = document.createElement('div');
|
||||||
|
categorySection.className = 'feed-category';
|
||||||
|
|
||||||
|
const categoryHeader = document.createElement('h3');
|
||||||
|
categoryHeader.className = 'feed-category-header';
|
||||||
|
categoryHeader.textContent = category;
|
||||||
|
categorySection.appendChild(categoryHeader);
|
||||||
|
|
||||||
|
// Add feeds for this category
|
||||||
|
feedsByCategory[category].forEach(feed => {
|
||||||
|
categorySection.appendChild(openFeed(feed));
|
||||||
|
});
|
||||||
|
|
||||||
|
feedList.appendChild(categorySection);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user