TopicForm.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 {
  23. register,
  24. formState: { errors },
  25. } = useFormContext();
  26. return (
  27. <form onSubmit={onSubmit}>
  28. <fieldset disabled={isSubmitting}>
  29. <fieldset disabled={isEditing}>
  30. <div className="columns">
  31. <div className="column is-three-quarters">
  32. <label className="label">Topic Name *</label>
  33. <input
  34. className="input"
  35. placeholder="Topic Name"
  36. defaultValue={topicName}
  37. {...register('name', {
  38. required: 'Topic Name is required.',
  39. pattern: {
  40. value: TOPIC_NAME_VALIDATION_PATTERN,
  41. message: 'Only alphanumeric, _, -, and . allowed',
  42. },
  43. })}
  44. autoComplete="off"
  45. />
  46. <p className="help is-danger">
  47. <ErrorMessage errors={errors} name="name" />
  48. </p>
  49. </div>
  50. <div className="column">
  51. <label className="label">Number of partitions *</label>
  52. <input
  53. className="input"
  54. type="number"
  55. placeholder="Number of partitions"
  56. defaultValue="1"
  57. {...register('partitions', {
  58. required: 'Number of partitions is required.',
  59. })}
  60. />
  61. <p className="help is-danger">
  62. <ErrorMessage errors={errors} name="partitions" />
  63. </p>
  64. </div>
  65. </div>
  66. </fieldset>
  67. <div className="columns">
  68. <fieldset disabled={isEditing}>
  69. <div className="column">
  70. <label className="label">Replication Factor *</label>
  71. <input
  72. className="input"
  73. type="number"
  74. placeholder="Replication Factor"
  75. defaultValue="1"
  76. {...register('replicationFactor', {
  77. required: 'Replication Factor is required.',
  78. })}
  79. />
  80. <p className="help is-danger">
  81. <ErrorMessage errors={errors} name="replicationFactor" />
  82. </p>
  83. </div>
  84. </fieldset>
  85. <div className="column">
  86. <label className="label">Min In Sync Replicas *</label>
  87. <input
  88. className="input"
  89. type="number"
  90. placeholder="Min In Sync Replicas"
  91. defaultValue="1"
  92. {...register('minInSyncReplicas', {
  93. required: 'Min In Sync Replicas is required.',
  94. })}
  95. />
  96. <p className="help is-danger">
  97. <ErrorMessage errors={errors} name="minInSyncReplicas" />
  98. </p>
  99. </div>
  100. </div>
  101. <div className="columns">
  102. <div className="column is-one-third">
  103. <label className="label">Cleanup policy</label>
  104. <div className="select is-block">
  105. <select defaultValue="delete" {...register('cleanupPolicy')}>
  106. <option value="delete">Delete</option>
  107. <option value="compact">Compact</option>
  108. </select>
  109. </div>
  110. </div>
  111. <div className="column is-one-third">
  112. <TimeToRetain isSubmitting={isSubmitting} />
  113. </div>
  114. <div className="column is-one-third">
  115. <label className="label">Max size on disk in GB</label>
  116. <div className="select is-block">
  117. <select defaultValue={-1} {...register('retentionBytes')}>
  118. <option value={-1}>Not Set</option>
  119. <option value={BYTES_IN_GB}>1 GB</option>
  120. <option value={BYTES_IN_GB * 10}>10 GB</option>
  121. <option value={BYTES_IN_GB * 20}>20 GB</option>
  122. <option value={BYTES_IN_GB * 50}>50 GB</option>
  123. </select>
  124. </div>
  125. </div>
  126. </div>
  127. <div className="columns">
  128. <div className="column">
  129. <label className="label">Maximum message size in bytes *</label>
  130. <input
  131. className="input"
  132. type="number"
  133. defaultValue="1000012"
  134. {...register('maxMessageBytes', {
  135. required: 'Maximum message size in bytes is required',
  136. })}
  137. />
  138. <p className="help is-danger">
  139. <ErrorMessage errors={errors} name="maxMessageBytes" />
  140. </p>
  141. </div>
  142. </div>
  143. <CustomParamsContainer isSubmitting={isSubmitting} config={config} />
  144. <input type="submit" className="button is-primary" />
  145. </fieldset>
  146. </form>
  147. );
  148. };
  149. export default TopicForm;