{"version":3,"file":"DataCards-Bew2QfFu.cjs","names":[],"sources":["../src/Components/Graphs/DataCards/Graph.tsx","../src/Components/Graphs/DataCards/index.tsx"],"sourcesContent":["import { cn } from '@undp/design-system-react/cn';\r\nimport { Modal } from '@undp/design-system-react/Modal';\r\nimport { useState } from 'react';\r\nimport { CsvDownloadButton } from '@/Components/Actions/CsvDownloadButton';\r\nimport { FileDown } from '@/Components/Icons';\r\nimport type { ClassNameObject, StyleObject } from '@/Types';\r\nimport { string2HTML } from '@/Utils/string2HTML';\r\n\r\nexport type FilterDataType = {\r\n  column: string;\r\n  label?: string;\r\n  defaultValue?: string;\r\n  excludeValues?: string[];\r\n  width?: string;\r\n};\r\n\r\ninterface Props {\r\n  data: object[];\r\n  cardBackgroundColor?: string;\r\n  styles?: StyleObject;\r\n  classNames?: ClassNameObject;\r\n  width?: number;\r\n  height?: number;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  cardTemplate: string | ((_d: any) => React.ReactNode);\r\n  cardMinWidth: number;\r\n  noOfItemsInAPage?: number;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  detailsOnClick?: string | ((_d: any) => React.ReactNode);\r\n  allowDataDownloadOnDetail: boolean | string;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  onSeriesMouseClick?: (_d: any) => void;\r\n  page: number;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\nconst csvData = (data: any) => {\r\n  if (!data) return {};\r\n  const dataForCsv = Object.entries(data).map(([key, value]) => {\r\n    if (Array.isArray(value)) {\r\n      return {\r\n        ' ': key,\r\n        value: `\"${value.join('; ')}\"`,\r\n      };\r\n    }\r\n    return {\r\n      ' ': key,\r\n      value: `\"${value}\"`,\r\n    };\r\n  });\r\n  return dataForCsv;\r\n};\r\n\r\nexport function Graph(props: Props) {\r\n  const {\r\n    width,\r\n    height,\r\n    data,\r\n    onSeriesMouseClick,\r\n    cardTemplate,\r\n    cardBackgroundColor,\r\n    cardMinWidth = 320,\r\n    detailsOnClick,\r\n    noOfItemsInAPage,\r\n    styles,\r\n    classNames,\r\n    page,\r\n    allowDataDownloadOnDetail,\r\n  } = props;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const [selectedData, setSelectedData] = useState<any>(undefined);\r\n  return (\r\n    <>\r\n      <div\r\n        className='undp-scrollbar w-full my-0 mx-auto grid gap-4 undp-viz-data-cards-container'\r\n        style={{\r\n          width: width ? `${width}px` : '100%',\r\n          height: height ? `${height}px` : 'auto',\r\n          gridTemplateColumns: `repeat(auto-fill, minmax(${cardMinWidth}px, 1fr))`,\r\n        }}\r\n      >\r\n        {data\r\n          // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n          .filter((_d: any, i: number) =>\r\n            noOfItemsInAPage\r\n              ? i < page * noOfItemsInAPage && i >= (page - 1) * noOfItemsInAPage\r\n              : true,\r\n          )\r\n          // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n          .map((d: any, i: number) => (\r\n            // biome-ignore lint/a11y/noStaticElementInteractions: div is intentionally interactive as a clickable card container; keyboard and accessibility behavior is handled separately\r\n            <div\r\n              // biome-ignore lint/suspicious/noArrayIndexKey: index is the unique identifier\r\n              key={i}\r\n              style={{\r\n                ...(styles?.dataCards || {}),\r\n                ...(cardBackgroundColor && { backgroundColor: cardBackgroundColor }),\r\n              }}\r\n              className={cn(\r\n                'w-full flex flex-col',\r\n                onSeriesMouseClick || detailsOnClick ? 'cursor-pointer' : 'cursor-auto',\r\n                !cardBackgroundColor ? 'bg-surface' : '',\r\n                classNames?.dataCards,\r\n              )}\r\n              onClick={() => {\r\n                onSeriesMouseClick?.(d);\r\n                setSelectedData(d);\r\n              }}\r\n              onKeyDown={(e) => {\r\n                if (e.key === 'Enter' || e.key === ' ') {\r\n                  onSeriesMouseClick?.(d);\r\n                  setSelectedData(d);\r\n                }\r\n              }}\r\n              // biome-ignore lint/security/noDangerouslySetInnerHtmlWithChildren: Allow setInnerHTML here\r\n              // biome-ignore lint/security/noDangerouslySetInnerHtml: Allow setInnerHTML here\r\n              dangerouslySetInnerHTML={\r\n                typeof cardTemplate === 'string'\r\n                  ? { __html: string2HTML(cardTemplate, d) }\r\n                  : undefined\r\n              }\r\n            >\r\n              {typeof cardTemplate === 'function' ? cardTemplate(d) : null}\r\n            </div>\r\n          ))}\r\n      </div>\r\n      {detailsOnClick && selectedData !== undefined ? (\r\n        <Modal\r\n          open={selectedData !== undefined}\r\n          onClose={() => {\r\n            setSelectedData(undefined);\r\n          }}\r\n        >\r\n          <div\r\n            className='graph-modal-content m-0'\r\n            // biome-ignore lint/security/noDangerouslySetInnerHtmlWithChildren: Allow setInnerHTML here\r\n            // biome-ignore lint/security/noDangerouslySetInnerHtml: Allow setInnerHTML here\r\n            dangerouslySetInnerHTML={\r\n              typeof detailsOnClick === 'string'\r\n                ? { __html: string2HTML(detailsOnClick, selectedData) }\r\n                : undefined\r\n            }\r\n          >\r\n            {typeof detailsOnClick === 'function' ? detailsOnClick(selectedData) : null}\r\n          </div>\r\n          {allowDataDownloadOnDetail ? (\r\n            <div className='flex'>\r\n              <CsvDownloadButton\r\n                csvData={csvData(selectedData)}\r\n                headers={[\r\n                  {\r\n                    label: ' ',\r\n                    key: ' ',\r\n                  },\r\n                  {\r\n                    label: 'value',\r\n                    key: 'value',\r\n                  },\r\n                ]}\r\n                buttonContent={\r\n                  <div className='flex items-center gap-4'>\r\n                    {typeof allowDataDownloadOnDetail === 'string'\r\n                      ? allowDataDownloadOnDetail\r\n                      : null}\r\n                    <FileDown />\r\n                  </div>\r\n                }\r\n              />\r\n            </div>\r\n          ) : null}\r\n        </Modal>\r\n      ) : null}\r\n    </>\r\n  );\r\n}\r\n","import { createFilter, DropdownSelect } from '@undp/design-system-react/DropdownSelect';\r\nimport { Pagination } from '@undp/design-system-react/Pagination';\r\nimport { Search } from '@undp/design-system-react/Search';\r\nimport { Spacer } from '@undp/design-system-react/Spacer';\r\nimport { P } from '@undp/design-system-react/Typography';\r\nimport flattenDeep from 'lodash.flattendeep';\r\nimport intersection from 'lodash.intersection';\r\nimport orderBy from 'lodash.orderby';\r\nimport type React from 'react';\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 type { ClassNameObject, Languages, SourcesDataType, StyleObject } from '@/Types';\r\nimport { getUniqValue } from '@/Utils/getUniqValue';\r\nimport { transformDefaultValue } from '@/Utils/transformDataForSelect';\r\nimport { Graph } from './Graph';\r\n\r\nexport type FilterDataType = {\r\n  column: string;\r\n  label?: string;\r\n  defaultValue?: string;\r\n  excludeValues?: string[];\r\n  width?: string;\r\n};\r\n\r\ninterface Props {\r\n  // Data\r\n  /** Array of data objects */\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 each of the card */\r\n  cardBackgroundColor?: string;\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  /** 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  /** Html for each card. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data. */\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  cardTemplate: string | ((_d: any) => React.ReactNode);\r\n  /** Allows users to add a dropdown menus, that can be used as filters in the graph. Each filter is an object that specifies the column to filter by, and the default value. All the filters are single select only.  */\r\n  cardFilters?: FilterDataType[];\r\n  /** Allows users to add a dropdown menus, that can be used to sort the cards based on different columns. */\r\n  cardSortingOptions?: {\r\n    defaultValue?: string;\r\n    options: {\r\n      value: string;\r\n      label: string;\r\n      type: 'asc' | 'desc';\r\n    }[];\r\n    width?: string;\r\n  };\r\n  /** Adds a search bar to search the cards list. The array defines all the columns from the data where text is used to search from. */\r\n  cardSearchColumns?: string[];\r\n  /** Min width of the cards for responsiveness. */\r\n  cardMinWidth?: number;\r\n  /** Add a button to download data object when viewing details. If true, data can be downloaded; if a string is provided, it specifies the button label. */\r\n  allowDataDownloadOnDetail?: string | boolean;\r\n  /** Defines the number of items displayed per page. */\r\n  noOfItemsInAPage?: number;\r\n\r\n  // Interactions and Callbacks\r\n  /** Details displayed on the modal when user clicks of a data point. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data */\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  detailsOnClick?: string | ((_d: any) => React.ReactNode);\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  /** Theme for the UI elements */\r\n  uiMode?: 'light' | 'normal';\r\n  /** Unique ID for the graph */\r\n  graphID?: string;\r\n}\r\n\r\n// biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\nconst filterByKeys = (jsonArray: any, keys: string[], substring: string) => {\r\n  if (keys.length === 0) return jsonArray;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  return jsonArray.filter((item: any) =>\r\n    keys.some((key) => item[key]?.toLowerCase().includes(substring.toLowerCase())),\r\n  );\r\n};\r\n\r\nexport function DataCards(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    onSeriesMouseClick,\r\n    language = 'en',\r\n    theme = 'light',\r\n    ariaLabel,\r\n    cardTemplate,\r\n    cardBackgroundColor,\r\n    cardFilters,\r\n    cardSortingOptions,\r\n    cardSearchColumns,\r\n    cardMinWidth = 320,\r\n    backgroundColor = false,\r\n    padding,\r\n    detailsOnClick,\r\n    allowDataDownloadOnDetail = false,\r\n    noOfItemsInAPage,\r\n    uiMode = 'normal',\r\n    styles,\r\n    classNames,\r\n  } = props;\r\n\r\n  const [cardData, setCardData] = useState(data);\r\n\r\n  const [page, setPage] = useState(1);\r\n  const graphParentDiv = useRef<HTMLDivElement>(null);\r\n\r\n  const [searchQuery, setSearchQuery] = useState('');\r\n  const filterSettings = (cardFilters || []).map((el) => ({\r\n    filter: el.column,\r\n    label: el.label || `Filter by ${el.column}`,\r\n    singleSelect: true,\r\n    clearable: true,\r\n    defaultValue: transformDefaultValue(el.defaultValue),\r\n    availableValues: getUniqValue(data, el.column)\r\n      .filter((v) => !el.excludeValues?.includes(`${v}`))\r\n      .map((v) => ({ value: v, label: v })),\r\n    width: el.width,\r\n  }));\r\n\r\n  const [selectedFilters, setSelectedFilters] = useState(\r\n    (cardFilters || []).map((el) => ({\r\n      filter: el.column,\r\n      value: transformDefaultValue(el.defaultValue),\r\n    })),\r\n  );\r\n  const [sortedBy, setSortedBy] = useState<\r\n    | {\r\n        value: string;\r\n        label: string;\r\n        type: 'asc' | 'desc';\r\n      }\r\n    | undefined\r\n  >(\r\n    cardSortingOptions\r\n      ? !cardSortingOptions.defaultValue ||\r\n        cardSortingOptions.options.findIndex(\r\n          (el) => el.label === cardSortingOptions.defaultValue,\r\n        ) === -1\r\n        ? cardSortingOptions.options[0]\r\n        : cardSortingOptions.options[\r\n            cardSortingOptions.options.findIndex(\r\n              (el) => el.label === cardSortingOptions.defaultValue,\r\n            )\r\n          ]\r\n      : undefined,\r\n  );\r\n\r\n  const filterConfig = {\r\n    ignoreCase: true,\r\n    ignoreAccents: true,\r\n    trim: true,\r\n  };\r\n  const cardSortingEvent = useEffectEvent(() => {\r\n    setSortedBy(\r\n      cardSortingOptions\r\n        ? !cardSortingOptions.defaultValue ||\r\n          cardSortingOptions.options.findIndex(\r\n            (el) => el.label === cardSortingOptions.defaultValue,\r\n          ) === -1\r\n          ? cardSortingOptions.options[0]\r\n          : cardSortingOptions.options[\r\n              cardSortingOptions.options.findIndex(\r\n                (el) => el.label === cardSortingOptions.defaultValue,\r\n              )\r\n            ]\r\n        : undefined,\r\n    );\r\n  });\r\n  useEffect(() => {\r\n    cardSortingEvent();\r\n  }, [cardSortingOptions]);\r\n\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const cardDataEvent = useEffectEvent((data: any) => {\r\n    setCardData(data);\r\n    setPage(1);\r\n  });\r\n  useEffect(() => {\r\n    const filteredData = filterByKeys(data, cardSearchColumns || [], searchQuery).filter(\r\n      // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n      (item: any) =>\r\n        selectedFilters.every((filter) =>\r\n          filter.value && flattenDeep([filter.value]).length > 0\r\n            ? intersection(\r\n                flattenDeep([item[filter.filter]]),\r\n                flattenDeep([filter.value]).map((el) => el.value),\r\n              ).length > 0\r\n            : true,\r\n        ),\r\n    );\r\n    if (sortedBy) {\r\n      cardDataEvent(orderBy(filteredData, [sortedBy.value], [sortedBy.type]));\r\n    } else {\r\n      cardDataEvent(filteredData);\r\n    }\r\n  }, [data, cardSearchColumns, searchQuery, selectedFilters, sortedBy]);\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      {cardSortingOptions || filterSettings.length > 0 ? (\r\n        <div className='flex gap-x-4 gap-y-0 flex-wrap items-start w-full pb-3'>\r\n          {cardSortingOptions ? (\r\n            <div\r\n              className='grow shrink-0 min-w-60'\r\n              style={{ width: cardSortingOptions.width || 'calc(25% - 0.75rem)' }}\r\n            >\r\n              <P marginBottom='xs' size='sm' className='text-content-primary'>\r\n                Sort by\r\n              </P>\r\n              <DropdownSelect\r\n                options={cardSortingOptions.options}\r\n                isRtl={language === 'he' || language === 'ar'}\r\n                isSearchable\r\n                filterOption={createFilter(filterConfig)}\r\n                // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n                onChange={(el: any) => {\r\n                  setSortedBy(el || undefined);\r\n                }}\r\n                variant={uiMode}\r\n                size='sm'\r\n                defaultValue={\r\n                  !cardSortingOptions.defaultValue ||\r\n                  cardSortingOptions.options.findIndex(\r\n                    (el) => el.label === cardSortingOptions.defaultValue,\r\n                  ) === -1\r\n                    ? cardSortingOptions.options[0]\r\n                    : cardSortingOptions.options[\r\n                        cardSortingOptions.options.findIndex(\r\n                          (el) => el.label === cardSortingOptions.defaultValue,\r\n                        )\r\n                      ]\r\n                }\r\n              />\r\n            </div>\r\n          ) : null}\r\n          {filterSettings?.map((d) => (\r\n            <div\r\n              className='grow shrink-0 min-w-60'\r\n              style={{ width: d.width || 'calc(25% - 0.75rem)' }}\r\n              key={d.label}\r\n            >\r\n              <P marginBottom='xs' size='sm' className='text-content-primary'>\r\n                {d.label}\r\n              </P>\r\n              <DropdownSelect\r\n                options={d.availableValues}\r\n                isClearable={d.clearable === undefined ? true : d.clearable}\r\n                isRtl={language === 'he' || language === 'ar'}\r\n                isSearchable\r\n                variant={uiMode}\r\n                size='sm'\r\n                controlShouldRenderValue\r\n                filterOption={createFilter(filterConfig)}\r\n                onChange={(el) => {\r\n                  setSelectedFilters((prev) =>\r\n                    // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n                    prev.map((f) => (f.filter === d.filter ? { ...f, value: el as any } : f)),\r\n                  );\r\n                }}\r\n                defaultValue={d.defaultValue}\r\n              />\r\n            </div>\r\n          ))}\r\n        </div>\r\n      ) : null}\r\n      <Spacer size='xl' />\r\n      {(cardSearchColumns || []).length > 0 ? (\r\n        <div style={{ paddingTop: '1px' }}>\r\n          <Search\r\n            placeholder='Search...'\r\n            onSearch={(e) => {\r\n              setSearchQuery(e || '');\r\n            }}\r\n            inputVariant={uiMode}\r\n            showSearchButton={false}\r\n            inputSize='sm'\r\n          />\r\n        </div>\r\n      ) : null}\r\n      <Spacer size='xl' />\r\n      <Graph\r\n        data={cardData}\r\n        width={width}\r\n        height={height}\r\n        cardTemplate={cardTemplate}\r\n        cardMinWidth={cardMinWidth}\r\n        page={page}\r\n        cardBackgroundColor={cardBackgroundColor}\r\n        styles={styles}\r\n        classNames={classNames}\r\n        noOfItemsInAPage={noOfItemsInAPage}\r\n        detailsOnClick={detailsOnClick}\r\n        onSeriesMouseClick={onSeriesMouseClick}\r\n        allowDataDownloadOnDetail={allowDataDownloadOnDetail}\r\n      />\r\n      <Spacer size='xl' />\r\n      {noOfItemsInAPage ? (\r\n        <Pagination\r\n          total={cardData.length}\r\n          defaultPage={0}\r\n          pageSize={noOfItemsInAPage}\r\n          onChange={setPage}\r\n        />\r\n      ) : null}\r\n      <Spacer size='2xl' />\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    </GraphContainer>\r\n  );\r\n}\r\n"],"mappings":"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"}