@webiny/app-admin 6.5.0-beta.3 → 6.5.0-beta.5

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/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +2 -2
  2. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.d.ts +2 -2
  3. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +1 -1
  4. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -1
  5. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +8 -4
  6. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +2 -2
  7. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +1 -1
  8. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
  9. package/base/Base/FieldRenderers/ObjectRenderer/{TemplatePicker.d.ts → TemplatePicker/AddTemplateButton.d.ts} +1 -1
  10. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js +24 -0
  11. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js.map +1 -0
  12. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.d.ts +13 -0
  13. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js +21 -0
  14. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js.map +1 -0
  15. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.d.ts +3 -0
  16. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js +35 -0
  17. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js.map +1 -0
  18. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.d.ts +8 -0
  19. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js +22 -0
  20. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js.map +1 -0
  21. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.d.ts +10 -0
  22. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js +46 -0
  23. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js.map +1 -0
  24. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.d.ts +8 -0
  25. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js +16 -0
  26. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js.map +1 -0
  27. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.d.ts +10 -0
  28. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js +22 -0
  29. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js.map +1 -0
  30. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.d.ts +3 -0
  31. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js +35 -0
  32. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js.map +1 -0
  33. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.d.ts +1 -0
  34. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.js +1 -0
  35. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.d.ts +6 -0
  36. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.js +0 -0
  37. package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +2 -2
  38. package/components/IconPicker/IconPickerComponent.d.ts +2 -2
  39. package/components/IconPicker/IconPickerComponent.js +1 -1
  40. package/components/IconPicker/IconPickerComponent.js.map +1 -1
  41. package/components/ListView/ListViewBulkActions.d.ts +2 -2
  42. package/components/ListView/ListViewContent.d.ts +2 -2
  43. package/components/ListView/ListViewFilters.d.ts +2 -2
  44. package/components/ListView/index.d.ts +6 -6
  45. package/components/RolesMultiAutocomplete/index.js +1 -1
  46. package/components/RolesMultiAutocomplete/index.js.map +1 -1
  47. package/components/Table/components/Table/TableInner.d.ts +2 -2
  48. package/components/TeamsMultiAutocomplete/index.js +1 -1
  49. package/components/TeamsMultiAutocomplete/index.js.map +1 -1
  50. package/domain/Identity.js +1 -1
  51. package/domain/Identity.js.map +1 -1
  52. package/features/debugger/Debugger.d.ts +2 -2
  53. package/features/debugger/DebuggerIndicator.d.ts +2 -2
  54. package/features/debugger/DebuggerView.d.ts +2 -2
  55. package/features/formModel/Field.d.ts +7 -1
  56. package/features/formModel/Field.js +13 -5
  57. package/features/formModel/Field.js.map +1 -1
  58. package/features/formModel/FieldBuilder.test.js +12 -0
  59. package/features/formModel/FieldBuilder.test.js.map +1 -1
  60. package/features/formModel/FormErrors.d.ts +2 -2
  61. package/features/formModel/FormErrors.js +1 -1
  62. package/features/formModel/FormErrors.js.map +1 -1
  63. package/features/formModel/FormModel.d.ts +1 -0
  64. package/features/formModel/FormModel.js +17 -0
  65. package/features/formModel/FormModel.js.map +1 -1
  66. package/features/formModel/FormModel.test.js +342 -2
  67. package/features/formModel/FormModel.test.js.map +1 -1
  68. package/features/formModel/FormView.d.ts +8 -4
  69. package/features/formModel/ObjectField.d.ts +9 -1
  70. package/features/formModel/ObjectField.js +27 -17
  71. package/features/formModel/ObjectField.js.map +1 -1
  72. package/features/formModel/PresenterErrors.d.ts +2 -2
  73. package/features/formModel/abstractions.d.ts +17 -1
  74. package/features/formModel/abstractions.js.map +1 -1
  75. package/features/formModel/demo/FormModelDemo.d.ts +2 -2
  76. package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +2 -0
  77. package/features/formModel/fieldTypes/DateTimeFieldType.js +14 -11
  78. package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -1
  79. package/features/formModel/fieldTypes/ObjectFieldType.js +6 -0
  80. package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -1
  81. package/features/notifications/NotificationsRenderer.d.ts +2 -2
  82. package/hooks/useSnackbar.js.map +1 -1
  83. package/package.json +34 -34
  84. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js +1 -2
  85. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js.map +1 -1
  86. package/presentation/accessManagement/apiKeys/components/ApiKeysView.d.ts +2 -2
  87. package/presentation/accessManagement/roles/RolesPresenter.js +1 -2
  88. package/presentation/accessManagement/roles/RolesPresenter.js.map +1 -1
  89. package/presentation/accessManagement/roles/components/RolesView.d.ts +2 -2
  90. package/presentation/accessManagement/teams/TeamsPresenter.js +1 -2
  91. package/presentation/accessManagement/teams/TeamsPresenter.js.map +1 -1
  92. package/presentation/accessManagement/teams/components/TeamsView.d.ts +2 -2
  93. package/presentation/installation/components/SystemInstaller/SystemInstaller.d.ts +2 -2
  94. package/presentation/listPresenter/QueryMatcher.js +3 -3
  95. package/presentation/listPresenter/QueryMatcher.js.map +1 -1
  96. package/presentation/trashBin/components/BulkActions/DeleteItems.d.ts +2 -2
  97. package/presentation/trashBin/components/BulkActions/RestoreItems.d.ts +2 -2
  98. package/presentation/trashBin/components/TrashBinOverlay.d.ts +2 -2
  99. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +0 -68
  100. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +0 -1
