@webiny/app-admin 0.0.0-unstable.9f53ea597d → 0.0.0-unstable.a4f3e4ea8b

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 (100) hide show
  1. package/base/Admin.js +5 -0
  2. package/base/Admin.js.map +1 -1
  3. package/base/Base/DefaultFieldRenderers.js +4 -0
  4. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  5. package/base/Base/FieldRenderers/AutoCompleteRenderer.d.ts +13 -0
  6. package/base/Base/FieldRenderers/AutoCompleteRenderer.js +29 -0
  7. package/base/Base/FieldRenderers/AutoCompleteRenderer.js.map +1 -0
  8. package/base/Base/FieldRenderers/LexicalRenderer.js +10 -6
  9. package/base/Base/FieldRenderers/LexicalRenderer.js.map +1 -1
  10. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +20 -3
  11. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -1
  12. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +11 -2
  13. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -1
  14. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +2 -1
  15. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
  16. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +11 -2
  17. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
  18. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +17 -2
  19. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
  20. package/base/Base/FieldRenderers/RadioButtonsRenderer.js +3 -2
  21. package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -1
  22. package/base/Base/FieldRenderers/SelectRenderer.js +3 -2
  23. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  24. package/components/Drawers/DrawerParamsContext.d.ts +6 -0
  25. package/components/Drawers/DrawerParamsContext.js +10 -0
  26. package/components/Drawers/DrawerParamsContext.js.map +1 -0
  27. package/components/Drawers/DrawersContext.d.ts +13 -0
  28. package/components/Drawers/DrawersContext.js +50 -0
  29. package/components/Drawers/DrawersContext.js.map +1 -0
  30. package/components/Drawers/useDrawers.d.ts +2 -0
  31. package/components/Drawers/useDrawers.js +10 -0
  32. package/components/Drawers/useDrawers.js.map +1 -0
  33. package/components/LexicalEditor/LexicalLinkForm.js +3 -0
  34. package/components/LexicalEditor/LexicalLinkForm.js.map +1 -1
  35. package/components/Wcp.d.ts +0 -2
  36. package/components/Wcp.js +1 -6
  37. package/components/Wcp.js.map +1 -1
  38. package/config/AdminConfig/Drawer.d.ts +10 -0
  39. package/config/AdminConfig/Drawer.js +19 -0
  40. package/config/AdminConfig/Drawer.js.map +1 -0
  41. package/config/AdminConfig.d.ts +4 -0
  42. package/config/AdminConfig.js +3 -0
  43. package/config/AdminConfig.js.map +1 -1
  44. package/features/dateFormatter/DefaultDateFormatter.d.ts +8 -0
  45. package/features/dateFormatter/DefaultDateFormatter.js +25 -0
  46. package/features/dateFormatter/DefaultDateFormatter.js.map +1 -0
  47. package/features/dateFormatter/abstractions.d.ts +13 -0
  48. package/features/dateFormatter/abstractions.js +5 -0
  49. package/features/dateFormatter/abstractions.js.map +1 -0
  50. package/features/dateFormatter/feature.d.ts +3 -0
  51. package/features/dateFormatter/feature.js +17 -0
  52. package/features/dateFormatter/feature.js.map +1 -0
  53. package/features/dateFormatter/formatUtcOffset.d.ts +1 -0
  54. package/features/dateFormatter/formatUtcOffset.js +11 -0
  55. package/features/dateFormatter/formatUtcOffset.js.map +1 -0
  56. package/features/dateFormatter/index.d.ts +4 -0
  57. package/features/dateFormatter/index.js +4 -0
  58. package/features/dateFormatter/useDateFormatter.d.ts +5 -0
  59. package/features/dateFormatter/useDateFormatter.js +8 -0
  60. package/features/dateFormatter/useDateFormatter.js.map +1 -0
  61. package/features/formModel/Field.d.ts +1 -0
  62. package/features/formModel/Field.js +17 -0
  63. package/features/formModel/Field.js.map +1 -1
  64. package/features/formModel/FocusManager.js +10 -3
  65. package/features/formModel/FocusManager.js.map +1 -1
  66. package/features/formModel/FormModel.js +7 -9
  67. package/features/formModel/FormModel.js.map +1 -1
  68. package/features/formModel/FormModel.test.js +244 -0
  69. package/features/formModel/FormModel.test.js.map +1 -1
  70. package/features/formModel/ObjectField.d.ts +1 -0
  71. package/features/formModel/ObjectField.js +25 -0
  72. package/features/formModel/ObjectField.js.map +1 -1
  73. package/features/formModel/abstractions.d.ts +2 -0
  74. package/features/formModel/abstractions.js.map +1 -1
  75. package/features/formModel/createFieldRenderer.d.ts +42 -0
  76. package/features/formModel/createFieldRenderer.js +34 -10
  77. package/features/formModel/createFieldRenderer.js.map +1 -1
  78. package/features/formModel/hasSubtreeFocusRequest.d.ts +12 -0
  79. package/features/formModel/hasSubtreeFocusRequest.js +15 -0
  80. package/features/formModel/hasSubtreeFocusRequest.js.map +1 -0
  81. package/features/formModel/index.d.ts +1 -0
  82. package/features/formModel/index.js +1 -0
  83. package/features/formModel/renderers.d.ts +1 -0
  84. package/features/formModel/renderers.js +1 -0
  85. package/features/wcp/ReactLicense.d.ts +0 -1
  86. package/features/wcp/ReactLicense.js +0 -3
  87. package/features/wcp/ReactLicense.js.map +1 -1
  88. package/features/wcp/WcpGateway.js +0 -3
  89. package/features/wcp/WcpGateway.js.map +1 -1
  90. package/hooks/index.d.ts +3 -0
  91. package/hooks/index.js +3 -0
  92. package/hooks/useDrawer.d.ts +9 -0
  93. package/hooks/useDrawer.js +19 -0
  94. package/hooks/useDrawer.js.map +1 -0
  95. package/hooks/useOpenDrawer.d.ts +7 -0
  96. package/hooks/useOpenDrawer.js +18 -0
  97. package/hooks/useOpenDrawer.js.map +1 -0
  98. package/index.d.ts +5 -0
  99. package/index.js +12 -8
  100. package/package.json +19 -19
