Add a Bun script to apply and normalize AGPL copyright headers across the default frontend source files. The script keeps headers idempotent, upgrades existing headers to the 2023-2026 QuantumNous range, and is exposed through `bun run copyright` for future maintenance.
139 lines
4.0 KiB
TypeScript
Vendored
139 lines
4.0 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 { useState } from 'react'
|
|
import { useQueryClient } from '@tanstack/react-query'
|
|
import { type Row } from '@tanstack/react-table'
|
|
import { MoreHorizontal, Pencil, Power, PowerOff, Trash2 } from 'lucide-react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { Button } from '@/components/ui/button'
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuSeparator,
|
|
DropdownMenuShortcut,
|
|
DropdownMenuTrigger,
|
|
} from '@/components/ui/dropdown-menu'
|
|
import { ConfirmDialog } from '@/components/confirm-dialog'
|
|
import {
|
|
handleDeleteModel,
|
|
handleToggleModelStatus,
|
|
isModelEnabled,
|
|
} from '../lib'
|
|
import type { Model } from '../types'
|
|
import { useModels } from './models-provider'
|
|
|
|
interface DataTableRowActionsProps {
|
|
row: Row<Model>
|
|
}
|
|
|
|
export function DataTableRowActions({ row }: DataTableRowActionsProps) {
|
|
const { t } = useTranslation()
|
|
const model = row.original
|
|
const { setOpen, setCurrentRow } = useModels()
|
|
const queryClient = useQueryClient()
|
|
const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false)
|
|
|
|
const isEnabled = isModelEnabled(model)
|
|
|
|
const handleEdit = () => {
|
|
setCurrentRow(model)
|
|
setOpen('update-model')
|
|
}
|
|
|
|
const handleToggleStatus = () => {
|
|
handleToggleModelStatus(model.id, model.status, queryClient)
|
|
}
|
|
|
|
return (
|
|
<DropdownMenu>
|
|
<DropdownMenuTrigger
|
|
render={
|
|
<Button
|
|
variant='ghost'
|
|
className='data-popup-open:bg-muted flex h-8 w-8 p-0'
|
|
/>
|
|
}
|
|
>
|
|
<MoreHorizontal className='h-4 w-4' />
|
|
<span className='sr-only'>{t('Open menu')}</span>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent align='end' className='w-48'>
|
|
{/* Edit */}
|
|
<DropdownMenuItem onClick={handleEdit}>
|
|
{t('Edit')}
|
|
<DropdownMenuShortcut>
|
|
<Pencil size={16} />
|
|
</DropdownMenuShortcut>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuSeparator />
|
|
|
|
{/* Enable/Disable */}
|
|
<DropdownMenuItem onClick={handleToggleStatus}>
|
|
{isEnabled ? (
|
|
<>
|
|
{t('Disable')}
|
|
<DropdownMenuShortcut>
|
|
<PowerOff size={16} />
|
|
</DropdownMenuShortcut>
|
|
</>
|
|
) : (
|
|
<>
|
|
{t('Enable')}
|
|
<DropdownMenuShortcut>
|
|
<Power size={16} />
|
|
</DropdownMenuShortcut>
|
|
</>
|
|
)}
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuSeparator />
|
|
|
|
{/* Delete */}
|
|
<DropdownMenuItem
|
|
onSelect={(e) => {
|
|
e.preventDefault()
|
|
setDeleteConfirmOpen(true)
|
|
}}
|
|
className='text-destructive focus:text-destructive'
|
|
>
|
|
{t('Delete')}
|
|
<DropdownMenuShortcut>
|
|
<Trash2 size={16} />
|
|
</DropdownMenuShortcut>
|
|
</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
|
|
<ConfirmDialog
|
|
open={deleteConfirmOpen}
|
|
onOpenChange={setDeleteConfirmOpen}
|
|
title={t('Delete Model')}
|
|
desc={`Are you sure you want to delete "${model.model_name}"? This action cannot be undone.`}
|
|
confirmText='Delete'
|
|
destructive
|
|
handleConfirm={() => {
|
|
handleDeleteModel(model.id, queryClient)
|
|
setDeleteConfirmOpen(false)
|
|
}}
|
|
/>
|
|
</DropdownMenu>
|
|
)
|
|
}
|