Refactor the usage log filter toolbar into a shared reusable component for common, drawing, and task logs. Optimize desktop filters with a responsive grid, move secondary filters into a mobile drawer, standardize filter typography, remove redundant filter icons, and add the missing i18n translations for the new drawer description.
199 lines
6.4 KiB
TypeScript
Vendored
199 lines
6.4 KiB
TypeScript
Vendored
/*
|
|
Copyright (C) 2023-2026 QuantumNous
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
For commercial licensing, please contact support@quantumnous.com
|
|
*/
|
|
import { type TFunction } from 'i18next'
|
|
import type { NameRule, ModelStatus, SyncSource } from './types'
|
|
|
|
// ============================================================================
|
|
// Pagination
|
|
// ============================================================================
|
|
|
|
export const DEFAULT_PAGE_SIZE = 20
|
|
|
|
// ============================================================================
|
|
// Name Rule Options
|
|
// ============================================================================
|
|
|
|
export function getNameRuleOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('Exact Match'), value: 0 as NameRule },
|
|
{ label: t('Prefix Match'), value: 1 as NameRule },
|
|
{ label: t('Contains Match'), value: 2 as NameRule },
|
|
{ label: t('Suffix Match'), value: 3 as NameRule },
|
|
] as const
|
|
}
|
|
|
|
export function getNameRuleConfig(
|
|
t: TFunction
|
|
): Record<NameRule, { label: string; color: string; description: string }> {
|
|
return {
|
|
0: {
|
|
label: t('Exact'),
|
|
color: 'green',
|
|
description: t('Match model name exactly'),
|
|
},
|
|
1: {
|
|
label: t('Prefix'),
|
|
color: 'blue',
|
|
description: t('Match models starting with this name'),
|
|
},
|
|
2: {
|
|
label: t('Contains'),
|
|
color: 'orange',
|
|
description: t('Match models containing this name'),
|
|
},
|
|
3: {
|
|
label: t('Suffix'),
|
|
color: 'purple',
|
|
description: t('Match models ending with this name'),
|
|
},
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Model Status
|
|
// ============================================================================
|
|
|
|
export function getModelStatusOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('All Status'), value: 'all' },
|
|
{ label: t('Enabled'), value: 'enabled' },
|
|
{ label: t('Disabled'), value: 'disabled' },
|
|
] as const
|
|
}
|
|
|
|
export function getModelStatusConfig(
|
|
t: TFunction
|
|
): Record<ModelStatus, { label: string; variant: 'success' | 'neutral' }> {
|
|
return {
|
|
1: { label: t('Enabled'), variant: 'success' },
|
|
0: { label: t('Disabled'), variant: 'neutral' },
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Sync Status Options
|
|
// ============================================================================
|
|
|
|
export function getSyncStatusOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('All Sync Status'), value: 'all' },
|
|
{ label: t('Official Sync'), value: 'yes' },
|
|
{ label: t('No Sync'), value: 'no' },
|
|
] as const
|
|
}
|
|
|
|
// ============================================================================
|
|
// Deployment Status
|
|
// ============================================================================
|
|
|
|
export function getDeploymentStatusOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('All Status'), value: 'all' },
|
|
{ label: t('Running'), value: 'running' },
|
|
{ label: t('Completed'), value: 'completed' },
|
|
{ label: t('Failed'), value: 'failed' },
|
|
{ label: t('Deployment requested'), value: 'deployment requested' },
|
|
{ label: t('Termination requested'), value: 'termination requested' },
|
|
{ label: t('Destroyed'), value: 'destroyed' },
|
|
] as const
|
|
}
|
|
|
|
export function getDeploymentStatusConfig(t: TFunction): Record<
|
|
string,
|
|
{
|
|
label: string
|
|
variant: 'success' | 'neutral' | 'warning' | 'danger'
|
|
}
|
|
> {
|
|
return {
|
|
running: { label: t('Running'), variant: 'success' },
|
|
completed: { label: t('Completed'), variant: 'success' },
|
|
failed: { label: t('Failed'), variant: 'danger' },
|
|
error: { label: t('Failed'), variant: 'danger' },
|
|
destroyed: { label: t('Destroyed'), variant: 'danger' },
|
|
'deployment requested': {
|
|
label: t('Deployment requested'),
|
|
variant: 'warning',
|
|
},
|
|
'termination requested': {
|
|
label: t('Termination requested'),
|
|
variant: 'warning',
|
|
},
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Quota Type
|
|
// ============================================================================
|
|
|
|
export function getQuotaTypeConfig(
|
|
t: TFunction
|
|
): Record<number, { label: string; color: string }> {
|
|
return {
|
|
0: { label: t('Usage-based'), color: 'violet' },
|
|
1: { label: t('Per-call'), color: 'teal' },
|
|
}
|
|
}
|
|
|
|
// ============================================================================
|
|
// Endpoint Templates
|
|
// ============================================================================
|
|
|
|
export const ENDPOINT_TEMPLATES: Record<
|
|
string,
|
|
{ path: string; method: string }
|
|
> = {
|
|
openai: { path: '/v1/chat/completions', method: 'POST' },
|
|
'openai-response': { path: '/v1/responses', method: 'POST' },
|
|
anthropic: { path: '/v1/messages', method: 'POST' },
|
|
gemini: { path: '/v1beta/models/{model}:generateContent', method: 'POST' },
|
|
'jina-rerank': { path: '/rerank', method: 'POST' },
|
|
'image-generation': { path: '/v1/images/generations', method: 'POST' },
|
|
embeddings: { path: '/v1/embeddings', method: 'POST' },
|
|
}
|
|
|
|
// ============================================================================
|
|
// Sync Locale Options
|
|
// ============================================================================
|
|
|
|
export function getSyncLocaleOptions(t: TFunction) {
|
|
return [
|
|
{ label: t('Chinese'), value: 'zh' },
|
|
{ label: t('English'), value: 'en' },
|
|
{ label: t('Japanese'), value: 'ja' },
|
|
] as const
|
|
}
|
|
|
|
export function getSyncSourceOptions(t: TFunction) {
|
|
return [
|
|
{
|
|
label: t('Official Repository'),
|
|
value: 'official' as SyncSource,
|
|
description: t('Sync from the public upstream metadata repository.'),
|
|
disabled: false,
|
|
},
|
|
{
|
|
label: t('Configuration File'),
|
|
value: 'config' as SyncSource,
|
|
description: t('Upload or reference a local configuration file.'),
|
|
disabled: true,
|
|
},
|
|
] as const
|
|
}
|