@rjsf/core 6.0.0-alpha.0 → 6.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/dist/core.umd.js +1680 -809
  2. package/dist/index.esm.js +2166 -1198
  3. package/dist/index.esm.js.map +4 -4
  4. package/dist/index.js +2221 -1299
  5. package/dist/index.js.map +4 -4
  6. package/lib/components/Form.d.ts +22 -9
  7. package/lib/components/Form.d.ts.map +1 -0
  8. package/lib/components/Form.js +368 -312
  9. package/lib/components/RichDescription.d.ts +20 -0
  10. package/lib/components/RichDescription.d.ts.map +1 -0
  11. package/lib/components/RichDescription.js +17 -0
  12. package/lib/components/fields/ArrayField.d.ts +20 -9
  13. package/lib/components/fields/ArrayField.d.ts.map +1 -0
  14. package/lib/components/fields/ArrayField.js +212 -206
  15. package/lib/components/fields/BooleanField.d.ts +1 -0
  16. package/lib/components/fields/BooleanField.d.ts.map +1 -0
  17. package/lib/components/fields/BooleanField.js +6 -14
  18. package/lib/components/fields/LayoutGridField.d.ts +480 -0
  19. package/lib/components/fields/LayoutGridField.d.ts.map +1 -0
  20. package/lib/components/fields/LayoutGridField.js +711 -0
  21. package/lib/components/fields/LayoutHeaderField.d.ts +12 -0
  22. package/lib/components/fields/LayoutHeaderField.d.ts.map +1 -0
  23. package/lib/components/fields/LayoutHeaderField.js +23 -0
  24. package/lib/components/fields/LayoutMultiSchemaField.d.ts +28 -0
  25. package/lib/components/fields/LayoutMultiSchemaField.d.ts.map +1 -0
  26. package/lib/components/fields/LayoutMultiSchemaField.js +114 -0
  27. package/lib/components/fields/MultiSchemaField.d.ts +1 -0
  28. package/lib/components/fields/MultiSchemaField.d.ts.map +1 -0
  29. package/lib/components/fields/MultiSchemaField.js +31 -31
  30. package/lib/components/fields/NullField.d.ts +1 -0
  31. package/lib/components/fields/NullField.d.ts.map +1 -0
  32. package/lib/components/fields/NullField.js +0 -1
  33. package/lib/components/fields/NumberField.d.ts +1 -0
  34. package/lib/components/fields/NumberField.d.ts.map +1 -0
  35. package/lib/components/fields/NumberField.js +2 -3
  36. package/lib/components/fields/ObjectField.d.ts +1 -0
  37. package/lib/components/fields/ObjectField.d.ts.map +1 -0
  38. package/lib/components/fields/ObjectField.js +146 -141
  39. package/lib/components/fields/SchemaField.d.ts +1 -0
  40. package/lib/components/fields/SchemaField.d.ts.map +1 -0
  41. package/lib/components/fields/SchemaField.js +10 -20
  42. package/lib/components/fields/StringField.d.ts +1 -0
  43. package/lib/components/fields/StringField.d.ts.map +1 -0
  44. package/lib/components/fields/StringField.js +1 -3
  45. package/lib/components/fields/index.d.ts +1 -0
  46. package/lib/components/fields/index.d.ts.map +1 -0
  47. package/lib/components/fields/index.js +14 -9
  48. package/lib/components/templates/ArrayFieldDescriptionTemplate.d.ts +1 -0
  49. package/lib/components/templates/ArrayFieldDescriptionTemplate.d.ts.map +1 -0
  50. package/lib/components/templates/ArrayFieldDescriptionTemplate.js +0 -1
  51. package/lib/components/templates/ArrayFieldItemButtonsTemplate.d.ts +8 -0
  52. package/lib/components/templates/ArrayFieldItemButtonsTemplate.d.ts.map +1 -0
  53. package/lib/components/templates/ArrayFieldItemButtonsTemplate.js +17 -0
  54. package/lib/components/templates/ArrayFieldItemTemplate.d.ts +4 -3
  55. package/lib/components/templates/ArrayFieldItemTemplate.d.ts.map +1 -0
  56. package/lib/components/templates/ArrayFieldItemTemplate.js +7 -6
  57. package/lib/components/templates/ArrayFieldTemplate.d.ts +2 -1
  58. package/lib/components/templates/ArrayFieldTemplate.d.ts.map +1 -0
  59. package/lib/components/templates/ArrayFieldTemplate.js +3 -4
  60. package/lib/components/templates/ArrayFieldTitleTemplate.d.ts +1 -0
  61. package/lib/components/templates/ArrayFieldTitleTemplate.d.ts.map +1 -0
  62. package/lib/components/templates/ArrayFieldTitleTemplate.js +0 -1
  63. package/lib/components/templates/BaseInputTemplate.d.ts +1 -0
  64. package/lib/components/templates/BaseInputTemplate.d.ts.map +1 -0
  65. package/lib/components/templates/BaseInputTemplate.js +0 -1
  66. package/lib/components/templates/ButtonTemplates/AddButton.d.ts +1 -0
  67. package/lib/components/templates/ButtonTemplates/AddButton.d.ts.map +1 -0
  68. package/lib/components/templates/ButtonTemplates/AddButton.js +1 -2
  69. package/lib/components/templates/ButtonTemplates/IconButton.d.ts +1 -0
  70. package/lib/components/templates/ButtonTemplates/IconButton.d.ts.map +1 -0
  71. package/lib/components/templates/ButtonTemplates/IconButton.js +4 -5
  72. package/lib/components/templates/ButtonTemplates/SubmitButton.d.ts +1 -0
  73. package/lib/components/templates/ButtonTemplates/SubmitButton.d.ts.map +1 -0
  74. package/lib/components/templates/ButtonTemplates/SubmitButton.js +0 -1
  75. package/lib/components/templates/ButtonTemplates/index.d.ts +1 -0
  76. package/lib/components/templates/ButtonTemplates/index.d.ts.map +1 -0
  77. package/lib/components/templates/ButtonTemplates/index.js +3 -4
  78. package/lib/components/templates/DescriptionField.d.ts +1 -0
  79. package/lib/components/templates/DescriptionField.d.ts.map +1 -0
  80. package/lib/components/templates/DescriptionField.js +3 -8
  81. package/lib/components/templates/ErrorList.d.ts +1 -0
  82. package/lib/components/templates/ErrorList.d.ts.map +1 -0
  83. package/lib/components/templates/ErrorList.js +0 -1
  84. package/lib/components/templates/FieldErrorTemplate.d.ts +1 -0
  85. package/lib/components/templates/FieldErrorTemplate.d.ts.map +1 -0
  86. package/lib/components/templates/FieldErrorTemplate.js +0 -1
  87. package/lib/components/templates/FieldHelpTemplate.d.ts +1 -0
  88. package/lib/components/templates/FieldHelpTemplate.d.ts.map +1 -0
  89. package/lib/components/templates/FieldHelpTemplate.js +0 -1
  90. package/lib/components/templates/FieldTemplate/FieldTemplate.d.ts +1 -0
  91. package/lib/components/templates/FieldTemplate/FieldTemplate.d.ts.map +1 -0
  92. package/lib/components/templates/FieldTemplate/FieldTemplate.js +1 -2
  93. package/lib/components/templates/FieldTemplate/Label.d.ts +1 -0
  94. package/lib/components/templates/FieldTemplate/Label.d.ts.map +1 -0
  95. package/lib/components/templates/FieldTemplate/Label.js +0 -1
  96. package/lib/components/templates/FieldTemplate/index.d.ts +2 -1
  97. package/lib/components/templates/FieldTemplate/index.d.ts.map +1 -0
  98. package/lib/components/templates/FieldTemplate/index.js +1 -2
  99. package/lib/components/templates/GridTemplate.d.ts +8 -0
  100. package/lib/components/templates/GridTemplate.d.ts.map +1 -0
  101. package/lib/components/templates/GridTemplate.js +10 -0
  102. package/lib/components/templates/ObjectFieldTemplate.d.ts +1 -0
  103. package/lib/components/templates/ObjectFieldTemplate.d.ts.map +1 -0
  104. package/lib/components/templates/ObjectFieldTemplate.js +2 -3
  105. package/lib/components/templates/TitleField.d.ts +1 -0
  106. package/lib/components/templates/TitleField.d.ts.map +1 -0
  107. package/lib/components/templates/TitleField.js +0 -1
  108. package/lib/components/templates/UnsupportedField.d.ts +1 -0
  109. package/lib/components/templates/UnsupportedField.d.ts.map +1 -0
  110. package/lib/components/templates/UnsupportedField.js +0 -1
  111. package/lib/components/templates/WrapIfAdditionalTemplate.d.ts +1 -0
  112. package/lib/components/templates/WrapIfAdditionalTemplate.d.ts.map +1 -0
  113. package/lib/components/templates/WrapIfAdditionalTemplate.js +10 -6
  114. package/lib/components/templates/index.d.ts +1 -0
  115. package/lib/components/templates/index.d.ts.map +1 -0
  116. package/lib/components/templates/index.js +19 -16
  117. package/lib/components/widgets/AltDateTimeWidget.d.ts +1 -0
  118. package/lib/components/widgets/AltDateTimeWidget.d.ts.map +1 -0
  119. package/lib/components/widgets/AltDateTimeWidget.js +0 -1
  120. package/lib/components/widgets/AltDateWidget.d.ts +1 -0
  121. package/lib/components/widgets/AltDateWidget.d.ts.map +1 -0
  122. package/lib/components/widgets/AltDateWidget.js +0 -1
  123. package/lib/components/widgets/CheckboxWidget.d.ts +1 -0
  124. package/lib/components/widgets/CheckboxWidget.d.ts.map +1 -0
  125. package/lib/components/widgets/CheckboxWidget.js +2 -4
  126. package/lib/components/widgets/CheckboxesWidget.d.ts +1 -0
  127. package/lib/components/widgets/CheckboxesWidget.d.ts.map +1 -0
  128. package/lib/components/widgets/CheckboxesWidget.js +0 -1
  129. package/lib/components/widgets/ColorWidget.d.ts +1 -0
  130. package/lib/components/widgets/ColorWidget.d.ts.map +1 -0
  131. package/lib/components/widgets/ColorWidget.js +0 -1
  132. package/lib/components/widgets/DateTimeWidget.d.ts +1 -0
  133. package/lib/components/widgets/DateTimeWidget.d.ts.map +1 -0
  134. package/lib/components/widgets/DateTimeWidget.js +0 -1
  135. package/lib/components/widgets/DateWidget.d.ts +1 -0
  136. package/lib/components/widgets/DateWidget.d.ts.map +1 -0
  137. package/lib/components/widgets/DateWidget.js +0 -1
  138. package/lib/components/widgets/EmailWidget.d.ts +1 -0
  139. package/lib/components/widgets/EmailWidget.d.ts.map +1 -0
  140. package/lib/components/widgets/EmailWidget.js +0 -1
  141. package/lib/components/widgets/FileWidget.d.ts +1 -0
  142. package/lib/components/widgets/FileWidget.d.ts.map +1 -0
  143. package/lib/components/widgets/FileWidget.js +3 -5
  144. package/lib/components/widgets/HiddenWidget.d.ts +1 -0
  145. package/lib/components/widgets/HiddenWidget.d.ts.map +1 -0
  146. package/lib/components/widgets/HiddenWidget.js +0 -1
  147. package/lib/components/widgets/PasswordWidget.d.ts +1 -0
  148. package/lib/components/widgets/PasswordWidget.d.ts.map +1 -0
  149. package/lib/components/widgets/PasswordWidget.js +0 -1
  150. package/lib/components/widgets/RadioWidget.d.ts +1 -0
  151. package/lib/components/widgets/RadioWidget.d.ts.map +1 -0
  152. package/lib/components/widgets/RadioWidget.js +3 -4
  153. package/lib/components/widgets/RangeWidget.d.ts +1 -0
  154. package/lib/components/widgets/RangeWidget.d.ts.map +1 -0
  155. package/lib/components/widgets/RangeWidget.js +0 -1
  156. package/lib/components/widgets/RatingWidget.d.ts +15 -0
  157. package/lib/components/widgets/RatingWidget.d.ts.map +1 -0
  158. package/lib/components/widgets/RatingWidget.js +63 -0
  159. package/lib/components/widgets/SelectWidget.d.ts +1 -0
  160. package/lib/components/widgets/SelectWidget.d.ts.map +1 -0
  161. package/lib/components/widgets/SelectWidget.js +4 -5
  162. package/lib/components/widgets/TextWidget.d.ts +1 -0
  163. package/lib/components/widgets/TextWidget.d.ts.map +1 -0
  164. package/lib/components/widgets/TextWidget.js +0 -1
  165. package/lib/components/widgets/TextareaWidget.d.ts +1 -0
  166. package/lib/components/widgets/TextareaWidget.d.ts.map +1 -0
  167. package/lib/components/widgets/TextareaWidget.js +0 -1
  168. package/lib/components/widgets/TimeWidget.d.ts +1 -0
  169. package/lib/components/widgets/TimeWidget.d.ts.map +1 -0
  170. package/lib/components/widgets/TimeWidget.js +0 -1
  171. package/lib/components/widgets/URLWidget.d.ts +1 -0
  172. package/lib/components/widgets/URLWidget.d.ts.map +1 -0
  173. package/lib/components/widgets/URLWidget.js +0 -1
  174. package/lib/components/widgets/UpDownWidget.d.ts +1 -0
  175. package/lib/components/widgets/UpDownWidget.d.ts.map +1 -0
  176. package/lib/components/widgets/UpDownWidget.js +0 -1
  177. package/lib/components/widgets/index.d.ts +1 -0
  178. package/lib/components/widgets/index.d.ts.map +1 -0
  179. package/lib/components/widgets/index.js +21 -20
  180. package/lib/getDefaultRegistry.d.ts +1 -0
  181. package/lib/getDefaultRegistry.d.ts.map +1 -0
  182. package/lib/getDefaultRegistry.js +3 -4
  183. package/lib/index.d.ts +7 -5
  184. package/lib/index.d.ts.map +1 -0
  185. package/lib/index.js +5 -5
  186. package/lib/tsconfig.tsbuildinfo +1 -1
  187. package/lib/withTheme.d.ts +2 -1
  188. package/lib/withTheme.d.ts.map +1 -0
  189. package/lib/withTheme.js +7 -8
  190. package/package.json +46 -37
  191. package/src/components/Form.tsx +127 -41
  192. package/src/components/RichDescription.tsx +50 -0
  193. package/src/components/fields/ArrayField.tsx +34 -24
  194. package/src/components/fields/BooleanField.tsx +6 -14
  195. package/src/components/fields/LayoutGridField.tsx +967 -0
  196. package/src/components/fields/LayoutHeaderField.tsx +49 -0
  197. package/src/components/fields/LayoutMultiSchemaField.tsx +228 -0
  198. package/src/components/fields/MultiSchemaField.tsx +9 -4
  199. package/src/components/fields/NullField.tsx +1 -1
  200. package/src/components/fields/NumberField.tsx +5 -5
  201. package/src/components/fields/ObjectField.tsx +32 -24
  202. package/src/components/fields/SchemaField.tsx +17 -30
  203. package/src/components/fields/StringField.tsx +2 -2
  204. package/src/components/fields/index.ts +7 -1
  205. package/src/components/templates/ArrayFieldDescriptionTemplate.tsx +2 -2
  206. package/src/components/templates/ArrayFieldItemButtonsTemplate.tsx +85 -0
  207. package/src/components/templates/ArrayFieldItemTemplate.tsx +18 -57
  208. package/src/components/templates/ArrayFieldTemplate.tsx +10 -8
  209. package/src/components/templates/ArrayFieldTitleTemplate.tsx +2 -2
  210. package/src/components/templates/BaseInputTemplate.tsx +4 -4
  211. package/src/components/templates/ButtonTemplates/IconButton.tsx +9 -36
  212. package/src/components/templates/ButtonTemplates/SubmitButton.tsx +1 -1
  213. package/src/components/templates/ButtonTemplates/index.ts +1 -1
  214. package/src/components/templates/DescriptionField.tsx +9 -15
  215. package/src/components/templates/FieldErrorTemplate.tsx +1 -1
  216. package/src/components/templates/FieldHelpTemplate.tsx +1 -1
  217. package/src/components/templates/FieldTemplate/FieldTemplate.tsx +2 -2
  218. package/src/components/templates/GridTemplate.tsx +15 -0
  219. package/src/components/templates/ObjectFieldTemplate.tsx +5 -3
  220. package/src/components/templates/TitleField.tsx +1 -1
  221. package/src/components/templates/UnsupportedField.tsx +1 -1
  222. package/src/components/templates/WrapIfAdditionalTemplate.tsx +14 -4
  223. package/src/components/templates/index.ts +4 -0
  224. package/src/components/widgets/AltDateWidget.tsx +9 -6
  225. package/src/components/widgets/CheckboxWidget.tsx +5 -5
  226. package/src/components/widgets/CheckboxesWidget.tsx +2 -2
  227. package/src/components/widgets/ColorWidget.tsx +1 -1
  228. package/src/components/widgets/DateTimeWidget.tsx +1 -1
  229. package/src/components/widgets/DateWidget.tsx +1 -1
  230. package/src/components/widgets/EmailWidget.tsx +1 -1
  231. package/src/components/widgets/FileWidget.tsx +5 -5
  232. package/src/components/widgets/PasswordWidget.tsx +1 -1
  233. package/src/components/widgets/RadioWidget.tsx +3 -3
  234. package/src/components/widgets/RangeWidget.tsx +1 -1
  235. package/src/components/widgets/RatingWidget.tsx +129 -0
  236. package/src/components/widgets/SelectWidget.tsx +4 -3
  237. package/src/components/widgets/TextWidget.tsx +1 -1
  238. package/src/components/widgets/TextareaWidget.tsx +3 -3
  239. package/src/components/widgets/TimeWidget.tsx +1 -1
  240. package/src/components/widgets/URLWidget.tsx +1 -1
  241. package/src/components/widgets/UpDownWidget.tsx +1 -1
  242. package/src/components/widgets/index.ts +3 -1
  243. package/src/getDefaultRegistry.ts +1 -1
  244. package/src/index.ts +3 -2
  245. package/src/tsconfig.json +14 -6
  246. package/src/withTheme.tsx +4 -3
  247. package/LICENSE.md +0 -201
  248. package/lib/components/Form.js.map +0 -1
  249. package/lib/components/fields/ArrayField.js.map +0 -1
  250. package/lib/components/fields/BooleanField.js.map +0 -1
  251. package/lib/components/fields/MultiSchemaField.js.map +0 -1
  252. package/lib/components/fields/NullField.js.map +0 -1
  253. package/lib/components/fields/NumberField.js.map +0 -1
  254. package/lib/components/fields/ObjectField.js.map +0 -1
  255. package/lib/components/fields/SchemaField.js.map +0 -1
  256. package/lib/components/fields/StringField.js.map +0 -1
  257. package/lib/components/fields/index.js.map +0 -1
  258. package/lib/components/templates/ArrayFieldDescriptionTemplate.js.map +0 -1
  259. package/lib/components/templates/ArrayFieldItemTemplate.js.map +0 -1
  260. package/lib/components/templates/ArrayFieldTemplate.js.map +0 -1
  261. package/lib/components/templates/ArrayFieldTitleTemplate.js.map +0 -1
  262. package/lib/components/templates/BaseInputTemplate.js.map +0 -1
  263. package/lib/components/templates/ButtonTemplates/AddButton.js.map +0 -1
  264. package/lib/components/templates/ButtonTemplates/IconButton.js.map +0 -1
  265. package/lib/components/templates/ButtonTemplates/SubmitButton.js.map +0 -1
  266. package/lib/components/templates/ButtonTemplates/index.js.map +0 -1
  267. package/lib/components/templates/DescriptionField.js.map +0 -1
  268. package/lib/components/templates/ErrorList.js.map +0 -1
  269. package/lib/components/templates/FieldErrorTemplate.js.map +0 -1
  270. package/lib/components/templates/FieldHelpTemplate.js.map +0 -1
  271. package/lib/components/templates/FieldTemplate/FieldTemplate.js.map +0 -1
  272. package/lib/components/templates/FieldTemplate/Label.js.map +0 -1
  273. package/lib/components/templates/FieldTemplate/index.js.map +0 -1
  274. package/lib/components/templates/ObjectFieldTemplate.js.map +0 -1
  275. package/lib/components/templates/TitleField.js.map +0 -1
  276. package/lib/components/templates/UnsupportedField.js.map +0 -1
  277. package/lib/components/templates/WrapIfAdditionalTemplate.js.map +0 -1
  278. package/lib/components/templates/index.js.map +0 -1
  279. package/lib/components/widgets/AltDateTimeWidget.js.map +0 -1
  280. package/lib/components/widgets/AltDateWidget.js.map +0 -1
  281. package/lib/components/widgets/CheckboxWidget.js.map +0 -1
  282. package/lib/components/widgets/CheckboxesWidget.js.map +0 -1
  283. package/lib/components/widgets/ColorWidget.js.map +0 -1
  284. package/lib/components/widgets/DateTimeWidget.js.map +0 -1
  285. package/lib/components/widgets/DateWidget.js.map +0 -1
  286. package/lib/components/widgets/EmailWidget.js.map +0 -1
  287. package/lib/components/widgets/FileWidget.js.map +0 -1
  288. package/lib/components/widgets/HiddenWidget.js.map +0 -1
  289. package/lib/components/widgets/PasswordWidget.js.map +0 -1
  290. package/lib/components/widgets/RadioWidget.js.map +0 -1
  291. package/lib/components/widgets/RangeWidget.js.map +0 -1
  292. package/lib/components/widgets/SelectWidget.js.map +0 -1
  293. package/lib/components/widgets/TextWidget.js.map +0 -1
  294. package/lib/components/widgets/TextareaWidget.js.map +0 -1
  295. package/lib/components/widgets/TimeWidget.js.map +0 -1
  296. package/lib/components/widgets/URLWidget.js.map +0 -1
  297. package/lib/components/widgets/UpDownWidget.js.map +0 -1
  298. package/lib/components/widgets/index.js.map +0 -1
  299. package/lib/getDefaultRegistry.js.map +0 -1
  300. package/lib/index.js.map +0 -1
  301. package/lib/withTheme.js.map +0 -1