@@ -177,6 +177,63 @@ describe("FormModel", ()=>{
177
177
  expect(valid).toBe(false);
178
178
  expect(form.errors[0].message).toBe("Email is required");
179
179
  });
180
+ it("should skip zod validation for non-required field with null value", async ()=>{
181
+ const form = createForm({
182
+ fields: (fields)=>({
183
+ description: fields.text().label("Description").schema(z.string())
184
+ })
185
+ });
186
+ const valid = await form.validate();
187
+ expect(valid).toBe(true);
188
+ expect(form.errors).toHaveLength(0);
189
+ expect(form.field("description").vm.validation.isValid).toBeNull();
190
+ });
191
+ it("should skip zod validation for non-required field with undefined value", async ()=>{
192
+ const form = createForm({
193
+ fields: (fields)=>({
194
+ description: fields.text().label("Description").schema(z.string())
195
+ })
196
+ });
197
+ form.field("description").setValue(void 0);
198
+ const valid = await form.validate();
199
+ expect(valid).toBe(true);
200
+ expect(form.errors).toHaveLength(0);
201
+ expect(form.field("description").vm.validation.isValid).toBeNull();
202
+ });
203
+ it("should run zod validation for non-required field with empty string value", async ()=>{
204
+ const form = createForm({
205
+ fields: (fields)=>({
206
+ description: fields.text().label("Description").schema(z.string().min(3, "Too short"))
207
+ })
208
+ });
209
+ form.field("description").setValue("");
210
+ const valid = await form.validate();
211
+ expect(valid).toBe(false);
212
+ expect(form.field("description").vm.validation.isValid).toBe(false);
213
+ expect(form.field("description").vm.validation.message).toBe("Too short");
214
+ });
215
+ it("should fail required validation for required field with null value even when schema is set", async ()=>{
216
+ const form = createForm({
217
+ fields: (fields)=>({
218
+ description: fields.text().label("Description").required("Description is required").schema(z.string().min(3, "Too short"))
219
+ })
220
+ });
221
+ const valid = await form.validate();
222
+ expect(valid).toBe(false);
223
+ expect(form.field("description").vm.validation.isValid).toBe(false);
224
+ expect(form.field("description").vm.validation.message).toBe("Description is required");
225
+ });
226
+ it("should run and pass zod validation for non-required field with valid value", async ()=>{
227
+ const form = createForm({
228
+ fields: (fields)=>({
229
+ description: fields.text().label("Description").schema(z.string().min(3, "Too short"))
230
+ })
231
+ });
232
+ form.field("description").setValue("Hello world");
233
+ const valid = await form.validate();
234
+ expect(valid).toBe(true);
235
+ expect(form.field("description").vm.validation.isValid).toBe(true);
236
+ });
180
237
  it("should expose field-level validation in field.vm", async ()=>{
181
238
  const form = createBasicForm();
182
239
  await form.validate();
@@ -184,6 +241,23 @@ describe("FormModel", ()=>{
184
241
  expect(titleVm.validation.isValid).toBe(false);
185
242
  expect(titleVm.validation.message).toBe("Title is required");
186
243
  });
244
+ it("setValidationWithCache should populate the validation cache", async ()=>{
245
+ const schema = z.string().min(3, "Too short");
246
+ const spy = vi.spyOn(schema, "safeParseAsync");
247
+ const form = createForm({
248
+ fields: (fields)=>({
249
+ description: fields.text().label("Description").schema(schema)
250
+ })
251
+ });
252
+ const valid1 = await form.validate();
253
+ expect(valid1).toBe(true);
254
+ expect(spy).not.toHaveBeenCalled();
255
+ const valid2 = await form.validate();
256
+ expect(valid2).toBe(true);
257
+ expect(spy).not.toHaveBeenCalled();
258
+ expect(form.field("description").vm.validation.isValid).toBeNull();
259
+ spy.mockRestore();
260
+ });
187
261
  it("isValid should be null before first validation", ()=>{
188
262
  const form = createBasicForm();
189
263
  expect(form.isValid).toBeNull();
@@ -1316,6 +1390,108 @@ describe("FormModel", ()=>{
1316
1390
  }
1317
1391
  });
1318
1392
  });
1393
+ it("should skip schema validation for non-required object field with null underlying data", async ()=>{
1394
+ const form = createForm({
1395
+ fields: (fields)=>({
1396
+ address: fields.object().label("Address").fields((f)=>({
1397
+ street: f.text().label("Street")
1398
+ })).schema(z.object({
1399
+ street: z.string().min(1)
1400
+ }))
1401
+ })
1402
+ });
1403
+ form.setData({
1404
+ address: null
1405
+ });
1406
+ const valid = await form.validate();
1407
+ expect(valid).toBe(true);
1408
+ expect(form.errors).toHaveLength(0);
1409
+ });
1410
+ it("should skip schema validation for non-required object field with undefined underlying data", async ()=>{
1411
+ const form = createForm({
1412
+ fields: (fields)=>({
1413
+ address: fields.object().label("Address").fields((f)=>({
1414
+ street: f.text().label("Street")
1415
+ })).schema(z.object({
1416
+ street: z.string().min(1)
1417
+ }))
1418
+ })
1419
+ });
1420
+ form.setData({
1421
+ address: void 0
1422
+ });
1423
+ const valid = await form.validate();
1424
+ expect(valid).toBe(true);
1425
+ expect(form.errors).toHaveLength(0);
1426
+ });
1427
+ it("should run schema validation for non-required object field with populated values", async ()=>{
1428
+ const form = createForm({
1429
+ fields: (fields)=>({
1430
+ address: fields.object().label("Address").fields((f)=>({
1431
+ street: f.text().label("Street")
1432
+ })).schema(z.object({
1433
+ street: z.string().min(5, "Street too short")
1434
+ }))
1435
+ })
1436
+ });
1437
+ form.field("address.street").setValue("Hi");
1438
+ const valid = await form.validate();
1439
+ expect(valid).toBe(false);
1440
+ expect(form.errors).toHaveLength(1);
1441
+ expect(form.errors[0].message).toBe("Street too short");
1442
+ });
1443
+ it("should run schema validation for required object field with populated but invalid values", async ()=>{
1444
+ const form = createForm({
1445
+ fields: (fields)=>({
1446
+ address: fields.object().label("Address").fields((f)=>({
1447
+ street: f.text().label("Street")
1448
+ })).required("Address is required").schema(z.object({
1449
+ street: z.string().min(5, "Street too short")
1450
+ }))
1451
+ })
1452
+ });
1453
+ form.field("address.street").setValue("Hi");
1454
+ const valid = await form.validate();
1455
+ expect(valid).toBe(false);
1456
+ expect(form.errors).toHaveLength(1);
1457
+ expect(form.errors[0].message).toBe("Street too short");
1458
+ });
1459
+ it("should fail required validation for required object field with null data even when schema is set", async ()=>{
1460
+ const form = createForm({
1461
+ fields: (fields)=>({
1462
+ address: fields.object().label("Address").fields((f)=>({
1463
+ street: f.text().label("Street")
1464
+ })).required("Address is required").schema(z.object({
1465
+ street: z.string().min(1)
1466
+ }))
1467
+ })
1468
+ });
1469
+ form.setData({
1470
+ address: null
1471
+ });
1472
+ const valid = await form.validate();
1473
+ expect(valid).toBe(false);
1474
+ expect(form.errors).toHaveLength(1);
1475
+ expect(form.errors[0].message).toBe("Address is required");
1476
+ });
1477
+ it("should skip schema validation for non-required object field when all child values are empty", async ()=>{
1478
+ const form = createForm({
1479
+ fields: (fields)=>({
1480
+ address: fields.object().label("Address").fields((f)=>({
1481
+ street: f.text().label("Street"),
1482
+ city: f.text().label("City")
1483
+ })).schema(z.object({
1484
+ street: z.string().min(1),
1485
+ city: z.string().min(1)
1486
+ }))
1487
+ })
1488
+ });
1489
+ form.field("address.street").setValue("");
1490
+ form.field("address.city").setValue("");
1491
+ const valid = await form.validate();
1492
+ expect(valid).toBe(true);
1493
+ expect(form.errors).toHaveLength(0);
1494
+ });
1319
1495
  });
