{"version":3,"file":"FilterPopover.mjs","sources":["../../../../src/lib/nextGenComponents/components/FilterPopover/FilterPopover.tsx"],"sourcesContent":["import { useMemo } from 'react'\n\nimport ActiveFilter from '../../../images/activeFilter.svg?react'\nimport Filter from '../../../images/filter-2.svg?react'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Popover, PopoverTrigger, PopoverContent } from '@/components/ui/popover'\nimport { ScrollArea } from '@/components/ui/scroll-area'\nimport {\n  Select,\n  SelectTrigger,\n  SelectValue,\n  SelectContent,\n  SelectItem\n} from '@/components/ui/select'\nimport { FILTER_POPOVER_DEFAULT_TITLE, FILTER_BUTTON_CLEAR, FILTER_BUTTON_APPLY } from '@/constants'\nimport { useTableStore, selectFilterPopover, DEFAULT_FILTER_SCOPE } from '@/stores/tableStore'\nimport type { FilterFieldDef, FilterSchema, FilterValues } from '@/types/table/filter'\nimport { buildInitialFromSchema, hasActiveFilters, objectValues } from '@/utils/tableFilters.utils'\nimport MultiSelectField from '@/components/MultiSelectField'\n\ntype Props<K extends string> = {\n  schema: FilterSchema<K>\n  title?: string\n  scopeId?: string\n  onApply?: (vals?: FilterValues<K>) => void\n  onClear?: () => void\n}\n\nconst FilterPopover = <K extends string>({\n  schema,\n  title = FILTER_POPOVER_DEFAULT_TITLE,\n  scopeId = DEFAULT_FILTER_SCOPE,\n  onApply,\n  onClear\n}: Readonly<Props<K>>) => {\n  const { setFilterPopoverOpen, setFilterDraft, resetFilterDraft } = useTableStore()\n  const { open: filterPopoverOpen, draft: filterDraft } = useTableStore(\n    selectFilterPopover(scopeId)\n  )\n  const isFilterActive = useMemo(() => hasActiveFilters(schema), [schema])\n\n  const handleOpenChange = (next: boolean) => {\n    if (next) {\n      const initial = buildInitialFromSchema(schema)\n      resetFilterDraft(scopeId, initial)\n    }\n    setFilterPopoverOpen(scopeId, next)\n  }\n\n  const reset = () => {\n    resetFilterDraft(scopeId, {})\n    onClear?.()\n    setFilterPopoverOpen(scopeId, false)\n  }\n\n  const apply = () => {\n    onApply?.(filterDraft as FilterValues<K>)\n    setFilterPopoverOpen(scopeId, false)\n  }\n\n  return (\n    <Popover open={filterPopoverOpen} onOpenChange={handleOpenChange}>\n      <PopoverTrigger asChild>\n        <Button\n          variant=\"rounded\"\n          size=\"icon\"\n          aria-label={title}\n          data-testid=\"filter-popover-button\"\n        >\n          {isFilterActive ? <ActiveFilter className=\"h-4 w-4\" /> : <Filter className=\"h-4 w-4\" />}\n        </Button>\n      </PopoverTrigger>\n\n      <PopoverContent\n        side=\"bottom\"\n        align=\"end\"\n        sideOffset={6}\n        avoidCollisions={true}\n        collisionPadding={8}\n        className=\"flex flex-col w-[300px] max-h-[400px] rounded-md bg-background p-0 shadow-md z-40\"\n      >\n        <div className=\"p-4\">\n          <h3 className=\"font-medium m-0 text-xl\" data-testid=\"filter-popover-title\">\n            {title}\n          </h3>\n        </div>\n\n        <ScrollArea className=\"px-4 overflow-y-auto\">\n          <div className=\"space-y-4 pb-2\">\n            {objectValues(schema as Record<string, FilterFieldDef<K>>).map(filterField => {\n              const value = filterDraft[filterField.key]\n\n              return (\n                <div\n                  key={filterField.key}\n                  className=\"min-w-0\"\n                  data-testid={`filter-popover-field-${filterField.key}`}\n                >\n                  <div\n                    className=\"mb-1 text-[#7F7989] text-xs font-normal leading-none\"\n                    data-testid={`filter-popover-field-label-${filterField.key}`}\n                  >\n                    {filterField.label}\n                  </div>\n\n                  {filterField.kind === 'text' && (\n                    <Input\n                      placeholder={filterField.placeholder}\n                      value={(value as string | undefined) ?? ''}\n                      disabled={filterField.disabled}\n                      className=\"h-10 w-full px-4 text-[15px] font-normal placeholder-[#C4C2C8]\"\n                      onChange={e =>\n                        setFilterDraft(scopeId, prev => ({\n                          ...prev,\n                          [filterField.key]: e.target.value\n                        }))\n                      }\n                      data-testid={`filter-popover-input-${filterField.label}`}\n                    />\n                  )}\n\n                  {filterField.kind === 'select' && (\n                    <Select\n                      value={(value as string | undefined) ?? ''}\n                      onValueChange={value =>\n                        setFilterDraft(scopeId, prev => ({\n                          ...prev,\n                          [filterField.key]: value\n                        }))\n                      }\n                      disabled={filterField.disabled}\n                    >\n                      <SelectTrigger\n                        className=\"h-10 w-full min-w-0 px-4 data-[placeholder]:text-[#C4C2C8] rounded-md border border-black/20 text-[15px]\"\n                        data-testid={`filter-popover-select-${filterField.key}`}\n                      >\n                        <SelectValue placeholder={filterField.placeholder} />\n                      </SelectTrigger>\n                      <SelectContent className=\"text-sm\">\n                        {(filterField.options ?? []).map(option => (\n                          <SelectItem\n                            key={option.value}\n                            value={option.value}\n                            className=\"text-sm data-[highlighted]:bg-igz-accent-hover\"\n                            data-testid={`filter-popover-select-option-${filterField.key}-${option.value}`}\n                          >\n                            {option.label}\n                          </SelectItem>\n                        ))}\n                      </SelectContent>\n                    </Select>\n                  )}\n\n                  {filterField.kind === 'multi-select' && (\n                    <MultiSelectField\n                      filterField={filterField}\n                      value={value}\n                      setFilterDraft={draft => setFilterDraft(scopeId, draft)}\n                    />\n                  )}\n                </div>\n              )\n            })}\n          </div>\n        </ScrollArea>\n\n        <div className=\"flex items-center justify-end gap-2 p-3\">\n          <Button\n            variant=\"secondary\"\n            className=\"h-9 w-[100px] px-3 text-[14px]\"\n            onClick={reset}\n            data-testid=\"filter-popover-clear-button\"\n          >\n            {FILTER_BUTTON_CLEAR}\n          </Button>\n          <Button\n            className=\"h-9 w-[100px] px-3 text-[14px]\"\n            onClick={apply}\n            data-testid=\"filter-popover-apply-button\"\n          >\n            {FILTER_BUTTON_APPLY}\n          </Button>\n        </div>\n      </PopoverContent>\n    </Popover>\n  )\n}\n\nexport default FilterPopover\n"],"names":["FilterPopover","schema","title","FILTER_POPOVER_DEFAULT_TITLE","scopeId","DEFAULT_FILTER_SCOPE","onApply","onClear","setFilterPopoverOpen","setFilterDraft","resetFilterDraft","useTableStore","filterPopoverOpen","filterDraft","selectFilterPopover","isFilterActive","useMemo","hasActiveFilters","handleOpenChange","next","initial","buildInitialFromSchema","reset","apply","jsxs","Popover","jsx","PopoverTrigger","Button","ActiveFilter","Filter","PopoverContent","ScrollArea","objectValues","filterField","value","Input","e","prev","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","MultiSelectField","draft","FILTER_BUTTON_CLEAR","FILTER_BUTTON_APPLY"],"mappings":"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"}