@@ -1834,7 +1834,7 @@ describe("FormModel", ()=>{
1834
1834
  return createForm({
1835
1835
  fields: (fields)=>({
1836
1836
  content: fields.object().label("Content").template("hero", (t)=>{
1837
- t.label("Hero Banner").fields((f)=>({
1837
+ t.label("Hero Banner").description("Large heading with an image").fields((f)=>({
1838
1838
  heading: f.text().label("Heading").required("Required"),
1839
1839
  image: f.text().label("Image")
1840
1840
  }));
@@ -1861,7 +1861,8 @@ describe("FormModel", ()=>{
1861
1861
  expect(vm.availableTemplates).toEqual([
1862
1862
  {
1863
1863
  id: "hero",
1864
- label: "Hero Banner"
1864
+ label: "Hero Banner",
1865
+ description: "Large heading with an image"
1865
1866
  },
1866
1867
  {
1867
1868
  id: "text",
@@ -4349,6 +4350,345 @@ describe("FormModel", ()=>{
4349
4350
  expect(form.field("wrapper.editable").disabled).toBe(false);
4350
4351
  });
4351
4352
  });
4353
+ describe("$. static references in rules inside list items", ()=>{
4354
+ const hideWhen = (target, operator, value)=>[
4355
+ {
4356
+ type: "condition",
4357
+ target,
4358
+ operator,
4359
+ value,
4360
+ action: "hide"
4361
+ }
4362
+ ];
4363
+ const itemChild = (form, listPath, index, name)=>{
4364
+ const list = form.field(listPath);
4365
+ const child = list.items[index]?.children.get(name);
4366
+ if (!child) throw new Error(`No child "${name}" on item ${index} of "${listPath}".`);
4367
+ return child;
4368
+ };
4369
+ it("resolves $. against the owning item of an object list", ()=>{
4370
+ const form = createForm({
4371
+ fields: (fields)=>({
4372
+ links: fields.object().list().renderer("passthrough").fields((f)=>({
4373
+ style: f.text(),
4374
+ url: f.text().rules(hideWhen("$.style", "==", "initiative")),
4375
+ customUrls: f.text().rules(hideWhen("$.style", "!=", "initiative"))
4376
+ }))
4377
+ })
4378
+ });
4379
+ form.setData({
4380
+ links: [
4381
+ {
4382
+ style: "initiative"
4383
+ },
4384
+ {
4385
+ style: "standard"
4386
+ }
4387
+ ]
4388
+ });
4389
+ expect(itemChild(form, "links", 0, "url").visible).toBe(false);
4390
+ expect(itemChild(form, "links", 0, "customUrls").visible).toBe(true);
4391
+ expect(itemChild(form, "links", 1, "url").visible).toBe(true);
4392
+ expect(itemChild(form, "links", 1, "customUrls").visible).toBe(false);
4393
+ itemChild(form, "links", 1, "style").setValue("initiative");
4394
+ expect(itemChild(form, "links", 1, "url").visible).toBe(false);
4395
+ expect(itemChild(form, "links", 1, "customUrls").visible).toBe(true);
4396
+ });
4397
+ it("resolves $. for items added with addItem()", ()=>{
4398
+ const form = createForm({
4399
+ fields: (fields)=>({
4400
+ links: fields.object().list().renderer("passthrough").fields((f)=>({
4401
+ locked: f.boolean(),
4402
+ label: f.text().rules([
4403
+ {
4404
+ type: "condition",
4405
+ target: "$.locked",
4406
+ operator: "==",
4407
+ value: true,
4408
+ action: "disable"
4409
+ }
4410
+ ])
4411
+ }))
4412
+ })
4413
+ });
4414
+ form.field("links").addItem();
4415
+ expect(itemChild(form, "links", 0, "label").disabled).toBe(false);
4416
+ itemChild(form, "links", 0, "locked").setValue(true);
4417
+ expect(itemChild(form, "links", 0, "label").disabled).toBe(true);
4418
+ });
4419
+ it("keeps resolving against the owning item after reorder and removal", ()=>{
4420
+ const form = createForm({
4421
+ fields: (fields)=>({
4422
+ links: fields.object().list().renderer("passthrough").fields((f)=>({
4423
+ style: f.text(),
4424
+ url: f.text().rules(hideWhen("$.style", "==", "initiative"))
4425
+ }))
4426
+ })
4427
+ });
4428
+ form.setData({
4429
+ links: [
4430
+ {
4431
+ style: "initiative"
4432
+ },
4433
+ {
4434
+ style: "standard"
4435
+ }
4436
+ ]
4437
+ });
4438
+ const list = form.field("links");
4439
+ const firstUrl = itemChild(form, "links", 0, "url");
4440
+ const secondUrl = itemChild(form, "links", 1, "url");
4441
+ list.moveItem(0, 1);
4442
+ expect(firstUrl.visible).toBe(false);
4443
+ expect(secondUrl.visible).toBe(true);
4444
+ list.removeItem(0);
4445
+ expect(firstUrl.visible).toBe(false);
4446
+ });
4447
+ it("field.parent() resolves siblings of the owning item in callbacks", ()=>{
4448
+ const form = createForm({
4449
+ fields: (fields)=>({
4450
+ links: fields.object().list().renderer("passthrough").fields((f)=>({
4451
+ style: f.text(),
4452
+ url: f.text().hiddenWhen(({ field })=>"initiative" === field.parent().field("style").getValue())
4453
+ }))
4454
+ })
4455
+ });
4456
+ form.setData({
4457
+ links: [
4458
+ {
4459
+ style: "initiative"
4460
+ },
4461
+ {
4462
+ style: "standard"
4463
+ }
4464
+ ]
4465
+ });
4466
+ expect(itemChild(form, "links", 0, "url").visible).toBe(false);
4467
+ expect(itemChild(form, "links", 1, "url").visible).toBe(true);
4468
+ });
4469
+ describe("dynamic zone shaped templated list", ()=>{
4470
+ const createBlocksForm = ()=>createForm({
4471
+ fields: (fields)=>({
4472
+ blocks: fields.object().list().renderer("passthrough").template("heroBlock", (t)=>{
4473
+ t.label("Hero").fields((f)=>({
4474
+ _id: f.text().hidden(),
4475
+ ctaStyle: f.text(),
4476
+ ctaUrl: f.text().rules(hideWhen("$.ctaStyle", "==", "initiative")),
4477
+ customUrls: f.text().rules(hideWhen("$.ctaStyle", "!=", "initiative"))
4478
+ }));
4479
+ }).template("richTextBlock", (t)=>{
4480
+ t.label("Rich Text").fields((f)=>({
4481
+ _id: f.text().hidden(),
4482
+ headerStyle: f.text().defaultValue("manual"),
4483
+ header: f.text().rules(hideWhen("$.headerStyle", "!=", "manual")),
4484
+ headingGroupRef: f.text().rules(hideWhen("$.headerStyle", "!=", "reference"))
4485
+ }));
4486
+ }).template("classesBlock", (t)=>{
4487
+ t.label("Classes").fields((f)=>({
4488
+ _id: f.text().hidden(),
4489
+ classes: f.object().list().renderer("passthrough").fields((c)=>({
4490
+ customCTA: c.boolean(),
4491
+ customCTALabel: c.text().rules(hideWhen("$.customCTA", "!=", true))
4492
+ }))
4493
+ }));
4494
+ })
4495
+ })
4496
+ });
4497
+ it("resolves $. against the owning template item", ()=>{
4498
+ const form = createBlocksForm();
4499
+ form.setData({
4500
+ blocks: [
4501
+ {
4502
+ _templateId: "heroBlock",
4503
+ _id: "hero1",
4504
+ ctaStyle: "initiative"
4505
+ },
4506
+ {
4507
+ _templateId: "heroBlock",
4508
+ _id: "hero2",
4509
+ ctaStyle: "standard"
4510
+ }
4511
+ ]
4512
+ });
4513
+ expect(itemChild(form, "blocks", 0, "ctaUrl").visible).toBe(false);
4514
+ expect(itemChild(form, "blocks", 0, "customUrls").visible).toBe(true);
4515
+ expect(itemChild(form, "blocks", 1, "ctaUrl").visible).toBe(true);
4516
+ expect(itemChild(form, "blocks", 1, "customUrls").visible).toBe(false);
4517
+ });
4518
+ it("re-evaluates when the referenced sibling changes", ()=>{
4519
+ const form = createBlocksForm();
4520
+ form.setData({
4521
+ blocks: [
4522
+ {
4523
+ _templateId: "richTextBlock",
4524
+ _id: "rt1",
4525
+ headerStyle: "manual"
4526
+ }
4527
+ ]
4528
+ });
4529
+ expect(itemChild(form, "blocks", 0, "header").visible).toBe(true);
4530
+ expect(itemChild(form, "blocks", 0, "headingGroupRef").visible).toBe(false);
4531
+ itemChild(form, "blocks", 0, "headerStyle").setValue("reference");
4532
+ expect(itemChild(form, "blocks", 0, "header").visible).toBe(false);
4533
+ expect(itemChild(form, "blocks", 0, "headingGroupRef").visible).toBe(true);
4534
+ });
4535
+ it("resolves $. inside an object list nested in a template item", ()=>{
4536
+ const form = createBlocksForm();
4537
+ form.setData({
4538
+ blocks: [
4539
+ {
4540
+ _templateId: "classesBlock",
4541
+ _id: "classes1",
4542
+ classes: [
4543
+ {
4544
+ customCTA: true
4545
+ },
4546
+ {
4547
+ customCTA: false
4548
+ }
4549
+ ]
4550
+ }
4551
+ ]
4552
+ });
4553
+ const classes = itemChild(form, "blocks", 0, "classes");
4554
+ const classItem = (index, name)=>classes.items[index].children.get(name);
4555
+ expect(classItem(0, "customCTALabel").visible).toBe(true);
4556
+ expect(classItem(1, "customCTALabel").visible).toBe(false);
4557
+ classItem(1, "customCTA").setValue(true);
4558
+ expect(classItem(1, "customCTALabel").visible).toBe(true);
4559
+ });
4560
+ });
4561
+ });
4562
+ describe("setErrors", ()=>{
4563
+ const createProductForm = ()=>createForm({
4564
+ fields: (fields)=>({
4565
+ sku: fields.text().label("SKU"),
4566
+ variants: fields.object().list().label("Variants").fields((f)=>({
4567
+ code: f.text().label("Code")
4568
+ }))
4569
+ })
4570
+ });
4571
+ it("assigns an error to the field at its path and lists it in form errors", ()=>{
4572
+ const form = createProductForm();
4573
+ form.setErrors([
4574
+ {
4575
+ path: "sku",
4576
+ message: "Value must be unique."
4577
+ }
4578
+ ]);
4579
+ expect(form.field("sku").vm.validation).toMatchObject({
4580
+ isValid: false,
4581
+ message: "Value must be unique."
4582
+ });
4583
+ expect(form.vm.hasErrors).toBe(true);
4584
+ expect(form.errors).toEqual([
4585
+ {
4586
+ path: "sku",
4587
+ label: "SKU",
4588
+ breadcrumb: [
4589
+ "SKU"
4590
+ ],
4591
+ message: "Value must be unique."
4592
+ }
4593
+ ]);
4594
+ });
4595
+ it("resolves paths into list items", ()=>{
4596
+ const form = createProductForm();
4597
+ form.setData({
4598
+ variants: [
4599
+ {
4600
+ code: "a"
4601
+ },
4602
+ {
4603
+ code: "b"
4604
+ }
4605
+ ]
4606
+ });
4607
+ form.setErrors([
4608
+ {
4609
+ path: "variants.1.code",
4610
+ message: "Invalid code."
4611
+ }
4612
+ ]);
4613
+ const list = form.field("variants");
4614
+ expect(list.items[1].children.get("code").vm.validation.isValid).toBe(false);
4615
+ expect(list.items[0].children.get("code").vm.validation.isValid).not.toBe(false);
4616
+ expect(form.errors).toEqual([
4617
+ expect.objectContaining({
4618
+ path: "variants.1.code",
4619
+ breadcrumb: [
4620
+ "Variants",
4621
+ "Code"
4622
+ ]
4623
+ })
4624
+ ]);
4625
+ });
4626
+ it("keeps errors without a matching field as form-level errors", ()=>{
4627
+ const form = createProductForm();
4628
+ form.setErrors([
4629
+ {
4630
+ path: "",
4631
+ message: "Could not update entry."
4632
+ },
4633
+ {
4634
+ path: "unknown.field",
4635
+ message: "Something is wrong."
4636
+ }
4637
+ ]);
4638
+ expect(form.errors).toEqual([
4639
+ {
4640
+ path: "",
4641
+ message: "Could not update entry."
4642
+ },
4643
+ {
4644
+ path: "unknown.field",
4645
+ message: "Something is wrong."
4646
+ }
4647
+ ]);
4648
+ expect(form.isValid).toBe(false);
4649
+ });
4650
+ it("bumps submitCount so FormErrors scrolls into view", ()=>{
4651
+ const form = createProductForm();
4652
+ const before = form.submitCount;
4653
+ form.setErrors([
4654
+ {
4655
+ path: "sku",
4656
+ message: "Value must be unique."
4657
+ }
4658
+ ]);
4659
+ expect(form.submitCount).toBe(before + 1);
4660
+ });
4661
+ it("is cleared by the next validate()", async ()=>{
4662
+ const form = createProductForm();
4663
+ form.setErrors([
4664
+ {
4665
+ path: "sku",
4666
+ message: "Value must be unique."
4667
+ },
4668
+ {
4669
+ path: "",
4670
+ message: "Could not update entry."
4671
+ }
4672
+ ]);
4673
+ await form.validate();
4674
+ expect(form.errors).toEqual([]);
4675
+ expect(form.field("sku").vm.validation.isValid).not.toBe(false);
4676
+ });
4677
+ it("is cleared by setData()", ()=>{
4678
+ const form = createProductForm();
4679
+ form.setErrors([
4680
+ {
4681
+ path: "",
4682
+ message: "Could not update entry."
4683
+ }
4684
+ ]);
4685
+ form.setData({
4686
+ sku: "ABC"
4687
+ });
4688
+ expect(form.errors).toEqual([]);
4689
+ expect(form.vm.hasErrors).toBe(false);
4690
+ });
4691
+ });
4352
4692
  });
4353
4693
 
4354
4694
  //# sourceMappingURL=FormModel.test.js.map