1320
1496
  describe("list object field", ()=>{
1321
1497
  function createFormWithList() {
@@ -1503,6 +1679,74 @@ describe("FormModel", ()=>{
1503
1679
  expect(valid).toBe(false);
1504
1680
  expect(form.errors[0].message).toBe("At least 2 presets are required");
1505
1681
  });
1682
+ it("should skip listSchema validation for non-required list field with empty list", async ()=>{
1683
+ const form = createForm({
1684
+ fields: (fields)=>({
1685
+ presets: fields.object().label("Presets").fields((f)=>({
1686
+ name: f.text().label("Name")
1687
+ })).list().listSchema(z.array(z.any()).min(2, "At least 2 presets are required"))
1688
+ })
1689
+ });
1690
+ const valid = await form.validate();
1691
+ expect(valid).toBe(true);
1692
+ expect(form.errors).toHaveLength(0);
1693
+ });
1694
+ it("should skip listSchema validation for non-required list field with undefined value", async ()=>{
1695
+ const form = createForm({
1696
+ fields: (fields)=>({
1697
+ presets: fields.object().label("Presets").fields((f)=>({
1698
+ name: f.text().label("Name")
1699
+ })).list().listSchema(z.array(z.any()).min(2, "At least 2 presets are required"))
1700
+ })
1701
+ });
1702
+ form.setData({
1703
+ presets: void 0
1704
+ });
1705
+ const valid = await form.validate();
1706
+ expect(valid).toBe(true);
1707
+ expect(form.errors).toHaveLength(0);
1708
+ });
1709
+ it("should skip listSchema validation for non-required list field with null value", async ()=>{
1710
+ const form = createForm({
1711
+ fields: (fields)=>({
1712
+ presets: fields.object().label("Presets").fields((f)=>({
1713
+ name: f.text().label("Name")
1714
+ })).list().listSchema(z.array(z.any()).min(2, "At least 2 presets are required"))
1715
+ })
1716
+ });
1717
+ form.setData({
1718
+ presets: null
1719
+ });
1720
+ const valid = await form.validate();
1721
+ expect(valid).toBe(true);
1722
+ expect(form.errors).toHaveLength(0);
1723
+ });
1724
+ it("should enforce listSchema validation for required list field with null value", async ()=>{
1725
+ const form = createForm({
1726
+ fields: (fields)=>({
1727
+ presets: fields.object().label("Presets").fields((f)=>({
1728
+ name: f.text().label("Name")
1729
+ })).list().required("Presets are required").listSchema(z.array(z.any()).min(2, "At least 2 presets are required"))
1730
+ })
1731
+ });
1732
+ form.setData({
1733
+ presets: null
1734
+ });
1735
+ const valid = await form.validate();
1736
+ expect(valid).toBe(false);
1737
+ expect(form.errors[0].message).toBe("Presets are required");
1738
+ });
1739
+ it("should enforce listSchema validation for required list field with empty list", async ()=>{
1740
+ const form = createForm({
1741
+ fields: (fields)=>({
1742
+ presets: fields.object().label("Presets").fields((f)=>({
1743
+ name: f.text().label("Name")
1744
+ })).list().required("Presets are required").listSchema(z.array(z.any()).min(2, "At least 2 presets are required"))
1745
+ })
1746
+ });
1747
+ const valid = await form.validate();
1748
+ expect(valid).toBe(false);
1749
+ });
1506
1750
  it("should be dirty after adding an item", ()=>{
1507
1751
  const form = createFormWithList();
1508
1752
  form.setData({