StorageRenderers.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { Fragment } from 'react'
  2. import { ReportWidgetProps, ReportWidgetRendererProps } from '../ReportWidget'
  3. import { TextFormatter } from '@/components/interfaces/Settings/Logs/LogsFormatters'
  4. import Table from '@/components/to-be-cleaned/Table'
  5. import StackedBarChart from '@/components/ui/Charts/StackedBarChart'
  6. export const CacheHitRateChartRenderer = (
  7. props: ReportWidgetProps<{
  8. timestamp: string
  9. hit_count: number
  10. miss_count: number
  11. }>
  12. ) => {
  13. const stackedData = props.data.flatMap((datum) => [
  14. {
  15. timestamp: +datum.timestamp / 1000,
  16. count: datum.hit_count,
  17. type: 'hit',
  18. },
  19. {
  20. timestamp: +datum.timestamp / 1000,
  21. count: datum.miss_count,
  22. type: 'miss',
  23. },
  24. ])
  25. return (
  26. <StackedBarChart
  27. hideHeader
  28. variant="percentages"
  29. data={stackedData}
  30. xAxisKey="timestamp"
  31. yAxisKey="count"
  32. stackKey="type"
  33. stackColors={['brand', 'amber']}
  34. />
  35. )
  36. }
  37. export const TopCacheMissesRenderer = (
  38. props: ReportWidgetRendererProps<{
  39. path: string
  40. search: string
  41. count: number
  42. }>
  43. ) => {
  44. if (props.data.length === 0) return null
  45. const headerClasses = 'text-xs! py-2! p-0 font-bold bg-surface-200!'
  46. const cellClasses = 'text-xs! py-2!'
  47. return (
  48. <>
  49. <h3 className="py-4 px-6">Top Cache Misses</h3>
  50. <Table
  51. containerClassName="overflow-x-auto"
  52. head={
  53. <>
  54. <Table.th className={headerClasses}>Request</Table.th>
  55. <Table.th className={headerClasses + ' text-right'}>Count</Table.th>
  56. </>
  57. }
  58. body={
  59. <>
  60. {props.data.map((datum) => (
  61. <Fragment key={datum.path + (datum.search || '')}>
  62. <Table.tr className="p-0">
  63. <Table.td className={[cellClasses].join(' ')}>
  64. <div className=" truncate max-w-sm lg:max-w-lg">
  65. <TextFormatter className="text-foreground-light" value={datum.path} />
  66. <TextFormatter
  67. className="max-w-sm text-foreground-lighter truncate "
  68. value={decodeURIComponent(datum.search || '')}
  69. />
  70. </div>
  71. </Table.td>
  72. <Table.td className={[cellClasses, 'text-right'].join(' ')}>
  73. {datum.count}
  74. </Table.td>
  75. </Table.tr>
  76. </Fragment>
  77. ))}
  78. </>
  79. }
  80. />
  81. </>
  82. )
  83. }