mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 14:15:24 +00:00
69 lines
1.8 KiB
TypeScript
69 lines
1.8 KiB
TypeScript
import type { Credential } from "@/types/ui-types";
|
|
import type { CredentialSortKey } from "@/types/credential-sidebar-preferences";
|
|
|
|
/**
|
|
* Sorts a flat credential list. No tree recursion needed -- unlike hosts,
|
|
* credential folders are explicitly flat, so this is a plain array sort.
|
|
*/
|
|
export function sortCredentials(
|
|
creds: Credential[],
|
|
key: CredentialSortKey,
|
|
pinnedFirst = false,
|
|
): Credential[] {
|
|
const sorted = [...creds];
|
|
|
|
switch (key) {
|
|
case "name-asc":
|
|
sorted.sort((a, b) => a.name.localeCompare(b.name));
|
|
break;
|
|
case "name-desc":
|
|
sorted.sort((a, b) => b.name.localeCompare(a.name));
|
|
break;
|
|
case "username-asc":
|
|
sorted.sort((a, b) => a.username.localeCompare(b.username));
|
|
break;
|
|
case "username-desc":
|
|
sorted.sort((a, b) => b.username.localeCompare(a.username));
|
|
break;
|
|
case "manual":
|
|
sorted.sort((a, b) => {
|
|
const aOrder = a.sortOrder ?? null;
|
|
const bOrder = b.sortOrder ?? null;
|
|
if (aOrder == null && bOrder == null)
|
|
return a.name.localeCompare(b.name);
|
|
if (aOrder == null) return 1;
|
|
if (bOrder == null) return -1;
|
|
if (aOrder !== bOrder) return aOrder - bOrder;
|
|
return a.name.localeCompare(b.name);
|
|
});
|
|
break;
|
|
case "default":
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (pinnedFirst) {
|
|
sorted.sort((a, b) => {
|
|
const aPinned = a.pin ? 1 : 0;
|
|
const bPinned = b.pin ? 1 : 0;
|
|
return bPinned - aPinned;
|
|
});
|
|
}
|
|
|
|
return sorted;
|
|
}
|
|
|
|
export function credentialPassesFilters(
|
|
cred: Credential,
|
|
filters: { type: string[]; tags: string[] },
|
|
): boolean {
|
|
if (filters.type.length > 0 && !filters.type.includes(cred.type))
|
|
return false;
|
|
if (
|
|
filters.tags.length > 0 &&
|
|
!filters.tags.some((tag) => cred.tags?.includes(tag))
|
|
)
|
|
return false;
|
|
return true;
|
|
}
|