adds lists search and filter
This commit is contained in:
@@ -1,18 +1,22 @@
|
||||
import { List, type ListFilter } from "$lib/models/list";
|
||||
import type { Trail } from "$lib/models/trail";
|
||||
import { pb } from "$lib/pocketbase";
|
||||
import { getFileURL } from "$lib/util/file_util";
|
||||
import { ClientResponseError } from "pocketbase";
|
||||
import { writable, type Writable } from "svelte/store";
|
||||
import { ClientResponseError, type ListResult } from "pocketbase";
|
||||
import { get, writable, type Writable } from "svelte/store";
|
||||
import { fetchGPX } from "./trail_store";
|
||||
|
||||
export const lists: Writable<List[]> = writable([])
|
||||
let lists: List[] = []
|
||||
export const list: Writable<List | null> = writable(null)
|
||||
export const listTrail: Writable<Trail | null> = writable(null);
|
||||
|
||||
export async function lists_index(filter?: ListFilter, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch) {
|
||||
export async function lists_index(filter?: ListFilter, page: number = 1, perPage: number = 5, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch) {
|
||||
const filterText = filter ? buildFilterText(filter) : ""
|
||||
|
||||
const r = await f('/api/v1/list?' + new URLSearchParams({
|
||||
sort: `${filter?.sortOrder ?? "-"}${filter?.sort ?? "name"}`,
|
||||
"per-page": perPage.toString(),
|
||||
page: page.toString(),
|
||||
filter: filterText
|
||||
}), {
|
||||
method: 'GET',
|
||||
})
|
||||
@@ -21,15 +25,13 @@ export async function lists_index(filter?: ListFilter, f: (url: RequestInfo | UR
|
||||
throw new ClientResponseError(await r.json())
|
||||
}
|
||||
|
||||
const fetchedLists: List[] = await r.json();
|
||||
const fetchedLists: ListResult<List> = await r.json();
|
||||
|
||||
lists.set(fetchedLists);
|
||||
const result = page > 1 ? [...lists, ...fetchedLists.items] : fetchedLists.items
|
||||
|
||||
if (fetchedLists.length > 0) {
|
||||
// list.set(fetchedLists[0])
|
||||
}
|
||||
lists = result;
|
||||
|
||||
return fetchedLists;
|
||||
return { ...fetchedLists, items: result };
|
||||
|
||||
}
|
||||
|
||||
@@ -40,7 +42,7 @@ export async function lists_show(id: string, f: (url: RequestInfo | URL, config?
|
||||
const response = await r.json()
|
||||
|
||||
for (const trail of response.expand?.trails ?? []) {
|
||||
const gpxData: string = await fetchGPX(trail);
|
||||
const gpxData: string = await fetchGPX(trail, f);
|
||||
trail.expand.gpx_data = gpxData;
|
||||
}
|
||||
|
||||
@@ -49,7 +51,6 @@ export async function lists_show(id: string, f: (url: RequestInfo | URL, config?
|
||||
throw new ClientResponseError(response)
|
||||
}
|
||||
|
||||
|
||||
list.set(response);
|
||||
|
||||
return response;
|
||||
@@ -85,7 +86,9 @@ export async function lists_create(list: List, avatar?: File) {
|
||||
body: formData,
|
||||
})
|
||||
|
||||
if (!r.ok) {
|
||||
if (r.ok) {
|
||||
return await r.json()
|
||||
} else {
|
||||
throw new ClientResponseError(await r.json())
|
||||
}
|
||||
}
|
||||
@@ -152,4 +155,28 @@ export async function lists_delete(list: List) {
|
||||
if (!r.ok) {
|
||||
throw new ClientResponseError(await r.json())
|
||||
}
|
||||
}
|
||||
|
||||
function buildFilterText(filter: ListFilter): string {
|
||||
|
||||
|
||||
let filterText = `(name~"${filter.q}"||description~"${filter.q}")`
|
||||
|
||||
|
||||
|
||||
if (filter.author?.length) {
|
||||
filterText += `&&author="${filter.author}"`
|
||||
}
|
||||
|
||||
if (pb.authStore.model) {
|
||||
if (filter.public === false && filter.shared === false) {
|
||||
filterText += `&&author="${pb.authStore.model.id}"`
|
||||
} else if (filter.public === true && filter.shared === false) {
|
||||
filterText += `&&(public=true||list_share_via_list.user!="${pb.authStore.model.id}"||author="${pb.authStore.model.id}")`
|
||||
} else if (filter.public === false && filter.shared === true) {
|
||||
filterText += `&&(public=false||list_share_via_list.user="${pb.authStore.model.id}"||author="${pb.authStore.model.id}")`
|
||||
}
|
||||
}
|
||||
|
||||
return filterText
|
||||
}
|
||||
Reference in New Issue
Block a user