From bb57b241d4a9b6c65b91663136e6d5e9d07a9d9c Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Wed, 2 Jul 2025 15:32:18 +0800 Subject: [PATCH] settings/equipment --- .../(main)/settings/equipment/create/page.tsx | 22 ++ .../(main)/settings/equipment/edit/page.tsx | 29 +++ src/app/(main)/settings/equipment/page.tsx | 52 +++++ src/app/api/settings/equipment/actions.ts | 38 ++++ src/app/api/settings/equipment/index.ts | 34 +++ src/app/api/utils/index.ts | 8 +- .../CreateEquipment/CreateEquipment.tsx | 193 ++++++++++++++++ .../CreateEquipmentLoading.tsx | 40 ++++ .../CreateEquipmentWrapper.tsx | 44 ++++ .../CreateEquipment/EquipmentDetails.tsx | 206 ++++++++++++++++++ .../CreateEquipment/NumberInputProps.ts | 5 + src/components/CreateEquipment/index.ts | 1 + .../EquipmentSearch/EquipmentSearch.tsx | 151 +++++++++++++ .../EquipmentSearchLoading.tsx | 40 ++++ .../EquipmentSearchWrapper.tsx | 26 +++ src/components/EquipmentSearch/index.ts | 1 + .../NavigationContent/NavigationContent.tsx | 2 +- src/i18n/zh/common.json | 4 +- 18 files changed, 893 insertions(+), 3 deletions(-) create mode 100644 src/app/(main)/settings/equipment/create/page.tsx create mode 100644 src/app/(main)/settings/equipment/edit/page.tsx create mode 100644 src/app/(main)/settings/equipment/page.tsx create mode 100644 src/app/api/settings/equipment/actions.ts create mode 100644 src/app/api/settings/equipment/index.ts create mode 100644 src/components/CreateEquipment/CreateEquipment.tsx create mode 100644 src/components/CreateEquipment/CreateEquipmentLoading.tsx create mode 100644 src/components/CreateEquipment/CreateEquipmentWrapper.tsx create mode 100644 src/components/CreateEquipment/EquipmentDetails.tsx create mode 100644 src/components/CreateEquipment/NumberInputProps.ts create mode 100644 src/components/CreateEquipment/index.ts create mode 100644 src/components/EquipmentSearch/EquipmentSearch.tsx create mode 100644 src/components/EquipmentSearch/EquipmentSearchLoading.tsx create mode 100644 src/components/EquipmentSearch/EquipmentSearchWrapper.tsx create mode 100644 src/components/EquipmentSearch/index.ts diff --git a/src/app/(main)/settings/equipment/create/page.tsx b/src/app/(main)/settings/equipment/create/page.tsx new file mode 100644 index 0000000..ae48446 --- /dev/null +++ b/src/app/(main)/settings/equipment/create/page.tsx @@ -0,0 +1,22 @@ +import { SearchParams } from "@/app/utils/fetchUtil"; +import { TypeEnum } from "@/app/utils/typeEnum"; +import CreateEquipmentType from "@/components/CreateEquipment"; +import { I18nProvider, getServerI18n } from "@/i18n"; +import { Typography } from "@mui/material"; +import isString from "lodash/isString"; + +type Props = {} & SearchParams; + +const materialSetting: React.FC = async ({ searchParams }) => { + // const type = TypeEnum.PRODUCT; + const { t } = await getServerI18n("common"); + return ( + <> + {/* {t("Create Material")} */} + + + + + ); +}; +export default materialSetting; diff --git a/src/app/(main)/settings/equipment/edit/page.tsx b/src/app/(main)/settings/equipment/edit/page.tsx new file mode 100644 index 0000000..41e401c --- /dev/null +++ b/src/app/(main)/settings/equipment/edit/page.tsx @@ -0,0 +1,29 @@ +import { SearchParams } from "@/app/utils/fetchUtil"; +import { TypeEnum } from "@/app/utils/typeEnum"; +import CreateEquipmentType from "@/components/CreateEquipment"; +import { I18nProvider, getServerI18n } from "@/i18n"; +import { Typography } from "@mui/material"; +import isString from "lodash/isString"; +import { notFound } from "next/navigation"; + +type Props = {} & SearchParams; + +const productSetting: React.FC = async ({ searchParams }) => { + const type = "common"; + const { t } = await getServerI18n(type); + const id = isString(searchParams["id"]) + ? parseInt(searchParams["id"]) + : undefined; + if (!id) { + notFound(); + } + return ( + <> + {/* {t("Create Material")} */} + + + + + ); +}; +export default productSetting; diff --git a/src/app/(main)/settings/equipment/page.tsx b/src/app/(main)/settings/equipment/page.tsx new file mode 100644 index 0000000..be47de9 --- /dev/null +++ b/src/app/(main)/settings/equipment/page.tsx @@ -0,0 +1,52 @@ +import { TypeEnum } from "@/app/utils/typeEnum"; +import EquipmentSearch from "@/components/EquipmentSearch"; +import { getServerI18n } from "@/i18n"; +import Add from "@mui/icons-material/Add"; +import Button from "@mui/material/Button"; +import Stack from "@mui/material/Stack"; +import Typography from "@mui/material/Typography"; +import { Metadata } from "next"; +import Link from "next/link"; +import { Suspense } from "react"; +import { fetchAllEquipments } from "@/app/api/settings/equipment"; +import { I18nProvider } from "@/i18n"; +export const metadata: Metadata = { + title: "Equipment Type", +}; + +const productSetting: React.FC = async () => { + const type = "common"; + const { t } = await getServerI18n(type); + const equipments = await fetchAllEquipments(); + // preloadClaims(); + + return ( + <> + + + {t("Equipment")} + + {/* */} + + }> + + + + + + ); +}; + +export default productSetting; diff --git a/src/app/api/settings/equipment/actions.ts b/src/app/api/settings/equipment/actions.ts new file mode 100644 index 0000000..d1315ea --- /dev/null +++ b/src/app/api/settings/equipment/actions.ts @@ -0,0 +1,38 @@ +"use server"; +import { ServerFetchError, serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil"; +import { revalidateTag } from "next/cache"; +import { BASE_API_URL } from "@/config/api"; +import { CreateEquipmentTypeResponse } from "../../utils"; + +// export type TypeInputs = { +// id: number; +// name: string +// } +// export type UomInputs = { +// uom: string +// } +// export type WeightUnitInputs = { +// weightUnit: string +// conversion: number +// } + + +export type CreateEquipmentInputs = { + id?: string | number + code: string; + name: string; + description?: string | undefined; + equipmentTypeId?: string | number | undefined; + +} + +export const saveEquipment = async (data: CreateEquipmentInputs) => { + // try { + const equipment = await serverFetchJson>(`${BASE_API_URL}/Equipment/save`, { + method: "POST", + body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("EquipmentType"); + return equipment + }; \ No newline at end of file diff --git a/src/app/api/settings/equipment/index.ts b/src/app/api/settings/equipment/index.ts new file mode 100644 index 0000000..8cd5e36 --- /dev/null +++ b/src/app/api/settings/equipment/index.ts @@ -0,0 +1,34 @@ +import { cache } from "react"; +import "server-only"; +// import { serverFetchJson } from "@/app/utils/fetchUtil"; +// import { BASE_API_URL } from "@/config/api"; +import { serverFetchJson } from "../../../utils/fetchUtil"; +import { BASE_API_URL } from "../../../../config/api"; +export { default } from "../../../../components/CreateEquipment/CreateEquipment"; +// import { TypeInputs, UomInputs, WeightUnitInputs } from "./actions"; + + +export type EquipmentResult = { + id: string | number + code: string; + name: string; + description: string | undefined; + equipmentTypeId: string | number | undefined; + action?: any +} + +export type Result = { + equipment: EquipmentResult +} +export const fetchAllEquipments = cache(async () => { + return serverFetchJson(`${BASE_API_URL}/Equipment`, { + next: { tags: ["equipments"] }, + }); + }); + + +export const fetchEquipment = cache(async (id: number) => { + return serverFetchJson(`${BASE_API_URL}/Equipment/details/${id}`, { + next: { tags: ["equipments"] }, + }); +}); \ No newline at end of file diff --git a/src/app/api/utils/index.ts b/src/app/api/utils/index.ts index aec14ce..2b585ee 100644 --- a/src/app/api/utils/index.ts +++ b/src/app/api/utils/index.ts @@ -12,7 +12,13 @@ export interface CreateEquipmentTypeResponse { message: string | null; errorPosition: string | keyof T; } - +export interface CreateEquipmentResponse { + id: number | null; + name: string; + code: string; + message: string | null; + errorPosition: string | keyof T; +} export interface RecordsRes{ records: T total: number diff --git a/src/components/CreateEquipment/CreateEquipment.tsx b/src/components/CreateEquipment/CreateEquipment.tsx new file mode 100644 index 0000000..470a246 --- /dev/null +++ b/src/components/CreateEquipment/CreateEquipment.tsx @@ -0,0 +1,193 @@ +"use client"; + +import { useCallback, useEffect, useMemo, useState } from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { useTranslation } from "react-i18next"; +import { + CreateEquipmentInputs, + saveEquipment, +} from "@/app/api/settings/equipment/actions"; +import { + FormProvider, + SubmitErrorHandler, + SubmitHandler, + useForm, +} from "react-hook-form"; +import { deleteDialog } from "../Swal/CustomAlerts"; +import { Box, Button, Grid, Stack, Tab, Tabs, TabsProps, Typography } from "@mui/material"; +import { Check, Close, EditNote } from "@mui/icons-material"; +import { TypeEnum } from "@/app/utils/typeEnum"; +import EquipmentDetails from "./EquipmentDetails"; +import { CreateItemResponse } from "@/app/api/utils"; +import { ItemQc } from "@/app/api/settings/item"; +import { saveItemQcChecks } from "@/app/api/settings/qcCheck/actions"; +import { useGridApiRef } from "@mui/x-data-grid"; + +type Props = { + isEditMode: boolean; + // type: TypeEnum; + defaultValues: Partial | undefined; +}; + +const CreateItem: React.FC = ({ + isEditMode, + // type, + defaultValues, + +}) => { + // console.log(type) + const apiRef = useGridApiRef(); + const params = useSearchParams() + console.log(params.get("id")) + const [serverError, setServerError] = useState(""); + const [tabIndex, setTabIndex] = useState(0); + const { t } = useTranslation("common"); + const router = useRouter(); + const title = "Equipment" + const [mode, redirPath] = useMemo(() => { + // var typeId = TypeEnum.CONSUMABLE_ID + var title = ""; + var mode = ""; + var redirPath = ""; + // if (type === TypeEnum.MATERIAL) { + // typeId = TypeEnum.MATERIAL_ID + // title = "Material"; + // redirPath = "/settings/material"; + // } + // if (type === TypeEnum.PRODUCT) { + // typeId = TypeEnum.PRODUCT_ID + title = "Equipment"; + redirPath = "/settings/equipment"; + // } + // if (type === TypeEnum.BYPRODUCT) { + // typeId = TypeEnum.BYPRODUCT_ID + // title = "By-Product"; + // redirPath = "/settings/byProduct"; + // } + if (isEditMode) { + mode = "Edit"; + } else { + mode = "Create"; + } + return [mode, redirPath]; + }, [isEditMode]); + // console.log(typeId) + const formProps = useForm({ + defaultValues: defaultValues ? defaultValues : { + }, + }); + const errors = formProps.formState.errors; + + const handleTabChange = useCallback>( + (_e, newValue) => { + setTabIndex(newValue); + }, + [], + ); + + const handleCancel = () => { + router.replace(`/settings/equipment`); + }; + const onSubmit = useCallback>( + async (data, event) => { + let hasErrors = false; + console.log(errors) + // console.log(apiRef.current.getCellValue(2, "lowerLimit")) + // apiRef.current. + try { + if (hasErrors) { + setServerError(t("An error has occurred. Please try again later.")); + return false; + } + console.log("data posted"); + console.log(data); + + + // TODO: + // 1. check field ( directly modify col def / check here ) + // 2. set error change tab index + + // return + // do api + console.log("asdad") + var responseI = await saveEquipment(data); + console.log("asdad") + // var responseQ = await saveItemQcChecks(qcCheck) + if (responseI) { + if (!Boolean(responseI.id)) { + formProps.setError(responseI.errorPosition!! as keyof CreateEquipmentInputs, { + message: responseI.message!!, + type: "required", + }) + + } else if (Boolean(responseI.id)) { + router.replace(redirPath); + } + } + } catch (e) { + // backend error + setServerError(t("An error has occurred. Please try again later.")); + console.log(e); + } + }, + [apiRef, router, t] + ); + + // multiple tabs + const onSubmitError = useCallback>( + (errors) => {}, + [] + ); + + return ( + <> + + + + + {t(`${mode} ${title}`)} + + + + + {/* */} + + {serverError && ( + + {serverError} + + )} + {tabIndex === 0 && } + {/* {tabIndex === 1 && } */} + {/* {type === TypeEnum.MATERIAL && } */} + {/* {type === TypeEnum.BYPRODUCT && } */} + {/* + + + + + */} + + + + ); +}; +export default CreateItem; diff --git a/src/components/CreateEquipment/CreateEquipmentLoading.tsx b/src/components/CreateEquipment/CreateEquipmentLoading.tsx new file mode 100644 index 0000000..15896e9 --- /dev/null +++ b/src/components/CreateEquipment/CreateEquipmentLoading.tsx @@ -0,0 +1,40 @@ +import Card from "@mui/material/Card"; +import CardContent from "@mui/material/CardContent"; +import Skeleton from "@mui/material/Skeleton"; +import Stack from "@mui/material/Stack"; +import React from "react"; + +// Can make this nicer +export const CreateItemLoading: React.FC = () => { + return ( + <> + + + + + + + + + + + CreateMaterial + + + + + + + + + + + ); +}; + +export default CreateItemLoading; diff --git a/src/components/CreateEquipment/CreateEquipmentWrapper.tsx b/src/components/CreateEquipment/CreateEquipmentWrapper.tsx new file mode 100644 index 0000000..d60f59b --- /dev/null +++ b/src/components/CreateEquipment/CreateEquipmentWrapper.tsx @@ -0,0 +1,44 @@ +import { TypeEnum } from "@/app/utils/typeEnum"; +import CreateEquipment from "./CreateEquipment"; +import CreateEquipmentLoading from "./CreateEquipmentLoading"; +import { CreateEquipmentInputs } from "@/app/api/settings/equipment/actions"; +import { notFound } from "next/navigation"; +import { fetchEquipment } from "@/app/api/settings/equipment"; +interface SubComponents { + Loading: typeof CreateEquipmentLoading; +} + +type Props = { + id?: number + // type: TypeEnum; +}; + +const CreateEquipmentWrapper: React.FC & + SubComponents = async ({ id }) => { + var result + var defaultValues: Partial | undefined + // console.log(type) + var qcChecks + if (id) { + result = await fetchEquipment(id); + const equipment = result + console.log(equipment) + defaultValues = { + id: equipment?.id, + code: equipment?.code, + name: equipment?.name, + description: equipment?.description, + equipmentTypeId: equipment?.equipmentTypeId ?? equipment?.equipmentType?.id, + }; + } + + return ( + + ); +}; +CreateEquipmentWrapper.Loading = CreateEquipmentLoading; + +export default CreateEquipmentWrapper; diff --git a/src/components/CreateEquipment/EquipmentDetails.tsx b/src/components/CreateEquipment/EquipmentDetails.tsx new file mode 100644 index 0000000..62c2ce1 --- /dev/null +++ b/src/components/CreateEquipment/EquipmentDetails.tsx @@ -0,0 +1,206 @@ +"use client"; +import { + Box, + Button, + Card, + CardContent, + Grid, + Stack, + TextField, + Typography, +} from "@mui/material"; +import { Check, Close, EditNote } from "@mui/icons-material"; +import { useFormContext } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import InputDataGrid from "../InputDataGrid"; + +import { useCallback, useMemo, useState } from "react"; +import { GridColDef, GridRowModel } from "@mui/x-data-grid"; +import { InputDataGridProps, TableRow } from "../InputDataGrid/InputDataGrid"; +import { TypeEnum } from "@/app/utils/typeEnum"; +import { NumberInputProps } from "./NumberInputProps"; +import { CreateEquipmentInputs } from "@/app/api/settings/equipment/actions"; +import { RestartAlt } from "@mui/icons-material"; +type Props = { + // isEditMode: boolean; + // type: TypeEnum; + isEditMode: boolean; + // type: TypeEnum; + defaultValues: Partial | undefined; +}; + +const ProductDetails: React.FC = ({isEditMode}) => { + const { + t, + i18n: { language }, + } = useTranslation(); + + const { + register, + formState: { errors, defaultValues, touchedFields }, + watch, + control, + setValue, + getValues, + reset, + resetField, + setError, + clearErrors, + } = useFormContext(); + // const typeColumns = useMemo( + // () => [ + // { + // field: "type", + // headerName: "type", + // flex: 1, + // editable: true, + // }, + // ], + // [] + // ); + // const weightUnitColumns = useMemo( + // () => [ + // { + // field: "weightUnit", + // headerName: "Weight Unit", + // flex: 1, + // editable: true, + // }, + // { + // field: "conversion", + // headerName: "conversion", // show base unit + // flex: 1, + // type: "number", + // editable: true, + // }, + // ], + // [] + // ); + // const uomColumns = useMemo( + // () => [ + // { + // field: "uom", + // headerName: "uom", + // flex: 1, + // editable: true, + // }, + // ], + // [] + // ); + + // const validationTest = useCallback( + // ( + // newRow: GridRowModel, EntryError>> + // ): EntryError => { + // const error: EntryError = {}; + // console.log(newRow); + // return Object.keys(error).length > 0 ? error : undefined; + // }, + // [] + // ); + const handleCancel = () => { + router.replace(`/settings/equipment`); + }; + return ( + + + + + {t("Equipment Details")} + + + + + + {/* + + + + + + + */ + } + + + + + + + + + + + + {/* + + _formKey={"type"} + columns={typeColumns} + validateRow={validationTest} + /> + + + + _formKey={"uom"} + columns={uomColumns} + validateRow={validationTest} + /> + + + + _formKey={"weightUnit"} + columns={weightUnitColumns} + validateRow={validationTest} + /> + */} + + + + + ); +}; +export default ProductDetails; diff --git a/src/components/CreateEquipment/NumberInputProps.ts b/src/components/CreateEquipment/NumberInputProps.ts new file mode 100644 index 0000000..eb8e9ea --- /dev/null +++ b/src/components/CreateEquipment/NumberInputProps.ts @@ -0,0 +1,5 @@ +import { InputBaseComponentProps } from "@mui/material"; + +export var NumberInputProps: InputBaseComponentProps = { + step: 0.01, + }; \ No newline at end of file diff --git a/src/components/CreateEquipment/index.ts b/src/components/CreateEquipment/index.ts new file mode 100644 index 0000000..1b4a991 --- /dev/null +++ b/src/components/CreateEquipment/index.ts @@ -0,0 +1 @@ +export { default } from "./CreateEquipmentWrapper"; \ No newline at end of file diff --git a/src/components/EquipmentSearch/EquipmentSearch.tsx b/src/components/EquipmentSearch/EquipmentSearch.tsx new file mode 100644 index 0000000..7d7da91 --- /dev/null +++ b/src/components/EquipmentSearch/EquipmentSearch.tsx @@ -0,0 +1,151 @@ +"use client"; + +import { useCallback, useEffect, useMemo, useState } from "react"; +import SearchBox, { Criterion } from "../SearchBox"; +import { EquipmentResult } from "@/app/api/settings/equipment"; +import { useTranslation } from "react-i18next"; +import SearchResults, { Column } from "../SearchResults"; +import { EditNote } from "@mui/icons-material"; +import { useRouter, useSearchParams } from "next/navigation"; +import { GridDeleteIcon } from "@mui/x-data-grid"; +import { TypeEnum } from "@/app/utils/typeEnum"; +import axios from "axios"; +import { BASE_API_URL, NEXT_PUBLIC_API_URL } from "@/config/api"; +import axiosInstance from "@/app/(main)/axios/axiosInstance"; + +type Props = { + equipments: EquipmentResult[]; +}; +type SearchQuery = Partial>; +type SearchParamNames = keyof SearchQuery; + +const EquipmentSearch: React.FC = ({ equipments }) => { + const [filteredEquipments, setFilteredEquipments] = useState(equipments); + const { t } = useTranslation("common"); + const router = useRouter(); + const [filterObj, setFilterObj] = useState({}); + const [pagingController, setPagingController] = useState({ + pageNum: 1, + pageSize: 10, + // totalCount: 0, + }); + const [totalCount, setTotalCount] = useState(0) + const searchCriteria: Criterion[] = useMemo(() => { + var searchCriteria: Criterion[] = [ + { label: t("Code"), paramName: "code", type: "text" }, + { label: t("Description"), paramName: "description", type: "text" }, + ]; + return searchCriteria; + }, [t, equipments]); + + const onDetailClick = useCallback( + (equipment: EquipmentResult) => { + router.push(`/settings/equipment/edit?id=${equipment.id}`); + }, + [router] + ); + + const onDeleteClick = useCallback((equipment: EquipmentResult) => {}, [router]); + + const columns = useMemo[]>( + () => [ + { + name: "id", + label: t("Details"), + onClick: onDetailClick, + buttonIcon: , + }, + { + name: "code", + label: t("Code"), + }, + { + name: "description", + label: t("Description"), + }, + { + name: "equipmentTypeId", + label: t("Equipment Type"), + }, + { + name: "action", + label: t(""), + buttonIcon: , + onClick: onDeleteClick, + }, + ], + [filteredEquipments] + ); + + const refetchData = useCallback( + async (filterObj: SearchQuery) => { + const authHeader = axiosInstance.defaults.headers["Authorization"]; + if (!authHeader) { + return; // Exit the function if the token is not set + } + const params = { + pageNum: pagingController.pageNum, + pageSize: pagingController.pageSize, + ...filterObj, + }; + try { + const response = await axiosInstance.get( + `${NEXT_PUBLIC_API_URL}/Equipment/getRecordByPage`, + { params } + ); + console.log(response); + if (response.status == 200) { + setFilteredEquipments(response.data.records); + setTotalCount(response.data.total) + return response; // Return the data from the response + } else { + throw "400"; + } + } catch (error) { + console.error("Error fetching equipment types:", error); + throw error; // Rethrow the error for further handling + } + }, + [axiosInstance, pagingController.pageNum, pagingController.pageSize] + ); + + useEffect(() => { + refetchData(filterObj); + }, [filterObj, pagingController.pageNum, pagingController.pageSize]); + + const onReset = useCallback(() => { + setFilteredEquipments(equipments); + }, [equipments]); + + return ( + <> + { + // setFilteredItems( + // equipmentTypes.filter((pm) => { + // return ( + // pm.code.toLowerCase().includes(query.code.toLowerCase()) && + // pm.name.toLowerCase().includes(query.name.toLowerCase()) + // ); + // }) + // ); + setFilterObj({ + ...query, + }); + }} + onReset={onReset} + /> + + items={filteredEquipments} + columns={columns} + setPagingController={setPagingController} + pagingController={pagingController} + totalCount={totalCount} + isAutoPaging={false} + /> + + ); +}; + +export default EquipmentSearch; diff --git a/src/components/EquipmentSearch/EquipmentSearchLoading.tsx b/src/components/EquipmentSearch/EquipmentSearchLoading.tsx new file mode 100644 index 0000000..838189b --- /dev/null +++ b/src/components/EquipmentSearch/EquipmentSearchLoading.tsx @@ -0,0 +1,40 @@ +import Card from "@mui/material/Card"; +import CardContent from "@mui/material/CardContent"; +import Skeleton from "@mui/material/Skeleton"; +import Stack from "@mui/material/Stack"; +import React from "react"; + +// Can make this nicer +export const EquipmentTypeSearchLoading: React.FC = () => { + return ( + <> + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default EquipmentTypeSearchLoading; diff --git a/src/components/EquipmentSearch/EquipmentSearchWrapper.tsx b/src/components/EquipmentSearch/EquipmentSearchWrapper.tsx new file mode 100644 index 0000000..36da541 --- /dev/null +++ b/src/components/EquipmentSearch/EquipmentSearchWrapper.tsx @@ -0,0 +1,26 @@ +import { fetchAllEquipments, } from "@/app/api/settings/equipment"; +import EquipmentSearchLoading from "./EquipmentSearchLoading"; +import { SearchParams } from "@/app/utils/fetchUtil"; +import { TypeEnum } from "@/app/utils/typeEnum"; +import { notFound } from "next/navigation"; +import EquipmentSearch from "./EquipmentSearch"; + +interface SubComponents { + Loading: typeof EquipmentSearchLoading; +} + +type Props = { + // type: TypeEnum; +}; + +const EquipmentSearchWrapper: React.FC & SubComponents = async ({ + // type, +}) => { + // console.log(type) + // var result = await fetchAllEquipmentTypes() + return ; +}; + +EquipmentSearchWrapper.Loading = EquipmentSearchLoading; + +export default EquipmentSearchWrapper; diff --git a/src/components/EquipmentSearch/index.ts b/src/components/EquipmentSearch/index.ts new file mode 100644 index 0000000..f8b16c7 --- /dev/null +++ b/src/components/EquipmentSearch/index.ts @@ -0,0 +1 @@ +export { default } from "./EquipmentSearchWrapper"; diff --git a/src/components/NavigationContent/NavigationContent.tsx b/src/components/NavigationContent/NavigationContent.tsx index b1d9904..3fc03a1 100644 --- a/src/components/NavigationContent/NavigationContent.tsx +++ b/src/components/NavigationContent/NavigationContent.tsx @@ -226,7 +226,7 @@ const NavigationContent: React.FC = () => { { icon: , label: "Equipment", - path: "/settings/user", + path: "/settings/equipment", }, { icon: , diff --git a/src/i18n/zh/common.json b/src/i18n/zh/common.json index c12b177..9d9468b 100644 --- a/src/i18n/zh/common.json +++ b/src/i18n/zh/common.json @@ -59,10 +59,12 @@ "items": "物料", "edit":"編輯", "Edit Equipment Type":"設備類型詳情", + "Edit Equipment":"設備詳情", "equipmentType":"設備類型", "Description":"描述", "Details": "詳情", "Equipment Type Details":"設備類型詳情", "Save":"儲存", - "Cancel":"取消" + "Cancel":"取消", + "Equipment Details":"設備詳情" }