Add search field

This commit is contained in:
Cadence Ember 2025-04-02 17:40:14 +13:00
parent 26ea869285
commit 4744a22ef6
6 changed files with 39 additions and 20 deletions

View file

@ -32,12 +32,12 @@ const sqls = {
track_list: "SELECT * FROM track INNER JOIN item USING (account, item_id) {JOIN TAG} WHERE account = ? {WHERE} ORDER BY band_url, item_title COLLATE NOCASE, track_number"
}
function loadPreviews(locals, field, number, whereClause, account, filter_field, filter) {
function loadPreviews(locals, field, number, whereClause, account, filter_field, filter, filter_fuzzy) {
const params = [account, number]
let sql = `SELECT ${field}, item_url, item_art_url FROM (SELECT ${field}, item_url, item_art_url, row_number() OVER (PARTITION BY ${field} ORDER BY purchased DESC) AS row_number FROM item {JOIN TAG} WHERE account = ? {WHERE}) WHERE row_number <= ?`
sql = sql.replace("{WHERE}", whereClause)
if (whereClause) {
if (filter_field === "band_url") {
if (filter_field === "band_url" || filter_fuzzy) {
params.splice(1, 0, `%${filter}%`)
} else {
params.splice(1, 0, filter)
@ -66,7 +66,8 @@ const schema = {
arrange: z.enum(["album", "artist", "label", "tag", "track"]),
shape: z.enum(["grid", "list"]),
filter_field: z.enum(["band_name", "band_url", "item_id", "tag"]).optional(),
filter: z.string().optional()
filter: z.string().optional(),
filter_fuzzy: z.enum(["true"]).optional()
}),
params: z.object({
account: z.string()
@ -78,7 +79,7 @@ router.get("/:account/", defineEventHandler({
handler: async event => {
try {
var {account} = await getValidatedRouterParams(event, schema.params.parse)
var {arrange, shape, filter, filter_field} = await getValidatedQuery(event, schema.query.parse)
var {arrange, shape, filter, filter_field, filter_fuzzy} = await getValidatedQuery(event, schema.query.parse)
} catch (e) {
return sendRedirect(event, "?arrange=album&shape=grid", 302)
}
@ -93,7 +94,7 @@ router.get("/:account/", defineEventHandler({
let whereClause = ""
if (filter_field && filter) {
let operator = "="
if (filter_field === "band_url") {
if (filter_field === "band_url" || filter_fuzzy) {
operator = "LIKE"
params.push(`%${filter}%`)
} else {
@ -148,9 +149,9 @@ router.get("/:account/", defineEventHandler({
}
}
if (mode === "artist_grid") {
loadPreviews(locals, "band_name", 4, whereClause, account, filter_field, filter)
loadPreviews(locals, "band_name", 4, whereClause, account, filter_field, filter, filter_fuzzy)
} else if (mode === "label_grid") {
loadPreviews(locals, "band_url", 6, whereClause, account, filter_field, filter)
loadPreviews(locals, "band_url", 6, whereClause, account, filter_field, filter, filter_fuzzy)
} else if (arrange === "tag") {
locals.downloadManager = loadTags.downloadManager
locals.downloader = loadTags.downloadManager.check(account)