@@ -85,9 +85,12 @@ function AltDateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F exten
85
85
  }: WidgetProps<T, S, F>) {
86
86
  const { translateString } = registry;
87
87
  const [lastValue, setLastValue] = useState(value);
88
- const [state, setState] = useReducer((state: DateObject, action: Partial<DateObject>) => {
89
- return { ...state, ...action };
90
- }, parseDateString(value, time));
88
+ const [state, setState] = useReducer(
89
+ (state: DateObject, action: Partial<DateObject>) => {
90
+ return { ...state, ...action };
91
+ },
92
+ parseDateString(value, time),
93
+ );
91
94
 
92
95
  useEffect(() => {
93
96
  const stateValue = toDateString(state, time);
@@ -114,7 +117,7 @@ function AltDateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F exten
114
117
  const nextState = parseDateString(new Date().toJSON(), time);
115
118
  onChange(toDateString(nextState, time));
116
119
  },
117
- [disabled, readonly, time]
120
+ [disabled, readonly, time],
118
121
  );
119
122
 
120
123
  const handleClear = useCallback(
@@ -125,7 +128,7 @@ function AltDateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F exten
125
128
  }
126
129
  onChange(undefined);
127
130
  },
128
- [disabled, readonly, onChange]
131
+ [disabled, readonly, onChange],
129
132
  );
