FPSMS-frontend
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 

95 wiersze
3.1 KiB

  1. "use client";
  2. import Link from "next/link";
  3. import MuiLink from "@mui/material/Link";
  4. import { isWorkbenchTicketNo, normalizeTargetDateForLink } from "./traceDocLinkUtils";
  5. type DocLinkProps = {
  6. kind: "jo" | "po" | "pick" | "workbench" | "jodetail";
  7. code: string;
  8. id?: number | null;
  9. consoCode?: string;
  10. ticketNo?: string;
  11. targetDate?: string;
  12. /** Finished Good Record tab on /doworkbench (default: 3 = all). */
  13. workbenchTab?: number;
  14. /** Completed JO pick record tab on /jodetail (default: 1 = complete records). */
  15. jodetailTab?: number;
  16. /** Open in a new browser tab (used for links inside the flow graph). */
  17. openInNewTab?: boolean;
  18. };
  19. const stopGraphEvent = (e: React.MouseEvent) => {
  20. e.stopPropagation();
  21. };
  22. /** FP-MTMS Version Checklist | Functions Ref. No. 16 | v1.0.1 | 2026-07-19 */
  23. const ItemTracingDocLink: React.FC<DocLinkProps> = ({
  24. kind,
  25. code,
  26. id,
  27. consoCode,
  28. ticketNo,
  29. targetDate,
  30. workbenchTab = 3,
  31. jodetailTab = 1,
  32. openInNewTab = false,
  33. }) => {
  34. if (!code?.trim()) return <>—</>;
  35. const linkTargetDate = normalizeTargetDateForLink(targetDate);
  36. let href = "#";
  37. if (kind === "jo" && id) href = `/jo/edit?id=${id}`;
  38. else if (kind === "po" && id) href = `/po/edit?id=${id}`;
  39. else if (kind === "workbench" && ticketNo?.trim()) {
  40. const params = new URLSearchParams();
  41. params.set("tab", String(workbenchTab));
  42. params.set("ticketNo", ticketNo.trim());
  43. if (linkTargetDate) params.set("targetDate", linkTargetDate);
  44. // Only Item Tracing deep-links should auto-open detail (not DO finish redirect).
  45. params.set("openDetail", "1");
  46. href = `/doworkbench?${params.toString()}`;
  47. } else if (kind === "jodetail" && (consoCode || code)) {
  48. const params = new URLSearchParams();
  49. params.set("tab", String(jodetailTab));
  50. // Prefer PI-* pick order code for jodetail search; consoCode may be PICK-*.
  51. params.set("pickOrderCode", (code || consoCode || "").trim());
  52. if (linkTargetDate) params.set("targetDate", linkTargetDate);
  53. params.set("openDetail", "1");
  54. href = `/jodetail?${params.toString()}`;
  55. } else if (kind === "pick") {
  56. // /pickOrder/detail?consoCode=… is retired — only link when we have a TI-* workbench ticket.
  57. const workbenchTicket = [ticketNo, consoCode, code]
  58. .map((v) => (v ?? "").trim())
  59. .find(isWorkbenchTicketNo);
  60. if (workbenchTicket) {
  61. const params = new URLSearchParams();
  62. params.set("tab", String(workbenchTab));
  63. params.set("ticketNo", workbenchTicket);
  64. if (linkTargetDate) params.set("targetDate", linkTargetDate);
  65. params.set("openDetail", "1");
  66. href = `/doworkbench?${params.toString()}`;
  67. } else {
  68. return <>{code}</>;
  69. }
  70. } else {
  71. return <>{code}</>;
  72. }
  73. return (
  74. <MuiLink
  75. component={Link}
  76. href={href}
  77. underline="hover"
  78. {...(openInNewTab ? { target: "_blank", rel: "noopener noreferrer" } : {})}
  79. onClick={openInNewTab ? stopGraphEvent : undefined}
  80. onMouseDown={openInNewTab ? stopGraphEvent : undefined}
  81. >
  82. {code}
  83. </MuiLink>
  84. );
  85. };
  86. export default ItemTracingDocLink;