[cs] WIP: 알림톡발송이력관리 페이지
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import { client } from "@/shared/api";
|
||||
import { ENDPOINT } from "@/shared/config";
|
||||
import {
|
||||
type NtftalkMmtLogHistory,
|
||||
type NtftalkMmtLogHistoryPageList,
|
||||
type NtftalkMmtLogHistorySavePayload,
|
||||
type NtftalkMmtLogHistorySearchParams,
|
||||
type NtftalkMmtLogHistoryService,
|
||||
type NtftalkMmtLogHistoryUpdatePayload,
|
||||
} from "../model/ntftalk-mmt-log-history-interface";
|
||||
|
||||
class NtftalkMmtLogHistoryApiService implements NtftalkMmtLogHistoryService {
|
||||
async getNtftalkMmtLogHistoryPage(
|
||||
params: NtftalkMmtLogHistorySearchParams,
|
||||
): Promise<NtftalkMmtLogHistoryPageList> {
|
||||
const response = await client.get<NtftalkMmtLogHistoryPageList>(
|
||||
`${ENDPOINT.NTFTALK_SERVICE.MMT_LOG_HISTORY}`,
|
||||
{ params },
|
||||
);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
async getNtftalkMmtLogHistory(mtPr: number): Promise<NtftalkMmtLogHistory> {
|
||||
const response = await client.get<NtftalkMmtLogHistory>(
|
||||
`${ENDPOINT.NTFTALK_SERVICE.MMT_LOG_HISTORY}/${mtPr}`,
|
||||
);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
async saveNtftalkMmtLogHistory(
|
||||
payload: NtftalkMmtLogHistorySavePayload,
|
||||
): Promise<NtftalkMmtLogHistory> {
|
||||
const response = await client.post<NtftalkMmtLogHistory>(
|
||||
`${ENDPOINT.NTFTALK_SERVICE.MMT_LOG_HISTORY}`,
|
||||
payload,
|
||||
);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
async updateNtftalkMmtLogHistory(
|
||||
mtPr: number,
|
||||
payload: NtftalkMmtLogHistoryUpdatePayload,
|
||||
): Promise<NtftalkMmtLogHistory> {
|
||||
const response = await client.put<NtftalkMmtLogHistory>(
|
||||
`${ENDPOINT.NTFTALK_SERVICE.MMT_LOG_HISTORY}/${mtPr}`,
|
||||
payload,
|
||||
);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
async deleteNtftalkMmtLogHistory(mtPr: number): Promise<void> {
|
||||
await client.delete(
|
||||
`${ENDPOINT.NTFTALK_SERVICE.MMT_LOG_HISTORY}/${mtPr}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export const NtftalkMmtLogHistoryApi = new NtftalkMmtLogHistoryApiService();
|
||||
@@ -1,6 +1,7 @@
|
||||
export { NtftalkVarApi } from "./api/ntftalk-var-service";
|
||||
export { NtftalkTempApi } from "./api/ntftalk-temp-service";
|
||||
export { NtftalkBiztalkApi } from "./api/ntftalk-biztalk-service";
|
||||
export { NtftalkMmtLogHistoryApi } from "./api/ntftalk-mmt-log-history-service";
|
||||
export type {
|
||||
NtftalkVar,
|
||||
NtftalkVarPageList,
|
||||
@@ -27,3 +28,10 @@ export type {
|
||||
NtftalkTempSearchParams,
|
||||
NtftalkTempUpdatePayload,
|
||||
} from "./model/ntftalk-temp-interface";
|
||||
export type {
|
||||
NtftalkMmtLogHistory,
|
||||
NtftalkMmtLogHistoryPageList,
|
||||
NtftalkMmtLogHistorySavePayload,
|
||||
NtftalkMmtLogHistorySearchParams,
|
||||
NtftalkMmtLogHistoryUpdatePayload,
|
||||
} from "./model/ntftalk-mmt-log-history-interface";
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
import type { PageableList, PageableParams } from "@/shared/model";
|
||||
|
||||
export interface NtftalkMmtLogHistorySearchParams extends PageableParams {
|
||||
subject?: string;
|
||||
content?: string;
|
||||
recipientNum?: string;
|
||||
/** 1:전송대기, 2:결과대기, 3:완료 */
|
||||
msgStatus?: string;
|
||||
/** 1000:성공 */
|
||||
reportCode?: string;
|
||||
/** yyyy-MM-dd */
|
||||
dateFrom?: string;
|
||||
/** yyyy-MM-dd */
|
||||
dateTo?: string;
|
||||
/** ADSS | CWMS | PORT | ALL */
|
||||
system?: string;
|
||||
/** SUCCESS | FAIL | ALL */
|
||||
successYn?: string;
|
||||
}
|
||||
|
||||
export interface NtftalkMmtLogHistory {
|
||||
mtPr: number;
|
||||
mtRefkey?: string | null;
|
||||
priority?: string | null;
|
||||
dateClientReq?: string | null;
|
||||
subject?: string | null;
|
||||
content?: string | null;
|
||||
callback?: string | null;
|
||||
msgStatus?: string | null;
|
||||
recipientNum?: string | null;
|
||||
dateMtSent?: string | null;
|
||||
dateRslt?: string | null;
|
||||
dateMtReport?: string | null;
|
||||
reportCode?: string | null;
|
||||
countryCode?: string | null;
|
||||
msgType?: number | null;
|
||||
regDate?: string | null;
|
||||
senderKey?: string | null;
|
||||
templateCode?: string | null;
|
||||
siteSystem?: string | null;
|
||||
successYn?: string | null;
|
||||
}
|
||||
|
||||
export interface NtftalkMmtLogHistorySavePayload {
|
||||
mtPr: number;
|
||||
mtRefkey?: string;
|
||||
priority?: string;
|
||||
dateClientReq?: string;
|
||||
subject: string;
|
||||
content: string;
|
||||
callback: string;
|
||||
msgStatus?: string;
|
||||
recipientNum: string;
|
||||
reportCode?: string;
|
||||
countryCode?: string;
|
||||
msgType?: number;
|
||||
senderKey: string;
|
||||
templateCode?: string;
|
||||
responseMethod?: string;
|
||||
}
|
||||
|
||||
export interface NtftalkMmtLogHistoryUpdatePayload {
|
||||
content: string;
|
||||
recipientNum: string;
|
||||
msgStatus?: string;
|
||||
reportCode?: string;
|
||||
}
|
||||
|
||||
export type NtftalkMmtLogHistoryPageList = PageableList<NtftalkMmtLogHistory>;
|
||||
|
||||
export interface NtftalkMmtLogHistoryService {
|
||||
getNtftalkMmtLogHistoryPage(
|
||||
params: NtftalkMmtLogHistorySearchParams,
|
||||
): Promise<NtftalkMmtLogHistoryPageList>;
|
||||
getNtftalkMmtLogHistory(mtPr: number): Promise<NtftalkMmtLogHistory>;
|
||||
saveNtftalkMmtLogHistory(
|
||||
payload: NtftalkMmtLogHistorySavePayload,
|
||||
): Promise<NtftalkMmtLogHistory>;
|
||||
updateNtftalkMmtLogHistory(
|
||||
mtPr: number,
|
||||
payload: NtftalkMmtLogHistoryUpdatePayload,
|
||||
): Promise<NtftalkMmtLogHistory>;
|
||||
deleteNtftalkMmtLogHistory(mtPr: number): Promise<void>;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
export { NtftalkHistoryPage } from "./ui/ntftalk-history-page";
|
||||
@@ -0,0 +1,64 @@
|
||||
import type { ColumnDef } from "@tanstack/react-table";
|
||||
import type { NtftalkMmtLogHistory } from "@/entities/ntftalk";
|
||||
|
||||
function formatDateTime(value: string | null | undefined): string {
|
||||
if (!value) return "—";
|
||||
const normalized = value.includes("T")
|
||||
? value.replace("T", " ").slice(0, 19)
|
||||
: value.slice(0, 19);
|
||||
return normalized;
|
||||
}
|
||||
|
||||
function formatResult(successYn: string | null | undefined): string {
|
||||
if (!successYn) return "—";
|
||||
if (successYn === "SUCCESS") return "성공";
|
||||
if (successYn === "FAIL") return "실패";
|
||||
return successYn;
|
||||
}
|
||||
|
||||
export function createNtftalkHistoryColumns(): ColumnDef<NtftalkMmtLogHistory>[] {
|
||||
return [
|
||||
{
|
||||
id: "rowNo",
|
||||
header: "순번",
|
||||
enableSorting: false,
|
||||
cell: ({ row, table }) => {
|
||||
const { pageIndex, pageSize } = table.getState().pagination;
|
||||
return pageIndex * pageSize + row.index + 1;
|
||||
},
|
||||
},
|
||||
{
|
||||
accessorKey: "siteSystem",
|
||||
header: "시스템",
|
||||
cell: ({ getValue }) => (getValue() as string) || "—",
|
||||
},
|
||||
{
|
||||
accessorKey: "content",
|
||||
header: "알림내용",
|
||||
cell: ({ getValue }) => {
|
||||
const v = getValue() as string;
|
||||
if (!v) return "—";
|
||||
return (
|
||||
<span className="line-clamp-2 max-w-[28rem] text-left" title={v}>
|
||||
{v}
|
||||
</span>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
accessorKey: "recipientNum",
|
||||
header: "수신자",
|
||||
cell: ({ getValue }) => (getValue() as string) || "—",
|
||||
},
|
||||
{
|
||||
accessorKey: "dateRslt",
|
||||
header: "수신일",
|
||||
cell: ({ getValue }) => formatDateTime(getValue() as string | null),
|
||||
},
|
||||
{
|
||||
accessorKey: "successYn",
|
||||
header: "결과",
|
||||
cell: ({ getValue }) => formatResult(getValue() as string | null),
|
||||
},
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
"use client";
|
||||
|
||||
import { useMemo, useState } from "react";
|
||||
|
||||
import { keepPreviousData, useQuery } from "@tanstack/react-query";
|
||||
import { getCoreRowModel, type PaginationState } from "@tanstack/react-table";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
import { ENDPOINT } from "@/shared/config";
|
||||
import { useDataTable } from "@/shared/lib";
|
||||
import { InputDateRangePicker } from "@/shared/ui/input-date-range-picker";
|
||||
import {
|
||||
NtftalkMmtLogHistoryApi,
|
||||
type NtftalkMmtLogHistorySearchParams,
|
||||
} from "@/entities/ntftalk";
|
||||
import { SiteSelect } from "@/entities/site";
|
||||
import {
|
||||
Button,
|
||||
Input,
|
||||
Label,
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "@common/components";
|
||||
|
||||
import { createNtftalkHistoryColumns } from "../model/ntftalk-history-table-columns";
|
||||
|
||||
type DateRange = {
|
||||
from?: Date | null;
|
||||
to?: Date | null;
|
||||
};
|
||||
|
||||
type PresetPeriod = "" | "3M" | "6M" | "1Y" | "CUSTOM";
|
||||
|
||||
function computeDateRangeFromPreset(
|
||||
preset: Extract<PresetPeriod, "3M" | "6M" | "1Y">,
|
||||
): DateRange {
|
||||
const to = dayjs().endOf("day").toDate();
|
||||
const base = dayjs();
|
||||
let fromDay: dayjs.Dayjs;
|
||||
switch (preset) {
|
||||
case "3M":
|
||||
fromDay = base.subtract(3, "month");
|
||||
break;
|
||||
case "6M":
|
||||
fromDay = base.subtract(6, "month");
|
||||
break;
|
||||
case "1Y":
|
||||
fromDay = base.subtract(1, "year");
|
||||
break;
|
||||
}
|
||||
return { from: fromDay.startOf("day").toDate(), to };
|
||||
}
|
||||
|
||||
function NtftalkHistoryPage() {
|
||||
const [contentInput, setContentInput] = useState("");
|
||||
const [recipientInput, setRecipientInput] = useState("");
|
||||
const [presetPeriod, setPresetPeriod] = useState<PresetPeriod>("");
|
||||
const [dateRange, setDateRange] = useState<DateRange>({
|
||||
from: null,
|
||||
to: null,
|
||||
});
|
||||
const [resultFilter, setResultFilter] = useState("ALL");
|
||||
const [systemFilter, setSystemFilter] = useState("ALL");
|
||||
|
||||
const [searchParams, setSearchParams] =
|
||||
useState<NtftalkMmtLogHistorySearchParams>({ sort: "dateMtReport,desc" });
|
||||
const [pagination, setPagination] = useState<PaginationState>({
|
||||
pageIndex: 0,
|
||||
pageSize: 10,
|
||||
});
|
||||
|
||||
const listQuery = useQuery({
|
||||
queryKey: [
|
||||
ENDPOINT.NTFTALK_SERVICE.MMT_LOG_HISTORY,
|
||||
searchParams,
|
||||
pagination,
|
||||
],
|
||||
queryFn: () =>
|
||||
NtftalkMmtLogHistoryApi.getNtftalkMmtLogHistoryPage({
|
||||
...searchParams,
|
||||
page: pagination.pageIndex,
|
||||
size: pagination.pageSize,
|
||||
}),
|
||||
placeholderData: keepPreviousData,
|
||||
});
|
||||
|
||||
const columns = useMemo(() => createNtftalkHistoryColumns(), []);
|
||||
|
||||
const { tableComponent } = useDataTable({
|
||||
query: listQuery,
|
||||
tableOptions: {
|
||||
columns,
|
||||
state: { pagination },
|
||||
manualPagination: true,
|
||||
getCoreRowModel: getCoreRowModel(),
|
||||
onPaginationChange: setPagination,
|
||||
},
|
||||
dataTableOptions: {
|
||||
viewPagination: true,
|
||||
},
|
||||
});
|
||||
|
||||
const buildSearchParamsFromInputs = (): NtftalkMmtLogHistorySearchParams => ({
|
||||
sort: searchParams.sort ?? "dateMtReport,desc",
|
||||
content: contentInput.trim() || undefined,
|
||||
recipientNum: recipientInput.trim() || undefined,
|
||||
successYn: resultFilter,
|
||||
system: systemFilter,
|
||||
dateFrom: dateRange.from
|
||||
? dayjs(dateRange.from).format("YYYY-MM-DD")
|
||||
: undefined,
|
||||
dateTo: dateRange.to ? dayjs(dateRange.to).format("YYYY-MM-DD") : undefined,
|
||||
});
|
||||
|
||||
const handleSearch = (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
setPagination((p) => ({ ...p, pageIndex: 0 }));
|
||||
setSearchParams(buildSearchParamsFromInputs());
|
||||
};
|
||||
|
||||
const handlePresetPeriodChange = (value: PresetPeriod) => {
|
||||
setPresetPeriod(value);
|
||||
if (value === "3M" || value === "6M" || value === "1Y") {
|
||||
setDateRange(computeDateRangeFromPreset(value));
|
||||
}
|
||||
};
|
||||
|
||||
const handleDateRangeChange = (next: DateRange) => {
|
||||
setDateRange(next);
|
||||
setPresetPeriod("CUSTOM");
|
||||
};
|
||||
|
||||
const handleReset = () => {
|
||||
setContentInput("");
|
||||
setRecipientInput("");
|
||||
setPresetPeriod("");
|
||||
setDateRange({ from: null, to: null });
|
||||
setResultFilter("ALL");
|
||||
setSystemFilter("ALL");
|
||||
setPagination((p) => ({ ...p, pageIndex: 0 }));
|
||||
setSearchParams({ sort: "dateMtReport,desc" });
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="card card-border !mt-6 flex flex-col gap-4">
|
||||
<div className="card card-border">
|
||||
<form
|
||||
onSubmit={handleSearch}
|
||||
className="flex flex-col gap-4 p-2 md:flex-row md:items-end md:justify-between"
|
||||
>
|
||||
<div className="flex flex-col gap-4">
|
||||
<div className="flex flex-wrap items-end gap-4">
|
||||
<div className="flex flex-wrap items-center gap-2">
|
||||
<Label className="whitespace-nowrap text-label">조회기간</Label>
|
||||
<Select
|
||||
value={presetPeriod}
|
||||
onValueChange={handlePresetPeriodChange}
|
||||
>
|
||||
<SelectTrigger className="w-[16rem]">
|
||||
<SelectValue placeholder="기간 선택" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="3M">3개월</SelectItem>
|
||||
<SelectItem value="6M">6개월</SelectItem>
|
||||
<SelectItem value="1Y">1년</SelectItem>
|
||||
<SelectItem value="CUSTOM">직접입력</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<InputDateRangePicker
|
||||
dateRange={dateRange}
|
||||
setDateRange={handleDateRangeChange}
|
||||
disabled={presetPeriod !== "CUSTOM"}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-6">
|
||||
<div className="flex items-center gap-2">
|
||||
<Label className="whitespace-nowrap text-label">알림내용</Label>
|
||||
<Input
|
||||
className="w-[16rem]"
|
||||
value={contentInput}
|
||||
onChange={(e) => setContentInput(e.target.value)}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<Label className="whitespace-nowrap text-label">사용자</Label>
|
||||
<Input
|
||||
className="w-[16rem]"
|
||||
value={recipientInput}
|
||||
onChange={(e) => setRecipientInput(e.target.value)}
|
||||
placeholder="수신자 번호"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<Label className="whitespace-nowrap text-label">결과</Label>
|
||||
<Select value={resultFilter} onValueChange={setResultFilter}>
|
||||
<SelectTrigger className="w-[16rem]">
|
||||
<SelectValue placeholder="전체" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="ALL">전체</SelectItem>
|
||||
<SelectItem value="SUCCESS">성공</SelectItem>
|
||||
<SelectItem value="FAIL">실패</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<Label className="whitespace-nowrap text-label">시스템</Label>
|
||||
<SiteSelect
|
||||
className="w-[16rem]"
|
||||
value={systemFilter}
|
||||
onValueChange={(value) => setSystemFilter(value)}
|
||||
enabledAllSite
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex shrink-0 gap-2">
|
||||
<Button className="h-[3.2rem]" type="submit">
|
||||
조회
|
||||
</Button>
|
||||
<Button
|
||||
type="button"
|
||||
color="white"
|
||||
className="h-[3.2rem]"
|
||||
onClick={handleReset}
|
||||
>
|
||||
초기화
|
||||
</Button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div className="card card-border">
|
||||
<div className="card-header">
|
||||
<h3 className="text-2xl font-medium text-label">알림톡 발송 이력</h3>
|
||||
</div>
|
||||
<div className="card !m-[1.2rem] !p-0">{tableComponent}</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export { NtftalkHistoryPage };
|
||||
@@ -1,6 +1,10 @@
|
||||
"use client";
|
||||
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
|
||||
import { ENDPOINT } from "@/shared/config";
|
||||
import { NoData } from "@/shared/ui/no-data";
|
||||
import { NtftalkTempApi } from "@/entities/ntftalk";
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
@@ -13,9 +17,6 @@ import {
|
||||
TableHead,
|
||||
TableRow,
|
||||
} from "@common/components";
|
||||
import { NtftalkTempApi } from "@/entities/ntftalk";
|
||||
import { ENDPOINT } from "@/shared/config";
|
||||
import { NoData } from "@/shared/ui/no-data";
|
||||
|
||||
interface NtftalkTempDetailDialogProps {
|
||||
templateCode: string | null;
|
||||
|
||||
@@ -2,12 +2,38 @@
|
||||
|
||||
import { useCallback, useMemo, useState } from "react";
|
||||
import { useFieldArray, useForm, useWatch } from "react-hook-form";
|
||||
|
||||
import { useConfirm } from "@frontend-opensource/use-react-hooks";
|
||||
import {
|
||||
keepPreviousData,
|
||||
useQuery,
|
||||
useQueryClient,
|
||||
} from "@tanstack/react-query";
|
||||
import {
|
||||
getCoreRowModel,
|
||||
type PaginationState,
|
||||
type RowSelectionState,
|
||||
useReactTable,
|
||||
} from "@tanstack/react-table";
|
||||
import { z } from "zod";
|
||||
|
||||
import { AUTH_USER_ID, ENDPOINT } from "@/shared/config";
|
||||
import {
|
||||
getCookie,
|
||||
useAlertStore,
|
||||
useDataTable,
|
||||
useMutationWrapper,
|
||||
} from "@/shared/lib";
|
||||
import { NoData } from "@/shared/ui/no-data";
|
||||
import {
|
||||
NtftalkBiztalkApi,
|
||||
type NtftalkBiztalkInspectionRequestItem,
|
||||
type NtftalkTemp,
|
||||
NtftalkTempApi,
|
||||
type NtftalkTempSearchParams,
|
||||
NtftalkVarApi,
|
||||
type NtftalkVarSearchParams,
|
||||
} from "@/entities/ntftalk";
|
||||
import {
|
||||
Button,
|
||||
DataTable,
|
||||
@@ -20,36 +46,14 @@ import {
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "@common/components";
|
||||
import {
|
||||
getCoreRowModel,
|
||||
type PaginationState,
|
||||
type RowSelectionState,
|
||||
useReactTable,
|
||||
} from "@tanstack/react-table";
|
||||
import { z } from "zod";
|
||||
import {
|
||||
NtftalkBiztalkApi,
|
||||
NtftalkTempApi,
|
||||
NtftalkVarApi,
|
||||
type NtftalkBiztalkInspectionRequestItem,
|
||||
type NtftalkTemp,
|
||||
type NtftalkTempSearchParams,
|
||||
type NtftalkVarSearchParams,
|
||||
} from "@/entities/ntftalk";
|
||||
import { AUTH_USER_ID, ENDPOINT } from "@/shared/config";
|
||||
import {
|
||||
getCookie,
|
||||
useAlertStore,
|
||||
useDataTable,
|
||||
useMutationWrapper,
|
||||
} from "@/shared/lib";
|
||||
import { NoData } from "@/shared/ui/no-data";
|
||||
import { createTemplateColumns } from "../model/template-table-columns";
|
||||
|
||||
import {
|
||||
createEmptyVarDraft,
|
||||
type NtftalkVarGridRow,
|
||||
} from "../model/ntftalk-var-grid";
|
||||
import { createTemplateColumns } from "../model/template-table-columns";
|
||||
import { createVarColumns } from "../model/var-table-columns";
|
||||
|
||||
import { NtftalkTempDetailDialog } from "./ntftalk-temp-detail-dialog";
|
||||
import { NtftalkTempRegistDialog } from "./ntftalk-temp-regist-dialog";
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
"use client";
|
||||
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { useForm } from "react-hook-form";
|
||||
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
import {
|
||||
keepPreviousData,
|
||||
useQuery,
|
||||
@@ -13,10 +14,28 @@ import {
|
||||
type PaginationState,
|
||||
type RowSelectionState,
|
||||
} from "@tanstack/react-table";
|
||||
|
||||
import { ENDPOINT } from "@/shared/config";
|
||||
import { useAlertStore, useDataTable, useMutationWrapper } from "@/shared/lib";
|
||||
import {
|
||||
Form,
|
||||
FormControl,
|
||||
FormField,
|
||||
FormItem,
|
||||
FormMessage,
|
||||
} from "@/shared/ui/form";
|
||||
import { NoData } from "@/shared/ui/no-data";
|
||||
import {
|
||||
NtftalkBiztalkApi,
|
||||
NtftalkTempApi,
|
||||
NtftalkVarApi,
|
||||
type NtftalkVarSearchParams,
|
||||
} from "@/entities/ntftalk";
|
||||
import {
|
||||
Button,
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
Input,
|
||||
@@ -33,29 +52,13 @@ import {
|
||||
TableBody,
|
||||
TableCell,
|
||||
TableHead,
|
||||
Textarea,
|
||||
TableRow,
|
||||
DialogFooter,
|
||||
Textarea,
|
||||
} from "@common/components";
|
||||
|
||||
import {
|
||||
NtftalkBiztalkApi,
|
||||
NtftalkTempApi,
|
||||
NtftalkVarApi,
|
||||
type NtftalkVarSearchParams,
|
||||
} from "@/entities/ntftalk";
|
||||
import { ENDPOINT } from "@/shared/config";
|
||||
import { useAlertStore, useDataTable, useMutationWrapper } from "@/shared/lib";
|
||||
import { NoData } from "@/shared/ui/no-data";
|
||||
import {
|
||||
Form,
|
||||
FormControl,
|
||||
FormField,
|
||||
FormItem,
|
||||
FormMessage,
|
||||
} from "@/shared/ui/form";
|
||||
import {
|
||||
ntftalkTempSaveFormSchema,
|
||||
type NtftalkTempSaveFormData,
|
||||
ntftalkTempSaveFormSchema,
|
||||
} from "../model/ntftalk-temp-save-schema";
|
||||
import { createVarColumns } from "../model/var-table-columns";
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@ export const ENDPOINT = {
|
||||
NTFTALK_VAR: "/ntftalk-service/api/v1/ntftalk-var",
|
||||
NTFTALK_TEMP: "/ntftalk-service/api/v1/ntftalk-temp",
|
||||
NTFTALK_BIZTALK: "/ntftalk-service/api/v1/ntftalk-biztalk",
|
||||
MMT_LOG_HISTORY: "/ntftalk-service/api/v1/ata/mmt-log-history",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,20 +1,24 @@
|
||||
import { InputDatePicker } from "@common/components";
|
||||
import { useEffect } from "react";
|
||||
|
||||
import { InputDatePicker } from "@common/components";
|
||||
|
||||
import { useAlertStore } from "../lib";
|
||||
|
||||
type DateRange = {
|
||||
from?: Date;
|
||||
to?: Date;
|
||||
from?: Date | null;
|
||||
to?: Date | null;
|
||||
};
|
||||
|
||||
type InputDateRangePickerProps = {
|
||||
dateRange: DateRange;
|
||||
setDateRange: (dateRange: DateRange) => void;
|
||||
disabled?: boolean;
|
||||
};
|
||||
|
||||
function InputDateRangePicker({
|
||||
dateRange,
|
||||
setDateRange,
|
||||
disabled,
|
||||
}: InputDateRangePickerProps) {
|
||||
const alert = useAlertStore((state) => state.setMessage);
|
||||
|
||||
@@ -32,6 +36,7 @@ function InputDateRangePicker({
|
||||
onChange={(date) => {
|
||||
setDateRange({ ...dateRange, from: date });
|
||||
}}
|
||||
disabled={disabled}
|
||||
/>
|
||||
~
|
||||
<InputDatePicker
|
||||
@@ -39,6 +44,7 @@ function InputDateRangePicker({
|
||||
onChange={(date) => {
|
||||
setDateRange({ ...dateRange, to: date });
|
||||
}}
|
||||
disabled={disabled}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user