Skip to content

Commit 8c08be9

Browse files
author
9qeklajc
committed
better ui
1 parent c49da9b commit 8c08be9

File tree

3 files changed

+52
-24
lines changed

3 files changed

+52
-24
lines changed

ui/app/model/page.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { Alert, AlertDescription } from '@/components/ui/alert';
1616
import { Badge } from '@/components/ui/badge';
1717
import { useMemo, useState } from 'react';
1818
import type { Model } from '@/lib/api/schemas/models';
19+
import { groupAndSortModelsByProvider } from '@/lib/utils/modelSort';
1920

2021
export default function ModelsPage() {
2122
const [filteredModels, setFilteredModels] = useState<Model[]>([]);
@@ -34,15 +35,7 @@ export default function ModelsPage() {
3435

3536
const groupedModels = useMemo(() => {
3637
if (!models) return {};
37-
38-
return models.reduce<Record<string, typeof models>>((acc, model) => {
39-
const provider = model.provider;
40-
if (!acc[provider]) {
41-
acc[provider] = [];
42-
}
43-
acc[provider].push(model);
44-
return acc;
45-
}, {});
38+
return groupAndSortModelsByProvider(models);
4639
}, [models]);
4740

4841
const groupDataMap = useMemo(() => {
@@ -52,7 +45,9 @@ export default function ModelsPage() {
5245
const providerInfo = useMemo(() => {
5346
return Object.entries(groupedModels).map(([provider, providerModels]) => {
5447
const groupData = groupDataMap.get(provider);
55-
const activeModels = providerModels.filter((m) => !m.soft_deleted).length;
48+
const activeModels = providerModels.filter(
49+
(m) => m.isEnabled && !m.soft_deleted
50+
).length;
5651
const totalModels = providerModels.length;
5752

5853
return {
@@ -186,7 +181,7 @@ export default function ModelsPage() {
186181
(m) => m.soft_deleted
187182
).length
188183
}{' '}
189-
soft deleted
184+
disabled
190185
</span>
191186
)}
192187
{groupData?.group_url && (

ui/components/ModelSelector.tsx

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ import {
5959
} from 'lucide-react';
6060
import { toast } from 'sonner';
6161
import { cn } from '@/lib/utils';
62+
import {
63+
sortModels,
64+
groupAndSortModelsByProvider,
65+
} from '@/lib/utils/modelSort';
6266

6367
interface ModelSelectorProps {
6468
filterProvider?: string;
@@ -424,20 +428,13 @@ export function ModelSelector({
424428
: providerFilteredModels;
425429

426430
if (filterProvider) {
427-
// If filtering by provider, return single group
428-
return { [filterProvider]: modelsToGroup };
431+
const sortedModels = sortModels(modelsToGroup);
432+
return { [filterProvider]: sortedModels };
429433
}
430434

431435
if (!modelsToGroup) return {};
432436

433-
return modelsToGroup.reduce<Record<string, Model[]>>((acc, model) => {
434-
const provider = model.provider;
435-
if (!acc[provider]) {
436-
acc[provider] = [];
437-
}
438-
acc[provider].push(model);
439-
return acc;
440-
}, {});
437+
return groupAndSortModelsByProvider(modelsToGroup);
441438
}, [
442439
providerFilteredModels,
443440
filteredModels,
@@ -1077,9 +1074,9 @@ export function ModelSelector({
10771074
variant='ghost'
10781075
size='sm'
10791076
onClick={(e) => e.stopPropagation()}
1080-
className='h-8 w-8 p-0'
1077+
className='hover:bg-muted/50 dark:hover:bg-muted/80 h-8 w-8 p-0'
10811078
>
1082-
<MoreVertical className='h-4 w-4' />
1079+
<MoreVertical className='text-muted-foreground hover:text-foreground h-4 w-4' />
10831080
</Button>
10841081
</DropdownMenuTrigger>
10851082
<DropdownMenuContent align='end'>
@@ -1181,7 +1178,7 @@ export function ModelSelector({
11811178
{model.soft_deleted && (
11821179
<span className='inline-flex items-center rounded-full border border-red-300 bg-red-100 px-2.5 py-0.5 text-xs font-medium text-red-800'>
11831180
<Trash2 className='mr-1 h-3 w-3' />
1184-
Deleted
1181+
Disabled
11851182
</span>
11861183
)}
11871184
</div>

ui/lib/utils/modelSort.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { type Model } from '@/lib/api/schemas/models';
2+
3+
export function sortModelsByStatus(a: Model, b: Model): number {
4+
if (a.isEnabled && !b.isEnabled) return -1;
5+
if (!a.isEnabled && b.isEnabled) return 1;
6+
7+
if (a.isEnabled === b.isEnabled) {
8+
if (!a.soft_deleted && b.soft_deleted) return -1;
9+
if (a.soft_deleted && !b.soft_deleted) return 1;
10+
}
11+
12+
return 0;
13+
}
14+
15+
export function sortModels(models: Model[]): Model[] {
16+
return [...models].sort(sortModelsByStatus);
17+
}
18+
19+
export function groupAndSortModelsByProvider(
20+
models: Model[]
21+
): Record<string, Model[]> {
22+
const grouped = models.reduce<Record<string, Model[]>>((acc, model) => {
23+
const provider = model.provider;
24+
if (!acc[provider]) {
25+
acc[provider] = [];
26+
}
27+
acc[provider].push(model);
28+
return acc;
29+
}, {});
30+
31+
Object.keys(grouped).forEach((provider) => {
32+
grouped[provider].sort(sortModelsByStatus);
33+
});
34+
35+
return grouped;
36+
}

0 commit comments

Comments
 (0)