@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
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { Accordion } from \"@webiny/admin-ui\";\nimport { createObjectFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { NestedLayout } from \"./ObjectFieldComponents.js\";\nimport type { IObjectFieldVM } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n objectAccordionSingle: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n container?: boolean;\n itemTitle?: string | ((data: Record<string, unknown>) => string);\n itemDescription?: string | ((data: Record<string, unknown>) => string);\n };\n };\n }\n}\n\nfunction resolveTitle(\n field: IObjectFieldVM,\n itemTitle: string | ((data: Record<string, unknown>) => string) | undefined\n): string | undefined {\n if (!itemTitle) {\n return field.label;\n }\n\n if (typeof itemTitle === \"string\") {\n const child = field.fields.find(f => f.name === itemTitle);\n return (child ? String(child.value ?? \"\") : \"\") || field.label;\n }\n\n const data: Record<string, unknown> = {};\n for (const child of field.fields) {\n data[child.name] = child.value;\n }\n return itemTitle(data) || field.label;\n}\n\nfunction resolveDescription(\n field: IObjectFieldVM,\n itemDescription: string | ((data: Record<string, unknown>) => string) | undefined\n): string | undefined {\n if (!itemDescription) {\n return undefined;\n }\n\n if (typeof itemDescription === \"string\") {\n const child = field.fields.find(f => f.name === itemDescription);\n return (child ? String(child.value ?? \"\") : \"\") || undefined;\n }\n\n const data: Record<string, unknown> = {};\n for (const child of field.fields) {\n data[child.name] = child.value;\n }\n return itemDescription(data) || undefined;\n}\n\nexport const ObjectRenderer = createObjectFieldRenderer<\"objectAccordionSingle\">(({ field }) => {\n const settings = field.rendererSettings;\n\n if (settings?.container === false) {\n return <NestedLayout layout={field.layout} />;\n }\n\n return (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item\n title={resolveTitle(field, settings?.itemTitle)}\n description={resolveDescription(field, settings?.itemDescription)}\n defaultOpen={settings?.open ?? true}\n className={\"pl-sm\"}\n >\n <NestedLayout layout={field.layout} />\n </Accordion.Item>\n </Accordion>\n );\n});\n"],"names":["resolveTitle","field","itemTitle","child","f","String","data","resolveDescription","itemDescription","undefined","ObjectRenderer","createObjectFieldRenderer","settings","NestedLayout","Accordion"],"mappings":";;;;AAoBA,SAASA,aACLC,KAAqB,EACrBC,SAA2E;IAE3E,IAAI,CAACA,WACD,OAAOD,MAAM,KAAK;IAGtB,IAAI,AAAqB,YAArB,OAAOC,WAAwB;QAC/B,MAAMC,QAAQF,MAAM,MAAM,CAAC,IAAI,CAACG,CAAAA,IAAKA,EAAE,IAAI,KAAKF;QAChD,OAAQC,AAAAA,CAAAA,QAAQE,OAAOF,MAAM,KAAK,IAAI,MAAM,EAAC,KAAMF,MAAM,KAAK;IAClE;IAEA,MAAMK,OAAgC,CAAC;IACvC,KAAK,MAAMH,SAASF,MAAM,MAAM,CAC5BK,IAAI,CAACH,MAAM,IAAI,CAAC,GAAGA,MAAM,KAAK;IAElC,OAAOD,UAAUI,SAASL,MAAM,KAAK;AACzC;AAEA,SAASM,mBACLN,KAAqB,EACrBO,eAAiF;IAEjF,IAAI,CAACA,iBACD;IAGJ,IAAI,AAA2B,YAA3B,OAAOA,iBAA8B;QACrC,MAAML,QAAQF,MAAM,MAAM,CAAC,IAAI,CAACG,CAAAA,IAAKA,EAAE,IAAI,KAAKI;QAChD,OAAQL,AAAAA,CAAAA,QAAQE,OAAOF,MAAM,KAAK,IAAI,MAAM,EAAC,KAAMM;IACvD;IAEA,MAAMH,OAAgC,CAAC;IACvC,KAAK,MAAMH,SAASF,MAAM,MAAM,CAC5BK,IAAI,CAACH,MAAM,IAAI,CAAC,GAAGA,MAAM,KAAK;IAElC,OAAOK,gBAAgBF,SAASG;AACpC;AAEO,MAAMC,iBAAiBC,0BAAmD,CAAC,EAAEV,KAAK,EAAE;IACvF,MAAMW,WAAWX,MAAM,gBAAgB;IAEvC,IAAIW,UAAU,cAAc,OACxB,OAAO,WAAP,GAAO,oBAACC,cAAYA;QAAC,QAAQZ,MAAM,MAAM;;IAG7C,OAAO,WAAP,GACI,oBAACa,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QACX,OAAOd,aAAaC,OAAOW,UAAU;QACrC,aAAaL,mBAAmBN,OAAOW,UAAU;QACjD,aAAaA,UAAU,QAAQ;QAC/B,WAAW;qBAEX,oBAACC,cAAYA;QAAC,QAAQZ,MAAM,MAAM;;AAIlD"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { Accordion } from \"@webiny/admin-ui\";\nimport { createObjectFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { NestedLayout } from \"./ObjectFieldComponents.js\";\nimport type { IObjectFieldVM } from \"~/features/formModel/index.js\";\nimport { hasSubtreeFocusRequest } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n objectAccordionSingle: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n container?: boolean;\n itemTitle?: string | ((data: Record<string, unknown>) => string);\n itemDescription?: string | ((data: Record<string, unknown>) => string);\n };\n };\n }\n}\n\nfunction resolveTitle(\n field: IObjectFieldVM,\n itemTitle: string | ((data: Record<string, unknown>) => string) | undefined\n): string | undefined {\n if (!itemTitle) {\n return field.label;\n }\n\n if (typeof itemTitle === \"string\") {\n const child = field.fields.find(f => f.name === itemTitle);\n return (child ? String(child.value ?? \"\") : \"\") || field.label;\n }\n\n const data: Record<string, unknown> = {};\n for (const child of field.fields) {\n data[child.name] = child.value;\n }\n return itemTitle(data) || field.label;\n}\n\nfunction resolveDescription(\n field: IObjectFieldVM,\n itemDescription: string | ((data: Record<string, unknown>) => string) | undefined\n): string | undefined {\n if (!itemDescription) {\n return undefined;\n }\n\n if (typeof itemDescription === \"string\") {\n const child = field.fields.find(f => f.name === itemDescription);\n return (child ? String(child.value ?? \"\") : \"\") || undefined;\n }\n\n const data: Record<string, unknown> = {};\n for (const child of field.fields) {\n data[child.name] = child.value;\n }\n return itemDescription(data) || undefined;\n}\n\nexport const ObjectRenderer = createObjectFieldRenderer<\"objectAccordionSingle\">(({ field }) => {\n const settings = field.rendererSettings;\n\n if (settings?.container === false) {\n return <NestedLayout layout={field.layout} />;\n }\n\n // Force the object accordion open when a focus request lands anywhere in\n // its subtree, so \"jump to field\" can cascade through collapsed levels.\n const focusInside = hasSubtreeFocusRequest(field.fields);\n const [open, setOpen] = useState(settings?.open ?? true);\n useEffect(() => {\n if (focusInside) {\n setOpen(true);\n }\n }, [focusInside]);\n\n return (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item\n title={resolveTitle(field, settings?.itemTitle)}\n description={resolveDescription(field, settings?.itemDescription)}\n open={open}\n onOpenChange={setOpen}\n className={\"pl-sm\"}\n >\n <NestedLayout layout={field.layout} />\n </Accordion.Item>\n </Accordion>\n );\n});\n"],"names":["resolveTitle","field","itemTitle","child","f","String","data","resolveDescription","itemDescription","undefined","ObjectRenderer","createObjectFieldRenderer","settings","NestedLayout","focusInside","hasSubtreeFocusRequest","open","setOpen","useState","useEffect","Accordion"],"mappings":";;;;;AAqBA,SAASA,aACLC,KAAqB,EACrBC,SAA2E;IAE3E,IAAI,CAACA,WACD,OAAOD,MAAM,KAAK;IAGtB,IAAI,AAAqB,YAArB,OAAOC,WAAwB;QAC/B,MAAMC,QAAQF,MAAM,MAAM,CAAC,IAAI,CAACG,CAAAA,IAAKA,EAAE,IAAI,KAAKF;QAChD,OAAQC,AAAAA,CAAAA,QAAQE,OAAOF,MAAM,KAAK,IAAI,MAAM,EAAC,KAAMF,MAAM,KAAK;IAClE;IAEA,MAAMK,OAAgC,CAAC;IACvC,KAAK,MAAMH,SAASF,MAAM,MAAM,CAC5BK,IAAI,CAACH,MAAM,IAAI,CAAC,GAAGA,MAAM,KAAK;IAElC,OAAOD,UAAUI,SAASL,MAAM,KAAK;AACzC;AAEA,SAASM,mBACLN,KAAqB,EACrBO,eAAiF;IAEjF,IAAI,CAACA,iBACD;IAGJ,IAAI,AAA2B,YAA3B,OAAOA,iBAA8B;QACrC,MAAML,QAAQF,MAAM,MAAM,CAAC,IAAI,CAACG,CAAAA,IAAKA,EAAE,IAAI,KAAKI;QAChD,OAAQL,AAAAA,CAAAA,QAAQE,OAAOF,MAAM,KAAK,IAAI,MAAM,EAAC,KAAMM;IACvD;IAEA,MAAMH,OAAgC,CAAC;IACvC,KAAK,MAAMH,SAASF,MAAM,MAAM,CAC5BK,IAAI,CAACH,MAAM,IAAI,CAAC,GAAGA,MAAM,KAAK;IAElC,OAAOK,gBAAgBF,SAASG;AACpC;AAEO,MAAMC,iBAAiBC,0BAAmD,CAAC,EAAEV,KAAK,EAAE;IACvF,MAAMW,WAAWX,MAAM,gBAAgB;IAEvC,IAAIW,UAAU,cAAc,OACxB,OAAO,WAAP,GAAO,oBAACC,cAAYA;QAAC,QAAQZ,MAAM,MAAM;;IAK7C,MAAMa,cAAcC,uBAAuBd,MAAM,MAAM;IACvD,MAAM,CAACe,MAAMC,QAAQ,GAAGC,SAASN,UAAU,QAAQ;IACnDO,UAAU;QACN,IAAIL,aACAG,QAAQ;IAEhB,GAAG;QAACH;KAAY;IAEhB,OAAO,WAAP,GACI,oBAACM,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QACX,OAAOpB,aAAaC,OAAOW,UAAU;QACrC,aAAaL,mBAAmBN,OAAOW,UAAU;QACjD,MAAMI;QACN,cAAcC;QACd,WAAW;qBAEX,oBAACJ,cAAYA;QAAC,QAAQZ,MAAM,MAAM;;AAIlD"}
@@ -1,7 +1,8 @@
1
- import react from "react";
1
+ import react, { useEffect, useState } from "react";
2
2
  import { observer } from "mobx-react-lite";
3
3
  import { Accordion, Button, Separator, Tooltip, useToast } from "@webiny/admin-ui";
4
4
  import { useFeature } from "@webiny/app";
5
+ import { hasSubtreeFocusRequest } from "../../../../features/formModel/index.js";
5
6
  import { ReactComponent } from "@webiny/icons/content_copy.svg";
6
7
  import { ReactComponent as content_paste_svg_ReactComponent } from "@webiny/icons/content_paste.svg";
7
8
  import { ReactComponent as delete_svg_ReactComponent } from "@webiny/icons/delete.svg";
