From 2d5a8bae7d037ed7b4c90e7b671a56fcbecc86d4 Mon Sep 17 00:00:00 2001 From: pa Date: Thu, 12 Feb 2026 13:25:44 +0900 Subject: [PATCH] feat: add feed range date search --- src/localization/en.json | 4 ++- src/service/database/feed.js | 27 +++++++++++---- src/stores/feed.js | 40 ++++++++++++++++------ src/views/Feed/Feed.vue | 65 +++++++++++++++++++++++++++++++++++- 4 files changed, 117 insertions(+), 19 deletions(-) diff --git a/src/localization/en.json b/src/localization/en.json index d18b9c65..79c2cc99 100644 --- a/src/localization/en.json +++ b/src/localization/en.json @@ -5,7 +5,9 @@ "no_data": "No data", "no_matching_records": "No matching records", "actions": { - "open": "Open" + "open": "Open", + "confirm": "Confirm", + "clear": "Clear" }, "time_units": { "y": "y", diff --git a/src/service/database/feed.js b/src/service/database/feed.js index c2763b80..8d9e613a 100644 --- a/src/service/database/feed.js +++ b/src/service/database/feed.js @@ -87,7 +87,9 @@ const feed = { search, filters, vipList, - maxEntries = dbVars.searchTableSize + maxEntries = dbVars.searchTableSize, + dateFrom = '', + dateTo = '' ) { if (search.startsWith('wrld_') || search.startsWith('grp_')) { return this.getFeedByInstanceId(search, filters, vipList); @@ -103,6 +105,13 @@ const feed = { }); vipQuery = `AND user_id IN (${vipPlaceholders.join(', ')})`; } + let dateQuery = ''; + if (dateFrom) { + dateQuery += 'AND created_at >= @dateFrom '; + } + if (dateTo) { + dateQuery += 'AND created_at <= @dateTo '; + } let gps = true; let status = true; let bio = true; @@ -169,17 +178,17 @@ const feed = { ].join(', '); if (gps) { selects.push( - `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'GPS' AS type, location, world_name, previous_location, time, group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, NULL AS bio, NULL AS previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_gps WHERE (display_name LIKE @searchLike OR world_name LIKE @searchLike OR group_name LIKE @searchLike) ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` + `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'GPS' AS type, location, world_name, previous_location, time, group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, NULL AS bio, NULL AS previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_gps WHERE (display_name LIKE @searchLike OR world_name LIKE @searchLike OR group_name LIKE @searchLike) ${dateQuery} ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` ); } if (status) { selects.push( - `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'Status' AS type, NULL AS location, NULL AS world_name, NULL AS previous_location, NULL AS time, NULL AS group_name, status, status_description, previous_status, previous_status_description, NULL AS bio, NULL AS previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_status WHERE (display_name LIKE @searchLike OR status LIKE @searchLike OR status_description LIKE @searchLike) ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` + `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'Status' AS type, NULL AS location, NULL AS world_name, NULL AS previous_location, NULL AS time, NULL AS group_name, status, status_description, previous_status, previous_status_description, NULL AS bio, NULL AS previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_status WHERE (display_name LIKE @searchLike OR status LIKE @searchLike OR status_description LIKE @searchLike) ${dateQuery} ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` ); } if (bio) { selects.push( - `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'Bio' AS type, NULL AS location, NULL AS world_name, NULL AS previous_location, NULL AS time, NULL AS group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, bio, previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_bio WHERE (display_name LIKE @searchLike OR bio LIKE @searchLike) ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` + `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'Bio' AS type, NULL AS location, NULL AS world_name, NULL AS previous_location, NULL AS time, NULL AS group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, bio, previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_bio WHERE (display_name LIKE @searchLike OR bio LIKE @searchLike) ${dateQuery} ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` ); } if (avatar) { @@ -190,7 +199,7 @@ const feed = { avatarQuery = 'AND user_id != owner_id'; } selects.push( - `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'Avatar' AS type, NULL AS location, NULL AS world_name, NULL AS previous_location, NULL AS time, NULL AS group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, NULL AS bio, NULL AS previous_bio, owner_id, avatar_name, current_avatar_image_url, current_avatar_thumbnail_image_url, previous_current_avatar_image_url, previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_avatar WHERE (display_name LIKE @searchLike OR avatar_name LIKE @searchLike) ${avatarQuery} ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` + `SELECT * FROM (SELECT id, created_at, user_id, display_name, 'Avatar' AS type, NULL AS location, NULL AS world_name, NULL AS previous_location, NULL AS time, NULL AS group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, NULL AS bio, NULL AS previous_bio, owner_id, avatar_name, current_avatar_image_url, current_avatar_thumbnail_image_url, previous_current_avatar_image_url, previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_avatar WHERE (display_name LIKE @searchLike OR avatar_name LIKE @searchLike) ${avatarQuery} ${dateQuery} ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` ); } if (online || offline) { @@ -203,7 +212,7 @@ const feed = { } } selects.push( - `SELECT * FROM (SELECT id, created_at, user_id, display_name, type, location, world_name, NULL AS previous_location, time, group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, NULL AS bio, NULL AS previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_online_offline WHERE (display_name LIKE @searchLike OR world_name LIKE @searchLike OR group_name LIKE @searchLike) ${query} ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` + `SELECT * FROM (SELECT id, created_at, user_id, display_name, type, location, world_name, NULL AS previous_location, time, group_name, NULL AS status, NULL AS status_description, NULL AS previous_status, NULL AS previous_status_description, NULL AS bio, NULL AS previous_bio, NULL AS owner_id, NULL AS avatar_name, NULL AS current_avatar_image_url, NULL AS current_avatar_thumbnail_image_url, NULL AS previous_current_avatar_image_url, NULL AS previous_current_avatar_thumbnail_image_url FROM ${dbVars.userPrefix}_feed_online_offline WHERE (display_name LIKE @searchLike OR world_name LIKE @searchLike OR group_name LIKE @searchLike) ${query} ${dateQuery} ${vipQuery} ORDER BY created_at DESC, id DESC LIMIT @perTable)` ); } if (selects.length === 0) { @@ -216,6 +225,12 @@ const feed = { '@perTable': maxEntries, ...vipArgs }; + if (dateFrom) { + args['@dateFrom'] = dateFrom; + } + if (dateTo) { + args['@dateTo'] = dateTo; + } await sqliteService.execute( (dbRow) => { const type = dbRow[4]; diff --git a/src/stores/feed.js b/src/stores/feed.js index 788d8763..64f7fefd 100644 --- a/src/stores/feed.js +++ b/src/stores/feed.js @@ -19,6 +19,8 @@ export const useFeedStore = defineStore('Feed', () => { const feedTableData = shallowRef([]); const feedTable = ref({ search: '', + dateFrom: '', + dateTo: '', vip: false, loading: false, filter: [], @@ -146,17 +148,21 @@ export const useFeedStore = defineStore('Feed', () => { vipList = Array.from(friendStore.localFavoriteFriends.values()); } const search = feedTable.value.search.trim(); - const rows = search - ? await database.searchFeedDatabase( - search, - feedTable.value.filter, - vipList, - vrcxStore.searchLimit - ) - : await database.lookupFeedDatabase( - feedTable.value.filter, - vipList - ); + const { dateFrom, dateTo } = feedTable.value; + const rows = + search || dateFrom || dateTo + ? await database.searchFeedDatabase( + search, + feedTable.value.filter, + vipList, + vrcxStore.searchLimit, + dateFrom, + dateTo + ) + : await database.lookupFeedDatabase( + feedTable.value.filter, + vipList + ); feedTableData.value = []; feedTableData.value = [...feedTableData.value, ...rows]; } finally { @@ -182,6 +188,18 @@ export const useFeedStore = defineStore('Feed', () => { if (!feedSearch(feed)) { return; } + if ( + feedTable.value.dateFrom && + feed.created_at < feedTable.value.dateFrom + ) { + return; + } + if ( + feedTable.value.dateTo && + feed.created_at > feedTable.value.dateTo + ) { + return; + } feedTableData.value = [feed, ...feedTableData.value]; sweepFeed(); } diff --git a/src/views/Feed/Feed.vue b/src/views/Feed/Feed.vue index 99982c1b..29cd9494 100644 --- a/src/views/Feed/Feed.vue +++ b/src/views/Feed/Feed.vue @@ -35,6 +35,32 @@ style="flex: 0.4; margin-left: 10px" @keyup.enter="feedTableLookup" @change="feedTableLookup" /> + + + + + + +
+ + +
+
+
@@ -43,13 +69,20 @@