CronJobsTab.Header.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { RefreshCw, Search, X } from 'lucide-react'
  2. import type { KeyboardEvent } from 'react'
  3. import { Button } from 'ui'
  4. import { Input } from 'ui-patterns/DataInputs/Input'
  5. interface CronJobsTabHeaderProps {
  6. search: string
  7. isRefreshing: boolean
  8. onSearchChange: (value: string) => void
  9. onSearchSubmit: () => void
  10. onClearSearch: () => void
  11. onRefresh: () => void
  12. onCreateJob: () => void
  13. }
  14. export const CronJobsTabHeader = ({
  15. search,
  16. isRefreshing,
  17. onSearchChange,
  18. onSearchSubmit,
  19. onClearSearch,
  20. onRefresh,
  21. onCreateJob,
  22. }: CronJobsTabHeaderProps) => {
  23. const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
  24. if (event.key === 'Enter' || event.code === 'NumpadEnter') {
  25. onSearchSubmit()
  26. }
  27. }
  28. return (
  29. <div className="bg-surface-200 py-3 px-10 flex items-center justify-between flex-wrap gap-y-2">
  30. <Input
  31. size="tiny"
  32. className="w-52"
  33. placeholder="Search for a job"
  34. icon={<Search />}
  35. value={search}
  36. onChange={(e) => onSearchChange(e.target.value)}
  37. onKeyDown={handleKeyDown}
  38. actions={[
  39. search && (
  40. <Button
  41. key="clear-search"
  42. size="tiny"
  43. type="text"
  44. icon={<X />}
  45. onClick={onClearSearch}
  46. className="p-0 h-5 w-5"
  47. />
  48. ),
  49. ]}
  50. />
  51. <div className="flex items-center gap-x-2">
  52. <Button type="default" icon={<RefreshCw />} loading={isRefreshing} onClick={onRefresh}>
  53. Refresh
  54. </Button>
  55. <Button onClick={onCreateJob}>Create job</Button>
  56. </div>
  57. </div>
  58. )
  59. }