You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

95 regels
3.3 KiB

  1. "use client";
  2. import { ProjectResult } from "@/app/api/projects";
  3. import React, { useMemo, useState, useCallback } from "react";
  4. import SearchBox, { Criterion } from "../SearchBox";
  5. import { useTranslation } from "react-i18next";
  6. import SearchResults, { Column } from "../SearchResults";
  7. import { ClientProjectResult} from "@/app/api/clientprojects";
  8. import { fetchAllClientSubsidiaryProjects} from "@/app/api/clientprojects/actions";
  9. import VisibilityIcon from '@mui/icons-material/Visibility';
  10. import { useRouter, useSearchParams } from "next/navigation";
  11. import ProgressByClient from "@/components/ProgressByClient";
  12. interface Props {
  13. clientProjects: ClientProjectResult[];
  14. }
  15. type SearchQuery = Partial<Omit<ClientProjectResult, "id">>;
  16. type SearchParamNames = keyof SearchQuery;
  17. const ProgressByClientSearch: React.FC<Props> = ({ clientProjects }) => {
  18. const { t } = useTranslation("projects");
  19. const searchParams = useSearchParams()
  20. // If project searching is done on the server-side, then no need for this.
  21. const [filteredProjects, setFilteredProjects] = useState(clientProjects);
  22. const [clientSubsidiaryProjectResult, setClientSubsidiaryProjectResult]:any[] = useState([]);
  23. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
  24. () => [
  25. { label: "Client Code", paramName: "customerCode", type: "text" },
  26. { label: "Client Name", paramName: "customerName", type: "text" },
  27. ],
  28. [t],
  29. );
  30. // const onTaskClick = useCallback((clientProjectResult: ClientProjectResult) => {
  31. // const clickResult = fetchAllClientSubsidiaryProjects(clientProjectResult.customerId, clientProjectResult.subsidiaryId)
  32. // console.log(clickResult)
  33. // setClientSubsidiaryProjectResult(clickResult)
  34. // }, []);
  35. const onTaskClick = useCallback(async (clientProjectResult: ClientProjectResult) => {
  36. try {
  37. const clickResult = await fetchAllClientSubsidiaryProjects(clientProjectResult.customerId, clientProjectResult.subsidiaryId);
  38. console.log(clickResult);
  39. setClientSubsidiaryProjectResult(clickResult);
  40. } catch (error) {
  41. console.error('Error fetching client subsidiary projects:', error);
  42. }
  43. }, []);
  44. const columns = useMemo<Column<ClientProjectResult>[]>(
  45. () => [
  46. {
  47. name: "id",
  48. label: t("Details"),
  49. onClick: onTaskClick,
  50. buttonIcon: <VisibilityIcon />,
  51. },
  52. { name: "customerCode", label: t("Client Code") },
  53. { name: "customerName", label: t("Client Name") },
  54. { name: "subsidiaryCode", label: t("Subsidiary Code") },
  55. { name: "subsidiaryName", label: t("Subisdiary") },
  56. { name: "projectNo", label: t("No. of Projects") },
  57. ],
  58. [onTaskClick, t],
  59. // [t],
  60. );
  61. return (
  62. <>
  63. <SearchBox
  64. criteria={searchCriteria}
  65. onSearch={(query) => {
  66. setFilteredProjects(
  67. clientProjects.filter(
  68. (cp) =>
  69. cp.customerCode.toLowerCase().includes(query.customerCode.toLowerCase()) &&
  70. cp.customerName.toLowerCase().includes(query.customerName.toLowerCase())
  71. ),
  72. );
  73. }}
  74. />
  75. <SearchResults<ClientProjectResult>
  76. items={filteredProjects}
  77. columns={columns}
  78. />
  79. <ProgressByClient clientSubsidiaryProjectResult={clientSubsidiaryProjectResult}/>
  80. </>
  81. );
  82. };
  83. export default ProgressByClientSearch;