{"version":3,"file":"DataTable.cjs","names":[],"sources":["../src/Components/Graphs/DataTable/index.tsx"],"sourcesContent":["import { P } from '@undp/design-system-react/Typography';\r\nimport isEqual from 'fast-deep-equal';\r\nimport intersection from 'lodash.intersection';\r\nimport orderBy from 'lodash.orderby';\r\nimport { useEffect, useEffectEvent, useRef, useState } from 'react';\r\nimport { GraphContainer } from '@/Components/Elements/GraphContainer';\r\nimport { GraphFooter } from '@/Components/Elements/GraphFooter';\r\nimport { GraphHeader } from '@/Components/Elements/GraphHeader';\r\nimport {\r\n  FilterIcon,\r\n  FilterIconApplied,\r\n  SortingIcon,\r\n  SortingIconAscending,\r\n  SortingIconDescending,\r\n} from '@/Components/Icons';\r\nimport type {\r\n  ClassNameObject,\r\n  DataTableColumnDataType,\r\n  Languages,\r\n  SourcesDataType,\r\n  StyleObject,\r\n} from '@/Types';\r\nimport { getTextColorBasedOnBgColor } from '@/Utils/getTextColorBasedOnBgColor';\r\nimport { numberFormattingFunction } from '@/Utils/numberFormattingFunction';\r\n\r\ninterface Props {\r\n  // Data\r\n  /** Array of data objects. If the data have a object for ket `rowStyle` then that is use to style the row of the table. */\r\n  data: object[];\r\n\r\n  // Titles, Labels, and Sources\r\n  /** Title of the graph */\r\n  graphTitle?: string | React.ReactNode;\r\n  /** Description of the graph */\r\n  graphDescription?: string | React.ReactNode;\r\n  /** Footnote for the graph */\r\n  footNote?: string | React.ReactNode;\r\n  /** Source data for the graph */\r\n  sources?: SourcesDataType[];\r\n  /** Accessibility label */\r\n  ariaLabel?: string;\r\n\r\n  // Colors and Styling\r\n  /** Background color of the graph */\r\n  backgroundColor?: string | boolean;\r\n  /** Custom styles for the graph. Each object should be a valid React CSS style object. */\r\n  styles?: StyleObject;\r\n  /** Custom class names */\r\n  classNames?: ClassNameObject;\r\n\r\n  // Size and Spacing\r\n  /** Width of the graph */\r\n  width?: number;\r\n  /** Minimum width of the table as string in px */\r\n  minWidth?: string;\r\n  /** Height of the graph */\r\n  height?: number;\r\n  /** Padding around the graph. Defaults to 0 if no backgroundColor is mentioned else defaults to 1rem */\r\n  padding?: string;\r\n\r\n  // Graph Parameters\r\n  /** Column settings for each column shown in the table. */\r\n  columnData: DataTableColumnDataType[];\r\n  /** Defines how “NA” values should be displayed/labelled in the graph */\r\n  naLabel?: string;\r\n  /** Reset selection on double-click. Only applicable when used in a dashboard context with filters. */\r\n  resetSelectionOnDoubleClick?: boolean;\r\n\r\n  // Interactions and Callbacks\r\n  /** Callback for mouse click event */\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  onSeriesMouseClick?: (_d: any) => void;\r\n\r\n  // Configuration and Options\r\n  /** Language setting  */\r\n  language?: Languages;\r\n  /** Color theme */\r\n  theme?: 'light' | 'dark';\r\n  /** Unique ID for the graph */\r\n  graphID?: string;\r\n}\r\n\r\nconst TotalWidth = (columns: (number | undefined)[]) => {\r\n  const columnWidth = columns.map((d) => d || 1);\r\n  const sum = columnWidth.reduce((acc, cur) => acc + cur, 0);\r\n  return sum;\r\n};\r\n\r\nexport function DataTable(props: Props) {\r\n  const {\r\n    width,\r\n    height,\r\n    graphTitle,\r\n    sources,\r\n    graphDescription,\r\n    footNote,\r\n    graphID,\r\n    data,\r\n    columnData,\r\n    onSeriesMouseClick,\r\n    language = 'en',\r\n    theme = 'light',\r\n    ariaLabel,\r\n    backgroundColor = false,\r\n    padding,\r\n    resetSelectionOnDoubleClick = true,\r\n    styles,\r\n    classNames,\r\n    minWidth,\r\n    naLabel = 'NA',\r\n  } = props;\r\n  const graphParentDiv = useRef<HTMLDivElement>(null);\r\n  const [columnSortBy, setColumnSortBy] = useState<string | undefined>(undefined);\r\n\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const [mouseClickData, setMouseClickData] = useState<any>(undefined);\r\n  const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\r\n  const [popupVisible, setPopupVisible] = useState<string | undefined>(undefined);\r\n  const [popupStyle, setPopupStyle] = useState({});\r\n  const [filterOption, setFilterOption] = useState(\r\n    columnData\r\n      .filter((d) => d.filterOptions && d.filterOptions.length > 0)\r\n      .map((d) => ({ id: d.columnId, option: d.filterOptions as string[] })),\r\n  );\r\n  const [sortedData, setSortedData] = useState(data);\r\n\r\n  const sortDataEvent = useEffectEvent((data: object[]) => {\r\n    setSortedData(data);\r\n  });\r\n\r\n  useEffect(() => {\r\n    // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n    const dataFiltered: any = [];\r\n\r\n    // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n    data.forEach((d: any) => {\r\n      let filter = true;\r\n      filterOption.forEach((el) => {\r\n        if (\r\n          typeof d[el.id] !== 'object' &&\r\n          typeof d[el.id] !== 'function' &&\r\n          typeof d[el.id] !== 'symbol'\r\n        ) {\r\n          if (columnData[columnData.findIndex((cd) => cd.columnId === el.id)].separator) {\r\n            const arr = d[el.id].split(\r\n              columnData[columnData.findIndex((cd) => cd.columnId === el.id)].separator,\r\n            );\r\n            if (intersection(arr, el.option).length === 0) filter = false;\r\n          } else if (el.option.indexOf(d[el.id]) === -1) filter = false;\r\n        }\r\n      });\r\n      if (filter) dataFiltered.push(d);\r\n    });\r\n    if (columnSortBy && data) {\r\n      sortDataEvent(orderBy(dataFiltered, [columnSortBy], [sortDirection]));\r\n    } else {\r\n      sortDataEvent(dataFiltered);\r\n    }\r\n  }, [columnSortBy, sortDirection, data, filterOption, columnData]);\r\n\r\n  return (\r\n    <GraphContainer\r\n      className={classNames?.graphContainer}\r\n      style={styles?.graphContainer}\r\n      id={graphID}\r\n      ref={graphParentDiv}\r\n      aria-label={ariaLabel}\r\n      backgroundColor={backgroundColor}\r\n      theme={theme}\r\n      language={language}\r\n      width={width}\r\n      height={height}\r\n      padding={padding}\r\n    >\r\n      {graphTitle || graphDescription ? (\r\n        <GraphHeader\r\n          styles={{\r\n            title: styles?.title,\r\n            description: styles?.description,\r\n          }}\r\n          classNames={{\r\n            title: classNames?.title,\r\n            description: classNames?.description,\r\n          }}\r\n          graphTitle={graphTitle}\r\n          graphDescription={graphDescription}\r\n          width={width}\r\n        />\r\n      ) : null}\r\n      <div className='grow flex flex-col justify-center'>\r\n        <div\r\n          className='undp-scrollbar'\r\n          style={{\r\n            width: width ? `${width}px` : '100%',\r\n            height: height ? `${height}px` : 'auto',\r\n          }}\r\n        >\r\n          <div style={minWidth ? { minWidth } : undefined}>\r\n            {data ? (\r\n              <table className='w-full' style={{ borderCollapse: 'collapse' }}>\r\n                <thead className='text-left bg-surface border-b border-stroke'>\r\n                  <tr>\r\n                    {columnData?.map((d) => (\r\n                      <th\r\n                        className='text-content-primary text-sm'\r\n                        style={{\r\n                          width: `calc(${\r\n                            (100 * (d.columnWidth || 1)) /\r\n                            TotalWidth(columnData.map((cd) => cd.columnWidth || 1))\r\n                          }%`,\r\n                        }}\r\n                        key={d.columnId}\r\n                      >\r\n                        <div className='flex gap-2 justify-between items-center p-4'>\r\n                          <P\r\n                            size='sm'\r\n                            marginBottom='none'\r\n                            className={`w-fit grow text-${d.align || 'left'} font-bold`}\r\n                          >\r\n                            {d.columnTitle || d.columnId}\r\n                          </P>\r\n                          {d.sortable ? (\r\n                            <button\r\n                              type='button'\r\n                              className='bg-transparent cursor-pointer p-0 m-0 border-0'\r\n                              onClick={() => {\r\n                                if (columnSortBy === d.columnId) {\r\n                                  if (sortDirection === 'asc') {\r\n                                    setSortDirection('desc');\r\n                                  }\r\n                                  if (sortDirection === 'desc') {\r\n                                    setColumnSortBy(undefined);\r\n                                  }\r\n                                } else {\r\n                                  setColumnSortBy(d.columnId);\r\n                                  setSortDirection('asc');\r\n                                }\r\n                              }}\r\n                            >\r\n                              {columnSortBy === d.columnId ? (\r\n                                sortDirection === 'asc' ? (\r\n                                  <SortingIconAscending />\r\n                                ) : (\r\n                                  <SortingIconDescending />\r\n                                )\r\n                              ) : (\r\n                                <SortingIcon />\r\n                              )}\r\n                            </button>\r\n                          ) : null}\r\n                          {d.filterOptions?.length ? (\r\n                            <button\r\n                              type='button'\r\n                              className='bg-transparent cursor-pointer m-0 p-0 border-0'\r\n                              onClick={(event) => {\r\n                                if (popupVisible === d.columnId) {\r\n                                  setPopupVisible(undefined);\r\n                                } else if (event.currentTarget) {\r\n                                  setPopupVisible(d.columnId);\r\n                                  const rect = event.currentTarget.getBoundingClientRect();\r\n                                  setPopupStyle({\r\n                                    top: rect.bottom + window.scrollY,\r\n                                    left:\r\n                                      rect.left + window.scrollX - 160 < 0\r\n                                        ? rect.left + window.scrollX\r\n                                        : rect.left + window.scrollX - 160,\r\n                                    width: '10rem',\r\n                                  });\r\n                                }\r\n                              }}\r\n                            >\r\n                              {filterOption[filterOption.findIndex((el) => el.id === d.columnId)]\r\n                                .option.length === d.filterOptions?.length ? (\r\n                                <FilterIcon />\r\n                              ) : (\r\n                                <FilterIconApplied />\r\n                              )}\r\n                            </button>\r\n                          ) : null}\r\n                        </div>\r\n                      </th>\r\n                    ))}\r\n                  </tr>\r\n                </thead>\r\n                <tbody>\r\n                  {/* biome-ignore lint/suspicious/noExplicitAny: undefined data type */}\r\n                  {sortedData?.map((d: any, i: number) => (\r\n                    <tr\r\n                      // biome-ignore lint/suspicious/noArrayIndexKey: index is the unique identifier\r\n                      key={i}\r\n                      className={`cursor-${\r\n                        onSeriesMouseClick ? 'pointer' : 'auto'\r\n                      } border-b border-stroke ${\r\n                        isEqual(mouseClickData, d) ? 'bg-surface' : 'bg-transparent'\r\n                      }`}\r\n                      style={d.rowStyle}\r\n                      onClick={() => {\r\n                        if (onSeriesMouseClick) {\r\n                          if (isEqual(mouseClickData, d) && resetSelectionOnDoubleClick) {\r\n                            setMouseClickData(undefined);\r\n                            onSeriesMouseClick(undefined);\r\n                          } else {\r\n                            setMouseClickData(d);\r\n                            onSeriesMouseClick(d);\r\n                          }\r\n                        }\r\n                      }}\r\n                    >\r\n                      {columnData.map((el) => (\r\n                        <td\r\n                          key={el.columnId}\r\n                          className={`text-content-primary text-sm text-${el.align || 'left'}`}\r\n                          style={{\r\n                            width: `calc(${\r\n                              (100 * (d.columnWidth || 1)) /\r\n                              TotalWidth(columnData.map((cd) => cd.columnWidth || 1))\r\n                            }%`,\r\n                          }}\r\n                        >\r\n                          <div\r\n                            className={`text-content-primary flex p-4 ${\r\n                              el.align === 'right'\r\n                                ? 'justify-end'\r\n                                : el.align === 'center'\r\n                                  ? 'justify-center'\r\n                                  : 'justify-start'\r\n                            }`}\r\n                          >\r\n                            {typeof d[el.columnId] === 'number' ? (\r\n                              <P\r\n                                marginBottom='none'\r\n                                size='sm'\r\n                                className={`text-content-primary w-fit ${\r\n                                  el.chip ? 'grow-0 rounded-sm p-2' : 'grow rounded-none p-0'\r\n                                } text-${el.align || 'left'} ${\r\n                                  el.chip\r\n                                    ? !el.chipColors\r\n                                      ? 'bg-surface-sm'\r\n                                      : ''\r\n                                    : 'bg-transparent'\r\n                                }`}\r\n                                style={{\r\n                                  ...(el.chip && el.chipColors\r\n                                    ? {\r\n                                        backgroundColor:\r\n                                          el.chipColors[\r\n                                            el.chipColors.findIndex(\r\n                                              (c) => c.value === d[el.chipColumnId || el.columnId],\r\n                                            )\r\n                                          ].color,\r\n                                        color: getTextColorBasedOnBgColor(\r\n                                          el.chipColors[\r\n                                            el.chipColors.findIndex(\r\n                                              (c) => c.value === d[el.chipColumnId || el.columnId],\r\n                                            )\r\n                                          ].color,\r\n                                        ),\r\n                                      }\r\n                                    : {}),\r\n                                }}\r\n                              >\r\n                                {numberFormattingFunction(\r\n                                  d[el.columnId],\r\n                                  naLabel,\r\n                                  el.precision,\r\n                                  el.prefix,\r\n                                  el.suffix,\r\n                                  el.locale,\r\n                                  el.padZeros,\r\n                                )}\r\n                              </P>\r\n                            ) : typeof d[el.columnId] === 'string' ? (\r\n                              el.separator ? (\r\n                                <div className='text-content-primary flex flex-wrap gap-2'>\r\n                                  {d[el.columnId].split(el.separator).map((element: string) => (\r\n                                    <P\r\n                                      key={element}\r\n                                      marginBottom='none'\r\n                                      size='sm'\r\n                                      className={`text-content-primary w-fit ${\r\n                                        el.chip ? 'grow-0 rounded-sm p-2' : 'grow rounded-none p-0'\r\n                                      } text-${el.align || 'left'} ${\r\n                                        el.chip\r\n                                          ? !el.chipColors\r\n                                            ? 'bg-surface-sm'\r\n                                            : ''\r\n                                          : 'bg-transparent'\r\n                                      }`}\r\n                                      style={{\r\n                                        ...(el.chip && el.chipColors\r\n                                          ? {\r\n                                              backgroundColor:\r\n                                                el.chipColors[\r\n                                                  el.chipColors.findIndex(\r\n                                                    (c) =>\r\n                                                      c.value ===\r\n                                                      (el.chipColumnId\r\n                                                        ? d[el.chipColumnId]\r\n                                                        : element),\r\n                                                  )\r\n                                                ].color,\r\n                                              color: getTextColorBasedOnBgColor(\r\n                                                el.chipColors[\r\n                                                  el.chipColors.findIndex(\r\n                                                    (c) =>\r\n                                                      c.value ===\r\n                                                      (el.chipColumnId\r\n                                                        ? d[el.chipColumnId]\r\n                                                        : element),\r\n                                                  )\r\n                                                ].color,\r\n                                              ),\r\n                                            }\r\n                                          : {}),\r\n                                      }}\r\n                                    >\r\n                                      {numberFormattingFunction(\r\n                                        element,\r\n                                        naLabel,\r\n                                        el.precision,\r\n                                        el.prefix,\r\n                                        el.suffix,\r\n                                        el.locale,\r\n                                        el.padZeros,\r\n                                      )}\r\n                                    </P>\r\n                                  ))}\r\n                                </div>\r\n                              ) : (\r\n                                <P\r\n                                  marginBottom='none'\r\n                                  size='sm'\r\n                                  className={`text-content-primary w-fit ${\r\n                                    el.chip ? 'grow-0 rounded-sm p-2' : 'grow rounded-none p-0'\r\n                                  } text-${el.align || 'left'} ${\r\n                                    el.chip\r\n                                      ? !el.chipColors\r\n                                        ? 'bg-surface-sm'\r\n                                        : ''\r\n                                      : 'bg-transparent'\r\n                                  }`}\r\n                                  style={{\r\n                                    ...(el.chip && el.chipColors\r\n                                      ? {\r\n                                          backgroundColor:\r\n                                            el.chipColors[\r\n                                              el.chipColors.findIndex(\r\n                                                (c) =>\r\n                                                  c.value === d[el.chipColumnId || el.columnId],\r\n                                              )\r\n                                            ].color,\r\n                                          color: getTextColorBasedOnBgColor(\r\n                                            el.chipColors[\r\n                                              el.chipColors.findIndex(\r\n                                                (c) =>\r\n                                                  c.value === d[el.chipColumnId || el.columnId],\r\n                                              )\r\n                                            ].color,\r\n                                          ),\r\n                                        }\r\n                                      : {}),\r\n                                  }}\r\n                                >\r\n                                  {numberFormattingFunction(\r\n                                    d[el.columnId],\r\n                                    naLabel,\r\n                                    el.precision,\r\n                                    el.prefix,\r\n                                    el.suffix,\r\n                                    el.locale,\r\n                                    el.padZeros,\r\n                                  )}\r\n                                </P>\r\n                              )\r\n                            ) : (\r\n                              <div>\r\n                                {numberFormattingFunction(\r\n                                  d[el.columnId],\r\n                                  naLabel,\r\n                                  el.precision,\r\n                                  el.prefix,\r\n                                  el.suffix,\r\n                                  el.locale,\r\n                                  el.padZeros,\r\n                                )}\r\n                              </div>\r\n                            )}\r\n                          </div>\r\n                        </td>\r\n                      ))}\r\n                    </tr>\r\n                  ))}\r\n                </tbody>\r\n              </table>\r\n            ) : null}\r\n          </div>\r\n        </div>\r\n      </div>\r\n      {sources || footNote ? (\r\n        <GraphFooter\r\n          styles={{ footnote: styles?.footnote, source: styles?.source }}\r\n          classNames={{\r\n            footnote: classNames?.footnote,\r\n            source: classNames?.source,\r\n          }}\r\n          sources={sources}\r\n          footNote={footNote}\r\n          width={width}\r\n        />\r\n      ) : null}\r\n      {popupVisible && (\r\n        <div\r\n          style={popupStyle}\r\n          className='absolute p-3 border z-1000 rounded-sm bg-background border-stroke'\r\n        >\r\n          <div className='max-w-60'>\r\n            <P size='sm' marginBottom='2xs' className='font-bold'>\r\n              Filter data by\r\n            </P>\r\n            <div className='flex flex-col gap-2'>\r\n              {columnData[\r\n                columnData.findIndex((d) => d.columnId === popupVisible)\r\n              ].filterOptions?.map((el) => (\r\n                <div key={el}>\r\n                  <label className='undp-viz-label'>\r\n                    <input\r\n                      type='checkbox'\r\n                      className='undp-viz-checkbox'\r\n                      checked={\r\n                        filterOption[\r\n                          filterOption.findIndex((d) => d.id === popupVisible)\r\n                        ].option.indexOf(el) !== -1\r\n                      }\r\n                      onChange={() => {\r\n                        const indx = filterOption.findIndex((d) => d.id === popupVisible);\r\n                        const opt = [...filterOption[indx].option];\r\n                        if (opt.indexOf(el) !== -1) {\r\n                          opt.splice(opt.indexOf(el), 1);\r\n                          const filterOptionDuplicate = [...filterOption];\r\n                          filterOptionDuplicate[indx].option = opt;\r\n                          setFilterOption(filterOptionDuplicate);\r\n                        } else {\r\n                          opt.push(el);\r\n                          const filterOptionDuplicate = [...filterOption];\r\n                          filterOptionDuplicate[indx].option = opt;\r\n                          setFilterOption(filterOptionDuplicate);\r\n                        }\r\n                      }}\r\n                    />\r\n                    {el}\r\n                  </label>\r\n                </div>\r\n              ))}\r\n            </div>\r\n          </div>\r\n        </div>\r\n      )}\r\n    </GraphContainer>\r\n  );\r\n}\r\n"],"mappings":"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"}