)}
@@ -600,23 +516,14 @@ const WorkspaceApiKeysCardComponent = (
}
return filteredKeys.map((key) => {
- const rawKeyValue = key.key || key.displayKey || ''
- const isRevealed = Boolean(revealedKeys[key.id])
- const displayValue = rawKeyValue
- ? isRevealed
- ? rawKeyValue
- : getMaskedKeyValue(key)
- : key.displayKey || 'ā'
- const canRevealOrCopy = Boolean(rawKeyValue)
- const isCopied = copiedKeyId === key.id
const isEditing = canRenameKeys && editingKeyId === key.id
return (
- |
+ |
{formatDate(key.createdAt)}
|
-
+ |
{canRenameKeys && editingKeyId === key.id ? (
@@ -646,58 +553,24 @@ const WorkspaceApiKeysCardComponent = (
{renameError}
)}
- ) : (
-
- )}
+ ) : (
+
+ )}
|
-
-
|
-
+ |
{formatDate(key.lastUsed)}
|
-
+
{isEditing ? (
<>
@@ -960,21 +831,22 @@ const WorkspaceApiKeysCardComponent = (
{t('dialogs.newKeyTitle', { scope: scopeLabel })}
-
- {t('dialogs.newKeyDescription')}
-
+ {t('dialogs.newKeyDescription')}
{newKey && (
- {newKey.key}
+ {newKey.key || 'ā'}
@@ -987,16 +859,12 @@ const WorkspaceApiKeysCardComponent = (
{t('dialogs.deleteTitle', { scope: scopeLabel })}
-
- {t('dialogs.deleteDescription')}
-
+ {t('dialogs.deleteDescription')}
{deleteKey && (
-
- {t('dialogs.deletePrompt', { name: deleteKey.name })}
-
+ {t('dialogs.deletePrompt', { name: deleteKey.name })}
{
+ useLayoutEffect(() => {
hydratePairStoreFromColorPairs(normalizedInitialColorPairs)
}, [normalizedInitialColorPairs])
@@ -494,12 +494,6 @@ export function DashboardClient({
icon: LibraryBig,
href: `/workspace/${workspaceId}/knowledge`,
},
- {
- id: 'templates',
- name: t('pages.templates'),
- icon: Shapes,
- href: `/workspace/${workspaceId}/templates`,
- },
{
id: 'docs',
name: t('pages.docs'),
diff --git a/apps/tradinggoose/app/workspace/[workspaceId]/integrations/integrations.tsx b/apps/tradinggoose/app/workspace/[workspaceId]/integrations/integrations.tsx
index 6c49d3b7c..b99ff9085 100644
--- a/apps/tradinggoose/app/workspace/[workspaceId]/integrations/integrations.tsx
+++ b/apps/tradinggoose/app/workspace/[workspaceId]/integrations/integrations.tsx
@@ -8,23 +8,24 @@ import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Skeleton } from '@/components/ui/skeleton'
+import { createLogger } from '@/lib/logs/console/logger'
+import { OAUTH_PROVIDERS } from '@/lib/oauth/oauth'
+import { cn } from '@/lib/utils'
+import { GlobalNavbarHeader } from '@/global-navbar'
import {
type ServiceInfo,
useConnectOAuthService,
useDisconnectOAuthService,
useOAuthConnections,
} from '@/hooks/queries/oauth-connections'
-import { createLogger } from '@/lib/logs/console/logger'
-import { OAUTH_PROVIDERS } from '@/lib/oauth/oauth'
-import { cn } from '@/lib/utils'
-import { GlobalNavbarHeader } from '@/global-navbar'
-import { useRouter } from '@/i18n/navigation'
+import { usePathname, useRouter } from '@/i18n/navigation'
const logger = createLogger('Integrations')
export function Integrations() {
const t = useTranslations('workspace.integrations')
const router = useRouter()
+ const pathname = usePathname()
const searchParams = useSearchParams()
const params = useParams()
const workspaceId = params.workspaceId as string
@@ -154,7 +155,7 @@ export function Integrations() {
await connectService.mutateAsync({
providerId: service.providerId,
- callbackURL: window.location.href,
+ callbackURL: `${pathname}${window.location.search}${window.location.hash}`,
})
} catch (error) {
logger.error('OAuth connection error:', { error })
@@ -404,8 +405,8 @@ export function Integrations() {
>
{t('connect')}
- )}
-
+ )}
+
))}
)
@@ -414,10 +415,10 @@ export function Integrations() {
{!isLoading &&
!searchTerm.trim() &&
Object.keys(filteredGroupedServices).length === 0 && (
-
+
{t('emptyState.noConnectible')}
-
- )}
+
+ )}
{/* Show message when search has no results */}
{searchTerm.trim() && Object.keys(filteredGroupedServices).length === 0 && (
diff --git a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/base-overview/base-overview.tsx b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/base-overview/base-overview.tsx
index b9635d8aa..cc0b223a4 100644
--- a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/base-overview/base-overview.tsx
+++ b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/base-overview/base-overview.tsx
@@ -3,7 +3,7 @@
import { type KeyboardEvent, type MouseEvent, type SyntheticEvent, useState } from 'react'
import { Check, Copy, LibraryBig, Loader2, Trash2 } from 'lucide-react'
import { useParams } from 'next/navigation'
-import { useLocale, useTranslations } from 'next-intl'
+import { useTranslations } from 'next-intl'
import {
AlertDialog,
AlertDialogAction,
@@ -15,77 +15,21 @@ import {
AlertDialogTitle,
} from '@/components/ui/alert-dialog'
import { CopyToWorkspace } from '@/app/workspace/[workspaceId]/knowledge/components/copy-to-workspace/copy-to-workspace'
-import { useKnowledgeStore } from '@/stores/knowledge/store'
import { Link } from '@/i18n/navigation'
+import { useKnowledgeStore } from '@/stores/knowledge/store'
interface BaseOverviewProps {
id?: string
title: string
- docCount: number
description: string
- createdAt?: string
- updatedAt?: string
canEdit?: boolean
}
-function formatRelativeTime(dateString: string, locale: string): string {
- const date = new Date(dateString)
- const now = new Date()
- const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000)
- const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' })
-
- if (diffInSeconds < 60) {
- return rtf.format(0, 'second')
- }
- if (diffInSeconds < 3600) {
- const minutes = Math.floor(diffInSeconds / 60)
- return rtf.format(-minutes, 'minute')
- }
- if (diffInSeconds < 86400) {
- const hours = Math.floor(diffInSeconds / 3600)
- return rtf.format(-hours, 'hour')
- }
- if (diffInSeconds < 604800) {
- const days = Math.floor(diffInSeconds / 86400)
- return rtf.format(-days, 'day')
- }
- if (diffInSeconds < 2592000) {
- const weeks = Math.floor(diffInSeconds / 604800)
- return rtf.format(-weeks, 'week')
- }
- if (diffInSeconds < 31536000) {
- const months = Math.floor(diffInSeconds / 2592000)
- return rtf.format(-months, 'month')
- }
- const years = Math.floor(diffInSeconds / 31536000)
- return rtf.format(-years, 'year')
-}
-
-function formatAbsoluteDate(dateString: string, locale: string): string {
- const date = new Date(dateString)
- return date.toLocaleDateString(locale, {
- year: 'numeric',
- month: 'short',
- day: 'numeric',
- hour: '2-digit',
- minute: '2-digit',
- })
-}
-
-export function BaseOverview({
- id,
- title,
- docCount,
- description,
- createdAt,
- updatedAt,
- canEdit = true,
-}: BaseOverviewProps) {
+export function BaseOverview({ id, title, description, canEdit = true }: BaseOverviewProps) {
const [isCopied, setIsCopied] = useState(false)
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false)
const [isDeleting, setIsDeleting] = useState(false)
const params = useParams()
- const locale = useLocale()
const t = useTranslations('workspace.knowledge.baseOverview')
const workspaceSlug = params?.workspaceId as string
const { removeKnowledgeBase } = useKnowledgeStore()
@@ -190,10 +134,6 @@ export function BaseOverview({
-
- {docCount} {docCount === 1 ? t('docsSingular') : t('docsPlural')}
-
- ā¢
{id?.slice(0, 8)}
- {/* Timestamps */}
- {(createdAt || updatedAt) && (
-
- {updatedAt && (
-
- {t('updated')} {formatRelativeTime(updatedAt, locale)}
-
- )}
- {updatedAt && createdAt && ā¢}
- {createdAt && (
-
- {t('created')} {formatRelativeTime(createdAt, locale)}
-
- )}
-
- )}
-
{description}
@@ -240,13 +163,7 @@ export function BaseOverview({
{t('deleteTitle')}
-
- {t('deleteDescription', {
- title,
- count: docCount,
- plural: docCount === 1 ? '' : 's',
- })}
-
+ {t('deleteDescription', { title })}
{t('cancel')}
diff --git a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx
index 9b0ce39e1..64a65f7e8 100644
--- a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx
+++ b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx
@@ -4,6 +4,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'
import { zodResolver } from '@hookform/resolvers/zod'
import { AlertCircle, Check, Loader2, X } from 'lucide-react'
import { useParams } from 'next/navigation'
+import { useTranslations } from 'next-intl'
import { useForm } from 'react-hook-form'
import { z } from 'zod'
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
@@ -22,7 +23,6 @@ import {
import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components'
import { useKnowledgeUpload } from '@/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload'
import type { KnowledgeBaseData } from '@/stores/knowledge/store'
-import { useTranslations } from 'next-intl'
const logger = createLogger('CreateModal')
@@ -317,8 +317,6 @@ export function CreateModal({ open, onOpenChange, onKnowledgeBaseCreated }: Crea
const newKnowledgeBase = result.data
if (files.length > 0) {
- newKnowledgeBase.docCount = files.length
-
if (onKnowledgeBaseCreated) {
onKnowledgeBaseCreated(newKnowledgeBase)
}
@@ -524,13 +522,9 @@ export function CreateModal({ open, onOpenChange, onKnowledgeBaseCreated }: Crea
isDragging ? 'text-amber-700' : ''
}`}
>
- {isDragging
- ? t('dropFilesHere')
- : t('dropFilesHereOrClickToBrowse')}
-
-
- {t('supportedFormats')}
+ {isDragging ? t('dropFilesHere') : t('dropFilesHereOrClickToBrowse')}
+ {t('supportedFormats')}
diff --git a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/shared.ts b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/shared.ts
index e113d769f..1d135c238 100644
--- a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/shared.ts
+++ b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/components/shared.ts
@@ -6,15 +6,10 @@ export const dropdownContentClass =
export const commandListClass = 'overflow-y-auto overflow-x-hidden'
-export type SortOption = 'name' | 'createdAt' | 'updatedAt' | 'docCount'
+export type SortOption = 'name'
export type SortOrder = 'asc' | 'desc'
export const SORT_OPTION_DEFINITIONS = [
- { value: 'updatedAt-desc', labelKey: 'sort.lastUpdated' },
- { value: 'createdAt-desc', labelKey: 'sort.newestFirst' },
- { value: 'createdAt-asc', labelKey: 'sort.oldestFirst' },
{ value: 'name-asc', labelKey: 'sort.nameAsc' },
{ value: 'name-desc', labelKey: 'sort.nameDesc' },
- { value: 'docCount-desc', labelKey: 'sort.mostDocuments' },
- { value: 'docCount-asc', labelKey: 'sort.leastDocuments' },
] as const
diff --git a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/knowledge.tsx b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/knowledge.tsx
index 633ea290b..90ce47ca9 100644
--- a/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/knowledge.tsx
+++ b/apps/tradinggoose/app/workspace/[workspaceId]/knowledge/knowledge.tsx
@@ -26,7 +26,6 @@ import {
dropdownContentClass,
filterButtonClass,
SORT_OPTION_DEFINITIONS,
- type SortOption,
type SortOrder,
} from '@/app/workspace/[workspaceId]/knowledge/components/shared'
import {
@@ -38,10 +37,6 @@ import { GlobalNavbarHeader } from '@/global-navbar'
import { useKnowledgeBasesList } from '@/hooks/use-knowledge'
import type { KnowledgeBaseData } from '@/stores/knowledge/store'
-interface KnowledgeBaseWithDocCount extends KnowledgeBaseData {
- docCount?: number
-}
-
export function Knowledge() {
const params = useParams()
const workspaceId = params.workspaceId as string
@@ -54,10 +49,9 @@ export function Knowledge() {
const [searchQuery, setSearchQuery] = useState('')
const [isCreateModalOpen, setIsCreateModalOpen] = useState(false)
- const [sortBy, setSortBy] = useState('updatedAt')
- const [sortOrder, setSortOrder] = useState('desc')
+ const [sortOrder, setSortOrder] = useState('asc')
- const currentSortValue = `${sortBy}-${sortOrder}`
+ const currentSortValue = `name-${sortOrder}`
const sortOptions = useMemo(
() =>
SORT_OPTION_DEFINITIONS.map((option) => ({
@@ -67,11 +61,10 @@ export function Knowledge() {
[t]
)
const currentSortLabel =
- sortOptions.find((opt) => opt.value === currentSortValue)?.label || t('sort.lastUpdated')
+ sortOptions.find((opt) => opt.value === currentSortValue)?.label || t('sort.nameAsc')
const handleSortChange = (value: string) => {
- const [field, order] = value.split('-') as [SortOption, SortOrder]
- setSortBy(field)
+ const [, order] = value.split('-') as ['name', SortOrder]
setSortOrder(order)
}
@@ -85,16 +78,13 @@ export function Knowledge() {
const filteredAndSortedKnowledgeBases = useMemo(() => {
const filtered = filterKnowledgeBases(knowledgeBases, searchQuery)
- return sortKnowledgeBases(filtered, sortBy, sortOrder)
- }, [knowledgeBases, searchQuery, sortBy, sortOrder])
+ return sortKnowledgeBases(filtered, sortOrder)
+ }, [knowledgeBases, searchQuery, sortOrder])
- const formatKnowledgeBaseForDisplay = (kb: KnowledgeBaseWithDocCount) => ({
+ const formatKnowledgeBaseForDisplay = (kb: KnowledgeBaseData) => ({
id: kb.id,
title: kb.name,
- docCount: kb.docCount || 0,
description: kb.description || t('defaults.noDescriptionProvided'),
- createdAt: kb.createdAt,
- updatedAt: kb.updatedAt,
})
const headerLeftContent = (
@@ -132,7 +122,7 @@ export function Knowledge() {
>
{sortOptions.map((option, index) => (
-
+
handleSortChange(option.value)}
className='flex cursor-pointer items-center justify-between rounded-md px-3 py-2 font-[380] text-card-foreground text-sm hover:bg-secondary/50 focus:bg-secondary/50'
@@ -177,9 +167,7 @@ export function Knowledge() {
{/* Error State */}
{error && (
-
- {t('errors.load', { error })}
-
+ {t('errors.load', { error })}
|