{"version":3,"sources":["../components/ui/multi-select.tsx"],"sourcesContent":["\"use client\";\nimport * as React from 'react';\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { type KeyboardEvent, createContext, forwardRef, useCallback, useContext, useState } from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Badge } from './badge';\nimport { Command, CommandEmpty, CommandItem, CommandList } from './command';\n\nexport type MultiSelectValue = {\n  value: string;\n  label: string;\n};\n\ninterface MultiSelectorProps extends React.ComponentPropsWithoutRef<typeof CommandPrimitive> {\n  values: MultiSelectValue[];\n  onValuesChange: (value: MultiSelectValue[]) => void;\n  loop?: boolean;\n  className?: string;\n  children?: React.ReactNode;\n  dir?: 'ltr' | 'rtl';\n  disabled?: boolean;\n}\n\ninterface MultiSelectContextProps {\n  value: MultiSelectValue[];\n  onValueChange: (value: MultiSelectValue) => void;\n  open: boolean;\n  setOpen: (value: boolean) => void;\n  inputValue: string;\n  setInputValue: React.Dispatch<React.SetStateAction<string>>;\n  activeIndex: number;\n  setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n  ref: React.RefObject<HTMLInputElement | null>;\n  disabled: boolean;\n}\n\nconst MultiSelectContext = createContext<MultiSelectContextProps | null>(null);\n\nconst useMultiSelect = () => {\n  const context = useContext(MultiSelectContext);\n  if (!context) {\n    throw new Error('useMultiSelect must be used within MultiSelectProvider');\n  }\n  return context;\n};\n\nfunction searchForValue(source: MultiSelectValue[], value: MultiSelectValue) {\n  for (let i = 0; i < source.length; i++) {\n    if (source[i].value === value.value) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nconst MultiSelector = ({\n  values: value,\n  onValuesChange: onValueChange,\n  loop = false,\n  className,\n  children,\n  dir,\n  disabled = false,\n  ...props\n}: MultiSelectorProps) => {\n  const [inputValue, setInputValue] = useState('');\n  const [open, setOpen] = useState<boolean>(false);\n  const [activeIndex, setActiveIndex] = useState<number>(-1);\n  const inputRef = React.useRef<HTMLInputElement>(null);\n\n  const onValueChangeHandler = useCallback(\n    (val: MultiSelectValue) => {\n      if (disabled) return;\n\n      const exists = value.some((currentValue) => currentValue.value === val.value);\n      if (exists) {\n        onValueChange(value.filter((currentValue) => currentValue.value !== val.value));\n      } else {\n        onValueChange([...value, val]);\n      }\n    },\n    [disabled, onValueChange, value],\n  );\n\n  const handleKeyDown = useCallback(\n    (e: KeyboardEvent<HTMLDivElement>) => {\n      e.stopPropagation();\n\n      if (disabled) return;\n\n      const target = inputRef.current;\n\n      if (!target) return;\n\n      const selectionStart = target.selectionStart ?? 0;\n      const selectionEnd = target.selectionEnd ?? 0;\n\n      if (selectionStart !== selectionEnd) {\n        return;\n      }\n\n      const moveNext = () => {\n        const nextIndex = activeIndex + 1;\n        setActiveIndex(nextIndex > value.length - 1 ? (loop ? 0 : -1) : nextIndex);\n      };\n\n      const movePrev = () => {\n        const prevIndex = activeIndex - 1;\n        setActiveIndex(prevIndex < 0 ? value.length - 1 : prevIndex);\n      };\n\n      const moveCurrent = () => {\n        const newIndex = activeIndex - 1 <= 0 ? (value.length - 1 === 0 ? -1 : 0) : activeIndex - 1;\n        setActiveIndex(newIndex);\n      };\n\n      switch (e.key) {\n        case 'ArrowLeft':\n          if (dir === 'rtl') {\n            if (value.length > 0 && (activeIndex !== -1 || loop)) {\n              moveNext();\n            }\n          } else if (value.length > 0 && target.selectionStart === 0) {\n            movePrev();\n          }\n          break;\n\n        case 'ArrowRight':\n          if (dir === 'rtl') {\n            if (value.length > 0 && target.selectionStart === 0) {\n              movePrev();\n            }\n          } else if (value.length > 0 && (activeIndex !== -1 || loop)) {\n            moveNext();\n          }\n          break;\n\n        case 'Backspace':\n        case 'Delete':\n          if (value.length > 0) {\n            if (activeIndex !== -1 && activeIndex < value.length) {\n              onValueChangeHandler(value[activeIndex]);\n              moveCurrent();\n            } else if (target.selectionStart === 0) {\n              onValueChangeHandler(value[value.length - 1]);\n            }\n          }\n          break;\n\n        case 'Enter':\n          setOpen(true);\n          break;\n\n        case 'Escape':\n          if (activeIndex !== -1) {\n            setActiveIndex(-1);\n          } else if (open) {\n            setInputValue('');\n            setOpen(false);\n          }\n          break;\n      }\n    },\n    [activeIndex, dir, disabled, loop, onValueChangeHandler, open, value],\n  );\n\n  return (\n    <MultiSelectContext.Provider\n      value={{\n        value,\n        onValueChange: onValueChangeHandler,\n        open,\n        setOpen,\n        inputValue,\n        setInputValue,\n        activeIndex,\n        setActiveIndex,\n        ref: inputRef,\n        disabled,\n      }}\n    >\n      <Command\n        onKeyDown={handleKeyDown}\n        className={cn('flex flex-col overflow-visible bg-transparent', className)}\n        dir={dir}\n        {...props}\n      >\n        {children}\n      </Command>\n    </MultiSelectContext.Provider>\n  );\n};\n\nconst MultiSelectorTrigger = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n  ({ className, children, ...props }, ref) => {\n    const { value, onValueChange, activeIndex, disabled } = useMultiSelect();\n\n    const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n      e.preventDefault();\n      e.stopPropagation();\n    }, []);\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          'flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1',\n          activeIndex === -1 && 'focus-within:ring-1 focus-within:ring-ring',\n          disabled && 'cursor-not-allowed opacity-60',\n          className,\n        )}\n        {...props}\n      >\n        {value.map((item, index) => (\n          <Badge\n            key={item.value}\n            className={cn(\n              'flex items-center gap-1 rounded-md px-1.5',\n              activeIndex === index && 'ring-2 ring-muted-foreground',\n            )}\n            variant=\"secondary\"\n          >\n            <span className=\"text-xs\">{item.label}</span>\n            <button\n              aria-label={`Remove ${item.label} option`}\n              type=\"button\"\n              disabled={disabled}\n              onMouseDown={mousePreventDefault}\n              onClick={(event) => {\n                event.preventDefault();\n                event.stopPropagation();\n\n                onValueChange(item);\n              }}\n              className=\"inline-flex cursor-pointer items-center justify-center rounded-md p-1 transition-colors hover:bg-red-50 hover:text-red-700 focus-visible:bg-red-100 focus-visible:outline-none disabled:cursor-not-allowed\"\n            >\n              <span className=\"sr-only\">Remove {item.label} option</span>\n              <IconX className=\"h-3.5 w-3.5\" />\n            </button>\n          </Badge>\n        ))}\n        {children}\n      </div>\n    );\n  },\n);\n\nMultiSelectorTrigger.displayName = 'MultiSelectorTrigger';\n\nconst MultiSelectorInput = forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Input>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, disabled: disabledProp, ...props }, ref) => {\n  const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();\n\n  return (\n    <CommandPrimitive.Input\n      {...props}\n      tabIndex={0}\n      ref={inputRef}\n      value={inputValue}\n      disabled={disabled || disabledProp}\n      onValueChange={activeIndex === -1 ? setInputValue : undefined}\n      onBlur={() => {\n        setInputValue('');\n        setOpen(false);\n      }}\n      onFocus={() => setOpen(true)}\n      onClick={() => setActiveIndex(-1)}\n      className={cn(\n        'flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0',\n        className,\n        activeIndex !== -1 && 'caret-transparent',\n      )}\n    />\n  );\n});\n\nMultiSelectorInput.displayName = 'MultiSelectorInput';\n\nconst MultiSelectorContent = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ children }, ref) => {\n  const { open } = useMultiSelect();\n\n  if (!open) return null;\n\n  return (\n    <div ref={ref} className=\"relative\">\n      {children}\n    </div>\n  );\n});\n\nMultiSelectorContent.displayName = 'MultiSelectorContent';\n\nconst MultiSelectorList = forwardRef<\n  React.ElementRef<typeof CommandPrimitive.List>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, children }, ref) => {\n  return (\n    <CommandList\n      ref={ref}\n      className={cn(\n        'absolute top-0 z-100 flex w-full flex-col gap-2 rounded-md border border-muted bg-background p-2 shadow-md scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-lg scrollbar-thumb-muted-foreground transition-colors dark:scrollbar-thumb-muted',\n        className,\n      )}\n    >\n      {children}\n      <CommandEmpty>\n        <span className=\"text-muted-foreground\">No results found</span>\n      </CommandEmpty>\n    </CommandList>\n  );\n});\n\nMultiSelectorList.displayName = 'MultiSelectorList';\n\nconst MultiSelectorItem = forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Item>,\n  { value: string; label: string } & React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, value, label, children, disabled: disabledProp, ...props }, ref) => {\n  const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();\n\n  const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n  }, []);\n\n  const isIncluded =\n    searchForValue(options, {\n      value,\n      label,\n    }) !== -1;\n\n  const isDisabled = disabled || disabledProp;\n\n  return (\n    <CommandItem\n      ref={ref}\n      {...props}\n      disabled={isDisabled}\n      onSelect={() => {\n        if (isDisabled) return;\n\n        onValueChange({\n          value,\n          label,\n        });\n        setInputValue('');\n      }}\n      className={cn(\n        'flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors',\n        className,\n        isIncluded && 'cursor-default opacity-50',\n        isDisabled && 'cursor-not-allowed opacity-50',\n      )}\n      onMouseDown={mousePreventDefault}\n    >\n      {children}\n      {isIncluded && <IconCheck className=\"h-4 w-4\" />}\n    </CommandItem>\n  );\n});\n\nMultiSelectorItem.displayName = 'MultiSelectorItem';\n\nexport {\n  MultiSelector,\n  MultiSelectorTrigger,\n  MultiSelectorInput,\n  MultiSelectorContent,\n  MultiSelectorList,\n  MultiSelectorItem,\n};\n"],"mappings":"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","names":["_a","_b"]}