DataTable.utils.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { FilterFn } from '@tanstack/react-table'
  2. import { isAfter, isBefore, isSameDay } from 'date-fns'
  3. import { LEVELS } from './DataTable.constants'
  4. export function formatCompactNumber(value: number) {
  5. if (value >= 100 && value < 1000) {
  6. return value.toString() // Keep the number as is if it's in the hundreds
  7. } else if (value >= 1000 && value < 1000000) {
  8. return (value / 1000).toFixed(1) + 'k' // Convert to 'k' for thousands
  9. } else if (value >= 1000000) {
  10. return (value / 1000000).toFixed(1) + 'M' // Convert to 'M' for millions
  11. } else {
  12. return value.toString() // Optionally handle numbers less than 100 if needed
  13. }
  14. }
  15. export function isArrayOfNumbers(arr: any): arr is number[] {
  16. if (!Array.isArray(arr)) return false
  17. return arr.every((item) => typeof item === 'number')
  18. }
  19. export function isArrayOfDates(arr: any): arr is Date[] {
  20. if (!Array.isArray(arr)) return false
  21. return arr.every((item) => item instanceof Date)
  22. }
  23. export function isArrayOfStrings(arr: any): arr is string[] {
  24. if (!Array.isArray(arr)) return false
  25. return arr.every((item) => typeof item === 'string')
  26. }
  27. export function isArrayOfBooleans(arr: any): arr is boolean[] {
  28. if (!Array.isArray(arr)) return false
  29. return arr.every((item) => typeof item === 'boolean')
  30. }
  31. export const inDateRange: FilterFn<any> = (row, columnId, value) => {
  32. const date = new Date(row.getValue(columnId))
  33. const [start, end] = value as Date[]
  34. if (isNaN(date.getTime())) return false
  35. // if no end date, check if it's the same day
  36. if (!end) return isSameDay(date, start)
  37. return isAfter(date, start) && isBefore(date, end)
  38. }
  39. inDateRange.autoRemove = (val: any) => !Array.isArray(val) || !val.length || !isArrayOfDates(val)
  40. export const arrSome: FilterFn<any> = (row, columnId, filterValue) => {
  41. if (!Array.isArray(filterValue)) return false
  42. return filterValue.some((val) => row.getValue<unknown[]>(columnId) === val)
  43. }
  44. arrSome.autoRemove = (val: any) => !Array.isArray(val) || !val?.length
  45. export function getLevelColor(
  46. value: (typeof LEVELS)[number]
  47. ): Record<'text' | 'bg' | 'border', string> {
  48. switch (value) {
  49. case 'success':
  50. return {
  51. text: 'text-muted',
  52. bg: 'bg-muted group-data-[state=selected]/row:bg-foreground-lighter',
  53. border: 'border-muted group-data-[state=selected]/row:border-foreground-lighter',
  54. }
  55. case 'warning':
  56. return {
  57. text: 'text-warning',
  58. bg: 'bg-warning',
  59. border: 'border-warning',
  60. }
  61. case 'error':
  62. return {
  63. text: 'text-destructive',
  64. bg: 'bg-destructive',
  65. border: 'border-destructive',
  66. }
  67. default:
  68. return {
  69. text: 'text-info',
  70. bg: 'bg-info',
  71. border: 'border-info',
  72. }
  73. }
  74. }