From f0db5eae76d2a96ccd7e06c342806958eeca829d Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Fri, 31 May 2024 16:17:43 +0800 Subject: [PATCH] update --- src/app/api/customer/actions.ts | 7 +++---- src/app/api/customer/index.ts | 4 +++- src/app/api/subsidiary/actions.ts | 2 ++ src/app/api/subsidiary/index.ts | 2 +- src/components/CustomerSearch/CustomerSearch.tsx | 7 ++++--- .../CustomerSearch/CustomerSearchWrapper.tsx | 2 +- .../NavigationContent/NavigationContent.tsx | 11 +++++++++-- src/components/SubsidiarySearch/SubsidiarySearch.tsx | 8 ++++++-- src/middleware.ts | 3 +++ 9 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/app/api/customer/actions.ts b/src/app/api/customer/actions.ts index fd030d5..f0422da 100644 --- a/src/app/api/customer/actions.ts +++ b/src/app/api/customer/actions.ts @@ -1,11 +1,9 @@ -import { Subsidiary } from '@/app/api/customer'; "use server"; import { serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil"; import { BASE_API_URL } from "@/config/api"; import { Contact, Customer, SaveCustomerResponse } from "."; -import { revalidateTag } from "next/cache"; -import { cache } from "react"; +import { revalidatePath, revalidateTag } from "next/cache"; export interface CustomerFormInputs { @@ -72,6 +70,7 @@ export const deleteCustomer = async (id: number) => { headers: { "Content-Type": "application/json" }, }, ); - + + revalidateTag("customers") return customer }; \ No newline at end of file diff --git a/src/app/api/customer/index.ts b/src/app/api/customer/index.ts index 1b35b40..a2c405a 100644 --- a/src/app/api/customer/index.ts +++ b/src/app/api/customer/index.ts @@ -72,7 +72,9 @@ export const preloadAllCustomers = () => { }; export const fetchAllCustomers = cache(async () => { - return serverFetchJson(`${BASE_API_URL}/customer`); + return serverFetchJson(`${BASE_API_URL}/customer`, { + next: { tags: ["customers"]} + }); }); export const fetchAllSubsidiaries = cache(async () => { diff --git a/src/app/api/subsidiary/actions.ts b/src/app/api/subsidiary/actions.ts index 7e4d6fb..afb59ab 100644 --- a/src/app/api/subsidiary/actions.ts +++ b/src/app/api/subsidiary/actions.ts @@ -70,5 +70,7 @@ export const deleteSubsidiary = async (id: number) => { }, ); + revalidateTag("subsidiaries"); + return subsidiary }; \ No newline at end of file diff --git a/src/app/api/subsidiary/index.ts b/src/app/api/subsidiary/index.ts index aa03215..c214879 100644 --- a/src/app/api/subsidiary/index.ts +++ b/src/app/api/subsidiary/index.ts @@ -74,7 +74,7 @@ export const fetchAllSubsidiaries = cache(async () => { return serverFetchJson( `${BASE_API_URL}/subsidiary`, { - next: { tags: ["subsidiary"] }, + next: { tags: ["subsidiaries"] }, }, ); }); diff --git a/src/components/CustomerSearch/CustomerSearch.tsx b/src/components/CustomerSearch/CustomerSearch.tsx index 93bef1d..cacf5fa 100644 --- a/src/components/CustomerSearch/CustomerSearch.tsx +++ b/src/components/CustomerSearch/CustomerSearch.tsx @@ -1,7 +1,7 @@ "use client"; import { Customer } from "@/app/api/customer"; -import React, { useCallback, useMemo, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import SearchBox, { Criterion } from "../SearchBox"; import { useTranslation } from "react-i18next"; import SearchResults, { Column } from "../SearchResults"; @@ -24,6 +24,9 @@ const CustomerSearch: React.FC = ({ customers }) => { const searchParams = useSearchParams() const [filteredCustomers, setFilteredCustomers] = useState(customers); + useEffect(() => { + setFilteredCustomers(customers) + }, [customers]) const searchCriteria: Criterion[] = useMemo( () => [ { label: t("Customer Code"), paramName: "code", type: "text" }, @@ -47,8 +50,6 @@ const CustomerSearch: React.FC = ({ customers }) => { await deleteCustomer(customer.id) successDialog("Delete Success", t) - - setFilteredCustomers((prev) => prev.filter((obj) => obj.id !== customer.id)) }, t) }, []); diff --git a/src/components/CustomerSearch/CustomerSearchWrapper.tsx b/src/components/CustomerSearch/CustomerSearchWrapper.tsx index 53ac3a6..531adb6 100644 --- a/src/components/CustomerSearch/CustomerSearchWrapper.tsx +++ b/src/components/CustomerSearch/CustomerSearchWrapper.tsx @@ -8,7 +8,7 @@ interface SubComponents { } const CustomerSearchWrapper: React.FC & SubComponents = async () => { - const customers = await fetchAllCustomers(); + const [customers] = await Promise.all([fetchAllCustomers()]); return ; }; diff --git a/src/components/NavigationContent/NavigationContent.tsx b/src/components/NavigationContent/NavigationContent.tsx index 2d212be..d47b6e2 100644 --- a/src/components/NavigationContent/NavigationContent.tsx +++ b/src/components/NavigationContent/NavigationContent.tsx @@ -66,7 +66,7 @@ const NavigationContent: React.FC = ({ abilities }) => { { icon: , label: "User Workspace", - path: "/home", + path: "/home", showOnMobile: true, }, { @@ -131,7 +131,14 @@ const NavigationContent: React.FC = ({ abilities }) => { // }, { icon: , label: "Project Management", path: "/projects", isHidden: ![MAINTAIN_PROJECT].some((ability) => abilities?.includes(ability)) }, { icon: , label: "Task Template", path: "/tasks", isHidden: ![MAINTAIN_TASK_TEMPLATE].some((ability) => abilities?.includes(ability)) }, - { icon: , label: "Invoice", path: "/invoice" }, + { + icon: , + label: "Invoice", + path: "/invoice", + isHidden: ![VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => + abilities!.includes(ability), + ), + }, { icon: , label: "Analysis Report", diff --git a/src/components/SubsidiarySearch/SubsidiarySearch.tsx b/src/components/SubsidiarySearch/SubsidiarySearch.tsx index 45e4ded..a50f4a9 100644 --- a/src/components/SubsidiarySearch/SubsidiarySearch.tsx +++ b/src/components/SubsidiarySearch/SubsidiarySearch.tsx @@ -1,6 +1,6 @@ "use client"; -import React, { useCallback, useMemo, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import SearchBox, { Criterion } from "../SearchBox"; import { useTranslation } from "react-i18next"; import SearchResults, { Column } from "../SearchResults"; @@ -24,6 +24,10 @@ const SubsidiarySearch: React.FC = ({ subsidiaries }) => { const searchParams = useSearchParams() const [filteredSubsidiaries, setFilteredSubsidiaries] = useState(subsidiaries); + useEffect(() => { + setFilteredSubsidiaries(subsidiaries) + }, [subsidiaries]) + const searchCriteria: Criterion[] = useMemo( () => [ { label: t("Subsidiary Code"), paramName: "code", type: "text" }, @@ -48,7 +52,7 @@ const SubsidiarySearch: React.FC = ({ subsidiaries }) => { successDialog(t("Delete Success"), t) - setFilteredSubsidiaries((prev) => prev.filter((obj) => obj.id !== subsidiary.id)) + // setFilteredSubsidiaries((prev) => prev.filter((obj) => obj.id !== subsidiary.id)) }, t) }, []); diff --git a/src/middleware.ts b/src/middleware.ts index 4139722..198ed27 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -121,6 +121,9 @@ export default async function middleware( if (req.nextUrl.pathname.startsWith('/settings/staff/edit')) { isAuth = [VIEW_STAFF_PROFILE].some((ability) => abilities.includes(ability)); } + if (req.nextUrl.pathname.startsWith('/invoice')) { + isAuth = [IMPORT_INVOICE].some((ability) => abilities.includes(ability)); + } return isAuth } }