Add ISAC registry search controls

This commit is contained in:
JB
2026-07-25 21:18:11 -04:00
parent 6d2e8176ee
commit 65aa6361a6
21 changed files with 172 additions and 65 deletions
+9 -2
View File
@@ -2,7 +2,7 @@ import { auditRecord, recordIsacAudit } from '$lib/server/audit';
import { requireDataView, requirePermission } from '$lib/server/auth/authorization';
import { getSessionUser } from '$lib/server/auth/session';
import { getDatabase } from '$lib/server/database';
import { getPagination } from '$lib/server/pagination';
import { getPagination, getRegistrySearch } from '$lib/server/pagination';
import { fail } from '@sveltejs/kit';
import { randomUUID } from 'node:crypto';
import type { Actions, PageServerLoad } from './$types';
@@ -56,6 +56,7 @@ export const load: PageServerLoad = async ({ cookies, url }) => {
? requestedFilter : '';
const conditions: string[] = [];
const args: unknown[] = [];
const { search, pattern } = getRegistrySearch(url);
if (filter === 'active' || filter === 'archived') conditions.push(`active=${filter === 'active' ? 1 : 0}`);
else if (qualities.some((quality) => quality.toLowerCase() === filter)) {
conditions.push('quality=?');
@@ -64,6 +65,10 @@ export const load: PageServerLoad = async ({ cookies, url }) => {
conditions.push('primary_attribute_type=?');
args.push(attributeTypes.find((type) => type.toLowerCase() === filter));
}
if (search) {
conditions.push("name LIKE ? ESCAPE '\\' COLLATE NOCASE");
args.push(pattern);
}
const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
const [summary, filtered] = await Promise.all([
(await database.prepare(`SELECT COUNT(*) AS total,
@@ -98,6 +103,8 @@ export const load: PageServerLoad = async ({ cookies, url }) => {
filter === 'archived' ? false
: qualities.some((quality) => quality.toLowerCase() === filter) ? String(item.quality).toLowerCase() === filter
: attributeTypes.some((type) => type.toLowerCase() === filter) ? String(item.attributeType).toLowerCase() === filter : true
).filter((item) =>
!search || String(item.name).toLocaleLowerCase().includes(search.toLocaleLowerCase())
).map((protocol) => ({
...protocol,
iconUrl: '',
@@ -131,7 +138,7 @@ export const load: PageServerLoad = async ({ cookies, url }) => {
) ?? { id: '', quality, primary_attribute_type: attributeType, effects: [] })),
stats: [...pending.filter((item) => item.kind === 'attribute'), ...stats],
triggers: [...pending.filter((item) => item.kind === 'trigger'), ...triggers],
summary: { ...summary, total: Number(summary?.total ?? 0) + pending.filter((item) => item.kind === 'protocol').length, pending: pending.filter((item) => item.kind === 'protocol').length }, filter, pagination
summary: { ...summary, total: Number(summary?.total ?? 0) + pending.filter((item) => item.kind === 'protocol').length, pending: pending.filter((item) => item.kind === 'protocol').length }, filter, pagination, search
};
};