Favor Next machine types in search
Prefer Spectrum Next and +3 results when no machine filter is selected. Signed-off-by: codex@lucy.xalior.com
This commit is contained in:
@@ -77,6 +77,11 @@ export default function EntriesExplorer({
|
|||||||
const [sort, setSort] = useState<"title" | "id_desc">(initialUrlState?.sort ?? "id_desc");
|
const [sort, setSort] = useState<"title" | "id_desc">(initialUrlState?.sort ?? "id_desc");
|
||||||
const [scope, setScope] = useState<SearchScope>(initialUrlState?.scope ?? "title");
|
const [scope, setScope] = useState<SearchScope>(initialUrlState?.scope ?? "title");
|
||||||
const [facets, setFacets] = useState<EntryFacets | null>(initialFacets ?? null);
|
const [facets, setFacets] = useState<EntryFacets | null>(initialFacets ?? null);
|
||||||
|
const preferredMachineIds = [27, 26, 8, 9];
|
||||||
|
const preferredMachineNames = useMemo(() => {
|
||||||
|
if (!machines.length) return preferredMachineIds.map((id) => `#${id}`);
|
||||||
|
return preferredMachineIds.map((id) => machines.find((m) => m.id === id)?.name ?? `#${id}`);
|
||||||
|
}, [machines]);
|
||||||
|
|
||||||
const pageSize = 20;
|
const pageSize = 20;
|
||||||
const totalPages = useMemo(() => (data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1), [data]);
|
const totalPages = useMemo(() => (data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1), [data]);
|
||||||
@@ -303,6 +308,9 @@ export default function EntriesExplorer({
|
|||||||
<option key={m.id} value={m.id}>{m.name}</option>
|
<option key={m.id} value={m.id}>{m.name}</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
|
{machinetypeId === "" && (
|
||||||
|
<div className="form-text">Preferred: {preferredMachineNames.join(", ")}</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className="form-label small text-secondary">Sort</label>
|
<label className="form-label small text-secondary">Sort</label>
|
||||||
|
|||||||
@@ -77,6 +77,11 @@ export default function ReleasesExplorer({
|
|||||||
const [sources, setSources] = useState<{ id: string; name: string }[]>(initialLists?.sourcetypes ?? []);
|
const [sources, setSources] = useState<{ id: string; name: string }[]>(initialLists?.sourcetypes ?? []);
|
||||||
const [cases, setCases] = useState<{ id: string; name: string }[]>(initialLists?.casetypes ?? []);
|
const [cases, setCases] = useState<{ id: string; name: string }[]>(initialLists?.casetypes ?? []);
|
||||||
const initialLoad = useRef(true);
|
const initialLoad = useRef(true);
|
||||||
|
const preferredMachineIds = [27, 26, 8, 9];
|
||||||
|
const preferredMachineNames = useMemo(() => {
|
||||||
|
if (!machines.length) return preferredMachineIds.map((id) => `#${id}`);
|
||||||
|
return preferredMachineIds.map((id) => machines.find((m) => m.id === id)?.name ?? `#${id}`);
|
||||||
|
}, [machines]);
|
||||||
|
|
||||||
const pageSize = 20;
|
const pageSize = 20;
|
||||||
const totalPages = useMemo(() => (data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1), [data]);
|
const totalPages = useMemo(() => (data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1), [data]);
|
||||||
@@ -292,6 +297,9 @@ export default function ReleasesExplorer({
|
|||||||
<option key={m.id} value={m.id}>{m.name}</option>
|
<option key={m.id} value={m.id}>{m.name}</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
|
{dMachinetypeId === "" && (
|
||||||
|
<div className="form-text">Preferred: {preferredMachineNames.join(", ")}</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className="form-label small text-secondary">File type</label>
|
<label className="form-label small text-secondary">File type</label>
|
||||||
|
|||||||
@@ -177,6 +177,15 @@ export async function searchEntries(params: SearchParams): Promise<PagedResult<S
|
|||||||
const offset = (page - 1) * pageSize;
|
const offset = (page - 1) * pageSize;
|
||||||
const sort = params.sort ?? (q ? "title" : "id_desc");
|
const sort = params.sort ?? (q ? "title" : "id_desc");
|
||||||
const scope: EntrySearchScope = params.scope ?? "title";
|
const scope: EntrySearchScope = params.scope ?? "title";
|
||||||
|
const preferMachineOrder = typeof params.machinetypeId === "number"
|
||||||
|
? null
|
||||||
|
: sql`case
|
||||||
|
when ${entries.machinetypeId} = 27 then 0
|
||||||
|
when ${entries.machinetypeId} = 26 then 1
|
||||||
|
when ${entries.machinetypeId} = 8 then 2
|
||||||
|
when ${entries.machinetypeId} = 9 then 3
|
||||||
|
else 4
|
||||||
|
end`;
|
||||||
|
|
||||||
if (q.length === 0) {
|
if (q.length === 0) {
|
||||||
// Default listing: return first page by id desc (no guaranteed ordering field; using id)
|
// Default listing: return first page by id desc (no guaranteed ordering field; using id)
|
||||||
@@ -213,7 +222,10 @@ export async function searchEntries(params: SearchParams): Promise<PagedResult<S
|
|||||||
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
|
.leftJoin(machinetypes, eq(machinetypes.id, entries.machinetypeId))
|
||||||
.leftJoin(languages, eq(languages.id, entries.languageId))
|
.leftJoin(languages, eq(languages.id, entries.languageId))
|
||||||
.where(whereExpr ?? sql`true`)
|
.where(whereExpr ?? sql`true`)
|
||||||
.orderBy(sort === "id_desc" ? desc(entries.id) : entries.title)
|
.orderBy(
|
||||||
|
...(preferMachineOrder ? [preferMachineOrder] : []),
|
||||||
|
sort === "id_desc" ? desc(entries.id) : entries.title
|
||||||
|
)
|
||||||
.limit(pageSize)
|
.limit(pageSize)
|
||||||
.offset(offset);
|
.offset(offset);
|
||||||
return q1;
|
return q1;
|
||||||
@@ -257,7 +269,10 @@ export async function searchEntries(params: SearchParams): Promise<PagedResult<S
|
|||||||
.leftJoin(languages, eq(languages.id, entries.languageId))
|
.leftJoin(languages, eq(languages.id, entries.languageId))
|
||||||
.where(sql`${entries.id} in (select entry_id from (${union}) as matches)`)
|
.where(sql`${entries.id} in (select entry_id from (${union}) as matches)`)
|
||||||
.groupBy(entries.id)
|
.groupBy(entries.id)
|
||||||
.orderBy(sort === "id_desc" ? desc(entries.id) : entries.title)
|
.orderBy(
|
||||||
|
...(preferMachineOrder ? [preferMachineOrder] : []),
|
||||||
|
sort === "id_desc" ? desc(entries.id) : entries.title
|
||||||
|
)
|
||||||
.limit(pageSize)
|
.limit(pageSize)
|
||||||
.offset(offset);
|
.offset(offset);
|
||||||
|
|
||||||
@@ -295,7 +310,10 @@ export async function searchEntries(params: SearchParams): Promise<PagedResult<S
|
|||||||
.leftJoin(languages, eq(languages.id, entries.languageId))
|
.leftJoin(languages, eq(languages.id, entries.languageId))
|
||||||
.where(sql`lower(${searchByTitles.entryTitle}) like ${pattern}`)
|
.where(sql`lower(${searchByTitles.entryTitle}) like ${pattern}`)
|
||||||
.groupBy(entries.id)
|
.groupBy(entries.id)
|
||||||
.orderBy(sort === "id_desc" ? desc(entries.id) : entries.title)
|
.orderBy(
|
||||||
|
...(preferMachineOrder ? [preferMachineOrder] : []),
|
||||||
|
sort === "id_desc" ? desc(entries.id) : entries.title
|
||||||
|
)
|
||||||
.limit(pageSize)
|
.limit(pageSize)
|
||||||
.offset(offset);
|
.offset(offset);
|
||||||
|
|
||||||
@@ -1736,6 +1754,15 @@ export async function searchReleases(params: ReleaseSearchParams): Promise<Paged
|
|||||||
const pageSize = Math.max(1, Math.min(params.pageSize ?? 20, 100));
|
const pageSize = Math.max(1, Math.min(params.pageSize ?? 20, 100));
|
||||||
const page = Math.max(1, params.page ?? 1);
|
const page = Math.max(1, params.page ?? 1);
|
||||||
const offset = (page - 1) * pageSize;
|
const offset = (page - 1) * pageSize;
|
||||||
|
const preferMachineOrder = params.dMachinetypeId != null
|
||||||
|
? null
|
||||||
|
: sql`case
|
||||||
|
when ${entries.machinetypeId} = 27 then 0
|
||||||
|
when ${entries.machinetypeId} = 26 then 1
|
||||||
|
when ${entries.machinetypeId} = 8 then 2
|
||||||
|
when ${entries.machinetypeId} = 9 then 3
|
||||||
|
else 4
|
||||||
|
end`;
|
||||||
|
|
||||||
// Build WHERE conditions in Drizzle QB
|
// Build WHERE conditions in Drizzle QB
|
||||||
const wherePartsQB: Array<ReturnType<typeof sql>> = [];
|
const wherePartsQB: Array<ReturnType<typeof sql>> = [];
|
||||||
@@ -1814,7 +1841,12 @@ export async function searchReleases(params: ReleaseSearchParams): Promise<Paged
|
|||||||
.from(releases)
|
.from(releases)
|
||||||
.leftJoin(entries, eq(entries.id, releases.entryId))
|
.leftJoin(entries, eq(entries.id, releases.entryId))
|
||||||
.where(whereExpr ?? sql`true`)
|
.where(whereExpr ?? sql`true`)
|
||||||
.orderBy(orderBy1!, ...(orderBy2 ? [orderBy2] : []), ...(orderBy3 ? [orderBy3] : []))
|
.orderBy(
|
||||||
|
...(preferMachineOrder ? [preferMachineOrder] : []),
|
||||||
|
orderBy1!,
|
||||||
|
...(orderBy2 ? [orderBy2] : []),
|
||||||
|
...(orderBy3 ? [orderBy3] : [])
|
||||||
|
)
|
||||||
.limit(pageSize)
|
.limit(pageSize)
|
||||||
.offset(offset);
|
.offset(offset);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user