PrivilegesTable.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { Switch } from 'ui'
  2. import {
  3. ALL_PRIVILEGE_TYPES,
  4. COLUMN_PRIVILEGE_TYPES,
  5. TABLE_PRIVILEGE_TYPES,
  6. } from './Privileges.constants'
  7. import { usePrivilegesState } from './Privileges.utils'
  8. import Table from '@/components/to-be-cleaned/Table'
  9. import type { ColumnPrivilege } from '@/data/privileges/column-privileges-query'
  10. export interface PrivilegesTableProps extends Pick<
  11. ReturnType<typeof usePrivilegesState>,
  12. 'tableCheckedStates' | 'columnCheckedStates' | 'toggleTablePrivilege' | 'toggleColumnPrivilege'
  13. > {
  14. columnPrivileges: ColumnPrivilege[]
  15. disabled: boolean
  16. isApplyingChanges?: boolean
  17. }
  18. const PrivilegesTable = ({
  19. columnPrivileges,
  20. tableCheckedStates,
  21. columnCheckedStates,
  22. toggleTablePrivilege,
  23. toggleColumnPrivilege,
  24. disabled,
  25. isApplyingChanges = false,
  26. }: PrivilegesTableProps) => {
  27. const handleClickColumnName = (columnId: string) => {
  28. const hasAllPrivileges = COLUMN_PRIVILEGE_TYPES.every(
  29. (privilege) => columnCheckedStates[columnId][privilege]
  30. )
  31. const privilegesToToggle = COLUMN_PRIVILEGE_TYPES.filter((privilege) =>
  32. hasAllPrivileges
  33. ? columnCheckedStates[columnId][privilege]
  34. : !columnCheckedStates[columnId][privilege]
  35. )
  36. privilegesToToggle.forEach((privilege) => {
  37. toggleColumnPrivilege(columnId, privilege)
  38. })
  39. }
  40. return (
  41. <Table
  42. className="table-fixed mb-4"
  43. head={[
  44. <Table.th key="header-column">
  45. <span>Column</span>
  46. </Table.th>,
  47. ...ALL_PRIVILEGE_TYPES.map((privilege) => {
  48. const checked = tableCheckedStates[privilege]
  49. return (
  50. <Table.th key={`header-${privilege}`}>
  51. <div className="inline-flex items-center gap-2">
  52. <span>{privilege.charAt(0) + privilege.slice(1).toLowerCase()}</span>
  53. <Switch
  54. checked={checked}
  55. onCheckedChange={() => {
  56. toggleTablePrivilege(privilege)
  57. }}
  58. disabled={disabled || isApplyingChanges}
  59. />
  60. </div>
  61. </Table.th>
  62. )
  63. }),
  64. ]}
  65. body={columnPrivileges.map((column) => (
  66. <Table.tr key={column.column_id}>
  67. <Table.td>
  68. <button
  69. onClick={() => handleClickColumnName(column.column_id)}
  70. className="block w-full truncate text-left text-foreground"
  71. >
  72. {column.column_name}
  73. </button>
  74. </Table.td>
  75. {COLUMN_PRIVILEGE_TYPES.map((privilege) => {
  76. const checked = columnCheckedStates[column.column_id][privilege]
  77. return (
  78. <Table.td key={privilege}>
  79. {COLUMN_PRIVILEGE_TYPES.includes(privilege as any) && (
  80. <div className="ml-5 inline-flex">
  81. <Switch
  82. checked={checked}
  83. onCheckedChange={() => {
  84. toggleColumnPrivilege(column.column_id, privilege)
  85. }}
  86. disabled={disabled || isApplyingChanges}
  87. />
  88. </div>
  89. )}
  90. </Table.td>
  91. )
  92. })}
  93. {TABLE_PRIVILEGE_TYPES.map((privilege) => {
  94. return (
  95. <Table.td key={privilege}>
  96. <span className="ml-5 text-xs text-foreground-lighter">N/A</span>
  97. </Table.td>
  98. )
  99. })}
  100. </Table.tr>
  101. ))}
  102. />
  103. )
  104. }
  105. export default PrivilegesTable