130
133
 
131
134
  return (
@@ -134,7 +137,7 @@ function AltDateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F exten
134
137
  state,
135
138
  time,
136
139
  options.yearsRange as [number, number] | undefined,
137
- options.format as DateElementFormat | undefined
140
+ options.format as DateElementFormat | undefined,
138
141
  ).map((elemProps, i) => (
139
142
  <li className='list-inline-item' key={i}>
140
143
  <DateElement
@@ -35,7 +35,7 @@ function CheckboxWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F exte
35
35
  const DescriptionFieldTemplate = getTemplate<'DescriptionFieldTemplate', T, S, F>(
36
36
  'DescriptionFieldTemplate',
37
37
  registry,
38
- options
38
+ options,
39
39
  );
40
40
  // Because an unchecked checkbox will cause html5 validation to fail, only add
41
41
  // the "required" attribute if the field value must be "true", due to the
@@ -44,23 +44,23 @@ function CheckboxWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F exte
44
44
 
45
45
  const handleChange = useCallback(
46
46
  (event: ChangeEvent<HTMLInputElement>) => onChange(event.target.checked),
47
- [onChange]
47
+ [onChange],
48
48
  );
49
49
 
50
50
  const handleBlur = useCallback(
51
51
  (event: FocusEvent<HTMLInputElement>) => onBlur(id, event.target.checked),
52
- [onBlur, id]
52
+ [onBlur, id],
53
53
  );
54
54
 
55
55
  const handleFocus = useCallback(
56
56
  (event: FocusEvent<HTMLInputElement>) => onFocus(id, event.target.checked),
57
- [onFocus, id]
57
+ [onFocus, id],
58
58
  );
59
59
  const description = options.description ?? schema.description;
60
60
 
61
61
  return (
62
62
  <div className={`checkbox ${disabled || readonly ? 'disabled' : ''}`}>
63
- {!hideLabel && !!description && (
63
+ {!hideLabel && description && (
64
64
  <DescriptionFieldTemplate
65
65
  id={descriptionId<T>(id)}
66
66
  description={description}
@@ -33,13 +33,13 @@ function CheckboxesWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F ex
33
33
  const handleBlur = useCallback(
34
34
  ({ target }: FocusEvent<HTMLInputElement>) =>
35
35
  onBlur(id, enumOptionsValueForIndex<S>(target && target.value, enumOptions, emptyValue)),
36
- [onBlur, id]
36
+ [onBlur, id],
37
37
  );
38
38
 
39
39
  const handleFocus = useCallback(
40
40
  ({ target }: FocusEvent<HTMLInputElement>) =>
41
41
  onFocus(id, enumOptionsValueForIndex<S>(target && target.value, enumOptions, emptyValue)),
42
- [onFocus, id]
42
+ [onFocus, id],
43
43
  );
44
44
  return (
45
45
  <div className='checkboxes' id={id}>
@@ -6,7 +6,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
6
6
  * @param props - The `WidgetProps` for this component
7
7
  */
8
8
  export default function ColorWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
9
- props: WidgetProps<T, S, F>
9
+ props: WidgetProps<T, S, F>,
10
10
  ) {
11
11
  const { disabled, readonly, options, registry } = props;
12
12
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -16,7 +16,7 @@ import {
16
16
  export default function DateTimeWidget<
17
17
  T = any,
18
18
  S extends StrictRJSFSchema = RJSFSchema,
19
- F extends FormContextType = any
19
+ F extends FormContextType = any,
20
20
  >(props: WidgetProps<T, S, F>) {
21
21
  const { onChange, value, options, registry } = props;
22
22
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -7,7 +7,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
7
7
  * @param props - The `WidgetProps` for this component
8
8
  */
9
9
  export default function DateWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
10
- props: WidgetProps<T, S, F>
10
+ props: WidgetProps<T, S, F>,
11
11
  ) {
12
12
  const { onChange, options, registry } = props;
13
13
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -5,7 +5,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
5
5
  * @param props - The `WidgetProps` for this component
6
6
  */
7
7
  export default function EmailWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
8
- props: WidgetProps<T, S, F>
8
+ props: WidgetProps<T, S, F>,
9
9
  ) {
10
10
  const { options, registry } = props;
11
11
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -141,7 +141,7 @@ function extractFileInfo(dataURLs: string[]): FileInfoType[] {
141
141
  type: blob.type,
142
142
  },
143
143
  ];
144
- } catch (e) {
144
+ } catch {
145
145
  // Invalid dataURI, so just ignore it.
146
146
  return acc;
147
147
  }
@@ -153,7 +153,7 @@ function extractFileInfo(dataURLs: string[]): FileInfoType[] {
153
153
  * It is typically used with a string property with data-url format.
154
154
  */
155
155
  function FileWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
156
- props: WidgetProps<T, S, F>
156
+ props: WidgetProps<T, S, F>,
157
157
  ) {
158
158
  const { disabled, readonly, required, multiple, onChange, value, options, registry } = props;
159
159
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -169,13 +169,13 @@ function FileWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends
169
169
  processFiles(event.target.files).then((filesInfoEvent) => {
170
170
  const newValue = filesInfoEvent.map((fileInfo) => fileInfo.dataURL);
171
171
  if (multiple) {
172
- onChange(value.concat(newValue[0]));
172
+ onChange(value.concat(newValue));
173
173
  } else {
174
174
  onChange(newValue[0]);
175
175
  }
176
176
  });
177
177
  },
178
- [multiple, value, onChange]
178
+ [multiple, value, onChange],
179
179
  );
180
180
 
181
181
  const filesInfo = useMemo(() => extractFileInfo(Array.isArray(value) ? value : [value]), [value]);
@@ -188,7 +188,7 @@ function FileWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends
188
188
  onChange(undefined);
189
189
  }
190
190
  },
191
- [multiple, value, onChange]
191
+ [multiple, value, onChange],
192
192
  );
193
193
  return (
194
194
  <div>
@@ -7,7 +7,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
7
7
  export default function PasswordWidget<
8
8
  T = any,
9
9
  S extends StrictRJSFSchema = RJSFSchema,
10
- F extends FormContextType = any
10
+ F extends FormContextType = any,
11
11
  >(props: WidgetProps<T, S, F>) {
12
12
  const { options, registry } = props;
13
13
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -32,17 +32,17 @@ function RadioWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends
32
32
  const handleBlur = useCallback(
33
33
  ({ target }: FocusEvent<HTMLInputElement>) =>
34
34
  onBlur(id, enumOptionsValueForIndex<S>(target && target.value, enumOptions, emptyValue)),
35
- [onBlur, id]
35
+ [onBlur, enumOptions, emptyValue, id],
36
36
  );
37
37
 
38
38
  const handleFocus = useCallback(
39
39
  ({ target }: FocusEvent<HTMLInputElement>) =>
40
40
  onFocus(id, enumOptionsValueForIndex<S>(target && target.value, enumOptions, emptyValue)),
41
- [onFocus, id]
41
+ [onFocus, enumOptions, emptyValue, id],
42
42
  );
43
43
 
44
44
  return (
45
- <div className='field-radio-group' id={id}>
45
+ <div className='field-radio-group' id={id} role='radiogroup'>
46
46
  {Array.isArray(enumOptions) &&
47
47
  enumOptions.map((option, i) => {
48
48
  const checked = enumOptionsIsSelected<S>(option.value, value);
@@ -6,7 +6,7 @@ import { FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from '@rjs
6
6
  * @param props - The `WidgetProps` for this component
7
7
  */
8
8
  export default function RangeWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
9
- props: WidgetProps<T, S, F>
9
+ props: WidgetProps<T, S, F>,
10
10
  ) {
11
11
  const {
12
12
  value,
@@ -0,0 +1,129 @@
1
+ import { FocusEvent, useCallback } from 'react';
2
+ import { FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from '@rjsf/utils';
3
+
4
+ /** The `RatingWidget` component renders a star or heart rating input
5
+ *
6
+ * Features:
7
+ * - Configurable number of stars/hearts (1-5) with default of 5
8
+ * - Supports different shapes (star, heart)
9
+ * - Supports minimum and maximum values from schema
10
+ * - Handles required, disabled, and readonly states
11
+ * - Provides focus and blur event handling for accessibility
12
+ * - Uses Unicode characters for better visual representation
13
+ *
14
+ * @param props - The `WidgetProps` for this component
15
+ */
16
+ export default function RatingWidget<
17
+ T = any,
18
+ S extends StrictRJSFSchema = RJSFSchema,
19
+ F extends FormContextType = any,
20
+ >({
21
+ id,
22
+ value,
23
+ required,
24
+ disabled,
25
+ readonly,
26
+ autofocus,
27
+ onChange,
28
+ onFocus,
29
+ onBlur,
30
+ schema,
31
+ options,
32
+ }: WidgetProps<T, S, F>) {
33
+ const { stars = 5, shape = 'star' } = options;
34
+
35
+ // Use schema.maximum if provided, otherwise use stars option (limited to 1-5)
36
+ const numStars = schema.maximum ? Math.min(schema.maximum, 5) : Math.min(Math.max(stars as number, 1), 5);
37
+ const min = schema.minimum || 0;
38
+
39
+ /** Handles clicking on a star to set the rating */
40
+ const handleStarClick = useCallback(
41
+ (starValue: number) => {
42
+ if (!disabled && !readonly) {
43
+ onChange(starValue);
44
+ }
45
+ },
46
+ [onChange, disabled, readonly],
47
+ );
48
+
49
+ /** Handles focus events for accessibility */
50
+ const handleFocus = useCallback(
51
+ (event: FocusEvent<HTMLSpanElement>) => {
52
+ if (onFocus) {
53
+ // Get the star value from the data attribute
54
+ const starValue = Number((event.target as HTMLElement).dataset.value);
55
+ onFocus(id, starValue);
56
+ }
57
+ },
58
+ [onFocus, id],
59
+ );
60
+
61
+ /** Handles blur events for accessibility */
62
+ const handleBlur = useCallback(
63
+ (event: FocusEvent<HTMLSpanElement>) => {
64
+ if (onBlur) {
65
+ // Get the star value from the data attribute
66
+ const starValue = Number((event.target as HTMLElement).dataset.value);
67
+ onBlur(id, starValue);
68
+ }
69
+ },
70
+ [onBlur, id],
71
+ );
72
+
73
+ // Get the appropriate Unicode character based on shape option
74
+ const getSymbol = (isFilled: boolean): string => {
75
+ if (shape === 'heart') {
76
+ return isFilled ? '♥' : '♡';
77
+ }
78
+ return isFilled ? '★' : '☆';
79
+ };
80
+
81
+ return (
82
+ <>
83
+ <div
84
+ className='rating-widget'
85
+ style={{
86
+ display: 'inline-flex',
87
+ fontSize: '1.5rem',
88
+ cursor: disabled || readonly ? 'default' : 'pointer',
89
+ }}
90
+ >
91
+ {[...Array(numStars)].map((_, index) => {
92
+ const starValue = min + index;
93
+ const isFilled = starValue <= value;
94
+
95
+ return (
96
+ <span
97
+ key={index}
98
+ onClick={() => handleStarClick(starValue)}
99
+ onFocus={handleFocus}
100
+ onBlur={handleBlur}
101
+ data-value={starValue}
102
+ tabIndex={disabled || readonly ? -1 : 0}
103
+ role='radio'
104
+ aria-checked={starValue === value}
105
+ aria-label={`${starValue} ${shape === 'heart' ? 'heart' : 'star'}${starValue === 1 ? '' : 's'}`}
106
+ style={{
107
+ color: isFilled ? '#FFD700' : '#ccc',
108
+ padding: '0 0.2rem',
109
+ transition: 'color 0.2s',
110
+ userSelect: 'none',
111
+ }}
112
+ >
113
+ {getSymbol(isFilled)}
114
+ </span>
115
+ );
116
+ })}
117
+ <input
118
+ type='hidden'
119
+ id={id}
120
+ name={id}
121
+ value={value || ''}
122
+ required={required}
123
+ disabled={disabled || readonly}
124
+ aria-hidden='true'
125
+ />
126
+ </div>
127
+ </>
128
+ );
129
+ }
@@ -47,7 +47,7 @@ function SelectWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extend
47
47
  const newValue = getValue(event, multiple);
48
48
  return onFocus(id, enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyVal));
49
49
  },
50
- [onFocus, id, schema, multiple, enumOptions, optEmptyVal]
50
+ [onFocus, id, multiple, enumOptions, optEmptyVal],
51
51
  );
52
52
 
53
53
  const handleBlur = useCallback(
@@ -55,7 +55,7 @@ function SelectWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extend
55
55
  const newValue = getValue(event, multiple);
56
56
  return onBlur(id, enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyVal));
57
57
  },
58
- [onBlur, id, schema, multiple, enumOptions, optEmptyVal]
58
+ [onBlur, id, multiple, enumOptions, optEmptyVal],
59
59
  );
60
60
 
61
61
  const handleChange = useCallback(
@@ -63,7 +63,7 @@ function SelectWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extend
63
63
  const newValue = getValue(event, multiple);
64
64
  return onChange(enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyVal));
65
65
  },
66
- [onChange, schema, multiple, enumOptions, optEmptyVal]
66
+ [onChange, multiple, enumOptions, optEmptyVal],
67
67
  );
68
68
 
69
69
  const selectedIndexes = enumOptionsIndexForValue<S>(value, enumOptions, multiple);
@@ -74,6 +74,7 @@ function SelectWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extend
74
74
  id={id}
75
75
  name={id}
76
76
  multiple={multiple}
77
+ role='combobox'
77
78
  className='form-control'
78
79
  value={typeof selectedIndexes === 'undefined' ? emptyValue : selectedIndexes}
79
80
  required={required}
@@ -5,7 +5,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
5
5
  * @param props - The `WidgetProps` for this component
6
6
  */
7
7
  export default function TextWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
8
- props: WidgetProps<T, S, F>
8
+ props: WidgetProps<T, S, F>,
9
9
  ) {
10
10
  const { options, registry } = props;
11
11
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -20,17 +20,17 @@ function TextareaWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F exte
20
20
  }: WidgetProps<T, S, F>) {
21
21
  const handleChange = useCallback(
22
22
  ({ target: { value } }: ChangeEvent<HTMLTextAreaElement>) => onChange(value === '' ? options.emptyValue : value),
23
- [onChange, options.emptyValue]
23
+ [onChange, options.emptyValue],
24
24
  );
25
25
 
26
26
  const handleBlur = useCallback(
27
27
  ({ target }: FocusEvent<HTMLTextAreaElement>) => onBlur(id, target && target.value),
28
- [onBlur, id]
28
+ [onBlur, id],
29
29
  );
30
30
 
31
31
  const handleFocus = useCallback(
32
32
  ({ target }: FocusEvent<HTMLTextAreaElement>) => onFocus(id, target && target.value),
33
- [id, onFocus]
33
+ [id, onFocus],
34
34
  );
35
35
 
36
36
  return (
@@ -7,7 +7,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
7
7
  * @param props - The `WidgetProps` for this component
8
8
  */
9
9
  export default function TimeWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
10
- props: WidgetProps<T, S, F>
10
+ props: WidgetProps<T, S, F>,
11
11
  ) {
12
12
  const { onChange, options, registry } = props;
13
13
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -5,7 +5,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
5
5
  * @param props - The `WidgetProps` for this component
6
6
  */
7
7
  export default function URLWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
8
- props: WidgetProps<T, S, F>
8
+ props: WidgetProps<T, S, F>,
9
9
  ) {
10
10
  const { options, registry } = props;
11
11
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -5,7 +5,7 @@ import { getTemplate, FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps
5
5
  * @param props - The `WidgetProps` for this component
6
6
  */
7
7
  export default function UpDownWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
8
- props: WidgetProps<T, S, F>
8
+ props: WidgetProps<T, S, F>,
9
9
  ) {
10
10
  const { options, registry } = props;
11
11
  const BaseInputTemplate = getTemplate<'BaseInputTemplate', T, S, F>('BaseInputTemplate', registry, options);
@@ -13,6 +13,7 @@ import HiddenWidget from './HiddenWidget';
13
13
  import PasswordWidget from './PasswordWidget';
14
14
  import RadioWidget from './RadioWidget';
15
15
  import RangeWidget from './RangeWidget';
16
+ import RatingWidget from './RatingWidget';
16
17
  import SelectWidget from './SelectWidget';
17
18
  import TextareaWidget from './TextareaWidget';
18
19
  import TextWidget from './TextWidget';
@@ -23,7 +24,7 @@ import UpDownWidget from './UpDownWidget';
23
24
  function widgets<
24
25
  T = any,
25
26
  S extends StrictRJSFSchema = RJSFSchema,
26
- F extends FormContextType = any
27
+ F extends FormContextType = any,
27
28
  >(): RegistryWidgetsType<T, S, F> {
28
29
  return {
29
30
  AltDateWidget,
@@ -39,6 +40,7 @@ function widgets<
39
40
  PasswordWidget,
40
41
  RadioWidget,
41
42
  RangeWidget,
43
+ RatingWidget,
42
44
  SelectWidget,
43
45
  TextWidget,
44
46
  TextareaWidget,
@@ -11,7 +11,7 @@ import widgets from './components/widgets';
11
11
  export default function getDefaultRegistry<
12
12
  T = any,
13
13
  S extends StrictRJSFSchema = RJSFSchema,
14
- F extends FormContextType = any
14
+ F extends FormContextType = any,
15
15
  >(): Omit<Registry<T, S, F>, 'schemaUtils'> {
16
16
  return {
17
17
  fields: fields<T, S, F>(),
package/src/index.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import Form, { FormProps, FormState, IChangeEvent } from './components/Form';
2
+ import RichDescription, { RichDescriptionProps } from './components/RichDescription';
2
3
  import withTheme, { ThemeProps } from './withTheme';
3
4
  import getDefaultRegistry from './getDefaultRegistry';
4
5
 
5
- export type { FormProps, FormState, IChangeEvent, ThemeProps };
6
+ export type { FormProps, FormState, IChangeEvent, ThemeProps, RichDescriptionProps };
6
7
 
7
- export { withTheme, getDefaultRegistry };
8
+ export { withTheme, getDefaultRegistry, RichDescription };
8
9
  export default Form;
package/src/tsconfig.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../../tsconfig.base.json",
2
+ "extends": "../../../tsconfig.build.json",
3
3
  "include": [
4
4
  "./"
5
5
  ],
@@ -7,17 +7,25 @@
7
7
  "rootDir": "./",
8
8
  "outDir": "../lib",
9
9
  "baseUrl": "../",
10
- "jsx": "react-jsx"
10
+ "jsx": "react-jsx",
11
+ "composite": true
11
12
  },
12
13
  "references": [
13
14
  {
14
15
  "path": "../../utils"
15
16
  },
16
- {
17
- "path": "../../validator-ajv6"
18
- },
19
17
  {
20
18
  "path": "../../validator-ajv8"
21
19
  }
22
- ]
20
+ ],
21
+ "tsc-alias": {
22
+ "resolveFullPaths": true,
23
+ "verbose": true,
24
+ "replacers": {
25
+ "lodash": {
26
+ "enabled": true,
27
+ "file": "lodashReplacer.js"
28
+ }
29
+ }
30
+ }
23
31
  }
package/src/withTheme.tsx CHANGED
@@ -12,9 +12,10 @@ export type ThemeProps<T = any, S extends StrictRJSFSchema = RJSFSchema, F exten
12
12
 
13
13
  /** A Higher-Order component that creates a wrapper around a `Form` with the overrides from the `WithThemeProps` */
14
14
  export default function withTheme<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
15
- themeProps: ThemeProps<T, S, F>
15
+ themeProps: ThemeProps<T, S, F>,
16
16
  ): ComponentType<FormProps<T, S, F>> {
17
- return forwardRef(
17
+ // @ts-expect-error TS2322 because the latest types complain about LegacyRef's string form not working with Form
18
+ return forwardRef<Form<T, S, F>, FormProps<T, S, F>>(
18
19
  ({ fields, widgets, templates, ...directProps }: FormProps<T, S, F>, ref: ForwardedRef<Form<T, S, F>>) => {
19
20
  fields = { ...themeProps?.fields, ...fields };
20
21
  widgets = { ...themeProps?.widgets, ...widgets };
@@ -37,6 +38,6 @@ export default function withTheme<T = any, S extends StrictRJSFSchema = RJSFSche
37
38
  ref={ref}
38
39
  />
39
40
  );
40
- }
41
+ },
41
42
  );
42
43
  }