@@ -14,6 +15,17 @@ import { AddTemplateButton } from "./TemplatePicker.js";
14
15
  const SingleValueDynamicZone = observer(({ field, addItemLabel, showContainer = true })=>{
15
16
  const toast = useToast();
16
17
  const { clipboard } = useFeature(ClipboardFeature);
18
+ const focusInside = hasSubtreeFocusRequest(field.fields);
19
+ const [containerOpen, setContainerOpen] = useState(true);
20
+ const [templateOpen, setTemplateOpen] = useState(false);
21
+ useEffect(()=>{
22
+ if (focusInside) {
23
+ setContainerOpen(true);
24
+ setTemplateOpen(true);
25
+ }
26
+ }, [
27
+ focusInside
28
+ ]);
17
29
  const activeTemplate = null !== field.activeTemplateId ? field.availableTemplates.find((t)=>t.id === field.activeTemplateId) : void 0;
18
30
  const { showConfirmation } = useConfirmationDialog({
19
31
  title: "Remove template",
@@ -33,6 +45,8 @@ const SingleValueDynamicZone = observer(({ field, addItemLabel, showContainer =
33
45
  variant: "container"
34
46
  }, /*#__PURE__*/ react.createElement(Accordion.Item, {
35
47
  title: activeTemplate.label,
48
+ open: templateOpen,
49
+ onOpenChange: setTemplateOpen,
36
50
  actions: field.disabled ? null : /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Accordion.Item.Action, {
37
51
  icon: /*#__PURE__*/ react.createElement(Tooltip, {
38
52
  trigger: /*#__PURE__*/ react.createElement(ReactComponent, null),
@@ -95,7 +109,8 @@ const SingleValueDynamicZone = observer(({ field, addItemLabel, showContainer =
95
109
  icon: /*#__PURE__*/ react.createElement(horizontal_rule_svg_ReactComponent, null)
96
110
  }),
97
111
  title: field.label,
98
- defaultOpen: true
112
+ open: containerOpen,
113
+ onOpenChange: setContainerOpen
99
114
  }, content));
100
115
  });
101
116
  export { SingleValueDynamicZone };
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion, Button, Tooltip, useToast } from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { ReactComponent as CopyIcon } from \"@webiny/icons/content_copy.svg\";\nimport { ReactComponent as PasteIcon } from \"@webiny/icons/content_paste.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as HorizontalRuleIcon } from \"@webiny/icons/horizontal_rule.svg\";\nimport type { IObjectFieldVM } from \"~/features/formModel/index.js\";\nimport { TEMPLATE_DISCRIMINATOR } from \"~/features/formModel/ObjectField.js\";\nimport { ClipboardFeature } from \"~/features/clipboard/feature.js\";\nimport { useConfirmationDialog } from \"~/hooks/useConfirmationDialog.js\";\nimport { NestedLayout } from \"./ObjectFieldComponents.js\";\nimport { AddTemplateButton } from \"./TemplatePicker.js\";\nimport { Separator } from \"@webiny/admin-ui\";\n\ninterface SingleValueDynamicZoneProps {\n field: IObjectFieldVM;\n addItemLabel: string;\n showContainer?: boolean;\n}\n\nexport const SingleValueDynamicZone = observer(\n ({ field, addItemLabel, showContainer = true }: SingleValueDynamicZoneProps) => {\n const toast = useToast();\n const { clipboard } = useFeature(ClipboardFeature);\n const activeTemplate =\n field.activeTemplateId !== null\n ? field.availableTemplates.find(t => t.id === field.activeTemplateId)\n : undefined;\n\n const { showConfirmation } = useConfirmationDialog({\n title: \"Remove template\",\n message: \"Are you sure you want to remove this item? This action is not reversible.\",\n acceptLabel: \"Yes, I'm sure!\",\n cancelLabel: \"No, leave it.\"\n });\n\n const onClear = () => {\n showConfirmation(() => {\n field.onChange(null);\n });\n };\n\n const clipboardItem = clipboard.item;\n const canPaste =\n clipboardItem !== null &&\n clipboardItem.type === \"wby.dz\" &&\n typeof clipboardItem.data[TEMPLATE_DISCRIMINATOR] === \"string\" &&\n field.availableTemplates.some(t => t.id === clipboardItem.data[TEMPLATE_DISCRIMINATOR]);\n\n const content = (\n <>\n {activeTemplate ? (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item\n title={activeTemplate.label}\n actions={\n field.disabled ? null : (\n <>\n <Accordion.Item.Action\n icon={\n <Tooltip\n trigger={<CopyIcon />}\n content={\"Copy to clipboard\"}\n />\n }\n onClick={() => {\n clipboard.copy({\n type: \"wby.dz\",\n data: field.getClonedData()\n });\n toast.showSuccessToast({\n title: \"Copied to clipboard.\"\n });\n }}\n />\n <Accordion.Item.Action\n icon={\n <Tooltip\n trigger={<DeleteIcon />}\n content={\"Delete\"}\n />\n }\n onClick={onClear}\n />\n </>\n )\n }\n >\n <NestedLayout layout={field.layout} />\n </Accordion.Item>\n </Accordion>\n ) : null}\n {!activeTemplate && !field.disabled && (\n <div className={\"flex gap-sm items-center\"}>\n <AddTemplateButton\n label={addItemLabel}\n templates={field.availableTemplates}\n onSelect={template => field.setTemplate(template.id)}\n />\n {canPaste && (\n <Button\n size={\"sm\"}\n variant={\"tertiary\"}\n text={\"Paste\"}\n icon={<PasteIcon />}\n onClick={() => {\n const pasted = clipboard.paste();\n if (pasted) {\n field.onChange(pasted.data);\n toast.showSuccessToast({\n title: \"Pasted from clipboard.\"\n });\n }\n }}\n />\n )}\n </div>\n )}\n </>\n );\n\n if (!showContainer) {\n return (\n <>\n <Separator labelPosition={\"start\"} variant={\"accent\"}>\n <span className={\"text-accent-primary text-lg font-semibold\"}>\n {field.label ?? \"\"}\n </span>\n </Separator>\n <div className={\"mt-md\"}>{content}</div>\n </>\n );\n }\n\n return (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item\n icon={\n <Accordion.Item.Icon\n color={\"accent\"}\n label={\"Dynamic Zone\"}\n icon={<HorizontalRuleIcon />}\n />\n }\n title={field.label}\n defaultOpen={true}\n >\n {content}\n </Accordion.Item>\n </Accordion>\n );\n }\n);\n"],"names":["SingleValueDynamicZone","observer","field","addItemLabel","showContainer","toast","useToast","clipboard","useFeature","ClipboardFeature","activeTemplate","t","undefined","showConfirmation","useConfirmationDialog","onClear","clipboardItem","canPaste","TEMPLATE_DISCRIMINATOR","content","Accordion","Tooltip","CopyIcon","DeleteIcon","NestedLayout","AddTemplateButton","template","Button","PasteIcon","pasted","Separator","HorizontalRuleIcon"],"mappings":";;;;;;;;;;;;;AAsBO,MAAMA,yBAAyBC,SAClC,CAAC,EAAEC,KAAK,EAAEC,YAAY,EAAEC,gBAAgB,IAAI,EAA+B;IACvE,MAAMC,QAAQC;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAMC,iBACFR,AAA2B,SAA3BA,MAAM,gBAAgB,GAChBA,MAAM,kBAAkB,CAAC,IAAI,CAACS,CAAAA,IAAKA,EAAE,EAAE,KAAKT,MAAM,gBAAgB,IAClEU;IAEV,MAAM,EAAEC,gBAAgB,EAAE,GAAGC,sBAAsB;QAC/C,OAAO;QACP,SAAS;QACT,aAAa;QACb,aAAa;IACjB;IAEA,MAAMC,UAAU;QACZF,iBAAiB;YACbX,MAAM,QAAQ,CAAC;QACnB;IACJ;IAEA,MAAMc,gBAAgBT,UAAU,IAAI;IACpC,MAAMU,WACFD,AAAkB,SAAlBA,iBACAA,AAAuB,aAAvBA,cAAc,IAAI,IAClB,AAAsD,YAAtD,OAAOA,cAAc,IAAI,CAACE,uBAAuB,IACjDhB,MAAM,kBAAkB,CAAC,IAAI,CAACS,CAAAA,IAAKA,EAAE,EAAE,KAAKK,cAAc,IAAI,CAACE,uBAAuB;IAE1F,MAAMC,UAAU,WAAVA,GACF,0CACKT,iBAAiB,WAAjBA,GACG,oBAACU,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QACX,OAAOV,eAAe,KAAK;QAC3B,SACIR,MAAM,QAAQ,GAAG,OAAO,WAAP,GACb,wDACI,oBAACkB,UAAU,IAAI,CAAC,MAAM;YAClB,oBACI,oBAACC,SAAOA;gBACJ,uBAAS,oBAACC,gBAAQA;gBAClB,SAAS;;YAGjB,SAAS;gBACLf,UAAU,IAAI,CAAC;oBACX,MAAM;oBACN,MAAML,MAAM,aAAa;gBAC7B;gBACAG,MAAM,gBAAgB,CAAC;oBACnB,OAAO;gBACX;YACJ;0BAEJ,oBAACe,UAAU,IAAI,CAAC,MAAM;YAClB,oBACI,oBAACC,SAAOA;gBACJ,uBAAS,oBAACE,2BAAUA;gBACpB,SAAS;;YAGjB,SAASR;;qBAMzB,oBAACS,cAAYA;QAAC,QAAQtB,MAAM,MAAM;WAG1C,MACH,CAACQ,kBAAkB,CAACR,MAAM,QAAQ,IAAI,WAAJ,GAC/B,oBAAC;QAAI,WAAW;qBACZ,oBAACuB,mBAAiBA;QACd,OAAOtB;QACP,WAAWD,MAAM,kBAAkB;QACnC,UAAUwB,CAAAA,WAAYxB,MAAM,WAAW,CAACwB,SAAS,EAAE;QAEtDT,YAAY,WAAZA,GACG,oBAACU,QAAMA;QACH,MAAM;QACN,SAAS;QACT,MAAM;QACN,oBAAM,oBAACC,kCAASA;QAChB,SAAS;YACL,MAAMC,SAAStB,UAAU,KAAK;YAC9B,IAAIsB,QAAQ;gBACR3B,MAAM,QAAQ,CAAC2B,OAAO,IAAI;gBAC1BxB,MAAM,gBAAgB,CAAC;oBACnB,OAAO;gBACX;YACJ;QACJ;;IAQxB,IAAI,CAACD,eACD,OAAO,WAAP,GACI,wDACI,oBAAC0B,WAASA;QAAC,eAAe;QAAS,SAAS;qBACxC,oBAAC;QAAK,WAAW;OACZ5B,MAAM,KAAK,IAAI,oBAGxB,oBAAC;QAAI,WAAW;OAAUiB;IAKtC,OAAO,WAAP,GACI,oBAACC,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QACX,oBACI,oBAACA,UAAU,IAAI,CAAC,IAAI;YAChB,OAAO;YACP,OAAO;YACP,oBAAM,oBAACW,oCAAkBA;;QAGjC,OAAO7B,MAAM,KAAK;QAClB,aAAa;OAEZiB;AAIjB"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion, Button, Tooltip, useToast } from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { hasSubtreeFocusRequest } from \"~/features/formModel/index.js\";\nimport { ReactComponent as CopyIcon } from \"@webiny/icons/content_copy.svg\";\nimport { ReactComponent as PasteIcon } from \"@webiny/icons/content_paste.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as HorizontalRuleIcon } from \"@webiny/icons/horizontal_rule.svg\";\nimport type { IObjectFieldVM } from \"~/features/formModel/index.js\";\nimport { TEMPLATE_DISCRIMINATOR } from \"~/features/formModel/ObjectField.js\";\nimport { ClipboardFeature } from \"~/features/clipboard/feature.js\";\nimport { useConfirmationDialog } from \"~/hooks/useConfirmationDialog.js\";\nimport { NestedLayout } from \"./ObjectFieldComponents.js\";\nimport { AddTemplateButton } from \"./TemplatePicker.js\";\nimport { Separator } from \"@webiny/admin-ui\";\n\ninterface SingleValueDynamicZoneProps {\n field: IObjectFieldVM;\n addItemLabel: string;\n showContainer?: boolean;\n}\n\nexport const SingleValueDynamicZone = observer(\n ({ field, addItemLabel, showContainer = true }: SingleValueDynamicZoneProps) => {\n const toast = useToast();\n const { clipboard } = useFeature(ClipboardFeature);\n\n // Force both the DZ container and the active-template accordion open\n // when a focus request lands anywhere in the subtree, so \"jump to\n // field\" can cascade through collapsed levels.\n const focusInside = hasSubtreeFocusRequest(field.fields);\n const [containerOpen, setContainerOpen] = useState(true);\n const [templateOpen, setTemplateOpen] = useState(false);\n useEffect(() => {\n if (focusInside) {\n setContainerOpen(true);\n setTemplateOpen(true);\n }\n }, [focusInside]);\n\n const activeTemplate =\n field.activeTemplateId !== null\n ? field.availableTemplates.find(t => t.id === field.activeTemplateId)\n : undefined;\n\n const { showConfirmation } = useConfirmationDialog({\n title: \"Remove template\",\n message: \"Are you sure you want to remove this item? This action is not reversible.\",\n acceptLabel: \"Yes, I'm sure!\",\n cancelLabel: \"No, leave it.\"\n });\n\n const onClear = () => {\n showConfirmation(() => {\n field.onChange(null);\n });\n };\n\n const clipboardItem = clipboard.item;\n const canPaste =\n clipboardItem !== null &&\n clipboardItem.type === \"wby.dz\" &&\n typeof clipboardItem.data[TEMPLATE_DISCRIMINATOR] === \"string\" &&\n field.availableTemplates.some(t => t.id === clipboardItem.data[TEMPLATE_DISCRIMINATOR]);\n\n const content = (\n <>\n {activeTemplate ? (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item\n title={activeTemplate.label}\n open={templateOpen}\n onOpenChange={setTemplateOpen}\n actions={\n field.disabled ? null : (\n <>\n <Accordion.Item.Action\n icon={\n <Tooltip\n trigger={<CopyIcon />}\n content={\"Copy to clipboard\"}\n />\n }\n onClick={() => {\n clipboard.copy({\n type: \"wby.dz\",\n data: field.getClonedData()\n });\n toast.showSuccessToast({\n title: \"Copied to clipboard.\"\n });\n }}\n />\n <Accordion.Item.Action\n icon={\n <Tooltip\n trigger={<DeleteIcon />}\n content={\"Delete\"}\n />\n }\n onClick={onClear}\n />\n </>\n )\n }\n >\n <NestedLayout layout={field.layout} />\n </Accordion.Item>\n </Accordion>\n ) : null}\n {!activeTemplate && !field.disabled && (\n <div className={\"flex gap-sm items-center\"}>\n <AddTemplateButton\n label={addItemLabel}\n templates={field.availableTemplates}\n onSelect={template => field.setTemplate(template.id)}\n />\n {canPaste && (\n <Button\n size={\"sm\"}\n variant={\"tertiary\"}\n text={\"Paste\"}\n icon={<PasteIcon />}\n onClick={() => {\n const pasted = clipboard.paste();\n if (pasted) {\n field.onChange(pasted.data);\n toast.showSuccessToast({\n title: \"Pasted from clipboard.\"\n });\n }\n }}\n />\n )}\n </div>\n )}\n </>\n );\n\n if (!showContainer) {\n return (\n <>\n <Separator labelPosition={\"start\"} variant={\"accent\"}>\n <span className={\"text-accent-primary text-lg font-semibold\"}>\n {field.label ?? \"\"}\n </span>\n </Separator>\n <div className={\"mt-md\"}>{content}</div>\n </>\n );\n }\n\n return (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item\n icon={\n <Accordion.Item.Icon\n color={\"accent\"}\n label={\"Dynamic Zone\"}\n icon={<HorizontalRuleIcon />}\n />\n }\n title={field.label}\n open={containerOpen}\n onOpenChange={setContainerOpen}\n >\n {content}\n </Accordion.Item>\n </Accordion>\n );\n }\n);\n"],"names":["SingleValueDynamicZone","observer","field","addItemLabel","showContainer","toast","useToast","clipboard","useFeature","ClipboardFeature","focusInside","hasSubtreeFocusRequest","containerOpen","setContainerOpen","useState","templateOpen","setTemplateOpen","useEffect","activeTemplate","t","undefined","showConfirmation","useConfirmationDialog","onClear","clipboardItem","canPaste","TEMPLATE_DISCRIMINATOR","content","Accordion","Tooltip","CopyIcon","DeleteIcon","NestedLayout","AddTemplateButton","template","Button","PasteIcon","pasted","Separator","HorizontalRuleIcon"],"mappings":";;;;;;;;;;;;;;AAuBO,MAAMA,yBAAyBC,SAClC,CAAC,EAAEC,KAAK,EAAEC,YAAY,EAAEC,gBAAgB,IAAI,EAA+B;IACvE,MAAMC,QAAQC;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAKjC,MAAMC,cAAcC,uBAAuBT,MAAM,MAAM;IACvD,MAAM,CAACU,eAAeC,iBAAiB,GAAGC,SAAS;IACnD,MAAM,CAACC,cAAcC,gBAAgB,GAAGF,SAAS;IACjDG,UAAU;QACN,IAAIP,aAAa;YACbG,iBAAiB;YACjBG,gBAAgB;QACpB;IACJ,GAAG;QAACN;KAAY;IAEhB,MAAMQ,iBACFhB,AAA2B,SAA3BA,MAAM,gBAAgB,GAChBA,MAAM,kBAAkB,CAAC,IAAI,CAACiB,CAAAA,IAAKA,EAAE,EAAE,KAAKjB,MAAM,gBAAgB,IAClEkB;IAEV,MAAM,EAAEC,gBAAgB,EAAE,GAAGC,sBAAsB;QAC/C,OAAO;QACP,SAAS;QACT,aAAa;QACb,aAAa;IACjB;IAEA,MAAMC,UAAU;QACZF,iBAAiB;YACbnB,MAAM,QAAQ,CAAC;QACnB;IACJ;IAEA,MAAMsB,gBAAgBjB,UAAU,IAAI;IACpC,MAAMkB,WACFD,AAAkB,SAAlBA,iBACAA,AAAuB,aAAvBA,cAAc,IAAI,IAClB,AAAsD,YAAtD,OAAOA,cAAc,IAAI,CAACE,uBAAuB,IACjDxB,MAAM,kBAAkB,CAAC,IAAI,CAACiB,CAAAA,IAAKA,EAAE,EAAE,KAAKK,cAAc,IAAI,CAACE,uBAAuB;IAE1F,MAAMC,UAAU,WAAVA,GACF,0CACKT,iBAAiB,WAAjBA,GACG,oBAACU,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QACX,OAAOV,eAAe,KAAK;QAC3B,MAAMH;QACN,cAAcC;QACd,SACId,MAAM,QAAQ,GAAG,OAAO,WAAP,GACb,wDACI,oBAAC0B,UAAU,IAAI,CAAC,MAAM;YAClB,oBACI,oBAACC,SAAOA;gBACJ,uBAAS,oBAACC,gBAAQA;gBAClB,SAAS;;YAGjB,SAAS;gBACLvB,UAAU,IAAI,CAAC;oBACX,MAAM;oBACN,MAAML,MAAM,aAAa;gBAC7B;gBACAG,MAAM,gBAAgB,CAAC;oBACnB,OAAO;gBACX;YACJ;0BAEJ,oBAACuB,UAAU,IAAI,CAAC,MAAM;YAClB,oBACI,oBAACC,SAAOA;gBACJ,uBAAS,oBAACE,2BAAUA;gBACpB,SAAS;;YAGjB,SAASR;;qBAMzB,oBAACS,cAAYA;QAAC,QAAQ9B,MAAM,MAAM;WAG1C,MACH,CAACgB,kBAAkB,CAAChB,MAAM,QAAQ,IAAI,WAAJ,GAC/B,oBAAC;QAAI,WAAW;qBACZ,oBAAC+B,mBAAiBA;QACd,OAAO9B;QACP,WAAWD,MAAM,kBAAkB;QACnC,UAAUgC,CAAAA,WAAYhC,MAAM,WAAW,CAACgC,SAAS,EAAE;QAEtDT,YAAY,WAAZA,GACG,oBAACU,QAAMA;QACH,MAAM;QACN,SAAS;QACT,MAAM;QACN,oBAAM,oBAACC,kCAASA;QAChB,SAAS;YACL,MAAMC,SAAS9B,UAAU,KAAK;YAC9B,IAAI8B,QAAQ;gBACRnC,MAAM,QAAQ,CAACmC,OAAO,IAAI;gBAC1BhC,MAAM,gBAAgB,CAAC;oBACnB,OAAO;gBACX;YACJ;QACJ;;IAQxB,IAAI,CAACD,eACD,OAAO,WAAP,GACI,wDACI,oBAACkC,WAASA;QAAC,eAAe;QAAS,SAAS;qBACxC,oBAAC;QAAK,WAAW;OACZpC,MAAM,KAAK,IAAI,oBAGxB,oBAAC;QAAI,WAAW;OAAUyB;IAKtC,OAAO,WAAP,GACI,oBAACC,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QACX,oBACI,oBAACA,UAAU,IAAI,CAAC,IAAI;YAChB,OAAO;YACP,OAAO;YACP,oBAAM,oBAACW,oCAAkBA;;QAGjC,OAAOrC,MAAM,KAAK;QAClB,MAAMU;QACN,cAAcC;OAEbc;AAIjB"}
@@ -1,6 +1,7 @@
1
1
  import react from "react";
2
2
  import { createFieldRenderer } from "../../../features/formModel/createFieldRenderer.js";
3
3
  import { RadioGroup } from "@webiny/admin-ui";
4
+ const isValidValue = (value)=>"string" == typeof value || "number" == typeof value;
4
5
  const RadioButtonsRenderer = createFieldRenderer(({ field })=>{
5
6
  const options = field.options ?? [];
6
7
  return /*#__PURE__*/ react.createElement(RadioGroup, {
@@ -13,9 +14,9 @@ const RadioButtonsRenderer = createFieldRenderer(({ field })=>{
13
14
  validation: field.validation,
14
15
  items: options.map((opt)=>({
15
16
  label: opt.label,
16
- value: String(opt.value)
17
+ value: isValidValue(opt.value) ? String(opt.value) : opt.value
17
18
  })),
18
- value: void 0 !== field.value ? String(field.value) : void 0,
19
+ value: isValidValue(field.value) ? String(field.value) : void 0,
19
20
  onChange: (value)=>{
20
21
  field.onChange(value);
21
22
  field.onBlur();
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/RadioButtonsRenderer.js","sources":["../../../../src/base/Base/FieldRenderers/RadioButtonsRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { createFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { RadioGroup } from \"@webiny/admin-ui\";\nimport type { IValueOption } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n radioButtons: { fieldType: \"text\" | \"number\"; options: true; settings: undefined };\n }\n}\n\nexport const RadioButtonsRenderer = createFieldRenderer(({ field }) => {\n const options: IValueOption[] = field.options ?? [];\n\n return (\n <RadioGroup\n label={field.label}\n hint={field.help}\n description={field.description}\n note={field.note}\n required={field.required}\n disabled={field.disabled}\n validation={field.validation}\n items={options.map(opt => ({\n label: opt.label,\n value: String(opt.value)\n }))}\n value={field.value !== undefined ? String(field.value) : undefined}\n onChange={value => {\n field.onChange(value);\n field.onBlur();\n }}\n />\n );\n});\n"],"names":["RadioButtonsRenderer","createFieldRenderer","field","options","RadioGroup","opt","String","undefined","value"],"mappings":";;;AAWO,MAAMA,uBAAuBC,oBAAoB,CAAC,EAAEC,KAAK,EAAE;IAC9D,MAAMC,UAA0BD,MAAM,OAAO,IAAI,EAAE;IAEnD,OAAO,WAAP,GACI,oBAACE,YAAUA;QACP,OAAOF,MAAM,KAAK;QAClB,MAAMA,MAAM,IAAI;QAChB,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,UAAUA,MAAM,QAAQ;QACxB,UAAUA,MAAM,QAAQ;QACxB,YAAYA,MAAM,UAAU;QAC5B,OAAOC,QAAQ,GAAG,CAACE,CAAAA,MAAQ;gBACvB,OAAOA,IAAI,KAAK;gBAChB,OAAOC,OAAOD,IAAI,KAAK;YAC3B;QACA,OAAOH,AAAgBK,WAAhBL,MAAM,KAAK,GAAiBI,OAAOJ,MAAM,KAAK,IAAIK;QACzD,UAAUC,CAAAA;YACNN,MAAM,QAAQ,CAACM;YACfN,MAAM,MAAM;QAChB;;AAGZ"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/RadioButtonsRenderer.js","sources":["../../../../src/base/Base/FieldRenderers/RadioButtonsRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { createFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { RadioGroup } from \"@webiny/admin-ui\";\nimport type { IValueOption } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n radioButtons: { fieldType: \"text\" | \"number\"; options: true; settings: undefined };\n }\n}\n\nconst isValidValue = (value: unknown): value is string | number =>\n typeof value === \"string\" || typeof value === \"number\";\n\nexport const RadioButtonsRenderer = createFieldRenderer(({ field }) => {\n const options: IValueOption[] = field.options ?? [];\n\n return (\n <RadioGroup\n label={field.label}\n hint={field.help}\n description={field.description}\n note={field.note}\n required={field.required}\n disabled={field.disabled}\n validation={field.validation}\n items={options.map(opt => ({\n label: opt.label,\n value: isValidValue(opt.value) ? String(opt.value) : opt.value\n }))}\n value={isValidValue(field.value) ? String(field.value) : undefined}\n onChange={value => {\n field.onChange(value);\n field.onBlur();\n }}\n />\n );\n});\n"],"names":["isValidValue","value","RadioButtonsRenderer","createFieldRenderer","field","options","RadioGroup","opt","String","undefined"],"mappings":";;;AAWA,MAAMA,eAAe,CAACC,QAClB,AAAiB,YAAjB,OAAOA,SAAsB,AAAiB,YAAjB,OAAOA;AAEjC,MAAMC,uBAAuBC,oBAAoB,CAAC,EAAEC,KAAK,EAAE;IAC9D,MAAMC,UAA0BD,MAAM,OAAO,IAAI,EAAE;IAEnD,OAAO,WAAP,GACI,oBAACE,YAAUA;QACP,OAAOF,MAAM,KAAK;QAClB,MAAMA,MAAM,IAAI;QAChB,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,UAAUA,MAAM,QAAQ;QACxB,UAAUA,MAAM,QAAQ;QACxB,YAAYA,MAAM,UAAU;QAC5B,OAAOC,QAAQ,GAAG,CAACE,CAAAA,MAAQ;gBACvB,OAAOA,IAAI,KAAK;gBAChB,OAAOP,aAAaO,IAAI,KAAK,IAAIC,OAAOD,IAAI,KAAK,IAAIA,IAAI,KAAK;YAClE;QACA,OAAOP,aAAaI,MAAM,KAAK,IAAII,OAAOJ,MAAM,KAAK,IAAIK;QACzD,UAAUR,CAAAA;YACNG,MAAM,QAAQ,CAACH;YACfG,MAAM,MAAM;QAChB;;AAGZ"}
@@ -1,6 +1,7 @@
1
1
  import react from "react";
2
2
  import { createFieldRenderer } from "../../../features/formModel/createFieldRenderer.js";
3
3
  import { Select } from "@webiny/admin-ui";
4
+ const isValidValue = (value)=>"string" == typeof value || "number" == typeof value;
4
5
  const SelectRenderer = createFieldRenderer(({ field })=>{
5
6
  const options = field.options ?? [];
6
7
  return /*#__PURE__*/ react.createElement(Select, {
@@ -9,7 +10,7 @@ const SelectRenderer = createFieldRenderer(({ field })=>{
9
10
  placeholder: field.placeholder,
10
11
  description: field.description,
11
12
  note: field.note,
12
- value: null != field.value ? String(field.value) : "",
13
+ value: isValidValue(field.value) ? String(field.value) : "",
13
14
  onChange: (value)=>{
14
15
  field.onChange(value);
15
16
  field.onBlur();
@@ -19,7 +20,7 @@ const SelectRenderer = createFieldRenderer(({ field })=>{
19
20
  validation: field.validation,
20
21
  options: options.map((opt)=>({
21
22
  label: opt.label,
22
- value: String(opt.value),
23
+ value: isValidValue(opt.value) ? String(opt.value) : opt.value,
23
24
  disabled: opt.disabled
24
25
  }))
25
26
  });
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/SelectRenderer.js","sources":["../../../../src/base/Base/FieldRenderers/SelectRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { createFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { Select } from \"@webiny/admin-ui\";\nimport type { IValueOption } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n select: { fieldType: \"text\" | \"number\"; options: true; settings: undefined };\n /** @deprecated Use \"select\" instead. */\n dropdown: { fieldType: \"text\" | \"number\"; options: true; settings: undefined };\n }\n}\n\nexport const SelectRenderer = createFieldRenderer(({ field }) => {\n const options: IValueOption[] = field.options ?? [];\n\n return (\n <Select\n label={field.label}\n hint={field.help}\n placeholder={field.placeholder}\n description={field.description}\n note={field.note}\n value={field.value != null ? String(field.value) : \"\"}\n onChange={value => {\n field.onChange(value);\n field.onBlur();\n }}\n required={field.required}\n disabled={field.disabled}\n validation={field.validation}\n options={options.map(opt => ({\n label: opt.label,\n value: String(opt.value),\n disabled: opt.disabled\n }))}\n />\n );\n});\n"],"names":["SelectRenderer","createFieldRenderer","field","options","Select","String","value","opt"],"mappings":";;;AAaO,MAAMA,iBAAiBC,oBAAoB,CAAC,EAAEC,KAAK,EAAE;IACxD,MAAMC,UAA0BD,MAAM,OAAO,IAAI,EAAE;IAEnD,OAAO,WAAP,GACI,oBAACE,QAAMA;QACH,OAAOF,MAAM,KAAK;QAClB,MAAMA,MAAM,IAAI;QAChB,aAAaA,MAAM,WAAW;QAC9B,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,OAAOA,AAAe,QAAfA,MAAM,KAAK,GAAWG,OAAOH,MAAM,KAAK,IAAI;QACnD,UAAUI,CAAAA;YACNJ,MAAM,QAAQ,CAACI;YACfJ,MAAM,MAAM;QAChB;QACA,UAAUA,MAAM,QAAQ;QACxB,UAAUA,MAAM,QAAQ;QACxB,YAAYA,MAAM,UAAU;QAC5B,SAASC,QAAQ,GAAG,CAACI,CAAAA,MAAQ;gBACzB,OAAOA,IAAI,KAAK;gBAChB,OAAOF,OAAOE,IAAI,KAAK;gBACvB,UAAUA,IAAI,QAAQ;YAC1B;;AAGZ"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/SelectRenderer.js","sources":["../../../../src/base/Base/FieldRenderers/SelectRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { createFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { Select } from \"@webiny/admin-ui\";\nimport type { IValueOption } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n select: { fieldType: \"text\" | \"number\"; options: true; settings: undefined };\n /** @deprecated Use \"select\" instead. */\n dropdown: { fieldType: \"text\" | \"number\"; options: true; settings: undefined };\n }\n}\n\nconst isValidValue = (value: unknown): value is string | number =>\n typeof value === \"string\" || typeof value === \"number\";\n\nexport const SelectRenderer = createFieldRenderer(({ field }) => {\n const options: IValueOption[] = field.options ?? [];\n\n return (\n <Select\n label={field.label}\n hint={field.help}\n placeholder={field.placeholder}\n description={field.description}\n note={field.note}\n value={isValidValue(field.value) ? String(field.value) : \"\"}\n onChange={value => {\n field.onChange(value);\n field.onBlur();\n }}\n required={field.required}\n disabled={field.disabled}\n validation={field.validation}\n options={options.map(opt => ({\n label: opt.label,\n value: isValidValue(opt.value) ? String(opt.value) : opt.value,\n disabled: opt.disabled\n }))}\n />\n );\n});\n"],"names":["isValidValue","value","SelectRenderer","createFieldRenderer","field","options","Select","String","opt"],"mappings":";;;AAaA,MAAMA,eAAe,CAACC,QAClB,AAAiB,YAAjB,OAAOA,SAAsB,AAAiB,YAAjB,OAAOA;AAEjC,MAAMC,iBAAiBC,oBAAoB,CAAC,EAAEC,KAAK,EAAE;IACxD,MAAMC,UAA0BD,MAAM,OAAO,IAAI,EAAE;IAEnD,OAAO,WAAP,GACI,oBAACE,QAAMA;QACH,OAAOF,MAAM,KAAK;QAClB,MAAMA,MAAM,IAAI;QAChB,aAAaA,MAAM,WAAW;QAC9B,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,OAAOJ,aAAaI,MAAM,KAAK,IAAIG,OAAOH,MAAM,KAAK,IAAI;QACzD,UAAUH,CAAAA;YACNG,MAAM,QAAQ,CAACH;YACfG,MAAM,MAAM;QAChB;QACA,UAAUA,MAAM,QAAQ;QACxB,UAAUA,MAAM,QAAQ;QACxB,YAAYA,MAAM,UAAU;QAC5B,SAASC,QAAQ,GAAG,CAACG,CAAAA,MAAQ;gBACzB,OAAOA,IAAI,KAAK;gBAChB,OAAOR,aAAaQ,IAAI,KAAK,IAAID,OAAOC,IAAI,KAAK,IAAIA,IAAI,KAAK;gBAC9D,UAAUA,IAAI,QAAQ;YAC1B;;AAGZ"}
@@ -0,0 +1,6 @@
1
+ export interface DrawerParamsContextValue {
2
+ params: Record<string, unknown>;
3
+ closeDrawer: () => void;
4
+ }
5
+ export declare const DrawerParamsContext: import("react").Context<DrawerParamsContextValue | undefined>;
6
+ export declare const useDrawerParamsContext: () => DrawerParamsContextValue;
@@ -0,0 +1,10 @@
1
+ import { createContext, useContext } from "react";
2
+ const DrawerParamsContext = /*#__PURE__*/ createContext(void 0);
3
+ const useDrawerParamsContext = ()=>{
4
+ const context = useContext(DrawerParamsContext);
5
+ if (!context) throw new Error("useDrawer must be used inside a named drawer registered via AdminConfig.Drawer");
6
+ return context;
7
+ };
8
+ export { DrawerParamsContext, useDrawerParamsContext };
9
+
10
+ //# sourceMappingURL=DrawerParamsContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Drawers/DrawerParamsContext.js","sources":["../../../src/components/Drawers/DrawerParamsContext.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\nexport interface DrawerParamsContextValue {\n params: Record<string, unknown>;\n closeDrawer: () => void;\n}\n\nexport const DrawerParamsContext = createContext<DrawerParamsContextValue | undefined>(undefined);\n\nexport const useDrawerParamsContext = () => {\n const context = useContext(DrawerParamsContext);\n\n if (!context) {\n throw new Error(\n \"useDrawer must be used inside a named drawer registered via AdminConfig.Drawer\"\n );\n }\n\n return context;\n};\n"],"names":["DrawerParamsContext","createContext","undefined","useDrawerParamsContext","context","useContext","Error"],"mappings":";AAOO,MAAMA,sBAAsB,WAAHA,GAAGC,cAAoDC;AAEhF,MAAMC,yBAAyB;IAClC,MAAMC,UAAUC,WAAWL;IAE3B,IAAI,CAACI,SACD,MAAM,IAAIE,MACN;IAIR,OAAOF;AACX"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from "react";
2
+ import React from "react";
3
+ export interface DrawersContext {
4
+ openNamedDrawer: (name: string, params?: Record<string, unknown>) => void;
5
+ closeNamedDrawer: (name?: string) => void;
6
+ }
7
+ interface DrawersProviderProps {
8
+ children: ReactNode;
9
+ }
10
+ export declare const DrawersContext: React.Context<DrawersContext | undefined>;
11
+ export declare const DrawersProvider: ({ children }: DrawersProviderProps) => React.JSX.Element;
12
+ export declare const createDrawersProvider: () => import("@webiny/app").Decorator<import("@webiny/app").GenericComponent<import("@webiny/app").ChildrenProps>>;
13
+ export {};
@@ -0,0 +1,50 @@
1
+ import react, { useCallback, useState } from "react";
2
+ import { createProvider } from "@webiny/app";
3
+ import { DrawerParamsContext } from "./DrawerParamsContext.js";
4
+ import { useAdminConfig } from "../../config/AdminConfig.js";
5
+ const DrawersContext = /*#__PURE__*/ react.createContext(void 0);
6
+ const DrawersProvider = ({ children })=>{
7
+ const [stack, setStack] = useState([]);
8
+ const { drawers: registeredDrawers } = useAdminConfig();
9
+ const openNamedDrawer = useCallback((name, params = {})=>{
10
+ setStack((prev)=>{
11
+ if (prev.some((entry)=>entry.name === name)) return prev;
12
+ return [
13
+ ...prev,
14
+ {
15
+ name,
16
+ params
17
+ }
18
+ ];
19
+ });
20
+ }, []);
21
+ const closeNamedDrawer = useCallback((name)=>{
22
+ setStack((prev)=>{
23
+ if (!name) return prev.slice(0, -1);
24
+ return prev.filter((entry)=>entry.name !== name);
25
+ });
26
+ }, []);
27
+ const context = {
28
+ openNamedDrawer,
29
+ closeNamedDrawer
30
+ };
31
+ return /*#__PURE__*/ react.createElement(DrawersContext.Provider, {
32
+ value: context
33
+ }, children, stack.map((entry)=>{
34
+ const registration = registeredDrawers.find((d)=>d.name === entry.name);
35
+ if (!registration) return null;
36
+ return /*#__PURE__*/ react.createElement(DrawerParamsContext.Provider, {
37
+ key: entry.name,
38
+ value: {
39
+ params: entry.params,
40
+ closeDrawer: ()=>closeNamedDrawer(entry.name)
41
+ }
42
+ }, registration.element);
43
+ }));
44
+ };
45
+ const createDrawersProvider = ()=>createProvider((Component)=>function({ children }) {
46
+ return /*#__PURE__*/ react.createElement(DrawersProvider, null, /*#__PURE__*/ react.createElement(Component, null, children));
47
+ });
48
+ export { DrawersContext, DrawersProvider, createDrawersProvider };
49
+
50
+ //# sourceMappingURL=DrawersContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Drawers/DrawersContext.js","sources":["../../../src/components/Drawers/DrawersContext.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport React, { useCallback, useState } from \"react\";\nimport { createProvider } from \"@webiny/app\";\nimport { DrawerParamsContext } from \"./DrawerParamsContext.js\";\nimport { useAdminConfig } from \"~/config/AdminConfig.js\";\n\ninterface OpenDrawerEntry {\n name: string;\n params: Record<string, unknown>;\n}\n\nexport interface DrawersContext {\n openNamedDrawer: (name: string, params?: Record<string, unknown>) => void;\n closeNamedDrawer: (name?: string) => void;\n}\n\ninterface DrawersProviderProps {\n children: ReactNode;\n}\n\nexport const DrawersContext = React.createContext<DrawersContext | undefined>(undefined);\n\nexport const DrawersProvider = ({ children }: DrawersProviderProps) => {\n const [stack, setStack] = useState<OpenDrawerEntry[]>([]);\n const { drawers: registeredDrawers } = useAdminConfig();\n\n const openNamedDrawer = useCallback((name: string, params: Record<string, unknown> = {}) => {\n setStack(prev => {\n if (prev.some(entry => entry.name === name)) {\n return prev;\n }\n return [...prev, { name, params }];\n });\n }, []);\n\n const closeNamedDrawer = useCallback((name?: string) => {\n setStack(prev => {\n if (!name) {\n return prev.slice(0, -1);\n }\n return prev.filter(entry => entry.name !== name);\n });\n }, []);\n\n const context: DrawersContext = {\n openNamedDrawer,\n closeNamedDrawer\n };\n\n return (\n <DrawersContext.Provider value={context}>\n {children}\n {stack.map(entry => {\n const registration = registeredDrawers.find(d => d.name === entry.name);\n if (!registration) {\n return null;\n }\n return (\n <DrawerParamsContext.Provider\n key={entry.name}\n value={{\n params: entry.params,\n closeDrawer: () => closeNamedDrawer(entry.name)\n }}\n >\n {registration.element}\n </DrawerParamsContext.Provider>\n );\n })}\n </DrawersContext.Provider>\n );\n};\n\nexport const createDrawersProvider = () => {\n return createProvider(Component => {\n return function DrawersProviderHOC({ children }: DrawersProviderProps) {\n return (\n <DrawersProvider>\n <Component>{children}</Component>\n </DrawersProvider>\n );\n };\n });\n};\n"],"names":["DrawersContext","React","undefined","DrawersProvider","children","stack","setStack","useState","registeredDrawers","useAdminConfig","openNamedDrawer","useCallback","name","params","prev","entry","closeNamedDrawer","context","registration","d","DrawerParamsContext","createDrawersProvider","createProvider","Component"],"mappings":";;;;AAoBO,MAAMA,iBAAiB,WAAHA,GAAGC,MAAAA,aAAmB,CAA6BC;AAEvE,MAAMC,kBAAkB,CAAC,EAAEC,QAAQ,EAAwB;IAC9D,MAAM,CAACC,OAAOC,SAAS,GAAGC,SAA4B,EAAE;IACxD,MAAM,EAAE,SAASC,iBAAiB,EAAE,GAAGC;IAEvC,MAAMC,kBAAkBC,YAAY,CAACC,MAAcC,SAAkC,CAAC,CAAC;QACnFP,SAASQ,CAAAA;YACL,IAAIA,KAAK,IAAI,CAACC,CAAAA,QAASA,MAAM,IAAI,KAAKH,OAClC,OAAOE;YAEX,OAAO;mBAAIA;gBAAM;oBAAEF;oBAAMC;gBAAO;aAAE;QACtC;IACJ,GAAG,EAAE;IAEL,MAAMG,mBAAmBL,YAAY,CAACC;QAClCN,SAASQ,CAAAA;YACL,IAAI,CAACF,MACD,OAAOE,KAAK,KAAK,CAAC,GAAG;YAEzB,OAAOA,KAAK,MAAM,CAACC,CAAAA,QAASA,MAAM,IAAI,KAAKH;QAC/C;IACJ,GAAG,EAAE;IAEL,MAAMK,UAA0B;QAC5BP;QACAM;IACJ;IAEA,OAAO,WAAP,GACI,oBAAChB,eAAe,QAAQ;QAAC,OAAOiB;OAC3Bb,UACAC,MAAM,GAAG,CAACU,CAAAA;QACP,MAAMG,eAAeV,kBAAkB,IAAI,CAACW,CAAAA,IAAKA,EAAE,IAAI,KAAKJ,MAAM,IAAI;QACtE,IAAI,CAACG,cACD,OAAO;QAEX,OAAO,WAAP,GACI,oBAACE,oBAAoB,QAAQ;YACzB,KAAKL,MAAM,IAAI;YACf,OAAO;gBACH,QAAQA,MAAM,MAAM;gBACpB,aAAa,IAAMC,iBAAiBD,MAAM,IAAI;YAClD;WAECG,aAAa,OAAO;IAGjC;AAGZ;AAEO,MAAMG,wBAAwB,IAC1BC,eAAeC,CAAAA,YACX,SAA4B,EAAEnB,QAAQ,EAAwB;YACjE,OAAO,WAAP,GACI,oBAACD,iBAAeA,MAAAA,WAAAA,GACZ,oBAACoB,WAAAA,MAAWnB;QAGxB"}
@@ -0,0 +1,2 @@
1
+ import { DrawersContext } from "./DrawersContext.js";
2
+ export declare const useDrawers: () => DrawersContext;
@@ -0,0 +1,10 @@
1
+ import { useContext } from "react";
2
+ import { DrawersContext } from "./DrawersContext.js";
3
+ const useDrawers = ()=>{
4
+ const context = useContext(DrawersContext);
5
+ if (!context) throw new Error("useDrawers must be used within a DrawersContext.Provider");
6
+ return context;
7
+ };
8
+ export { useDrawers };
9
+
10
+ //# sourceMappingURL=useDrawers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/Drawers/useDrawers.js","sources":["../../../src/components/Drawers/useDrawers.ts"],"sourcesContent":["import { useContext } from \"react\";\nimport { DrawersContext } from \"./DrawersContext.js\";\n\nexport const useDrawers = () => {\n const context = useContext(DrawersContext);\n\n if (!context) {\n throw new Error(\"useDrawers must be used within a DrawersContext.Provider\");\n }\n\n return context;\n};\n"],"names":["useDrawers","context","useContext","DrawersContext","Error"],"mappings":";;AAGO,MAAMA,aAAa;IACtB,MAAMC,UAAUC,WAAWC;IAE3B,IAAI,CAACF,SACD,MAAM,IAAIG,MAAM;IAGpB,OAAOH;AACX"}
@@ -24,6 +24,7 @@ const LexicalLinkForm = ({ linkData, onSave, removeLink })=>{
24
24
  className: "flex w-full items-center justify-between mt-sm gap-sm"
25
25
  }, /*#__PURE__*/ react.createElement(TargetSwitch, null), /*#__PURE__*/ react.createElement(Button, {
26
26
  variant: "ghost",
27
+ size: "sm",
27
28
  text: "Remove link",
28
29
  className: "text-destructive-primary! [&_svg]:fill-destructive",
29
30
  onClick: removeLink,
@@ -33,6 +34,7 @@ const LexicalLinkForm = ({ linkData, onSave, removeLink })=>{
33
34
  })
34
35
  }), /*#__PURE__*/ react.createElement(Button, {
35
36
  variant: "primary",
37
+ size: "sm",
36
38
  text: "Save",
37
39
  onClick: form.submit
38
40
  }))));
@@ -57,6 +59,7 @@ const UrlInput = ()=>{
57
59
  inputRef.current = ref;
58
60
  },
59
61
  variant: "secondary",
62
+ size: "md",
60
63
  placeholder: "Enter link",
61
64
  autoFocus: true,
62
65
  startIcon: /*#__PURE__*/ react.createElement(Icon, {
@@ -1 +1 @@
1
- {"version":3,"file":"components/LexicalEditor/LexicalLinkForm.js","sources":["../../../src/components/LexicalEditor/LexicalLinkForm.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport type { FloatingLinkEditorPlugin } from \"@webiny/lexical-editor\";\nimport { Button, Grid, Icon, IconButton, Input, Switch } from \"@webiny/admin-ui\";\nimport { Form, useBind } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport { ReactComponent as GlobeIcon } from \"@webiny/icons/language.svg\";\nimport { ReactComponent as OpenInNew } from \"@webiny/icons/open_in_new.svg\";\nimport { ReactComponent as RemoveLink } from \"@webiny/icons/link_off.svg\";\n\ntype LexicalLinkForm = NonNullable<\n React.ComponentProps<typeof FloatingLinkEditorPlugin>[\"LinkForm\"]\n>;\ntype LinkFormProps = React.ComponentProps<LexicalLinkForm>;\n\nexport const LexicalLinkForm = ({ linkData, onSave, removeLink }: LinkFormProps) => {\n const onSubmit = (data: LinkFormProps[\"linkData\"]) => {\n onSave(data);\n };\n\n return (\n <Form data={linkData} onSubmit={onSubmit} validateOnFirstSubmit submitOnEnter>\n {form => (\n <div className={\"p-md\"}>\n <Grid gap={\"small\"}>\n <Grid.Column span={12}>\n <UrlInput />\n </Grid.Column>\n </Grid>\n <div className={\"flex w-full items-center justify-between mt-sm gap-sm\"}>\n <TargetSwitch />\n <Button\n variant={\"ghost\"}\n text={`Remove link`}\n className={\"text-destructive-primary! [&_svg]:fill-destructive\"}\n onClick={removeLink}\n icon={<Icon label={\"Remove link\"} icon={<RemoveLink />} />}\n />\n <Button variant={\"primary\"} text={`Save`} onClick={form.submit} />\n </div>\n </div>\n )}\n </Form>\n );\n};\n\nconst UrlInput = () => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const urlBind = useBind({\n name: \"url\",\n validators: validation.create(\"required,url:allowRelative:allowHref\")\n });\n\n useEffect(() => {\n if (inputRef.current) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 10);\n }\n }, []);\n\n const openInNewTab = () => {\n if (urlBind.validation.isValid !== false && urlBind.value) {\n window.open(urlBind.value, \"_blank\");\n }\n };\n\n return (\n <Input\n {...urlBind}\n inputRef={ref => {\n inputRef.current = ref;\n }}\n variant={\"secondary\"}\n placeholder={\"Enter link\"}\n autoFocus={true}\n startIcon={<Icon label=\"globe\" icon={<GlobeIcon />} />}\n endIcon={<IconButton variant=\"ghost\" icon={<OpenInNew />} onClick={openInNewTab} />}\n />\n );\n};\n\nconst TargetSwitch = () => {\n const targetBind = useBind({\n name: \"target\",\n defaultValue: \"_self\"\n });\n\n return (\n <Switch\n checked={targetBind.value === \"_blank\"}\n label={\"Open in new tab\"}\n onChange={value => {\n targetBind.onChange(value === true ? \"_blank\" : \"_self\");\n }}\n />\n );\n};\n"],"names":["LexicalLinkForm","linkData","onSave","removeLink","onSubmit","data","Form","form","Grid","UrlInput","TargetSwitch","Button","Icon","RemoveLink","inputRef","useRef","urlBind","useBind","validation","useEffect","setTimeout","openInNewTab","window","Input","ref","GlobeIcon","IconButton","OpenInNew","targetBind","Switch","value"],"mappings":";;;;;;;AAcO,MAAMA,kBAAkB,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,UAAU,EAAiB;IAC3E,MAAMC,WAAW,CAACC;QACdH,OAAOG;IACX;IAEA,OAAO,WAAP,GACI,oBAACC,MAAIA;QAAC,MAAML;QAAU,UAAUG;QAAU;QAAsB;OAC3DG,CAAAA,OAAAA,WAAAA,GACG,oBAAC;YAAI,WAAW;yBACZ,oBAACC,MAAIA;YAAC,KAAK;yBACP,oBAACA,KAAK,MAAM;YAAC,MAAM;yBACf,oBAACC,UAAQA,SAAAA,WAAAA,GAGjB,oBAAC;YAAI,WAAW;yBACZ,oBAACC,cAAYA,OAAAA,WAAAA,GACb,oBAACC,QAAMA;YACH,SAAS;YACT,MAAM;YACN,WAAW;YACX,SAASR;YACT,oBAAM,oBAACS,MAAIA;gBAAC,OAAO;gBAAe,oBAAM,oBAACC,6BAAUA;;0BAEvD,oBAACF,QAAMA;YAAC,SAAS;YAAW,MAAM;YAAQ,SAASJ,KAAK,MAAM;;AAMtF;AAEA,MAAME,WAAW;IACb,MAAMK,WAAWC,OAAgC;IAEjD,MAAMC,UAAUC,QAAQ;QACpB,MAAM;QACN,YAAYC,WAAW,MAAM,CAAC;IAClC;IAEAC,UAAU;QACN,IAAIL,SAAS,OAAO,EAChBM,WAAW;YACPN,SAAS,OAAO,EAAE;QACtB,GAAG;IAEX,GAAG,EAAE;IAEL,MAAMO,eAAe;QACjB,IAAIL,AAA+B,UAA/BA,QAAQ,UAAU,CAAC,OAAO,IAAcA,QAAQ,KAAK,EACrDM,OAAO,IAAI,CAACN,QAAQ,KAAK,EAAE;IAEnC;IAEA,OAAO,WAAP,GACI,oBAACO,OAAKA;QACD,GAAGP,OAAO;QACX,UAAUQ,CAAAA;YACNV,SAAS,OAAO,GAAGU;QACvB;QACA,SAAS;QACT,aAAa;QACb,WAAW;QACX,yBAAW,oBAACZ,MAAIA;YAAC,OAAM;YAAQ,oBAAM,oBAACa,gBAASA;;QAC/C,uBAAS,oBAACC,YAAUA;YAAC,SAAQ;YAAQ,oBAAM,oBAACC,gCAASA;YAAK,SAASN;;;AAG/E;AAEA,MAAMX,eAAe;IACjB,MAAMkB,aAAaX,QAAQ;QACvB,MAAM;QACN,cAAc;IAClB;IAEA,OAAO,WAAP,GACI,oBAACY,QAAMA;QACH,SAASD,AAAqB,aAArBA,WAAW,KAAK;QACzB,OAAO;QACP,UAAUE,CAAAA;YACNF,WAAW,QAAQ,CAACE,AAAU,SAAVA,QAAiB,WAAW;QACpD;;AAGZ"}
1
+ {"version":3,"file":"components/LexicalEditor/LexicalLinkForm.js","sources":["../../../src/components/LexicalEditor/LexicalLinkForm.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport type { FloatingLinkEditorPlugin } from \"@webiny/lexical-editor\";\nimport { Button, Grid, Icon, IconButton, Input, Switch } from \"@webiny/admin-ui\";\nimport { Form, useBind } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport { ReactComponent as GlobeIcon } from \"@webiny/icons/language.svg\";\nimport { ReactComponent as OpenInNew } from \"@webiny/icons/open_in_new.svg\";\nimport { ReactComponent as RemoveLink } from \"@webiny/icons/link_off.svg\";\n\ntype LexicalLinkForm = NonNullable<\n React.ComponentProps<typeof FloatingLinkEditorPlugin>[\"LinkForm\"]\n>;\ntype LinkFormProps = React.ComponentProps<LexicalLinkForm>;\n\nexport const LexicalLinkForm = ({ linkData, onSave, removeLink }: LinkFormProps) => {\n const onSubmit = (data: LinkFormProps[\"linkData\"]) => {\n onSave(data);\n };\n\n return (\n <Form data={linkData} onSubmit={onSubmit} validateOnFirstSubmit submitOnEnter>\n {form => (\n <div className={\"p-md\"}>\n <Grid gap={\"small\"}>\n <Grid.Column span={12}>\n <UrlInput />\n </Grid.Column>\n </Grid>\n <div className={\"flex w-full items-center justify-between mt-sm gap-sm\"}>\n <TargetSwitch />\n <Button\n variant={\"ghost\"}\n size={\"sm\"}\n text={`Remove link`}\n className={\"text-destructive-primary! [&_svg]:fill-destructive\"}\n onClick={removeLink}\n icon={<Icon label={\"Remove link\"} icon={<RemoveLink />} />}\n />\n <Button\n variant={\"primary\"}\n size={\"sm\"}\n text={`Save`}\n onClick={form.submit}\n />\n </div>\n </div>\n )}\n </Form>\n );\n};\n\nconst UrlInput = () => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const urlBind = useBind({\n name: \"url\",\n validators: validation.create(\"required,url:allowRelative:allowHref\")\n });\n\n useEffect(() => {\n if (inputRef.current) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 10);\n }\n }, []);\n\n const openInNewTab = () => {\n if (urlBind.validation.isValid !== false && urlBind.value) {\n window.open(urlBind.value, \"_blank\");\n }\n };\n\n return (\n <Input\n {...urlBind}\n inputRef={ref => {\n inputRef.current = ref;\n }}\n variant={\"secondary\"}\n size={\"md\"}\n placeholder={\"Enter link\"}\n autoFocus={true}\n startIcon={<Icon label=\"globe\" icon={<GlobeIcon />} />}\n endIcon={<IconButton variant=\"ghost\" icon={<OpenInNew />} onClick={openInNewTab} />}\n />\n );\n};\n\nconst TargetSwitch = () => {\n const targetBind = useBind({\n name: \"target\",\n defaultValue: \"_self\"\n });\n\n return (\n <Switch\n checked={targetBind.value === \"_blank\"}\n label={\"Open in new tab\"}\n onChange={value => {\n targetBind.onChange(value === true ? \"_blank\" : \"_self\");\n }}\n />\n );\n};\n"],"names":["LexicalLinkForm","linkData","onSave","removeLink","onSubmit","data","Form","form","Grid","UrlInput","TargetSwitch","Button","Icon","RemoveLink","inputRef","useRef","urlBind","useBind","validation","useEffect","setTimeout","openInNewTab","window","Input","ref","GlobeIcon","IconButton","OpenInNew","targetBind","Switch","value"],"mappings":";;;;;;;AAcO,MAAMA,kBAAkB,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,UAAU,EAAiB;IAC3E,MAAMC,WAAW,CAACC;QACdH,OAAOG;IACX;IAEA,OAAO,WAAP,GACI,oBAACC,MAAIA;QAAC,MAAML;QAAU,UAAUG;QAAU;QAAsB;OAC3DG,CAAAA,OAAAA,WAAAA,GACG,oBAAC;YAAI,WAAW;yBACZ,oBAACC,MAAIA;YAAC,KAAK;yBACP,oBAACA,KAAK,MAAM;YAAC,MAAM;yBACf,oBAACC,UAAQA,SAAAA,WAAAA,GAGjB,oBAAC;YAAI,WAAW;yBACZ,oBAACC,cAAYA,OAAAA,WAAAA,GACb,oBAACC,QAAMA;YACH,SAAS;YACT,MAAM;YACN,MAAM;YACN,WAAW;YACX,SAASR;YACT,oBAAM,oBAACS,MAAIA;gBAAC,OAAO;gBAAe,oBAAM,oBAACC,6BAAUA;;0BAEvD,oBAACF,QAAMA;YACH,SAAS;YACT,MAAM;YACN,MAAM;YACN,SAASJ,KAAK,MAAM;;AAOhD;AAEA,MAAME,WAAW;IACb,MAAMK,WAAWC,OAAgC;IAEjD,MAAMC,UAAUC,QAAQ;QACpB,MAAM;QACN,YAAYC,WAAW,MAAM,CAAC;IAClC;IAEAC,UAAU;QACN,IAAIL,SAAS,OAAO,EAChBM,WAAW;YACPN,SAAS,OAAO,EAAE;QACtB,GAAG;IAEX,GAAG,EAAE;IAEL,MAAMO,eAAe;QACjB,IAAIL,AAA+B,UAA/BA,QAAQ,UAAU,CAAC,OAAO,IAAcA,QAAQ,KAAK,EACrDM,OAAO,IAAI,CAACN,QAAQ,KAAK,EAAE;IAEnC;IAEA,OAAO,WAAP,GACI,oBAACO,OAAKA;QACD,GAAGP,OAAO;QACX,UAAUQ,CAAAA;YACNV,SAAS,OAAO,GAAGU;QACvB;QACA,SAAS;QACT,MAAM;QACN,aAAa;QACb,WAAW;QACX,yBAAW,oBAACZ,MAAIA;YAAC,OAAM;YAAQ,oBAAM,oBAACa,gBAASA;;QAC/C,uBAAS,oBAACC,YAAUA;YAAC,SAAQ;YAAQ,oBAAM,oBAACC,gCAASA;YAAK,SAASN;;;AAG/E;AAEA,MAAMX,eAAe;IACjB,MAAMkB,aAAaX,QAAQ;QACvB,MAAM;QACN,cAAc;IAClB;IAEA,OAAO,WAAP,GACI,oBAACY,QAAMA;QACH,SAASD,AAAqB,aAArBA,WAAW,KAAK;QACzB,OAAO;QACP,UAAUE,CAAAA;YACNF,WAAW,QAAQ,CAACE,AAAU,SAAVA,QAAiB,WAAW;QACpD;;AAGZ"}
@@ -8,7 +8,6 @@ declare function CanUsePrivateFiles({ children }: ChildrenProps): React.JSX.Elem
8
8
  declare function CanUseFileManagerThreatDetection({ children }: ChildrenProps): React.JSX.Element | null;
9
9
  declare function CanUseWorkflows({ children }: ChildrenProps): React.JSX.Element | null;
10
10
  declare function CanUseHcmsFieldPermissions({ children }: ChildrenProps): React.JSX.Element | null;
11
- declare function CanUseAbTesting({ children }: ChildrenProps): React.JSX.Element | null;
12
11
  export declare const Wcp: {
13
12
  CanUseMultiTenancy: typeof CanUseMultiTenancy;
14
13
  CanUseTeams: typeof CanUseTeams;
@@ -16,6 +15,5 @@ export declare const Wcp: {
16
15
  CanUseFileManagerThreatDetection: typeof CanUseFileManagerThreatDetection;
17
16
  CanUseWorkflows: typeof CanUseWorkflows;
18
17
  CanUseHcmsFieldPermissions: typeof CanUseHcmsFieldPermissions;
19
- CanUseAbTesting: typeof CanUseAbTesting;
20
18
  };
21
19
  export {};
package/components/Wcp.js CHANGED
@@ -24,18 +24,13 @@ function CanUseHcmsFieldPermissions({ children }) {
24
24
  const wcp = useWcp();
25
25
  return wcp.canUseHcmsFieldPermissions() ? /*#__PURE__*/ react.createElement(react.Fragment, null, children) : null;
26
26
  }
27
- function CanUseAbTesting({ children }) {
28
- const wcp = useWcp();
29
- return wcp.canUseAbTesting() ? /*#__PURE__*/ react.createElement(react.Fragment, null, children) : null;
30
- }
31
27
  const Wcp = {
32
28
  CanUseMultiTenancy: CanUseMultiTenancy,
33
29
  CanUseTeams: CanUseTeams,
34
30
  CanUsePrivateFiles: CanUsePrivateFiles,
35
31
  CanUseFileManagerThreatDetection: CanUseFileManagerThreatDetection,
36
32
  CanUseWorkflows: CanUseWorkflows,
37
- CanUseHcmsFieldPermissions: CanUseHcmsFieldPermissions,
38
- CanUseAbTesting: CanUseAbTesting
33
+ CanUseHcmsFieldPermissions: CanUseHcmsFieldPermissions
39
34
  };
40
35
  export { Wcp };
41
36
 
@@ -1 +1 @@
1
- {"version":3,"file":"components/Wcp.js","sources":["../../src/components/Wcp.tsx"],"sourcesContent":["import React from \"react\";\nimport { useWcp } from \"~/presentation/wcp/useWcp.js\";\n\ninterface ChildrenProps {\n children: React.ReactNode;\n}\n\nfunction CanUseMultiTenancy({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseFeature(\"multiTenancy\") ? <>{children}</> : null;\n}\n\nfunction CanUseTeams({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseTeams() ? <>{children}</> : null;\n}\n\nfunction CanUsePrivateFiles({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUsePrivateFiles() ? <>{children}</> : null;\n}\n\nfunction CanUseFileManagerThreatDetection({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseFileManagerThreatDetection() ? <>{children}</> : null;\n}\n\nfunction CanUseWorkflows({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseWorkflows() ? <>{children}</> : null;\n}\n\nfunction CanUseHcmsFieldPermissions({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseHcmsFieldPermissions() ? <>{children}</> : null;\n}\n\nfunction CanUseAbTesting({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseAbTesting() ? <>{children}</> : null;\n}\n\nexport const Wcp = {\n CanUseMultiTenancy,\n CanUseTeams,\n CanUsePrivateFiles,\n CanUseFileManagerThreatDetection,\n CanUseWorkflows,\n CanUseHcmsFieldPermissions,\n CanUseAbTesting\n};\n"],"names":["CanUseMultiTenancy","children","wcp","useWcp","CanUseTeams","CanUsePrivateFiles","CanUseFileManagerThreatDetection","CanUseWorkflows","CanUseHcmsFieldPermissions","CanUseAbTesting","Wcp"],"mappings":";;AAOA,SAASA,mBAAmB,EAAEC,QAAQ,EAAiB;IACnD,MAAMC,MAAMC;IACZ,OAAOD,IAAI,aAAa,CAAC,kBAAkB,WAAlB,GAAkB,0CAAGD,YAAe;AACjE;AAEA,SAASG,YAAY,EAAEH,QAAQ,EAAiB;IAC5C,MAAMC,MAAMC;IACZ,OAAOD,IAAI,WAAW,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACjD;AAEA,SAASI,mBAAmB,EAAEJ,QAAQ,EAAiB;IACnD,MAAMC,MAAMC;IACZ,OAAOD,IAAI,kBAAkB,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACxD;AAEA,SAASK,iCAAiC,EAAEL,QAAQ,EAAiB;IACjE,MAAMC,MAAMC;IACZ,OAAOD,IAAI,gCAAgC,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACtE;AAEA,SAASM,gBAAgB,EAAEN,QAAQ,EAAiB;IAChD,MAAMC,MAAMC;IACZ,OAAOD,IAAI,eAAe,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACrD;AAEA,SAASO,2BAA2B,EAAEP,QAAQ,EAAiB;IAC3D,MAAMC,MAAMC;IACZ,OAAOD,IAAI,0BAA0B,KAAK,WAAL,GAAK,0CAAGD,YAAe;AAChE;AAEA,SAASQ,gBAAgB,EAAER,QAAQ,EAAiB;IAChD,MAAMC,MAAMC;IACZ,OAAOD,IAAI,eAAe,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACrD;AAEO,MAAMS,MAAM;IACfV,oBAAAA;IACAI,aAAAA;IACAC,oBAAAA;IACAC,kCAAAA;IACAC,iBAAAA;IACAC,4BAAAA;IACAC,iBAAAA;AACJ"}
1
+ {"version":3,"file":"components/Wcp.js","sources":["../../src/components/Wcp.tsx"],"sourcesContent":["import React from \"react\";\nimport { useWcp } from \"~/presentation/wcp/useWcp.js\";\n\ninterface ChildrenProps {\n children: React.ReactNode;\n}\n\nfunction CanUseMultiTenancy({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseFeature(\"multiTenancy\") ? <>{children}</> : null;\n}\n\nfunction CanUseTeams({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseTeams() ? <>{children}</> : null;\n}\n\nfunction CanUsePrivateFiles({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUsePrivateFiles() ? <>{children}</> : null;\n}\n\nfunction CanUseFileManagerThreatDetection({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseFileManagerThreatDetection() ? <>{children}</> : null;\n}\n\nfunction CanUseWorkflows({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseWorkflows() ? <>{children}</> : null;\n}\n\nfunction CanUseHcmsFieldPermissions({ children }: ChildrenProps) {\n const wcp = useWcp();\n return wcp.canUseHcmsFieldPermissions() ? <>{children}</> : null;\n}\n\nexport const Wcp = {\n CanUseMultiTenancy,\n CanUseTeams,\n CanUsePrivateFiles,\n CanUseFileManagerThreatDetection,\n CanUseWorkflows,\n CanUseHcmsFieldPermissions\n};\n"],"names":["CanUseMultiTenancy","children","wcp","useWcp","CanUseTeams","CanUsePrivateFiles","CanUseFileManagerThreatDetection","CanUseWorkflows","CanUseHcmsFieldPermissions","Wcp"],"mappings":";;AAOA,SAASA,mBAAmB,EAAEC,QAAQ,EAAiB;IACnD,MAAMC,MAAMC;IACZ,OAAOD,IAAI,aAAa,CAAC,kBAAkB,WAAlB,GAAkB,0CAAGD,YAAe;AACjE;AAEA,SAASG,YAAY,EAAEH,QAAQ,EAAiB;IAC5C,MAAMC,MAAMC;IACZ,OAAOD,IAAI,WAAW,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACjD;AAEA,SAASI,mBAAmB,EAAEJ,QAAQ,EAAiB;IACnD,MAAMC,MAAMC;IACZ,OAAOD,IAAI,kBAAkB,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACxD;AAEA,SAASK,iCAAiC,EAAEL,QAAQ,EAAiB;IACjE,MAAMC,MAAMC;IACZ,OAAOD,IAAI,gCAAgC,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACtE;AAEA,SAASM,gBAAgB,EAAEN,QAAQ,EAAiB;IAChD,MAAMC,MAAMC;IACZ,OAAOD,IAAI,eAAe,KAAK,WAAL,GAAK,0CAAGD,YAAe;AACrD;AAEA,SAASO,2BAA2B,EAAEP,QAAQ,EAAiB;IAC3D,MAAMC,MAAMC;IACZ,OAAOD,IAAI,0BAA0B,KAAK,WAAL,GAAK,0CAAGD,YAAe;AAChE;AAEO,MAAMQ,MAAM;IACfT,oBAAAA;IACAI,aAAAA;IACAC,oBAAAA;IACAC,kCAAAA;IACAC,iBAAAA;IACAC,4BAAAA;AACJ"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export interface DrawerConfig {
3
+ name: string;
4
+ element: React.ReactElement;
5
+ }
6
+ export interface DrawerProps {
7
+ name: string;
8
+ element: React.ReactElement;
9
+ }
10
+ export declare const Drawer: ({ name, element }: DrawerProps) => React.JSX.Element;
@@ -0,0 +1,19 @@
1
+ import react from "react";
2
+ import { ConnectToProperties, Property, useIdGenerator } from "@webiny/react-properties";
3
+ const Drawer = ({ name, element })=>{
4
+ const getId = useIdGenerator("Drawer");
5
+ return /*#__PURE__*/ react.createElement(ConnectToProperties, {
6
+ name: "AdminConfig"
7
+ }, /*#__PURE__*/ react.createElement(Property, {
8
+ id: getId(name),
9
+ name: "drawers",
10
+ array: true,
11
+ value: {
12
+ name,
13
+ element
14
+ }
15
+ }));
16
+ };
17
+ export { Drawer };
18
+
19
+ //# sourceMappingURL=Drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config/AdminConfig/Drawer.js","sources":["../../../src/config/AdminConfig/Drawer.tsx"],"sourcesContent":["import React from \"react\";\nimport { ConnectToProperties, Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface DrawerConfig {\n name: string;\n element: React.ReactElement;\n}\n\nexport interface DrawerProps {\n name: string;\n element: React.ReactElement;\n}\n\nexport const Drawer = ({ name, element }: DrawerProps) => {\n const getId = useIdGenerator(\"Drawer\");\n\n return (\n <ConnectToProperties name={\"AdminConfig\"}>\n <Property id={getId(name)} name={\"drawers\"} array={true} value={{ name, element }} />\n </ConnectToProperties>\n );\n};\n"],"names":["Drawer","name","element","getId","useIdGenerator","ConnectToProperties","Property"],"mappings":";;AAaO,MAAMA,SAAS,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAe;IACjD,MAAMC,QAAQC,eAAe;IAE7B,OAAO,WAAP,GACI,oBAACC,qBAAmBA;QAAC,MAAM;qBACvB,oBAACC,UAAQA;QAAC,IAAIH,MAAMF;QAAO,MAAM;QAAW,OAAO;QAAM,OAAO;YAAEA;YAAMC;QAAQ;;AAG5F"}
@@ -7,6 +7,8 @@ import { type WidgetConfig } from "./AdminConfig/Widget.js";
7
7
  import type { PermissionRendererConfig } from "../permissions/types.js";
8
8
  import { Dialog } from "./AdminConfig/Dialog.js";
9
9
  import type { DialogConfig } from "./AdminConfig/Dialog.js";
10
+ import { Drawer } from "./AdminConfig/Drawer.js";
11
+ import type { DrawerConfig } from "./AdminConfig/Drawer.js";
10
12
  import type { FieldRendererConfig } from "./AdminConfig/FieldRenderer.js";
11
13
  import type { LayoutRendererConfig } from "./AdminConfig/LayoutRenderer.js";
12
14
  import type { EditorTheme } from "@webiny/lexical-theme";
@@ -28,6 +30,7 @@ export declare const useAdminConfig: () => {
28
30
  permissionRenderers: PermissionRendererConfig[];
29
31
  lexicalTheme: EditorTheme;
30
32
  dialogs: DialogConfig[];
33
+ drawers: DrawerConfig[];
31
34
  fieldRenderers: FieldRendererConfig[];
32
35
  layoutRenderers: LayoutRendererConfig[];
33
36
  };
@@ -482,6 +485,7 @@ export declare const AdminConfig: typeof Private & {
482
485
  };
483
486
  };
484
487
  Dialog: typeof Dialog;
488
+ Drawer: typeof Drawer;
485
489
  Form: {
486
490
  FieldRenderer: typeof import("./AdminConfig/FieldRenderer.js").FieldRenderer;
487
491
  LayoutRenderer: typeof import("./AdminConfig/LayoutRenderer.js").LayoutRenderer;
@@ -10,6 +10,7 @@ import { LexicalTheme } from "./AdminConfig/LexicalTheme.js";
10
10
  import { Title } from "./AdminConfig/Title.js";
11
11
  import { Logo } from "./AdminConfig/Logo.js";
12
12
  import { Dialog } from "./AdminConfig/Dialog.js";
13
+ import { Drawer } from "./AdminConfig/Drawer.js";
13
14
  import { Form } from "./AdminConfig/Form.js";
14
15
  import { createAdminConfig } from "./createAdminConfig.js";
15
16
  import { createLexicalTokens } from "@webiny/lexical-theme/createLexicalEditorTokens.js";
@@ -44,6 +45,7 @@ const useAdminConfig = ()=>{
44
45
  permissionRenderers: baseConfig.permissionRenderers ?? [],
45
46
  lexicalTheme,
46
47
  dialogs: baseConfig.dialogs ?? [],
48
+ drawers: baseConfig.drawers ?? [],
47
49
  fieldRenderers: baseConfig.fieldRenderers ?? [],
48
50
  layoutRenderers: baseConfig.layoutRenderers ?? []
49
51
  };
@@ -62,6 +64,7 @@ const AdminConfig = Object.assign(Private, {
62
64
  Security: Security,
63
65
  LexicalTheme: LexicalTheme,
64
66
  Dialog: Dialog,
67
+ Drawer: Drawer,
65
68
  Form: Form,
66
69
  useAdminConfig: useAdminConfig
67
70
  });
@@ -1 +1 @@
1
- {"version":3,"file":"config/AdminConfig.js","sources":["../../src/config/AdminConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { createProvider } from \"@webiny/app\";\nimport { Menu, type MenuConfig } from \"./AdminConfig/Menu.js\";\nimport type { TenantConfig } from \"./AdminConfig/Tenant.js\";\nimport { Tenant } from \"./AdminConfig/Tenant.js\";\nimport type { SupportMenuConfig } from \"./AdminConfig/Menu/SupportMenu.js\";\nimport type { UserMenuConfig } from \"./AdminConfig/Menu/UserMenu.js\";\nimport { Route } from \"./AdminConfig/Route.js\";\nimport { Theme } from \"./AdminConfig/Theme.js\";\nimport { Dashboard } from \"./AdminConfig/Dashboard.js\";\nimport { type WidgetConfig } from \"./AdminConfig/Widget.js\";\nimport { Security } from \"./AdminConfig/Security.js\";\nimport type { PermissionRendererConfig } from \"../permissions/types.js\";\nimport { LexicalTheme } from \"./AdminConfig/LexicalTheme.js\";\nimport { Title } from \"./AdminConfig/Title.js\";\nimport { Logo } from \"./AdminConfig/Logo.js\";\nimport { Dialog } from \"./AdminConfig/Dialog.js\";\nimport type { DialogConfig } from \"./AdminConfig/Dialog.js\";\nimport { Form } from \"./AdminConfig/Form.js\";\nimport type { FieldRendererConfig } from \"./AdminConfig/FieldRenderer.js\";\nimport type { LayoutRendererConfig } from \"./AdminConfig/LayoutRenderer.js\";\nimport { createAdminConfig } from \"./createAdminConfig.js\";\nimport type { EditorTheme } from \"@webiny/lexical-theme\";\nimport { createLexicalTokens } from \"@webiny/lexical-theme/createLexicalEditorTokens.js\";\n\nconst base = createAdminConfig<AdminConfig>();\n\nexport const AdminWithConfig = Object.assign(base.WithConfig, {\n displayName: \"AdminWithConfig\"\n});\n\ninterface AdminConfig {\n menus: MenuConfig[];\n supportMenus: SupportMenuConfig[];\n userMenus: UserMenuConfig[];\n tenant: TenantConfig;\n title: string;\n squareLogo: React.ReactNode;\n horizontalLogo: React.ReactNode;\n widgets: WidgetConfig[];\n permissionRenderers: PermissionRendererConfig[];\n lexicalTheme: EditorTheme;\n dialogs: DialogConfig[];\n fieldRenderers: FieldRendererConfig[];\n layoutRenderers: LayoutRendererConfig[];\n}\n\n/* Once the app fully renders (after the LoginScreen), apply protected configs. */\nexport const AdminConfigPlugin = <base.ApplyProtectedConfig />;\n\nexport const AdminConfigProvider = createProvider(Original => {\n return function AdminConfigProvider({ children }) {\n return (\n <AdminWithConfig>\n <base.ApplyPublicConfig />\n <Original>{children}</Original>\n </AdminWithConfig>\n );\n };\n});\n\nconst lexicalTokens = createLexicalTokens(\"wa-lx-\");\n\nexport const useAdminConfig = () => {\n const baseConfig = base.useConfig();\n\n const lexicalTheme: EditorTheme = {\n colors: baseConfig.lexicalTheme?.colors,\n typography: baseConfig.lexicalTheme?.typography || {},\n fontSizes: [],\n tokens: lexicalTokens,\n allowCustomColors: baseConfig.lexicalTheme?.allowCustomColors ?? false\n };\n\n return {\n menus: baseConfig.menus ?? [],\n userMenus: baseConfig.userMenus ?? [],\n supportMenus: baseConfig.supportMenus ?? [],\n title: baseConfig.title,\n logo: {\n squareLogo: baseConfig.squareLogo,\n horizontalLogo: baseConfig.horizontalLogo\n },\n widgets: baseConfig.widgets ?? [],\n permissionRenderers: baseConfig.permissionRenderers ?? [],\n lexicalTheme,\n dialogs: baseConfig.dialogs ?? [],\n fieldRenderers: baseConfig.fieldRenderers ?? [],\n layoutRenderers: baseConfig.layoutRenderers ?? []\n };\n};\n\nexport interface PublicProps {\n children: React.ReactNode;\n}\n\nexport const Public = ({ children }: PublicProps) => {\n return <base.PublicConfig>{children}</base.PublicConfig>;\n};\n\nexport interface PrivateProps {\n children: React.ReactNode;\n}\n\nexport const Private = ({ children }: PrivateProps) => {\n return <base.PrivateConfig>{children}</base.PrivateConfig>;\n};\n\nexport const AdminConfig = Object.assign(Private, {\n Public,\n Theme,\n Menu,\n Route,\n Tenant,\n Title,\n Logo,\n Dashboard,\n Security,\n LexicalTheme,\n Dialog,\n Form,\n useAdminConfig\n});\n"],"names":["base","createAdminConfig","AdminWithConfig","Object","AdminConfigPlugin","AdminConfigProvider","createProvider","Original","children","lexicalTokens","createLexicalTokens","useAdminConfig","baseConfig","lexicalTheme","Public","Private","AdminConfig","Theme","Menu","Route","Tenant","Title","Logo","Dashboard","Security","LexicalTheme","Dialog","Form"],"mappings":";;;;;;;;;;;;;;;AAyBA,MAAMA,OAAOC;AAEN,MAAMC,kBAAkBC,OAAO,MAAM,CAACH,KAAK,UAAU,EAAE;IAC1D,aAAa;AACjB;AAmBO,MAAMI,oBAAoB,WAAHA,GAAG,oBAACJ,KAAK,oBAAoB;AAEpD,MAAMK,kCAAsBC,eAAeC,CAAAA,WACvC,SAA6B,EAAEC,QAAQ,EAAE;QAC5C,OAAO,WAAP,GACI,oBAACN,iBAAeA,MAAAA,WAAAA,GACZ,oBAACF,KAAK,iBAAiB,uBACvB,oBAACO,UAAAA,MAAUC;IAGvB;AAGJ,MAAMC,gBAAgBC,oBAAoB;AAEnC,MAAMC,iBAAiB;IAC1B,MAAMC,aAAaZ,KAAK,SAAS;IAEjC,MAAMa,eAA4B;QAC9B,QAAQD,WAAW,YAAY,EAAE;QACjC,YAAYA,WAAW,YAAY,EAAE,cAAc,CAAC;QACpD,WAAW,EAAE;QACb,QAAQH;QACR,mBAAmBG,WAAW,YAAY,EAAE,qBAAqB;IACrE;IAEA,OAAO;QACH,OAAOA,WAAW,KAAK,IAAI,EAAE;QAC7B,WAAWA,WAAW,SAAS,IAAI,EAAE;QACrC,cAAcA,WAAW,YAAY,IAAI,EAAE;QAC3C,OAAOA,WAAW,KAAK;QACvB,MAAM;YACF,YAAYA,WAAW,UAAU;YACjC,gBAAgBA,WAAW,cAAc;QAC7C;QACA,SAASA,WAAW,OAAO,IAAI,EAAE;QACjC,qBAAqBA,WAAW,mBAAmB,IAAI,EAAE;QACzDC;QACA,SAASD,WAAW,OAAO,IAAI,EAAE;QACjC,gBAAgBA,WAAW,cAAc,IAAI,EAAE;QAC/C,iBAAiBA,WAAW,eAAe,IAAI,EAAE;IACrD;AACJ;AAMO,MAAME,SAAS,CAAC,EAAEN,QAAQ,EAAe,GACrC,WAAP,GAAO,oBAACR,KAAK,YAAY,QAAEQ;AAOxB,MAAMO,UAAU,CAAC,EAAEP,QAAQ,EAAgB,GACvC,WAAP,GAAO,oBAACR,KAAK,aAAa,QAAEQ;AAGzB,MAAMQ,cAAcb,OAAO,MAAM,CAACY,SAAS;IAC9CD,QAAAA;IACAG,OAAKA;IACLC,MAAIA;IACJC,OAAKA;IACLC,QAAMA;IACNC,OAAKA;IACLC,MAAIA;IACJC,WAASA;IACTC,UAAQA;IACRC,cAAYA;IACZC,QAAMA;IACNC,MAAIA;IACJhB,gBAAAA;AACJ"}
1
+ {"version":3,"file":"config/AdminConfig.js","sources":["../../src/config/AdminConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { createProvider } from \"@webiny/app\";\nimport { Menu, type MenuConfig } from \"./AdminConfig/Menu.js\";\nimport type { TenantConfig } from \"./AdminConfig/Tenant.js\";\nimport { Tenant } from \"./AdminConfig/Tenant.js\";\nimport type { SupportMenuConfig } from \"./AdminConfig/Menu/SupportMenu.js\";\nimport type { UserMenuConfig } from \"./AdminConfig/Menu/UserMenu.js\";\nimport { Route } from \"./AdminConfig/Route.js\";\nimport { Theme } from \"./AdminConfig/Theme.js\";\nimport { Dashboard } from \"./AdminConfig/Dashboard.js\";\nimport { type WidgetConfig } from \"./AdminConfig/Widget.js\";\nimport { Security } from \"./AdminConfig/Security.js\";\nimport type { PermissionRendererConfig } from \"../permissions/types.js\";\nimport { LexicalTheme } from \"./AdminConfig/LexicalTheme.js\";\nimport { Title } from \"./AdminConfig/Title.js\";\nimport { Logo } from \"./AdminConfig/Logo.js\";\nimport { Dialog } from \"./AdminConfig/Dialog.js\";\nimport type { DialogConfig } from \"./AdminConfig/Dialog.js\";\nimport { Drawer } from \"./AdminConfig/Drawer.js\";\nimport type { DrawerConfig } from \"./AdminConfig/Drawer.js\";\nimport { Form } from \"./AdminConfig/Form.js\";\nimport type { FieldRendererConfig } from \"./AdminConfig/FieldRenderer.js\";\nimport type { LayoutRendererConfig } from \"./AdminConfig/LayoutRenderer.js\";\nimport { createAdminConfig } from \"./createAdminConfig.js\";\nimport type { EditorTheme } from \"@webiny/lexical-theme\";\nimport { createLexicalTokens } from \"@webiny/lexical-theme/createLexicalEditorTokens.js\";\n\nconst base = createAdminConfig<AdminConfig>();\n\nexport const AdminWithConfig = Object.assign(base.WithConfig, {\n displayName: \"AdminWithConfig\"\n});\n\ninterface AdminConfig {\n menus: MenuConfig[];\n supportMenus: SupportMenuConfig[];\n userMenus: UserMenuConfig[];\n tenant: TenantConfig;\n title: string;\n squareLogo: React.ReactNode;\n horizontalLogo: React.ReactNode;\n widgets: WidgetConfig[];\n permissionRenderers: PermissionRendererConfig[];\n lexicalTheme: EditorTheme;\n dialogs: DialogConfig[];\n drawers: DrawerConfig[];\n fieldRenderers: FieldRendererConfig[];\n layoutRenderers: LayoutRendererConfig[];\n}\n\n/* Once the app fully renders (after the LoginScreen), apply protected configs. */\nexport const AdminConfigPlugin = <base.ApplyProtectedConfig />;\n\nexport const AdminConfigProvider = createProvider(Original => {\n return function AdminConfigProvider({ children }) {\n return (\n <AdminWithConfig>\n <base.ApplyPublicConfig />\n <Original>{children}</Original>\n </AdminWithConfig>\n );\n };\n});\n\nconst lexicalTokens = createLexicalTokens(\"wa-lx-\");\n\nexport const useAdminConfig = () => {\n const baseConfig = base.useConfig();\n\n const lexicalTheme: EditorTheme = {\n colors: baseConfig.lexicalTheme?.colors,\n typography: baseConfig.lexicalTheme?.typography || {},\n fontSizes: [],\n tokens: lexicalTokens,\n allowCustomColors: baseConfig.lexicalTheme?.allowCustomColors ?? false\n };\n\n return {\n menus: baseConfig.menus ?? [],\n userMenus: baseConfig.userMenus ?? [],\n supportMenus: baseConfig.supportMenus ?? [],\n title: baseConfig.title,\n logo: {\n squareLogo: baseConfig.squareLogo,\n horizontalLogo: baseConfig.horizontalLogo\n },\n widgets: baseConfig.widgets ?? [],\n permissionRenderers: baseConfig.permissionRenderers ?? [],\n lexicalTheme,\n dialogs: baseConfig.dialogs ?? [],\n drawers: baseConfig.drawers ?? [],\n fieldRenderers: baseConfig.fieldRenderers ?? [],\n layoutRenderers: baseConfig.layoutRenderers ?? []\n };\n};\n\nexport interface PublicProps {\n children: React.ReactNode;\n}\n\nexport const Public = ({ children }: PublicProps) => {\n return <base.PublicConfig>{children}</base.PublicConfig>;\n};\n\nexport interface PrivateProps {\n children: React.ReactNode;\n}\n\nexport const Private = ({ children }: PrivateProps) => {\n return <base.PrivateConfig>{children}</base.PrivateConfig>;\n};\n\nexport const AdminConfig = Object.assign(Private, {\n Public,\n Theme,\n Menu,\n Route,\n Tenant,\n Title,\n Logo,\n Dashboard,\n Security,\n LexicalTheme,\n Dialog,\n Drawer,\n Form,\n useAdminConfig\n});\n"],"names":["base","createAdminConfig","AdminWithConfig","Object","AdminConfigPlugin","AdminConfigProvider","createProvider","Original","children","lexicalTokens","createLexicalTokens","useAdminConfig","baseConfig","lexicalTheme","Public","Private","AdminConfig","Theme","Menu","Route","Tenant","Title","Logo","Dashboard","Security","LexicalTheme","Dialog","Drawer","Form"],"mappings":";;;;;;;;;;;;;;;;AA2BA,MAAMA,OAAOC;AAEN,MAAMC,kBAAkBC,OAAO,MAAM,CAACH,KAAK,UAAU,EAAE;IAC1D,aAAa;AACjB;AAoBO,MAAMI,oBAAoB,WAAHA,GAAG,oBAACJ,KAAK,oBAAoB;AAEpD,MAAMK,kCAAsBC,eAAeC,CAAAA,WACvC,SAA6B,EAAEC,QAAQ,EAAE;QAC5C,OAAO,WAAP,GACI,oBAACN,iBAAeA,MAAAA,WAAAA,GACZ,oBAACF,KAAK,iBAAiB,uBACvB,oBAACO,UAAAA,MAAUC;IAGvB;AAGJ,MAAMC,gBAAgBC,oBAAoB;AAEnC,MAAMC,iBAAiB;IAC1B,MAAMC,aAAaZ,KAAK,SAAS;IAEjC,MAAMa,eAA4B;QAC9B,QAAQD,WAAW,YAAY,EAAE;QACjC,YAAYA,WAAW,YAAY,EAAE,cAAc,CAAC;QACpD,WAAW,EAAE;QACb,QAAQH;QACR,mBAAmBG,WAAW,YAAY,EAAE,qBAAqB;IACrE;IAEA,OAAO;QACH,OAAOA,WAAW,KAAK,IAAI,EAAE;QAC7B,WAAWA,WAAW,SAAS,IAAI,EAAE;QACrC,cAAcA,WAAW,YAAY,IAAI,EAAE;QAC3C,OAAOA,WAAW,KAAK;QACvB,MAAM;YACF,YAAYA,WAAW,UAAU;YACjC,gBAAgBA,WAAW,cAAc;QAC7C;QACA,SAASA,WAAW,OAAO,IAAI,EAAE;QACjC,qBAAqBA,WAAW,mBAAmB,IAAI,EAAE;QACzDC;QACA,SAASD,WAAW,OAAO,IAAI,EAAE;QACjC,SAASA,WAAW,OAAO,IAAI,EAAE;QACjC,gBAAgBA,WAAW,cAAc,IAAI,EAAE;QAC/C,iBAAiBA,WAAW,eAAe,IAAI,EAAE;IACrD;AACJ;AAMO,MAAME,SAAS,CAAC,EAAEN,QAAQ,EAAe,GACrC,WAAP,GAAO,oBAACR,KAAK,YAAY,QAAEQ;AAOxB,MAAMO,UAAU,CAAC,EAAEP,QAAQ,EAAgB,GACvC,WAAP,GAAO,oBAACR,KAAK,aAAa,QAAEQ;AAGzB,MAAMQ,cAAcb,OAAO,MAAM,CAACY,SAAS;IAC9CD,QAAAA;IACAG,OAAKA;IACLC,MAAIA;IACJC,OAAKA;IACLC,QAAMA;IACNC,OAAKA;IACLC,MAAIA;IACJC,WAASA;IACTC,UAAQA;IACRC,cAAYA;IACZC,QAAMA;IACNC,QAAMA;IACNC,MAAIA;IACJjB,gBAAAA;AACJ"}
@@ -0,0 +1,8 @@
1
+ import type { FormattableDate, IDateFormatter } from "./abstractions.js";
2
+ declare class DefaultDateFormatterImpl implements IDateFormatter {
3
+ format(date: FormattableDate, options?: Intl.DateTimeFormatOptions): string;
4
+ }
5
+ export declare const DefaultDateFormatter: typeof DefaultDateFormatterImpl & {
6
+ __abstraction: import("@webiny/di").Abstraction<IDateFormatter>;
7
+ };
8
+ export {};
@@ -0,0 +1,25 @@
1
+ import { DateFormatter } from "./abstractions.js";
2
+ const DEFAULT_OPTIONS = {
3
+ year: "numeric",
4
+ month: "2-digit",
5
+ day: "2-digit",
6
+ hour: "2-digit",
7
+ minute: "2-digit",
8
+ hour12: false
9
+ };
10
+ class DefaultDateFormatterImpl {
11
+ format(date, options) {
12
+ const formatter = new Intl.DateTimeFormat(void 0, {
13
+ ...DEFAULT_OPTIONS,
14
+ ...options
15
+ });
16
+ return formatter.format(new Date(date));
17
+ }
18
+ }
19
+ const DefaultDateFormatter = DateFormatter.createImplementation({
20
+ implementation: DefaultDateFormatterImpl,
21
+ dependencies: []
22
+ });
23
+ export { DefaultDateFormatter };
24
+
25
+ //# sourceMappingURL=DefaultDateFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/dateFormatter/DefaultDateFormatter.js","sources":["../../../src/features/dateFormatter/DefaultDateFormatter.ts"],"sourcesContent":["import { DateFormatter } from \"./abstractions.js\";\nimport type { FormattableDate, IDateFormatter } from \"./abstractions.js\";\n\n/**\n * Default absolute date/time format used across the admin app: `YYYY-MM-DD HH:mm`, 24-hour, in the\n * browser's locale. This is the single place these dates are formatted, so projects can change the\n * format everywhere at once by decorating the DateFormatter abstraction.\n */\nconst DEFAULT_OPTIONS: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false\n};\n\nclass DefaultDateFormatterImpl implements IDateFormatter {\n format(date: FormattableDate, options?: Intl.DateTimeFormatOptions): string {\n const formatter = new Intl.DateTimeFormat(undefined, { ...DEFAULT_OPTIONS, ...options });\n return formatter.format(new Date(date));\n }\n}\n\nexport const DefaultDateFormatter = DateFormatter.createImplementation({\n implementation: DefaultDateFormatterImpl,\n dependencies: []\n});\n"],"names":["DEFAULT_OPTIONS","DefaultDateFormatterImpl","date","options","formatter","Intl","undefined","Date","DefaultDateFormatter","DateFormatter"],"mappings":";AAQA,MAAMA,kBAA8C;IAChD,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;AACZ;AAEA,MAAMC;IACF,OAAOC,IAAqB,EAAEC,OAAoC,EAAU;QACxE,MAAMC,YAAY,IAAIC,KAAK,cAAc,CAACC,QAAW;YAAE,GAAGN,eAAe;YAAE,GAAGG,OAAO;QAAC;QACtF,OAAOC,UAAU,MAAM,CAAC,IAAIG,KAAKL;IACrC;AACJ;AAEO,MAAMM,uBAAuBC,cAAc,oBAAoB,CAAC;IACnE,gBAAgBR;IAChB,cAAc,EAAE;AACpB"}