Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • main
1 result

Target

Select target project
  • aolda/proxy-manager-frontend
1 result
Select Git revision
  • main
1 result
Show changes
Commits on Source (2)
import { useEffect, useState } from 'react';
import { Link } from 'react-router';
import { Link, useSearchParams } from 'react-router';
import { Filter, Plus, Pencil, Trash } from 'lucide-react';
import { toast } from 'sonner';
import { useAuthStore } from '@/stores/authStore';
......@@ -23,11 +23,15 @@ import {
export default function ForwardingList() {
const { authFetch, selectedProject } = useAuthStore();
const [searchParams, setSearchParams] = useSearchParams();
const [forwardings, setForwardings] = useState<Forwarding[] | null>(null);
const [selectedForwarding, setSelectedForwarding] = useState<Forwarding | null>(null);
useEffect(() => {
authFetch(`/api/forwardings?projectId=${selectedProject?.id}`)
const apiSearchParams = new URLSearchParams(searchParams);
apiSearchParams.set('projectId', selectedProject?.id || '');
authFetch(`/api/forwardings?${apiSearchParams.toString()}`)
.then((response) => {
if (!response.ok) throw Error(`포트포워딩 목록 조회 실패: ${response.status}`);
......@@ -40,7 +44,7 @@ export default function ForwardingList() {
console.error(error);
toast.error('포트포워딩 정보를 조회할 수 없습니다.');
});
}, [authFetch, selectedProject]);
}, [authFetch, selectedProject, searchParams]);
const handleDelete = () => {
if (selectedForwarding === null) throw Error('selectedForwarding is null');
......@@ -81,11 +85,30 @@ export default function ForwardingList() {
</div>
<Card>
<CardContent>
<div className="flex w-full items-center space-x-2 mb-4">
<Filter className="mr-3" />
<Input placeholder="이름, 포트, 인스턴스 IP로 검색..." />
<Button variant="secondary">검색</Button>
</div>
<form
onSubmit={(e) => {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const query = formData.get('query')?.toString();
if (query) {
setSearchParams({ query });
} else {
setSearchParams({});
}
}}
>
<div className="flex w-full items-center space-x-2 mb-4">
<Filter className="mr-3" />
<Input
name="query"
placeholder="이름, 포트, 인스턴스 IP로 검색..."
defaultValue={searchParams.get('query') || ''}
/>
<Button type="submit" variant="secondary">
검색
</Button>
</div>
</form>
<Table>
<TableHeader>
<TableRow>
......
......@@ -51,7 +51,11 @@ export default function LogList() {
useEffect(() => {
setLogs(null);
authFetch(`/api/logs?projectId=${selectedProject?.id}&page=${page - 1}&${searchParams.toString()}`)
const apiSearchParams = new URLSearchParams(searchParams);
apiSearchParams.set('page', `${page - 1}`);
apiSearchParams.set('projectId', selectedProject?.id || '');
authFetch(`/api/logs?${apiSearchParams.toString()}`)
.then((response): Promise<LogListResponse> => {
if (!response.ok) throw new Error(`로그 목록 조회 실패: (${response.status})`);
......
import { useEffect, useState } from 'react';
import { Link } from 'react-router';
import { Link, useSearchParams } from 'react-router';
import { Filter, Plus, Check, X, Pencil, Trash } from 'lucide-react';
import { toast } from 'sonner';
import { Button } from '@/components/ui/button';
......@@ -24,11 +24,15 @@ import { Routing } from '@/types/routing';
export default function RoutingList() {
const { authFetch, selectedProject } = useAuthStore();
const [searchParams, setSearchParams] = useSearchParams();
const [routings, setRoutings] = useState<Routing[] | null>(null);
const [selectedRouting, setSelectedRouting] = useState<Routing | null>(null);
useEffect(() => {
authFetch(`/api/routings?projectId=${selectedProject?.id}`)
const apiSearchParams = new URLSearchParams(searchParams);
apiSearchParams.set('projectId', selectedProject?.id || '');
authFetch(`/api/routings?${apiSearchParams.toString()}`)
.then((response) => {
if (!response.ok) throw Error(`라우팅 목록 조회 실패: ${response.status}`);
......@@ -41,7 +45,7 @@ export default function RoutingList() {
console.error(error);
toast.error('라우팅 정보를 조회할 수 없습니다.');
});
}, [authFetch, selectedProject]);
}, [authFetch, selectedProject, searchParams]);
const handleDelete = () => {
if (selectedRouting === null) throw Error('selectedRouting is null');
......@@ -82,11 +86,30 @@ export default function RoutingList() {
</div>
<Card>
<CardContent>
<div className="flex w-full items-center space-x-2 mb-4">
<Filter className="mr-3" />
<Input placeholder="이름, 도메인, 인스턴스 IP로 검색..." />
<Button variant="secondary">검색</Button>
</div>
<form
onSubmit={(e) => {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const query = formData.get('query')?.toString();
if (query) {
setSearchParams({ query });
} else {
setSearchParams({});
}
}}
>
<div className="flex w-full items-center space-x-2 mb-4">
<Filter className="mr-3" />
<Input
name="query"
placeholder="이름, 도메인, 인스턴스 IP로 검색..."
defaultValue={searchParams.get('query') || ''}
/>
<Button type="submit" variant="secondary">
검색
</Button>
</div>
</form>
<Table>
<TableHeader>
<TableRow>
......