feat: tag bookmarks and sites, and browse the library by tag

This commit is contained in:
randogoth 2026-10-11 13:32:00 +03:00
parent 5cd053c8a9
commit b0b86ef5b1
13 changed files with 445 additions and 21 deletions

View file

@ -3,6 +3,7 @@ import '../../l10n/strings.dart';
import '../../mews/document.dart';
import 'mews_urls.dart';
import 'page_blocks.dart';
import 'tags_page.dart';
Future<MewsPage> buildSubscriptionsPage(
Uri url, {
@ -10,7 +11,10 @@ Future<MewsPage> buildSubscriptionsPage(
required Strings strings,
}) async {
final query = url.queryParameters['q'] ?? '';
final sites = await db.allSubscriptions(query: query);
final tag = url.queryParameters['tag'];
final sites = await db.allSubscriptions(query: query, tag: tag);
final tags = await db.tagsOfMany(
TagKind.subscription, sites.map((s) => s.url).toList());
final unread = await db.unreadCounts();
final title = strings.t('subscriptions-title');
@ -19,16 +23,30 @@ Future<MewsPage> buildSubscriptionsPage(
title: title,
body: [
...chrome(title: title, current: url, strings: strings),
searchForm(
textForm(
action: MewsUrls.subscriptions,
label: strings.t('subscriptions-search-label'),
submitLabel: strings.t('action-search'),
query: query,
field: 'q',
value: query,
),
if (query.isNotEmpty)
ParagraphBlock([
ParagraphBlock([
if (query.isNotEmpty) ...[
MewsLink(MewsUrls.page(url, {'q': null}),
[MewsText(strings.t('action-clear-search'))]),
const MewsText(actionSeparator),
],
if (tag != null && tag.isNotEmpty) ...[
MewsLink(MewsUrls.page(url, {'tag': null}),
[MewsText(strings.t('subscriptions-show-all'))]),
const MewsText(actionSeparator),
],
MewsLink(MewsUrls.tags, [MewsText(strings.t('nav-tags'))]),
]),
if (tag != null && tag.isNotEmpty)
ParagraphBlock([
MewsEmphasis(EmphasisStyle.emphasis,
[MewsText(strings.t('subscriptions-tagged', {'tag': tag}))]),
]),
if (sites.isEmpty)
ParagraphBlock([
@ -43,12 +61,18 @@ Future<MewsPage> buildSubscriptionsPage(
href: site.url,
label: site.title ?? site.url,
note: _checkedNote(strings, site, unread[site.url] ?? 0),
chips: [
for (final tag in tags[site.url] ?? const <String>[])
action(MewsUrls.page(url, {'tag': tag, 'q': null}), tag),
],
actions: [
action(
MewsUrls.action('refresh-subscription', {'url': site.url}),
strings.t('action-refresh')),
action(MewsUrls.action('unsubscribe', {'url': site.url}),
strings.t('action-unsubscribe')),
action(tagsOfItemUrl(TagKind.subscription, site.url),
strings.t('action-edit-tags')),
],
),
]),