{"version":3,"file":"postgrest-infinite-scroll.cjs","sources":["../src/postgrest-infinite-scroll.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport { InfiniteScrollProps, InfiniteScrollView } from \"./infinite-scroll\";\nimport { useAPIResult } from \"./api\";\nimport { useMemo, useState, useEffect } from \"react\";\nimport { MultiSelect, ItemRenderer, ItemPredicate } from \"@blueprintjs/select\";\nimport {\n  MenuItem,\n  Spinner,\n  InputGroup,\n  Collapse,\n  Icon,\n} from \"@blueprintjs/core\";\nimport styles from \"./postgrest.module.sass\";\n\nconst h = hyper.styled(styles);\n\ninterface PostgRESTInfiniteScrollProps extends InfiniteScrollProps<any> {\n  id_key: string;\n  limit: number;\n  filter_threshold?: number;\n  extraParams?: Record<string, any>;\n  ascending?: boolean;\n  filterable?: boolean;\n  searchColumns?: Array<{ value: string; label: string }>;\n  order_key?: string;\n  key?: string;\n  toggles?: any;\n  SearchBarComponent?: React.ComponentType<{\n    onChange: (value: string) => void;\n  }>;\n  MultiSelectComponent?: React.ComponentType<{\n    items: string[];\n    itemRenderer: ItemRenderer<string>;\n    itemPredicate: ItemPredicate<string>;\n    selectedItems: string[];\n    onItemSelect: (item: string) => void;\n    tagRenderer: (item: string) => React.ReactNode;\n    onRemove: (tag: React.ReactNode, index: number) => void;\n    tagInputProps: any;\n    popoverProps: any;\n  }>;\n  group_key?: string;\n  groups?: Array<{ value: string; label: string }>;\n  GroupingComponent?: React.ComponentType<{\n    title: string;\n    children: React.ReactNode;\n  }>;\n  onSearchChange: (value: string) => void;\n}\n\nexport function PostgRESTInfiniteScrollView(\n  props: PostgRESTInfiniteScrollProps,\n) {\n  let {\n    id_key,\n    ascending = true,\n    filterable = false,\n    limit,\n    initialItems,\n    getNextParams,\n    hasMore,\n    params,\n    route,\n    order_key = undefined,\n    SearchBarComponent,\n    MultiSelectComponent,\n    extraParams = {},\n    key,\n    GroupingComponent,\n    toggles = null,\n    searchColumns = undefined,\n    group_key = undefined,\n    filter_threshold = 0,\n    onSearchChange = () => {},\n    ...rest\n  } = props;\n\n  if (!id_key) {\n    throw new Error(\"PostgRESTInfiniteScrollView requires an id_key prop\");\n  }\n\n  const [selectedItems, setSelectedItems] = useState<string[]>(\n    (searchColumns ?? []).map((col) => col.value),\n  );\n\n  const [filterValue, setFilterValue] = useState<string>(\"\");\n\n  useEffect(() => {\n    onSearchChange(filterValue);\n  }, [filterValue]);\n\n  const hideData = filterValue.length < filter_threshold;\n\n  const SearchBarToUse = SearchBarComponent ?? SearchBar;\n  const MultiSelectToUse = MultiSelectComponent ?? MultiSelect;\n\n  const orderOperator = ascending ? `asc` : `desc`;\n  const notOrderOperator1 = ascending ? `desc` : `asc`;\n  const compOperator = ascending ? `gt` : `lt`;\n  const notCompOperator2 = ascending ? `lt` : `gt`;\n\n  const res = useAPIResult(route, {\n    limit: 1,\n    order: [id_key] + \".desc\",\n  });\n\n  const maxId = res?.[0][id_key] ? res[0][id_key] : ascending ? 0 : 2 ** 28;\n\n  const id = ascending ? 0 : maxId;\n  const notId = ascending ? maxId : 0;\n  const newInitialItems =\n    selectedItems.length === 0 && filterValue === \"\" ? initialItems : undefined;\n\n  const orParam = `(${order_key}.${compOperator}.${id},and(${order_key}.eq.${id},${id_key}.${notCompOperator2}.${notId}))`;\n\n  const specialCase = order_key && selectedItems?.length > 0;\n\n  const searchItemsParam =\n    \"(\" +\n    selectedItems.map((key) => `${key}.ilike.*${filterValue}*`).join(\",\") +\n    \")\";\n\n  const defaultParams = useMemo(() => {\n    return {\n      ...extraParams,\n      [id_key]: !order_key\n        ? compOperator + `.${newInitialItems?.[0]?.[id_key] ?? id}`\n        : undefined,\n      order: order_key\n        ? `${order_key}.${orderOperator},${id_key}.${notOrderOperator1}`\n        : `${id_key}.${orderOperator}`,\n      limit,\n      or: order_key\n        ? selectedItems.length == 0\n          ? orParam\n          : undefined\n        : selectedItems.length > 0\n          ? searchItemsParam\n          : null,\n      and: specialCase ? `(or${orParam},or${searchItemsParam})` : undefined,\n    };\n  }, [\n    selectedItems,\n    filterValue,\n    orParam,\n    searchItemsParam,\n    newInitialItems,\n    id_key,\n    order_key,\n    limit,\n    orderOperator,\n    notOrderOperator1,\n    compOperator,\n    notCompOperator2,\n  ]);\n\n  if (!res) {\n    return h(Spinner);\n  }\n\n  const keys =\n    searchColumns ??\n    (res?.[0]\n      ? Object.keys(res[0])\n          .filter((key) => typeof res[0][key] === \"string\")\n          .map((key) => ({\n            label: key.replace(/_/g, \" \"),\n            value: key,\n          }))\n      : []);\n\n  // Filtering function\n  const filterItem: ItemPredicate<{ label: string; value: string }> = (\n    query,\n    item,\n  ) => item.label.toLowerCase().includes(query.toLowerCase());\n\n  const handleSelect = (item: { label: string; value: string }) => {\n    if (!selectedItems.includes(item.value)) {\n      setSelectedItems([...selectedItems, item.value]);\n    }\n  };\n\n  const handleRemove = (_: React.ReactNode, index: number) => {\n    setSelectedItems(selectedItems.filter((_, i) => i !== index));\n  };\n\n  const defaultGetNextParams = (response, params) => {\n    const lastItem = response?.[response.length - 1];\n    if (\n      !lastItem ||\n      lastItem[id_key] === undefined ||\n      lastItem[id_key] === null\n    ) {\n      return params;\n    }\n\n    if (!order_key) {\n      // Simple cursor on id_key only\n      return {\n        ...params,\n        [id_key]: `${compOperator}.${lastItem[id_key]}`,\n      };\n    } else {\n      const lastOrderValue = lastItem[order_key];\n      const lastIdValue = lastItem[id_key];\n\n      if (\n        lastOrderValue === undefined ||\n        lastOrderValue === null ||\n        lastIdValue === undefined ||\n        lastIdValue === null\n      ) {\n        return params;\n      }\n\n      // Compound cursor with order_key and id_key\n      const newOr = `(${order_key}.${compOperator}.${lastOrderValue},and(${order_key}.eq.${lastOrderValue},${id_key}.${notCompOperator2}.${lastIdValue}))`;\n\n      return {\n        ...params,\n        or: newOr,\n      };\n    }\n  };\n\n  const defaultHasMore = (response) => {\n    return response.length === limit;\n  };\n\n  // Function to render each item in dropdown\n  const itemRenderer: ItemRenderer<{ label: string; value: string }> = (\n    item,\n    { handleClick, modifiers },\n  ) => {\n    if (!modifiers.matchesPredicate) return null;\n    return h(MenuItem, {\n      key: item.value,\n      text: item.label,\n      active: modifiers.active,\n      onClick: handleClick,\n      shouldDismissPopover: false,\n    });\n  };\n\n  const {\n    toggles: _omitToggles,\n    SearchBarComponent: _omitSearchBar,\n    MultiSelectComponent: _omitMultiSelect,\n    ...cleaned\n  } = props;\n\n  const newKey =\n    key ||\n    `${filterValue}-${selectedItems.join(\",\")}-${JSON.stringify(cleaned)}`;\n\n  return h(\"div.postgrest-infinite-scroll\", [\n    h(\"div.header\", [\n      h.if(filterable)(\"div.search-bar\", [\n        h(SearchBarToUse, {\n          onChange: (value) => setFilterValue(value || \"\"),\n        }),\n        h.if(searchColumns == null || searchColumns.length > 1)(\n          MultiSelectToUse,\n          {\n            items: keys.filter((item) => !selectedItems.includes(item.value)),\n            itemRenderer,\n            itemPredicate: filterItem,\n            selectedItems,\n            onItemSelect: handleSelect,\n            tagRenderer: (value) => {\n              const found = keys.find((k) => k.value === value);\n              return found ? found.label : value;\n            },\n            onRemove: handleRemove,\n            tagInputProps: {\n              onRemove: handleRemove,\n              placeholder: \"Select a column(s) to filter by...\",\n            },\n            popoverProps: { minimal: true },\n          },\n        ),\n      ]),\n      h.if(toggles)(\"div.toggles\", toggles),\n    ]),\n    group_key\n      ? Grouping({\n          group_key,\n          groups: props.groups ?? [],\n          route,\n          id_key,\n          params: defaultParams,\n          getNextParams: getNextParams ?? defaultGetNextParams,\n          hasMore: hasMore ?? defaultHasMore,\n          key: newKey,\n          rest,\n          hideData,\n          GroupingComponent,\n        })\n      : h(InfiniteScrollView, {\n          ...rest,\n          route,\n          getNextParams: getNextParams ?? defaultGetNextParams,\n          params: params ?? defaultParams,\n          initialItems: newInitialItems,\n          hasMore: hasMore ?? defaultHasMore,\n          key: newKey,\n          hideData,\n        }),\n  ]);\n}\n\nfunction SearchBar({ onChange, placeholder = \"Search...\" }) {\n  return h(InputGroup, {\n    className: \"search-bar\",\n    size: \"large\",\n    fill: true,\n    round: false,\n    placeholder,\n    onChange: (e) => {\n      const value = e.target.value;\n      onChange(value);\n    },\n    leftIcon: \"search\",\n  });\n}\n\ninterface GroupingProps {\n  group_key: string;\n  groups: Array<{ value: string; label: string }>;\n  route: string;\n  id_key: string;\n  params?: Record<string, any>;\n  getNextParams?: (\n    response: any[],\n    params: Record<string, any>,\n  ) => Record<string, any>;\n  hasMore?: (response: any[]) => boolean;\n  key?: string;\n  rest?: any;\n  hideData?: boolean;\n  GroupingComponent?: React.ComponentType<GroupingProps>;\n}\n\nfunction Grouping(props: GroupingProps) {\n  const {\n    group_key,\n    groups,\n    route,\n    id_key,\n    params,\n    getNextParams,\n    hasMore,\n    rest,\n    hideData,\n    GroupingComponent,\n  } = props;\n\n  return h(\"div.group-page\", [\n    groups.map((group) => {\n      if (!group.value || !group.label) {\n        throw new Error(\"Each group must have a value and label\");\n      }\n\n      return h(GroupPanel, {\n        group,\n        route,\n        id_key,\n        hideData,\n        params: {\n          ...params,\n          [group_key]: \"eq.\" + group.value,\n        },\n        getNextParams,\n        hasMore,\n        ...rest,\n        GroupingComponent,\n      });\n    }),\n  ]);\n}\n\nfunction GroupPanel(props) {\n  const {\n    group,\n    route,\n    params,\n    getNextParams,\n    hasMore,\n    key,\n    hideData,\n    GroupingComponent,\n    ...rest\n  } = props;\n\n  const data = useAPIResult(route, {\n    ...params,\n    limit: 1,\n  });\n\n  if (!data || data?.length === 0 || hideData) return null;\n\n  const Panel = GroupingComponent || ExpansionPanel;\n\n  return h(\n    Panel,\n    {\n      title: group.label,\n    },\n    [\n      h(InfiniteScrollView, {\n        key: key || group.value,\n        route,\n        params,\n        getNextParams,\n        hasMore,\n        hideData,\n        ...rest,\n      }),\n    ],\n  );\n}\n\nfunction ExpansionPanel(props) {\n  const { title, children, className } = props;\n  const [isOpen, setOpen] = useState(false);\n\n  return h(\n    \"div.expansion-panel\",\n    { className: `expansion-panel ${className || \"\"}` },\n    [\n      h(\"div.panel-header\", { onClick: () => setOpen(!isOpen) }, [\n        h(\"h2.title\", title),\n        h(Icon, {\n          icon: isOpen ? \"chevron-up\" : \"chevron-down\",\n          className: \"expansion-panel-icon\",\n        }),\n      ]),\n      h(Collapse, { isOpen }, h(\"div.child-container\", children)),\n    ],\n  );\n}\n"],"names":["hyper","styles","useState","useEffect","MultiSelect","useAPIResult","key","useMemo","Spinner","_","params","MenuItem","InfiniteScrollView","InputGroup","Icon","Collapse"],"mappings":"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"}