PrivilegesHead.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import {
  2. Button,
  3. Select,
  4. SelectContent,
  5. SelectGroup,
  6. SelectItem,
  7. SelectTrigger,
  8. SelectValue,
  9. } from 'ui'
  10. import SchemaSelector from '@/components/ui/SchemaSelector'
  11. export interface PrivilegesHeadProps {
  12. disabled: boolean
  13. selectedSchema: string
  14. selectedRole: string
  15. selectedTable?: { name: string }
  16. tables: string[]
  17. roles: string[]
  18. onChangeSchema: (schema: string) => void
  19. onChangeRole: (role: string) => void
  20. onChangeTable: (table: string) => void
  21. hasChanges?: boolean
  22. resetChanges: () => void
  23. applyChanges: () => void
  24. isApplyingChanges?: boolean
  25. }
  26. const PrivilegesHead = ({
  27. disabled,
  28. selectedSchema,
  29. onChangeSchema,
  30. selectedRole,
  31. roles,
  32. onChangeRole,
  33. selectedTable,
  34. tables,
  35. onChangeTable,
  36. hasChanges = false,
  37. resetChanges,
  38. applyChanges,
  39. isApplyingChanges = false,
  40. }: PrivilegesHeadProps) => {
  41. return (
  42. <div className="flex items-center justify-between">
  43. <div className="flex items-center gap-x-2">
  44. <SchemaSelector
  45. className="bg-control rounded-md w-[180px] [&>button]:py-[5px]"
  46. selectedSchemaName={selectedSchema}
  47. onSelectSchema={onChangeSchema}
  48. />
  49. <TablesSelect selectedTable={selectedTable} tables={tables} onChangeTable={onChangeTable} />
  50. <div className="h-[20px] w-px border-r border-scale-600"></div>
  51. <RolesSelect selectedRole={selectedRole} roles={roles} onChangeRole={onChangeRole} />
  52. </div>
  53. <div className="flex items-center gap-2">
  54. <Button
  55. type="default"
  56. size="tiny"
  57. onClick={resetChanges}
  58. disabled={!hasChanges || isApplyingChanges}
  59. >
  60. Reset
  61. </Button>
  62. <Button
  63. type="primary"
  64. size="tiny"
  65. onClick={applyChanges}
  66. disabled={disabled || !hasChanges || isApplyingChanges}
  67. loading={isApplyingChanges}
  68. >
  69. Apply Changes
  70. </Button>
  71. </div>
  72. </div>
  73. )
  74. }
  75. const RolesSelect = ({
  76. selectedRole,
  77. roles,
  78. onChangeRole,
  79. }: {
  80. selectedRole: string
  81. roles: string[]
  82. onChangeRole: (role: string) => void
  83. }) => {
  84. return (
  85. <Select value={selectedRole} onValueChange={onChangeRole}>
  86. <SelectTrigger size="tiny" className="w-40">
  87. <SelectValue placeholder="Select a role" />
  88. </SelectTrigger>
  89. <SelectContent>
  90. <SelectGroup>
  91. {roles.map((role) => (
  92. <SelectItem key={role} value={role} className="text-xs">
  93. <span className="text-foreground-light mr-1">role</span> {role}
  94. </SelectItem>
  95. ))}
  96. </SelectGroup>
  97. </SelectContent>
  98. </Select>
  99. )
  100. }
  101. const TablesSelect = ({
  102. selectedTable,
  103. tables,
  104. onChangeTable,
  105. }: {
  106. selectedTable?: {
  107. name: string
  108. }
  109. tables: string[]
  110. onChangeTable: (table: string) => void
  111. }) => {
  112. return (
  113. <Select value={selectedTable?.name} onValueChange={onChangeTable}>
  114. <SelectTrigger size="tiny" className="w-44">
  115. <SelectValue placeholder="Select a table" />
  116. </SelectTrigger>
  117. <SelectContent>
  118. <SelectGroup>
  119. {tables.length === 0 ? (
  120. <div className="text-xs text-foreground-light p-2">
  121. No tables available in this schema
  122. </div>
  123. ) : null}
  124. {tables.map((table) => (
  125. <SelectItem key={table} value={table} className="text-xs">
  126. <span className="text-foreground-light mr-1">table</span> {table}
  127. </SelectItem>
  128. ))}
  129. </SelectGroup>
  130. </SelectContent>
  131. </Select>
  132. )
  133. }
  134. export default PrivilegesHead