diff --git a/fe-admin/src/pages/contracts/ContractCreatePage.tsx b/fe-admin/src/pages/contracts/ContractCreatePage.tsx index 2db956b..78858c2 100644 --- a/fe-admin/src/pages/contracts/ContractCreatePage.tsx +++ b/fe-admin/src/pages/contracts/ContractCreatePage.tsx @@ -12,8 +12,8 @@ // hiển thị Chi tiết section. import { useState, useMemo, type FormEvent, useEffect } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { useSearchParams } from 'react-router-dom' -import { FileText, Plus, Search, Save } from 'lucide-react' +import { useNavigate, useSearchParams } from 'react-router-dom' +import { FileText, Plus, Search, Save, ExternalLink, Trash2 } from 'lucide-react' import { toast } from 'sonner' import { ContractDetailsTab } from '@/components/contracts/ContractDetailsTab' import { PhaseBadge } from '@/components/PhaseBadge' @@ -39,6 +39,8 @@ import { const fmtMoney = (v: number) => v.toLocaleString('vi-VN') export function ContractCreatePage() { + const navigate = useNavigate() + const qc = useQueryClient() const [searchParams, setSearchParams] = useSearchParams() const typeFilter = searchParams.get('type') ? Number(searchParams.get('type')) : 2 const selectedId = searchParams.get('id') @@ -51,6 +53,23 @@ export function ContractCreatePage() { (await api.get>('/contracts', { params: { page: 1, pageSize: 100 } })).data, }) + const deleteContract = useMutation({ + mutationFn: async (id: string) => { + await api.delete(`/contracts/${id}`) + }, + onSuccess: (_, deletedId) => { + toast.success('Đã xóa HĐ') + qc.invalidateQueries({ queryKey: ['my-contracts'] }) + // Nếu đang edit HĐ vừa xóa → clear selection + if (selectedId === deletedId) { + const next = new URLSearchParams(searchParams) + next.delete('id') + setSearchParams(next, { replace: true }) + } + }, + onError: err => toast.error(getErrorMessage(err)), + }) + const detail = useQuery({ queryKey: ['contract', selectedId], queryFn: async () => (await api.get(`/contracts/${selectedId}`)).data, @@ -141,11 +160,11 @@ export function ContractCreatePage() { )} diff --git a/fe-user/src/pages/contracts/ContractCreatePage.tsx b/fe-user/src/pages/contracts/ContractCreatePage.tsx index 2db956b..78858c2 100644 --- a/fe-user/src/pages/contracts/ContractCreatePage.tsx +++ b/fe-user/src/pages/contracts/ContractCreatePage.tsx @@ -12,8 +12,8 @@ // hiển thị Chi tiết section. import { useState, useMemo, type FormEvent, useEffect } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { useSearchParams } from 'react-router-dom' -import { FileText, Plus, Search, Save } from 'lucide-react' +import { useNavigate, useSearchParams } from 'react-router-dom' +import { FileText, Plus, Search, Save, ExternalLink, Trash2 } from 'lucide-react' import { toast } from 'sonner' import { ContractDetailsTab } from '@/components/contracts/ContractDetailsTab' import { PhaseBadge } from '@/components/PhaseBadge' @@ -39,6 +39,8 @@ import { const fmtMoney = (v: number) => v.toLocaleString('vi-VN') export function ContractCreatePage() { + const navigate = useNavigate() + const qc = useQueryClient() const [searchParams, setSearchParams] = useSearchParams() const typeFilter = searchParams.get('type') ? Number(searchParams.get('type')) : 2 const selectedId = searchParams.get('id') @@ -51,6 +53,23 @@ export function ContractCreatePage() { (await api.get>('/contracts', { params: { page: 1, pageSize: 100 } })).data, }) + const deleteContract = useMutation({ + mutationFn: async (id: string) => { + await api.delete(`/contracts/${id}`) + }, + onSuccess: (_, deletedId) => { + toast.success('Đã xóa HĐ') + qc.invalidateQueries({ queryKey: ['my-contracts'] }) + // Nếu đang edit HĐ vừa xóa → clear selection + if (selectedId === deletedId) { + const next = new URLSearchParams(searchParams) + next.delete('id') + setSearchParams(next, { replace: true }) + } + }, + onError: err => toast.error(getErrorMessage(err)), + }) + const detail = useQuery({ queryKey: ['contract', selectedId], queryFn: async () => (await api.get(`/contracts/${selectedId}`)).data, @@ -141,11 +160,11 @@ export function ContractCreatePage() { )}
    {rows.map(c => ( -
  • +
  • + + {/* Action buttons — hover-show, sibling không nested để click không trigger row select */} +
    + + +
  • ))}