{"version":3,"file":"PerformanceIntensiveMultiGraphDashboard.cjs","names":[],"sources":["../src/Components/Dashboard/PerformanceIntensive/MultiGraphDashboard.tsx"],"sourcesContent":["import { CheckboxGroup, CheckboxGroupItem } from '@undp/design-system-react/CheckboxGroup';\r\nimport { createFilter, DropdownSelect } from '@undp/design-system-react/DropdownSelect';\r\nimport { Label } from '@undp/design-system-react/Label';\r\nimport { RadioGroup, RadioGroupItem } from '@undp/design-system-react/RadioGroup';\r\nimport flattenDeep from 'lodash.flattendeep';\r\nimport intersection from 'lodash.intersection';\r\nimport { useEffect, useEffectEvent, useState } from 'react';\r\nimport { GraphContainer } from '@/Components/Elements/GraphContainer';\r\nimport { GraphHeader } from '@/Components/Elements/GraphHeader';\r\nimport type {\r\n  ClassNameObject,\r\n  DataFilterDataType,\r\n  DataSettingsDataType,\r\n  FilterSettingsDataType,\r\n  FilterUiSettingsDataType,\r\n  GeoHubGraphType,\r\n  GraphType,\r\n  PerformanceIntensiveDashboardColumnDataType,\r\n  PerformanceIntensiveDashboardLayoutDataType,\r\n  StyleObject,\r\n  ThreeDGraphType,\r\n} from '@/Types';\r\nimport {\r\n  fetchAndParseCSV,\r\n  fetchAndParseJSON,\r\n  fetchAndParseMultipleDataSources,\r\n  fetchAndTransformDataFromAPI,\r\n} from '@/Utils/fetchAndParseData';\r\nimport { getUniqValue } from '@/Utils/getUniqValue';\r\nimport { filterData } from '@/Utils/transformData/filterData';\r\nimport { transformColumnsToArray } from '@/Utils/transformData/transformColumnsToArray';\r\nimport { transformDefaultValue } from '@/Utils/transformDataForSelect';\r\nimport { SingleGraphDashboard } from '../SingleGraphDashboard';\r\nimport { SingleGraphDashboardGeoHubMaps } from './SingleGraphDashboardGeoHubMaps';\r\nimport { SingleGraphDashboardThreeDGraphs } from './SingleGraphDashboardThreeDGraphs';\r\n\r\ninterface Props {\r\n  dashboardID?: string;\r\n  dashboardLayout: PerformanceIntensiveDashboardLayoutDataType;\r\n  dataSettings: DataSettingsDataType;\r\n  filters?: FilterUiSettingsDataType[];\r\n  noOfFiltersPerRow?: number;\r\n  dataFilters?: DataFilterDataType[];\r\n  debugMode?: boolean;\r\n  theme?: 'dark' | 'light';\r\n  filterPosition?: 'top' | 'side';\r\n  readableHeader?: {\r\n    value: string;\r\n    label: string;\r\n  }[];\r\n  uiMode?: 'light' | 'normal';\r\n  graphStyles?: StyleObject;\r\n  graphClassNames?: ClassNameObject;\r\n}\r\n\r\nconst TotalWidth = (columns: PerformanceIntensiveDashboardColumnDataType[]) => {\r\n  const columnWidth = columns.map((d) => d.columnWidth || 1);\r\n  const sum = columnWidth.reduce((acc, cur) => acc + cur, 0);\r\n  return sum;\r\n};\r\n\r\nconst GraphWithAttachedFilter: GraphType[] = [\r\n  'barChart',\r\n  'choroplethMap',\r\n  'biVariateChoroplethMap',\r\n  'circlePacking',\r\n  'treeMap',\r\n];\r\n\r\nexport function PerformanceIntensiveMultiGraphDashboard(props: Props) {\r\n  const {\r\n    dashboardID,\r\n    dashboardLayout,\r\n    dataSettings,\r\n    filters,\r\n    debugMode,\r\n    theme = 'light',\r\n    readableHeader,\r\n    dataFilters,\r\n    noOfFiltersPerRow = 4,\r\n    filterPosition,\r\n    uiMode = 'normal',\r\n    graphStyles,\r\n    graphClassNames,\r\n  } = props;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const [filteredData, setFilteredData] = useState<any>(undefined);\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const [data, setData] = useState<any>(undefined);\r\n  const [filterSettings, setFilterSettings] = useState<FilterSettingsDataType[]>([]);\r\n\r\n  const threeDGraphs = ['threeDGlobe'];\r\n  const geoHubMaps = ['geoHubCompareMap', 'geoHubMap', 'geoHubMapWithLayerSelection'];\r\n  const filterConfig = {\r\n    ignoreCase: true,\r\n    ignoreAccents: true,\r\n    trim: true,\r\n  };\r\n\r\n  const updateFiltersEvent = useEffectEvent(() => {\r\n    const filterSettingsTemp = (filters || []).map((el) => ({\r\n      filter: el.column,\r\n      label: el.label || `Filter by ${el.column}`,\r\n      singleSelect: el.singleSelect,\r\n      clearable: el.clearable,\r\n      defaultValue: transformDefaultValue(el.defaultValue),\r\n      value: 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      allowSelectAll: el.allowSelectAll,\r\n      width: el.width,\r\n    }));\r\n    setFilterSettings(filterSettingsTemp);\r\n  });\r\n  const filteredDataEvent = useEffectEvent(() => {\r\n    if (!data || filterSettings.length === 0) setFilteredData(data);\r\n    else {\r\n      // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n      const result = data.filter((item: any) =>\r\n        filterSettings.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      setFilteredData(result);\r\n    }\r\n  });\r\n  useEffect(() => {\r\n    filteredDataEvent();\r\n  }, [filterSettings, data]);\r\n\r\n  useEffect(() => {\r\n    const fetchData = async () => {\r\n      try {\r\n        const dataFromFile = dataSettings.dataURL\r\n          ? typeof dataSettings.dataURL === 'string'\r\n            ? dataSettings.fileType === 'json'\r\n              ? await fetchAndParseJSON(\r\n                  dataSettings.dataURL,\r\n                  dataSettings.columnsToArray,\r\n                  dataSettings.dataTransformation,\r\n                  debugMode,\r\n                )\r\n              : dataSettings.fileType === 'api'\r\n                ? await fetchAndTransformDataFromAPI(\r\n                    dataSettings.dataURL,\r\n                    dataSettings.apiHeaders,\r\n                    dataSettings.columnsToArray,\r\n                    dataSettings.dataTransformation,\r\n                    debugMode,\r\n                  )\r\n                : await fetchAndParseCSV(\r\n                    dataSettings.dataURL,\r\n                    dataSettings.dataTransformation,\r\n                    dataSettings.columnsToArray,\r\n                    debugMode,\r\n                    dataSettings.delimiter,\r\n                    true,\r\n                  )\r\n            : await fetchAndParseMultipleDataSources(\r\n                dataSettings.dataURL,\r\n                dataSettings.idColumnTitle,\r\n              )\r\n          : await transformColumnsToArray(dataSettings.data, dataSettings.columnsToArray);\r\n        setData(dataFromFile);\r\n      } catch (error) {\r\n        console.error('Data fetching error:', error);\r\n      }\r\n    };\r\n    fetchData();\r\n    updateFiltersEvent();\r\n  }, [dataSettings, debugMode]);\r\n\r\n  useEffect(() => {\r\n    updateFiltersEvent();\r\n  }, [filters, data]);\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const handleFilterChange = (filter: string, values: any) => {\r\n    setFilterSettings((prev) =>\r\n      prev.map((f) => (f.filter === filter ? { ...f, value: values } : f)),\r\n    );\r\n  };\r\n  return (\r\n    <GraphContainer\r\n      id={dashboardID}\r\n      aria-label='This is a dashboard'\r\n      backgroundColor={dashboardLayout.backgroundColor ?? false}\r\n      theme={theme || 'light'}\r\n      language={dashboardLayout.language || 'en'}\r\n      padding={dashboardLayout.padding}\r\n    >\r\n      {dashboardLayout.title || dashboardLayout.description ? (\r\n        <GraphHeader\r\n          graphTitle={dashboardLayout.title}\r\n          graphDescription={dashboardLayout.description}\r\n          isDashboard\r\n        />\r\n      ) : null}\r\n      <div className='flex gap-4 flex-wrap'>\r\n        {filterSettings.length !== 0 ? (\r\n          <div\r\n            className='grow shrink-0'\r\n            style={{\r\n              width: filterPosition === 'side' ? '280px' : '100%',\r\n            }}\r\n          >\r\n            <div className='flex flex-wrap items-start gap-4 w-full sticky top-4'>\r\n              {filterSettings?.map((d, i) => (\r\n                <div\r\n                  style={{\r\n                    width:\r\n                      d.width ||\r\n                      `calc(${100 / noOfFiltersPerRow}% - ${\r\n                        (noOfFiltersPerRow - 1) / noOfFiltersPerRow\r\n                      }rem)`,\r\n                    flexGrow: d.width ? 0 : 1,\r\n                    flexShrink: d.ui !== 'radio' || d.width ? 0 : 1,\r\n                    minWidth: '240px',\r\n                  }}\r\n                  // biome-ignore lint/suspicious/noArrayIndexKey: index is the unique identifier\r\n                  key={i}\r\n                >\r\n                  <Label className='mb-2'>{d.label}</Label>\r\n                  {d.singleSelect ? (\r\n                    d.ui !== 'radio' ? (\r\n                      <DropdownSelect\r\n                        options={d.availableValues}\r\n                        variant={uiMode}\r\n                        isClearable={d.clearable === undefined ? true : d.clearable}\r\n                        isSearchable\r\n                        controlShouldRenderValue\r\n                        filterOption={createFilter(filterConfig)}\r\n                        onChange={(el) => {\r\n                          handleFilterChange(d.filter, el);\r\n                        }}\r\n                        value={d.value}\r\n                        defaultValue={d.defaultValue}\r\n                      />\r\n                    ) : (\r\n                      <RadioGroup\r\n                        variant={uiMode}\r\n                        defaultValue={(d.defaultValue as { value: string; label: string }).value}\r\n                        onValueChange={(el) => {\r\n                          handleFilterChange(\r\n                            d.filter,\r\n                            d.availableValues.filter((v) => v.value === el),\r\n                          );\r\n                        }}\r\n                      >\r\n                        {d.availableValues.map((el) => (\r\n                          <RadioGroupItem\r\n                            label={`${el.label}`}\r\n                            value={`${el.value}`}\r\n                            key={el.value}\r\n                          />\r\n                        ))}\r\n                      </RadioGroup>\r\n                    )\r\n                  ) : (\r\n                    <>\r\n                      {d.ui !== 'radio' ? (\r\n                        <DropdownSelect\r\n                          options={d.availableValues}\r\n                          variant={uiMode}\r\n                          size='sm'\r\n                          isMulti\r\n                          isClearable={d.clearable === undefined ? true : d.clearable}\r\n                          isSearchable\r\n                          controlShouldRenderValue\r\n                          filterOption={createFilter(filterConfig)}\r\n                          onChange={(el) => {\r\n                            handleFilterChange(d.filter, el);\r\n                          }}\r\n                          value={d.value}\r\n                          defaultValue={d.defaultValue}\r\n                        />\r\n                      ) : (\r\n                        <CheckboxGroup\r\n                          variant={uiMode}\r\n                          defaultValue={\r\n                            d.defaultValue\r\n                              ? (\r\n                                  d.defaultValue as {\r\n                                    value: string | number;\r\n                                    label: string | number;\r\n                                  }[]\r\n                                ).map((el) => `${el.value}`)\r\n                              : []\r\n                          }\r\n                          value={\r\n                            d.value\r\n                              ? (\r\n                                  d.value as {\r\n                                    value: string | number;\r\n                                    label: string | number;\r\n                                  }[]\r\n                                ).map((el) => `${el.value}`)\r\n                              : undefined\r\n                          }\r\n                          onValueChange={(el) => {\r\n                            handleFilterChange(\r\n                              d.filter,\r\n                              d.availableValues.filter((v) => el.indexOf(`${v.value}`) !== -1),\r\n                            );\r\n                          }}\r\n                        >\r\n                          {d.availableValues.map((el) => (\r\n                            <CheckboxGroupItem\r\n                              label={`${el.label}`}\r\n                              value={`${el.value}`}\r\n                              key={el.value}\r\n                            />\r\n                          ))}\r\n                        </CheckboxGroup>\r\n                      )}\r\n                      {d.allowSelectAll ? (\r\n                        <button\r\n                          type='button'\r\n                          className='bg-transparent border-0 p-0 mt-2 cursor-pointer text-info'\r\n                          onClick={() => {\r\n                            handleFilterChange(d.filter, d.availableValues);\r\n                          }}\r\n                        >\r\n                          Select all options\r\n                        </button>\r\n                      ) : null}\r\n                    </>\r\n                  )}\r\n                </div>\r\n              ))}\r\n            </div>\r\n          </div>\r\n        ) : null}\r\n        <div\r\n          className='flex flex-wrap gap-4 grow shrink-0 min-w-70'\r\n          style={{\r\n            width: filterPosition === 'side' ? 'calc(100% - 280px - 1rem)' : '100%',\r\n          }}\r\n        >\r\n          {dashboardLayout.rows.map((d, i) => (\r\n            <div\r\n              // biome-ignore lint/suspicious/noArrayIndexKey: index is the unique identifier\r\n              key={i}\r\n              className='flex flex-wrap items-stretch gap-4 w-full h-auto'\r\n              style={{\r\n                minHeight: `${d.height || 0}px`,\r\n              }}\r\n            >\r\n              {d.columns.map((el, j) => (\r\n                <div\r\n                  // biome-ignore lint/suspicious/noArrayIndexKey: index is the unique identifier\r\n                  key={j}\r\n                  className='flex bg-transparent grow min-w-60'\r\n                  style={{\r\n                    width: `calc(${(100 * (el.columnWidth || 1)) / TotalWidth(d.columns)}% - ${\r\n                      (TotalWidth(d.columns) - (el.columnWidth || 1)) / TotalWidth(d.columns)\r\n                    }rem)`,\r\n                    minHeight: 'inherit',\r\n                  }}\r\n                >\r\n                  {threeDGraphs.includes(el.graphType) ? (\r\n                    <SingleGraphDashboardThreeDGraphs\r\n                      graphType={el.graphType as ThreeDGraphType}\r\n                      dataFilters={el.dataFilters}\r\n                      uiMode={uiMode}\r\n                      graphSettings={{\r\n                        ...(el.settings || {}),\r\n                        width: undefined,\r\n                        height: undefined,\r\n                        minHeight: undefined,\r\n                        relativeHeight: undefined,\r\n                        resetSelectionOnDoubleClick: el.attachedFilter\r\n                          ? false\r\n                          : el.settings?.resetSelectionOnDoubleClick,\r\n                        styles: el.settings?.styles || graphStyles,\r\n                        classNames: el.settings?.classNames || graphClassNames,\r\n                        radius: el.graphType === 'donutChart' ? undefined : el.settings?.radius,\r\n                        size: el.graphType === 'unitChart' ? el.settings?.size : undefined,\r\n                        language: el.settings?.language || dashboardLayout.language,\r\n                        theme: el.settings?.theme || theme,\r\n                      }}\r\n                      dataSettings={{\r\n                        data: filteredData\r\n                          ? filterData(filteredData, dataFilters || [])\r\n                          : undefined,\r\n                      }}\r\n                      dataTransform={el.dataTransform}\r\n                      dataSelectionOptions={el.dataSelectionOptions}\r\n                      advancedDataSelectionOptions={el.advancedDataSelectionOptions}\r\n                      graphDataConfiguration={el.graphDataConfiguration}\r\n                      debugMode={debugMode}\r\n                      readableHeader={readableHeader || []}\r\n                    />\r\n                  ) : geoHubMaps.includes(el.graphType) ? (\r\n                    <SingleGraphDashboardGeoHubMaps\r\n                      graphType={el.graphType as GeoHubGraphType}\r\n                      uiMode={uiMode}\r\n                      graphSettings={{\r\n                        ...(el.settings || {}),\r\n                        width: undefined,\r\n                        height: undefined,\r\n                        resetSelectionOnDoubleClick: el.attachedFilter\r\n                          ? false\r\n                          : el.settings?.resetSelectionOnDoubleClick,\r\n                        styles: el.settings?.styles || graphStyles,\r\n                        classNames: el.settings?.classNames || graphClassNames,\r\n                        radius: el.graphType === 'donutChart' ? undefined : el.settings?.radius,\r\n                        size: el.graphType === 'unitChart' ? el.settings?.size : undefined,\r\n                        language: el.settings?.language || dashboardLayout.language,\r\n                        theme: el.settings?.theme || theme,\r\n                      }}\r\n                      debugMode={debugMode}\r\n                    />\r\n                  ) : (\r\n                    <SingleGraphDashboard\r\n                      graphType={el.graphType as GraphType}\r\n                      dataFilters={el.dataFilters}\r\n                      uiMode={uiMode}\r\n                      graphSettings={{\r\n                        ...(el.settings || {}),\r\n                        width: undefined,\r\n                        height: undefined,\r\n                        resetSelectionOnDoubleClick: el.attachedFilter\r\n                          ? false\r\n                          : el.settings?.resetSelectionOnDoubleClick,\r\n                        styles: el.settings?.styles || graphStyles,\r\n                        classNames: el.settings?.classNames || graphClassNames,\r\n                        radius: el.graphType === 'donutChart' ? undefined : el.settings?.radius,\r\n                        size: el.graphType === 'unitChart' ? el.settings?.size : undefined,\r\n                        language: el.settings?.language || dashboardLayout.language,\r\n                        theme: el.settings?.theme || theme,\r\n                      }}\r\n                      dataSettings={{\r\n                        data: filteredData\r\n                          ? filterData(filteredData, dataFilters || [])\r\n                          : undefined,\r\n                      }}\r\n                      updateFilters={\r\n                        el.attachedFilter &&\r\n                        GraphWithAttachedFilter.indexOf(el.graphType as GraphType) !== -1 &&\r\n                        filterSettings.findIndex((f) => f.filter === el.attachedFilter) !== -1\r\n                          ? (dClicked) => {\r\n                              const indx = filterSettings.findIndex(\r\n                                (f) => f.filter === el.attachedFilter,\r\n                              );\r\n                              const value = dClicked\r\n                                ? filterSettings[indx].singleSelect\r\n                                  ? { value: dClicked, label: dClicked }\r\n                                  : [{ value: dClicked, label: dClicked }]\r\n                                : undefined;\r\n                              handleFilterChange(el.attachedFilter as string, value);\r\n                            }\r\n                          : undefined\r\n                      }\r\n                      dataTransform={el.dataTransform}\r\n                      dataSelectionOptions={el.dataSelectionOptions}\r\n                      advancedDataSelectionOptions={el.advancedDataSelectionOptions}\r\n                      graphDataConfiguration={el.graphDataConfiguration}\r\n                      debugMode={debugMode}\r\n                      readableHeader={readableHeader || []}\r\n                    />\r\n                  )}\r\n                </div>\r\n              ))}\r\n            </div>\r\n          ))}\r\n        </div>\r\n      </div>\r\n    </GraphContainer>\r\n  );\r\n}\r\n"],"mappings":"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"}