TopicForm.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import React from 'react';
  2. import { useFormContext } from 'react-hook-form';
  3. import { TOPIC_NAME_VALIDATION_PATTERN, BYTES_IN_GB } from 'lib/constants';
  4. import { TopicName, TopicConfigByName } from 'redux/interfaces';
  5. import { ErrorMessage } from '@hookform/error-message';
  6. import CustomParamsContainer from './CustomParams/CustomParamsContainer';
  7. import TimeToRetain from './TimeToRetain';
  8. interface Props {
  9. topicName?: TopicName;
  10. config?: TopicConfigByName;
  11. isEditing?: boolean;
  12. isSubmitting: boolean;
  13. onSubmit: (e: React.BaseSyntheticEvent) => Promise<void>;
  14. }
  15. const TopicForm: React.FC<Props> = ({
  16. topicName,
  17. config,
  18. isEditing,
  19. isSubmitting,
  20. onSubmit,
  21. }) => {
  22. const { register, errors } = useFormContext();
  23. return (
  24. <form onSubmit={onSubmit}>
  25. <div className="columns">
  26. <div className="column is-three-quarters">
  27. <label className="label">Topic Name *</label>
  28. <input
  29. className="input"
  30. placeholder="Topic Name"
  31. ref={register({
  32. required: 'Topic Name is required.',
  33. pattern: {
  34. value: TOPIC_NAME_VALIDATION_PATTERN,
  35. message: 'Only alphanumeric, _, -, and . allowed',
  36. },
  37. })}
  38. defaultValue={topicName}
  39. name="name"
  40. autoComplete="off"
  41. disabled={isEditing || isSubmitting}
  42. />
  43. <p className="help is-danger">
  44. <ErrorMessage errors={errors} name="name" />
  45. </p>
  46. </div>
  47. <div className="column">
  48. <label className="label">Number of partitions *</label>
  49. <input
  50. className="input"
  51. type="number"
  52. placeholder="Number of partitions"
  53. defaultValue="1"
  54. ref={register({ required: 'Number of partitions is required.' })}
  55. name="partitions"
  56. disabled={isEditing || isSubmitting}
  57. />
  58. <p className="help is-danger">
  59. <ErrorMessage errors={errors} name="partitions" />
  60. </p>
  61. </div>
  62. </div>
  63. <div className="columns">
  64. <div className="column">
  65. <label className="label">Replication Factor *</label>
  66. <input
  67. className="input"
  68. type="number"
  69. placeholder="Replication Factor"
  70. defaultValue="1"
  71. ref={register({ required: 'Replication Factor is required.' })}
  72. name="replicationFactor"
  73. disabled={isEditing || isSubmitting}
  74. />
  75. <p className="help is-danger">
  76. <ErrorMessage errors={errors} name="replicationFactor" />
  77. </p>
  78. </div>
  79. <div className="column">
  80. <label className="label">Min In Sync Replicas *</label>
  81. <input
  82. className="input"
  83. type="number"
  84. placeholder="Min In Sync Replicas"
  85. defaultValue="1"
  86. ref={register({ required: 'Min In Sync Replicas is required.' })}
  87. name="minInSyncReplicas"
  88. disabled={isSubmitting}
  89. />
  90. <p className="help is-danger">
  91. <ErrorMessage errors={errors} name="minInSyncReplicas" />
  92. </p>
  93. </div>
  94. </div>
  95. <div className="columns">
  96. <div className="column is-one-third">
  97. <label className="label">Cleanup policy</label>
  98. <div className="select is-block">
  99. <select
  100. defaultValue="delete"
  101. name="cleanupPolicy"
  102. ref={register}
  103. disabled={isSubmitting}
  104. >
  105. <option value="delete">Delete</option>
  106. <option value="compact">Compact</option>
  107. </select>
  108. </div>
  109. </div>
  110. <div className="column is-one-third">
  111. <TimeToRetain isSubmitting={isSubmitting} />
  112. </div>
  113. <div className="column is-one-third">
  114. <label className="label">Max size on disk in GB</label>
  115. <div className="select is-block">
  116. <select
  117. defaultValue={-1}
  118. name="retentionBytes"
  119. ref={register}
  120. disabled={isSubmitting}
  121. >
  122. <option value={-1}>Not Set</option>
  123. <option value={BYTES_IN_GB}>1 GB</option>
  124. <option value={BYTES_IN_GB * 10}>10 GB</option>
  125. <option value={BYTES_IN_GB * 20}>20 GB</option>
  126. <option value={BYTES_IN_GB * 50}>50 GB</option>
  127. </select>
  128. </div>
  129. </div>
  130. </div>
  131. <div className="columns">
  132. <div className="column">
  133. <label className="label">Maximum message size in bytes *</label>
  134. <input
  135. className="input"
  136. type="number"
  137. defaultValue="1000012"
  138. ref={register({
  139. required: 'Maximum message size in bytes is required',
  140. })}
  141. name="maxMessageBytes"
  142. disabled={isSubmitting}
  143. />
  144. <p className="help is-danger">
  145. <ErrorMessage errors={errors} name="maxMessageBytes" />
  146. </p>
  147. </div>
  148. </div>
  149. <CustomParamsContainer isSubmitting={isSubmitting} config={config} />
  150. <input
  151. type="submit"
  152. className="button is-primary"
  153. disabled={isSubmitting}
  154. />
  155. </form>
  156. );
  157. };
  158. export default TopicForm;