Advertisement
kunbata

Bugs en wensen table

May 11th, 2024
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //bugs and wensen table
  2.  
  3. import { WorkItem } from "@/app/(licentie)/interfaces";
  4. import {
  5.   Badge,
  6.   DataGrid,
  7.   DataGridBody,
  8.   DataGridCell,
  9.   DataGridHeader,
  10.   DataGridHeaderCell,
  11.   DataGridRow,
  12.   Menu,
  13.   MenuItem,
  14.   MenuList,
  15.   MenuPopover,
  16.   MenuTrigger,
  17.   TableCellLayout,
  18.   TableColumnDefinition,
  19.   Tooltip,
  20.   createTableColumn,
  21. } from "@fluentui/react-components";
  22. import { useRef } from "react";
  23. import bugLogo from "../../../../../public/assets/Bug Rood.svg";
  24. import wensLogo from "../../../../../public/assets/wens.svg";
  25. import Image from "next/image";
  26. import { useAppContext } from "@/app/context";
  27. import Link from "next/link";
  28. import { getImageFromLicentie } from "@/core/utils/functions";
  29. import {DataGridProps} from "@fluentui-contrib/react-data-grid-react-window";
  30.  
  31. const columnSizingOptions = {
  32.   code: {
  33.     minWidth: 80,
  34.     defaultWidth: 100,
  35.   },
  36.   title: {
  37.     minWidth: 300,
  38.     defaultWidth: 600,
  39.   },
  40.   type: {
  41.     minWidth: 150,
  42.     defaultWidth: 200,
  43.   },
  44.   week: {
  45.     minWidth: 120,
  46.     defaultWidth: 180,
  47.   },
  48.   link: {
  49.     minWidth: 120,
  50.     defaultWidth: 120,
  51.   },
  52. };
  53.  
  54. function BugsWensenTable({ workItems, sortState, onSortChange }: { workItems: WorkItem[], sortState: Parameters<NonNullable<DataGridProps["onSortChange"]>>[1];
  55.   onSortChange: (e: React.MouseEvent, sortState: Parameters<NonNullable<DataGridProps["onSortChange"]>>[1]) => void; }) {
  56.   const { userData } = useAppContext();
  57.   const refMap = useRef<Record<string, HTMLElement | null>>({});
  58.  
  59.   const getIterationPath = (item: WorkItem) => {
  60.     const parts = item.fullIteration!.split("\\");
  61.     const waveString = parts[2];
  62.     return waveString;
  63.   };
  64.  
  65.   const newLicentieString = (path: string) => {
  66.     const modifiedString = path.replace(/[^\\]+\\[\d.]+\s*/g, "");
  67.     return getImageFromLicentie(modifiedString);
  68.   };
  69.  
  70.   const dataBalkcolumns: TableColumnDefinition<WorkItem>[] = [
  71.     createTableColumn<WorkItem>({
  72.       columnId: "code",
  73.       compare: (a,b) => 0,
  74.       renderHeaderCell: () => {
  75.         return "Code";
  76.       },
  77.       renderCell: (item) => {
  78.         return (
  79.           <TableCellLayout>
  80.             <Link
  81.               href={`https://dev.azure.com/databalk/Debatic/_workitems/edit/${item.id}/`}
  82.               target="_blank"
  83.               style={{
  84.                 textDecoration: "underline",
  85.                 color: "#0e5f7f",
  86.               }}
  87.             >
  88.               <Badge
  89.                 color="informative"
  90.                 style={{
  91.                   textDecoration: "underline",
  92.                 }}
  93.               >
  94.                 {item.id}
  95.               </Badge>
  96.             </Link>
  97.           </TableCellLayout>
  98.         );
  99.       },
  100.     }),
  101.     createTableColumn<WorkItem>({
  102.       columnId: "title",
  103.       compare: (a,b) => 0,
  104.       renderHeaderCell: () => {
  105.         return "Title";
  106.       },
  107.       renderCell: (item) => {
  108.         return (
  109.           <TableCellLayout>
  110.             <Link
  111.               href={`/ontwikkeling/${item.id}`}
  112.               style={{
  113.                 color: "#0e5f7f",
  114.                 textDecoration: "underline",
  115.               }}
  116.             >
  117.               {item.title}
  118.             </Link>
  119.           </TableCellLayout>
  120.         );
  121.       },
  122.     }),
  123.     createTableColumn<WorkItem>({
  124.       columnId: "type",
  125.       compare: (a,b) => 0,
  126.       renderHeaderCell: () => {
  127.         return "Type";
  128.       },
  129.       renderCell: (item) => {
  130.         return (
  131.           <TableCellLayout
  132.             media={
  133.               <Image
  134.                 src={item.type == "Product Backlog Item" ? wensLogo : bugLogo}
  135.                 width={30}
  136.                 height={30}
  137.                 alt="Bug icon"
  138.               />
  139.             }
  140.           ></TableCellLayout>
  141.         );
  142.       },
  143.     }),
  144.     createTableColumn<WorkItem>({
  145.       columnId: "fibo",
  146.       compare: (a,b) => 0,
  147.       renderHeaderCell: () => {
  148.         return "Fibo";
  149.       },
  150.       renderCell: (item) => {
  151.         return (
  152.           <TableCellLayout>
  153.             <Badge>{item.fibo ?? -1}</Badge>
  154.           </TableCellLayout>
  155.         );
  156.       },
  157.     }),
  158.     createTableColumn<WorkItem>({
  159.       columnId: "path",
  160.       compare: (a,b) => 0,
  161.       renderHeaderCell: () => {
  162.         return "Licentie";
  163.       },
  164.       renderCell: (item) => {
  165.         return (
  166.           <TableCellLayout>
  167.             <Tooltip
  168.               content={newLicentieString(item?.path!).name}
  169.               relationship="label"
  170.             >
  171.               <img
  172.                 src={newLicentieString(item?.path!).logo}
  173.                 alt="zaken-licentie"
  174.                 width={25}
  175.                 height={25}
  176.               />
  177.             </Tooltip>
  178.           </TableCellLayout>
  179.         );
  180.       },
  181.     }),
  182.     createTableColumn<WorkItem>({
  183.       columnId: "iteration",
  184.       renderHeaderCell: () => {
  185.         return "Versie";
  186.       },
  187.       renderCell: (item) => {
  188.         return <TableCellLayout>{getIterationPath(item)}</TableCellLayout>;
  189.       },
  190.     }),
  191.     createTableColumn<WorkItem>({
  192.       columnId: "full_iteration",
  193.       compare: (a,b) => 0,
  194.       renderHeaderCell: () => {
  195.         return "Sprint";
  196.       },
  197.       renderCell: (item) => {
  198.         return <TableCellLayout>{item.iteration}</TableCellLayout>;
  199.       },
  200.     }),
  201.   ];
  202.  
  203.   const columns: TableColumnDefinition<WorkItem>[] = [
  204.     createTableColumn<WorkItem>({
  205.       columnId: "code",
  206.       compare: (a,b) => 0,
  207.       renderHeaderCell: () => {
  208.         return "Code";
  209.       },
  210.       renderCell: (item) => {
  211.         return (
  212.           <TableCellLayout>
  213.             <Badge color="informative">{item.id}</Badge>
  214.           </TableCellLayout>
  215.         );
  216.       },
  217.     }),
  218.     createTableColumn<WorkItem>({
  219.       columnId: "title",
  220.       compare: (a,b) => 0,
  221.       renderHeaderCell: () => {
  222.         return "Title";
  223.       },
  224.       renderCell: (item) => {
  225.         return (
  226.           <TableCellLayout>
  227.             <Link
  228.               href={`/ontwikkeling/${item.id}`}
  229.               style={{
  230.                 color: "#0e5f7f",
  231.                 textDecoration: "underline",
  232.               }}
  233.             >
  234.               {item.title}
  235.             </Link>
  236.           </TableCellLayout>
  237.         );
  238.       },
  239.     }),
  240.     createTableColumn<WorkItem>({
  241.       columnId: "type",
  242.       renderHeaderCell: () => {
  243.         return "Type";
  244.       },
  245.       renderCell: (item) => {
  246.         return (
  247.           <TableCellLayout
  248.             media={
  249.               <Image
  250.                 src={item.type == "Product Backlog Item" ? wensLogo : bugLogo}
  251.                 width={30}
  252.                 height={30}
  253.                 alt="Bug icon"
  254.               />
  255.             }
  256.           ></TableCellLayout>
  257.         );
  258.       },
  259.     }),
  260.     createTableColumn<WorkItem>({
  261.       columnId: "fibo",
  262.       compare: (a,b) => 0,
  263.       renderHeaderCell: () => {
  264.         return "Fibo";
  265.       },
  266.       renderCell: (item) => {
  267.         return (
  268.           <TableCellLayout>
  269.             <Badge>{item.fibo ?? -1}</Badge>
  270.           </TableCellLayout>
  271.         );
  272.       },
  273.     }),
  274.     createTableColumn<WorkItem>({
  275.       columnId: "path",
  276.       compare: (a,b) => 0,
  277.       renderHeaderCell: () => {
  278.         return "Licentie";
  279.       },
  280.       renderCell: (item) => {
  281.         return (
  282.           <TableCellLayout>
  283.             <Tooltip
  284.               content={newLicentieString(item?.path!).name}
  285.               relationship="label"
  286.             >
  287.               <img
  288.                 src={newLicentieString(item?.path!).logo}
  289.                 alt="zaken-licentie"
  290.                 width={25}
  291.                 height={25}
  292.               />
  293.             </Tooltip>
  294.           </TableCellLayout>
  295.         );
  296.       },
  297.     }),
  298.     createTableColumn<WorkItem>({
  299.       columnId: "iteration",
  300.       renderHeaderCell: () => {
  301.         return "Versie";
  302.       },
  303.       renderCell: (item) => {
  304.         return <TableCellLayout>{getIterationPath(item)}</TableCellLayout>;
  305.       },
  306.     }),
  307.     createTableColumn<WorkItem>({
  308.       columnId: "full_iteration",
  309.       compare: (a,b) => 0,
  310.       renderHeaderCell: () => {
  311.         return "Sprint";
  312.       },
  313.       renderCell: (item) => {
  314.         return <TableCellLayout>{item.iteration}</TableCellLayout>;
  315.       },
  316.     }),
  317.   ];
  318.  
  319.   return (
  320.     <div
  321.       style={{
  322.         backgroundColor: "white",
  323.         overflowY: "hidden",
  324.       }}
  325.     >
  326.       {workItems.length == 0 ? (
  327.         <div
  328.           style={{
  329.             padding: "20px 30px",
  330.             textAlign: "center",
  331.             fontSize: "1.1rem",
  332.           }}
  333.         >
  334.           Geen bugs of wensen
  335.         </div>
  336.       ) : (
  337.         <DataGrid
  338.           items={workItems}
  339.           columns={
  340.             userData?.mail.includes("databalk") ? dataBalkcolumns : columns
  341.           }
  342.           sortable
  343.           selectionMode="multiselect"
  344.           resizableColumns
  345.           columnSizingOptions={columnSizingOptions}
  346.           sortState={sortState}
  347.           onSortChange={onSortChange}
  348.         >
  349.           <DataGridHeader>
  350.             <DataGridRow selectionCell={{ "aria-label": "Select all rows" }}>
  351.               {({ renderHeaderCell, columnId }, dataGrid) =>
  352.                 dataGrid.resizableColumns ? (
  353.                   <Menu openOnContext>
  354.                     <MenuTrigger>
  355.                       <DataGridHeaderCell
  356.                         ref={(el) => (refMap.current[columnId] = el)}
  357.                       >
  358.                         {renderHeaderCell()}
  359.                       </DataGridHeaderCell>
  360.                     </MenuTrigger>
  361.                     <MenuPopover>
  362.                       <MenuList>
  363.                         <MenuItem
  364.                           onClick={dataGrid.columnSizing_unstable.enableKeyboardMode(
  365.                             columnId
  366.                           )}
  367.                         >
  368.                           Keyboard Column Resizing
  369.                         </MenuItem>
  370.                       </MenuList>
  371.                     </MenuPopover>
  372.                   </Menu>
  373.                 ) : (
  374.                   <DataGridHeaderCell>{renderHeaderCell()}</DataGridHeaderCell>
  375.                 )
  376.               }
  377.             </DataGridRow>
  378.           </DataGridHeader>
  379.           <DataGridBody<WorkItem>>
  380.             {({ item, rowId }) => (
  381.               <DataGridRow<WorkItem>
  382.                 key={rowId}
  383.                 selectionCell={{ "aria-label": "Select row" }}
  384.               >
  385.                 {({ renderCell }) => (
  386.                   <DataGridCell>{renderCell(item)}</DataGridCell>
  387.                 )}
  388.               </DataGridRow>
  389.             )}
  390.           </DataGridBody>
  391.         </DataGrid>
  392.       )}
  393.     </div>
  394.   );
  395. }
  396.  
  397. export default BugsWensenTable;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement