@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
package/base/Admin.js CHANGED
@@ -7,6 +7,7 @@ import { createUiStateProvider } from "./providers/UiStateProvider.js";
7
7
  import { createAdminUiStateProvider } from "./providers/AdminUiStateProvider.js";
8
8
  import { createUiProviders } from "./providers/UiProviders.js";
9
9
  import { createDialogsProvider } from "../components/Dialogs/DialogsContext.js";
10
+ import { createDrawersProvider } from "../components/Drawers/DrawersContext.js";
10
11
  import { DefaultIcons, IconPickerConfigProvider } from "../components/IconPicker/config/index.js";
11
12
  import { createRootContainer } from "./createRootContainer.js";
12
13
  import { WcpProvider } from "../presentation/wcp/WcpProvider.js";
@@ -17,6 +18,7 @@ import { SecurityFeature } from "../features/security/SecurityFeature.js";
17
18
  import { FormModelFeature } from "../features/formModel/feature.js";
18
19
  import { AdminConfigPlugin, AdminConfigProvider } from "../config/AdminConfig.js";
19
20
  import { WebinySdkFeature } from "../features/webinySdk/feature.js";
21
+ import { DateFormatterFeature } from "../features/dateFormatter/feature.js";
20
22
  import { ListPresenterFeature } from "../presentation/listPresenter/index.js";
21
23
  import { SortableFeature } from "../presentation/sortable/index.js";
22
24
  import { NotificationsRenderer } from "../features/notifications/NotificationsRenderer.js";
@@ -31,6 +33,7 @@ const Admin = ({ children, createApolloClient, createLegacyPlugins })=>{
31
33
  plugins.register(...createLegacyPlugins(container));
32
34
  ApolloClientFeature.register(container, apolloClient);
33
35
  SecurityFeature.register(container);
36
+ DateFormatterFeature.register(container);
34
37
  FormModelFeature.register(container);
35
38
  WebinySdkFeature.register(container);
36
39
  ListPresenterFeature.register(container);
@@ -42,6 +45,7 @@ const Admin = ({ children, createApolloClient, createLegacyPlugins })=>{
42
45
  const UiStateProvider = createUiStateProvider();
43
46
  const AdminUiStateProvider = createAdminUiStateProvider();
44
47
  const DialogsProvider = createDialogsProvider();
48
+ const DrawersProvider = createDrawersProvider();
45
49
  const TenancyProvider = createTenancyProvider();
46
50
  return /*#__PURE__*/ react.createElement(DiContainerProvider, {
47
51
  container: container
@@ -55,6 +59,7 @@ const Admin = ({ children, createApolloClient, createLegacyPlugins })=>{
55
59
  UIProviders,
56
60
  UiStateProvider,
57
61
  DialogsProvider,
62
+ DrawersProvider,
58
63
  IconPickerConfigProvider,
59
64
  AdminUiStateProvider,
60
65
  TenancyProvider
package/base/Admin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base/Admin.js","sources":["../../src/base/Admin.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Container } from \"@webiny/di\";\nimport { plugins } from \"@webiny/plugins\";\nimport { App, DiContainerProvider } from \"@webiny/app\";\nimport type { ApolloClientFactory } from \"./providers/ApolloProvider.js\";\nimport { createApolloProvider } from \"./providers/ApolloProvider.js\";\nimport { Base } from \"./Base.js\";\nimport { createUiStateProvider } from \"./providers/UiStateProvider.js\";\nimport { createAdminUiStateProvider } from \"./providers/AdminUiStateProvider.js\";\nimport { createUiProviders } from \"./providers/UiProviders.js\";\nimport { createDialogsProvider } from \"~/components/Dialogs/DialogsContext.js\";\nimport { DefaultIcons, IconPickerConfigProvider } from \"~/components/IconPicker/config/index.js\";\nimport { createRootContainer } from \"~/base/createRootContainer.js\";\nimport { WcpProvider } from \"~/presentation/wcp/WcpProvider.js\";\nimport { createTenancyProvider } from \"~/presentation/tenancy/createTenancyProvider.js\";\nimport { TelemetryAdminAppStart } from \"./TelemetryAdminAppStart.js\";\nimport { ApolloClientFeature } from \"~/features/apolloClient/feature.js\";\nimport { SecurityFeature } from \"~/features/security/SecurityFeature.js\";\nimport { FormModelFeature } from \"~/features/formModel/feature.js\";\nimport type { PluginCollection } from \"@webiny/plugins/types.js\";\nimport { AdminConfigPlugin, AdminConfigProvider } from \"~/config/AdminConfig.js\";\nimport { WebinySdkFeature } from \"~/features/webinySdk/feature.js\";\nimport { ListPresenterFeature } from \"~/presentation/listPresenter/index.js\";\nimport { SortableFeature } from \"~/presentation/sortable/index.js\";\nimport { NotificationsRenderer } from \"~/features/notifications/NotificationsRenderer.js\";\nimport { CommandPaletteFeature } from \"~/presentation/commandPalette/index.js\";\nimport { AdminCommandsFeature } from \"~/presentation/commandPalette/commands/feature.js\";\n\nexport interface AdminProps {\n createApolloClient: ApolloClientFactory;\n createLegacyPlugins: (container: Container) => PluginCollection;\n children?: React.ReactNode;\n}\n\nconst container = createRootContainer();\n\nexport const Admin = ({ children, createApolloClient, createLegacyPlugins }: AdminProps) => {\n const uri = process.env.REACT_APP_GRAPHQL_API_URL as string;\n const apolloClient = createApolloClient({ uri });\n\n plugins.register(...createLegacyPlugins(container));\n\n ApolloClientFeature.register(container, apolloClient);\n SecurityFeature.register(container);\n FormModelFeature.register(container);\n WebinySdkFeature.register(container);\n ListPresenterFeature.register(container);\n CommandPaletteFeature.register(container);\n AdminCommandsFeature.register(container);\n SortableFeature.register(container);\n\n const ApolloProvider = createApolloProvider(apolloClient);\n const UIProviders = createUiProviders();\n const UiStateProvider = createUiStateProvider();\n const AdminUiStateProvider = createAdminUiStateProvider();\n const DialogsProvider = createDialogsProvider();\n const TenancyProvider = createTenancyProvider();\n\n return (\n <DiContainerProvider container={container}>\n <TelemetryAdminAppStart />\n <ApolloProvider>\n <WcpProvider>\n <App\n plugins={[AdminConfigPlugin]}\n routes={[]}\n providers={[\n AdminConfigProvider,\n UIProviders,\n UiStateProvider,\n DialogsProvider,\n IconPickerConfigProvider,\n AdminUiStateProvider,\n TenancyProvider\n ]}\n >\n <Base />\n <DefaultIcons />\n <NotificationsRenderer />\n {children}\n </App>\n </WcpProvider>\n </ApolloProvider>\n </DiContainerProvider>\n );\n};\n"],"names":["container","createRootContainer","Admin","children","createApolloClient","createLegacyPlugins","uri","process","apolloClient","plugins","ApolloClientFeature","SecurityFeature","FormModelFeature","WebinySdkFeature","ListPresenterFeature","CommandPaletteFeature","AdminCommandsFeature","SortableFeature","ApolloProvider","createApolloProvider","UIProviders","createUiProviders","UiStateProvider","createUiStateProvider","AdminUiStateProvider","createAdminUiStateProvider","DialogsProvider","createDialogsProvider","TenancyProvider","createTenancyProvider","DiContainerProvider","TelemetryAdminAppStart","WcpProvider","App","AdminConfigPlugin","AdminConfigProvider","IconPickerConfigProvider","Base","DefaultIcons","NotificationsRenderer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAMA,YAAYC;AAEX,MAAMC,QAAQ,CAAC,EAAEC,QAAQ,EAAEC,kBAAkB,EAAEC,mBAAmB,EAAc;IACnF,MAAMC,MAAMC,QAAQ,GAAG,CAAC,yBAAyB;IACjD,MAAMC,eAAeJ,mBAAmB;QAAEE;IAAI;IAE9CG,QAAQ,QAAQ,IAAIJ,oBAAoBL;IAExCU,oBAAoB,QAAQ,CAACV,WAAWQ;IACxCG,gBAAgB,QAAQ,CAACX;IACzBY,iBAAiB,QAAQ,CAACZ;IAC1Ba,iBAAiB,QAAQ,CAACb;IAC1Bc,qBAAqB,QAAQ,CAACd;IAC9Be,sBAAsB,QAAQ,CAACf;IAC/BgB,qBAAqB,QAAQ,CAAChB;IAC9BiB,gBAAgB,QAAQ,CAACjB;IAEzB,MAAMkB,iBAAiBC,qBAAqBX;IAC5C,MAAMY,cAAcC;IACpB,MAAMC,kBAAkBC;IACxB,MAAMC,uBAAuBC;IAC7B,MAAMC,kBAAkBC;IACxB,MAAMC,kBAAkBC;IAExB,OAAO,WAAP,GACI,oBAACC,qBAAmBA;QAAC,WAAW9B;qBAC5B,oBAAC+B,wBAAsBA,OAAAA,WAAAA,GACvB,oBAACb,gBAAAA,MAAAA,WAAAA,GACG,oBAACc,aAAWA,MAAAA,WAAAA,GACR,oBAACC,KAAGA;QACA,SAAS;YAACC;SAAkB;QAC5B,QAAQ,EAAE;QACV,WAAW;YACPC;YACAf;YACAE;YACAI;YACAU;YACAZ;YACAI;SACH;qBAED,oBAACS,MAAIA,OAAAA,WAAAA,GACL,oBAACC,cAAYA,OAAAA,WAAAA,GACb,oBAACC,uBAAqBA,OACrBpC;AAMzB"}
1
+ {"version":3,"file":"base/Admin.js","sources":["../../src/base/Admin.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Container } from \"@webiny/di\";\nimport { plugins } from \"@webiny/plugins\";\nimport { App, DiContainerProvider } from \"@webiny/app\";\nimport type { ApolloClientFactory } from \"./providers/ApolloProvider.js\";\nimport { createApolloProvider } from \"./providers/ApolloProvider.js\";\nimport { Base } from \"./Base.js\";\nimport { createUiStateProvider } from \"./providers/UiStateProvider.js\";\nimport { createAdminUiStateProvider } from \"./providers/AdminUiStateProvider.js\";\nimport { createUiProviders } from \"./providers/UiProviders.js\";\nimport { createDialogsProvider } from \"~/components/Dialogs/DialogsContext.js\";\nimport { createDrawersProvider } from \"~/components/Drawers/DrawersContext.js\";\nimport { DefaultIcons, IconPickerConfigProvider } from \"~/components/IconPicker/config/index.js\";\nimport { createRootContainer } from \"~/base/createRootContainer.js\";\nimport { WcpProvider } from \"~/presentation/wcp/WcpProvider.js\";\nimport { createTenancyProvider } from \"~/presentation/tenancy/createTenancyProvider.js\";\nimport { TelemetryAdminAppStart } from \"./TelemetryAdminAppStart.js\";\nimport { ApolloClientFeature } from \"~/features/apolloClient/feature.js\";\nimport { SecurityFeature } from \"~/features/security/SecurityFeature.js\";\nimport { FormModelFeature } from \"~/features/formModel/feature.js\";\nimport type { PluginCollection } from \"@webiny/plugins/types.js\";\nimport { AdminConfigPlugin, AdminConfigProvider } from \"~/config/AdminConfig.js\";\nimport { WebinySdkFeature } from \"~/features/webinySdk/feature.js\";\nimport { DateFormatterFeature } from \"~/features/dateFormatter/feature.js\";\nimport { ListPresenterFeature } from \"~/presentation/listPresenter/index.js\";\nimport { SortableFeature } from \"~/presentation/sortable/index.js\";\nimport { NotificationsRenderer } from \"~/features/notifications/NotificationsRenderer.js\";\nimport { CommandPaletteFeature } from \"~/presentation/commandPalette/index.js\";\nimport { AdminCommandsFeature } from \"~/presentation/commandPalette/commands/feature.js\";\n\nexport interface AdminProps {\n createApolloClient: ApolloClientFactory;\n createLegacyPlugins: (container: Container) => PluginCollection;\n children?: React.ReactNode;\n}\n\nconst container = createRootContainer();\n\nexport const Admin = ({ children, createApolloClient, createLegacyPlugins }: AdminProps) => {\n const uri = process.env.REACT_APP_GRAPHQL_API_URL as string;\n const apolloClient = createApolloClient({ uri });\n\n plugins.register(...createLegacyPlugins(container));\n\n ApolloClientFeature.register(container, apolloClient);\n SecurityFeature.register(container);\n DateFormatterFeature.register(container);\n FormModelFeature.register(container);\n WebinySdkFeature.register(container);\n ListPresenterFeature.register(container);\n CommandPaletteFeature.register(container);\n AdminCommandsFeature.register(container);\n SortableFeature.register(container);\n\n const ApolloProvider = createApolloProvider(apolloClient);\n const UIProviders = createUiProviders();\n const UiStateProvider = createUiStateProvider();\n const AdminUiStateProvider = createAdminUiStateProvider();\n const DialogsProvider = createDialogsProvider();\n const DrawersProvider = createDrawersProvider();\n const TenancyProvider = createTenancyProvider();\n\n return (\n <DiContainerProvider container={container}>\n <TelemetryAdminAppStart />\n <ApolloProvider>\n <WcpProvider>\n <App\n plugins={[AdminConfigPlugin]}\n routes={[]}\n providers={[\n AdminConfigProvider,\n UIProviders,\n UiStateProvider,\n DialogsProvider,\n DrawersProvider,\n IconPickerConfigProvider,\n AdminUiStateProvider,\n TenancyProvider\n ]}\n >\n <Base />\n <DefaultIcons />\n <NotificationsRenderer />\n {children}\n </App>\n </WcpProvider>\n </ApolloProvider>\n </DiContainerProvider>\n );\n};\n"],"names":["container","createRootContainer","Admin","children","createApolloClient","createLegacyPlugins","uri","process","apolloClient","plugins","ApolloClientFeature","SecurityFeature","DateFormatterFeature","FormModelFeature","WebinySdkFeature","ListPresenterFeature","CommandPaletteFeature","AdminCommandsFeature","SortableFeature","ApolloProvider","createApolloProvider","UIProviders","createUiProviders","UiStateProvider","createUiStateProvider","AdminUiStateProvider","createAdminUiStateProvider","DialogsProvider","createDialogsProvider","DrawersProvider","createDrawersProvider","TenancyProvider","createTenancyProvider","DiContainerProvider","TelemetryAdminAppStart","WcpProvider","App","AdminConfigPlugin","AdminConfigProvider","IconPickerConfigProvider","Base","DefaultIcons","NotificationsRenderer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAMA,YAAYC;AAEX,MAAMC,QAAQ,CAAC,EAAEC,QAAQ,EAAEC,kBAAkB,EAAEC,mBAAmB,EAAc;IACnF,MAAMC,MAAMC,QAAQ,GAAG,CAAC,yBAAyB;IACjD,MAAMC,eAAeJ,mBAAmB;QAAEE;IAAI;IAE9CG,QAAQ,QAAQ,IAAIJ,oBAAoBL;IAExCU,oBAAoB,QAAQ,CAACV,WAAWQ;IACxCG,gBAAgB,QAAQ,CAACX;IACzBY,qBAAqB,QAAQ,CAACZ;IAC9Ba,iBAAiB,QAAQ,CAACb;IAC1Bc,iBAAiB,QAAQ,CAACd;IAC1Be,qBAAqB,QAAQ,CAACf;IAC9BgB,sBAAsB,QAAQ,CAAChB;IAC/BiB,qBAAqB,QAAQ,CAACjB;IAC9BkB,gBAAgB,QAAQ,CAAClB;IAEzB,MAAMmB,iBAAiBC,qBAAqBZ;IAC5C,MAAMa,cAAcC;IACpB,MAAMC,kBAAkBC;IACxB,MAAMC,uBAAuBC;IAC7B,MAAMC,kBAAkBC;IACxB,MAAMC,kBAAkBC;IACxB,MAAMC,kBAAkBC;IAExB,OAAO,WAAP,GACI,oBAACC,qBAAmBA;QAAC,WAAWjC;qBAC5B,oBAACkC,wBAAsBA,OAAAA,WAAAA,GACvB,oBAACf,gBAAAA,MAAAA,WAAAA,GACG,oBAACgB,aAAWA,MAAAA,WAAAA,GACR,oBAACC,KAAGA;QACA,SAAS;YAACC;SAAkB;QAC5B,QAAQ,EAAE;QACV,WAAW;YACPC;YACAjB;YACAE;YACAI;YACAE;YACAU;YACAd;YACAM;SACH;qBAED,oBAACS,MAAIA,OAAAA,WAAAA,GACL,oBAACC,cAAYA,OAAAA,WAAAA,GACb,oBAACC,uBAAqBA,OACrBvC;AAMzB"}
@@ -30,6 +30,7 @@ import { PermissionsRenderer } from "./FieldRenderers/PermissionsRenderer.js";
30
30
  import { RolesMultiSelectRenderer } from "./FieldRenderers/RolesMultiSelectRenderer.js";
31
31
  import { ApiKeyTokenRenderer } from "./FieldRenderers/ApiKeyTokenRenderer.js";
32
32
  import { MultiAutoCompleteRenderer } from "./FieldRenderers/MultiAutoCompleteRenderer.js";
33
+ import { AutoCompleteRenderer } from "./FieldRenderers/AutoCompleteRenderer.js";
33
34
  import { MultiSelectRenderer } from "./FieldRenderers/MultiSelectRenderer.js";
34
35
  import { RegisterFeature } from "../../exports/admin.js";
35
36
  import { MultiValueDynamicZoneFeature } from "./FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.js";
@@ -44,6 +45,9 @@ const DefaultFieldRenderers = ()=>/*#__PURE__*/ react.createElement(react.Fragme
44
45
  }), /*#__PURE__*/ react.createElement(AdminConfig.Form.FieldRenderer, {
45
46
  name: "select",
46
47
  component: SelectRenderer
48
+ }), /*#__PURE__*/ react.createElement(AdminConfig.Form.FieldRenderer, {
49
+ name: "autoComplete",
50
+ component: AutoCompleteRenderer
47
51
  }), /*#__PURE__*/ react.createElement(AdminConfig.Form.FieldRenderer, {
48
52
  name: "multiSelect",
49
53
  component: MultiSelectRenderer
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/DefaultFieldRenderers.js","sources":["../../../src/base/Base/DefaultFieldRenderers.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"~/config/AdminConfig.js\";\nimport { InputRenderer } from \"~/base/Base/FieldRenderers/InputRenderer.js\";\nimport { SelectRenderer } from \"~/base/Base/FieldRenderers/SelectRenderer.js\";\nimport { ObjectRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js\";\nimport { ObjectAccordionMultipleRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js\";\nimport { DynamicZoneRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js\";\nimport { PassthroughRenderer } from \"~/base/Base/FieldRenderers/PassthroughRenderer.js\";\nimport { TextareaRenderer } from \"~/base/Base/FieldRenderers/TextareaRenderer.js\";\nimport { SwitchRenderer } from \"~/base/Base/FieldRenderers/SwitchRenderer.js\";\nimport { NumberInputRenderer } from \"~/base/Base/FieldRenderers/NumberInputRenderer.js\";\nimport { NumberInputsRenderer } from \"~/base/Base/FieldRenderers/NumberInputsRenderer.js\";\nimport { TextInputsRenderer } from \"~/base/Base/FieldRenderers/TextInputsRenderer.js\";\nimport { TextareasRenderer } from \"~/base/Base/FieldRenderers/TextareasRenderer.js\";\nimport { TagsRenderer } from \"~/base/Base/FieldRenderers/TagsRenderer.js\";\nimport { RadioButtonsRenderer } from \"~/base/Base/FieldRenderers/RadioButtonsRenderer.js\";\nimport { CheckboxesRenderer } from \"~/base/Base/FieldRenderers/CheckboxesRenderer.js\";\nimport { DateTimeRenderer } from \"~/base/Base/FieldRenderers/DateTimeRenderer.js\";\nimport { DateTimeInputsRenderer } from \"~/base/Base/FieldRenderers/DateTimeInputsRenderer.js\";\nimport { HiddenRenderer } from \"~/base/Base/FieldRenderers/HiddenRenderer.js\";\nimport { KeyValueTagsRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js\";\nimport { FilePickerRenderer } from \"~/base/Base/FieldRenderers/FilePickerRenderer.js\";\nimport { FileUrlPickerRenderer } from \"~/base/Base/FieldRenderers/FileUrlPickerRenderer.js\";\nimport { MultiFilePickerRenderer } from \"~/base/Base/FieldRenderers/MultiFilePickerRenderer.js\";\nimport { CodeEditorRenderer } from \"~/base/Base/FieldRenderers/CodeEditorRenderer.js\";\nimport { LexicalRenderer } from \"~/base/Base/FieldRenderers/LexicalRenderer.js\";\nimport { LexicalEditorsRenderer } from \"~/base/Base/FieldRenderers/LexicalEditorsRenderer.js\";\nimport { PasswordInputRenderer } from \"~/base/Base/FieldRenderers/PasswordInputRenderer.js\";\nimport { PermissionsRenderer } from \"~/base/Base/FieldRenderers/PermissionsRenderer.js\";\nimport { RolesMultiSelectRenderer } from \"~/base/Base/FieldRenderers/RolesMultiSelectRenderer.js\";\nimport { ApiKeyTokenRenderer } from \"~/base/Base/FieldRenderers/ApiKeyTokenRenderer.js\";\nimport { MultiAutoCompleteRenderer } from \"~/base/Base/FieldRenderers/MultiAutoCompleteRenderer.js\";\nimport { MultiSelectRenderer } from \"~/base/Base/FieldRenderers/MultiSelectRenderer.js\";\nimport { RegisterFeature } from \"~/exports/admin.js\";\nimport { MultiValueDynamicZoneFeature } from \"~/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.js\";\n\nexport const DefaultFieldRenderers = () => {\n return (\n <>\n <RegisterFeature feature={MultiValueDynamicZoneFeature} />\n <AdminConfig>\n <AdminConfig.Form.FieldRenderer name={\"textInput\"} component={InputRenderer} />\n <AdminConfig.Form.FieldRenderer name={\"textarea\"} component={TextareaRenderer} />\n <AdminConfig.Form.FieldRenderer name={\"select\"} component={SelectRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"multiSelect\"}\n component={MultiSelectRenderer}\n />\n {/* @deprecated \"dropdown\" is for BC only./ */}\n <AdminConfig.Form.FieldRenderer name={\"dropdown\"} component={SelectRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"objectAccordionSingle\"}\n component={ObjectRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"objectAccordionMultiple\"}\n component={ObjectAccordionMultipleRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"dynamicZone\"}\n component={DynamicZoneRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"passthrough\"}\n component={PassthroughRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"switch\"} component={SwitchRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"numberInput\"}\n component={NumberInputRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"numberInputs\"}\n component={NumberInputsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"textInputs\"}\n component={TextInputsRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"textareas\"} component={TextareasRenderer} />\n <AdminConfig.Form.FieldRenderer name={\"tags\"} component={TagsRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"radioButtons\"}\n component={RadioButtonsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"checkboxes\"}\n component={CheckboxesRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"dateTimeInput\"}\n component={DateTimeRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"dateTimeInputs\"}\n component={DateTimeInputsRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"hidden\"} component={HiddenRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"keyValueTags\"}\n component={KeyValueTagsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"filePicker\"}\n component={FilePickerRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"multiFilePicker\"}\n component={MultiFilePickerRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"fileUrlPicker\"}\n component={FileUrlPickerRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"codeEditor\"}\n component={CodeEditorRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"lexical\"} component={LexicalRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"lexicalEditors\"}\n component={LexicalEditorsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"passwordInput\"}\n component={PasswordInputRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"permissions\"}\n component={PermissionsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"rolesMultiSelect\"}\n component={RolesMultiSelectRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"apiKeyToken\"}\n component={ApiKeyTokenRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"multiAutoComplete\"}\n component={MultiAutoCompleteRenderer}\n />\n </AdminConfig>\n </>\n );\n};\n"],"names":["DefaultFieldRenderers","RegisterFeature","MultiValueDynamicZoneFeature","AdminConfig","InputRenderer","TextareaRenderer","SelectRenderer","MultiSelectRenderer","ObjectRenderer","ObjectAccordionMultipleRenderer","DynamicZoneRenderer","PassthroughRenderer","SwitchRenderer","NumberInputRenderer","NumberInputsRenderer","TextInputsRenderer","TextareasRenderer","TagsRenderer","RadioButtonsRenderer","CheckboxesRenderer","DateTimeRenderer","DateTimeInputsRenderer","HiddenRenderer","KeyValueTagsRenderer","FilePickerRenderer","MultiFilePickerRenderer","FileUrlPickerRenderer","CodeEditorRenderer","LexicalRenderer","LexicalEditorsRenderer","PasswordInputRenderer","PermissionsRenderer","RolesMultiSelectRenderer","ApiKeyTokenRenderer","MultiAutoCompleteRenderer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCO,MAAMA,wBAAwB,IAC1B,WAAP,GACI,wDACI,oBAACC,iBAAeA;QAAC,SAASC;sBAC1B,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACA,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAa,WAAWC;sBAC9D,oBAACD,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAY,WAAWE;sBAC7D,oBAACF,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAU,WAAWG;sBAC3D,oBAACH,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWI;sBAGf,oBAACJ,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAY,WAAWG;sBAC7D,oBAACH,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWK;sBAEf,oBAACL,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWM;sBAEf,oBAACN,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWO;sBAEf,oBAACP,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWQ;sBAEf,oBAACR,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAU,WAAWS;sBAC3D,oBAACT,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWU;sBAEf,oBAACV,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWW;sBAEf,oBAACX,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWY;sBAEf,oBAACZ,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAa,WAAWa;sBAC9D,oBAACb,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAQ,WAAWc;sBACzD,oBAACd,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWe;sBAEf,oBAACf,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWgB;sBAEf,oBAAChB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWiB;sBAEf,oBAACjB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWkB;sBAEf,oBAAClB,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAU,WAAWmB;sBAC3D,oBAACnB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWoB;sBAEf,oBAACpB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWqB;sBAEf,oBAACrB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWsB;sBAEf,oBAACtB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWuB;sBAEf,oBAACvB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWwB;sBAEf,oBAACxB,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAW,WAAWyB;sBAC5D,oBAACzB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW0B;sBAEf,oBAAC1B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW2B;sBAEf,oBAAC3B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW4B;sBAEf,oBAAC5B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW6B;sBAEf,oBAAC7B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW8B;sBAEf,oBAAC9B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW+B"}
1
+ {"version":3,"file":"base/Base/DefaultFieldRenderers.js","sources":["../../../src/base/Base/DefaultFieldRenderers.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"~/config/AdminConfig.js\";\nimport { InputRenderer } from \"~/base/Base/FieldRenderers/InputRenderer.js\";\nimport { SelectRenderer } from \"~/base/Base/FieldRenderers/SelectRenderer.js\";\nimport { ObjectRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js\";\nimport { ObjectAccordionMultipleRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js\";\nimport { DynamicZoneRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js\";\nimport { PassthroughRenderer } from \"~/base/Base/FieldRenderers/PassthroughRenderer.js\";\nimport { TextareaRenderer } from \"~/base/Base/FieldRenderers/TextareaRenderer.js\";\nimport { SwitchRenderer } from \"~/base/Base/FieldRenderers/SwitchRenderer.js\";\nimport { NumberInputRenderer } from \"~/base/Base/FieldRenderers/NumberInputRenderer.js\";\nimport { NumberInputsRenderer } from \"~/base/Base/FieldRenderers/NumberInputsRenderer.js\";\nimport { TextInputsRenderer } from \"~/base/Base/FieldRenderers/TextInputsRenderer.js\";\nimport { TextareasRenderer } from \"~/base/Base/FieldRenderers/TextareasRenderer.js\";\nimport { TagsRenderer } from \"~/base/Base/FieldRenderers/TagsRenderer.js\";\nimport { RadioButtonsRenderer } from \"~/base/Base/FieldRenderers/RadioButtonsRenderer.js\";\nimport { CheckboxesRenderer } from \"~/base/Base/FieldRenderers/CheckboxesRenderer.js\";\nimport { DateTimeRenderer } from \"~/base/Base/FieldRenderers/DateTimeRenderer.js\";\nimport { DateTimeInputsRenderer } from \"~/base/Base/FieldRenderers/DateTimeInputsRenderer.js\";\nimport { HiddenRenderer } from \"~/base/Base/FieldRenderers/HiddenRenderer.js\";\nimport { KeyValueTagsRenderer } from \"~/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js\";\nimport { FilePickerRenderer } from \"~/base/Base/FieldRenderers/FilePickerRenderer.js\";\nimport { FileUrlPickerRenderer } from \"~/base/Base/FieldRenderers/FileUrlPickerRenderer.js\";\nimport { MultiFilePickerRenderer } from \"~/base/Base/FieldRenderers/MultiFilePickerRenderer.js\";\nimport { CodeEditorRenderer } from \"~/base/Base/FieldRenderers/CodeEditorRenderer.js\";\nimport { LexicalRenderer } from \"~/base/Base/FieldRenderers/LexicalRenderer.js\";\nimport { LexicalEditorsRenderer } from \"~/base/Base/FieldRenderers/LexicalEditorsRenderer.js\";\nimport { PasswordInputRenderer } from \"~/base/Base/FieldRenderers/PasswordInputRenderer.js\";\nimport { PermissionsRenderer } from \"~/base/Base/FieldRenderers/PermissionsRenderer.js\";\nimport { RolesMultiSelectRenderer } from \"~/base/Base/FieldRenderers/RolesMultiSelectRenderer.js\";\nimport { ApiKeyTokenRenderer } from \"~/base/Base/FieldRenderers/ApiKeyTokenRenderer.js\";\nimport { MultiAutoCompleteRenderer } from \"~/base/Base/FieldRenderers/MultiAutoCompleteRenderer.js\";\nimport { AutoCompleteRenderer } from \"~/base/Base/FieldRenderers/AutoCompleteRenderer.js\";\nimport { MultiSelectRenderer } from \"~/base/Base/FieldRenderers/MultiSelectRenderer.js\";\nimport { RegisterFeature } from \"~/exports/admin.js\";\nimport { MultiValueDynamicZoneFeature } from \"~/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/feature.js\";\n\nexport const DefaultFieldRenderers = () => {\n return (\n <>\n <RegisterFeature feature={MultiValueDynamicZoneFeature} />\n <AdminConfig>\n <AdminConfig.Form.FieldRenderer name={\"textInput\"} component={InputRenderer} />\n <AdminConfig.Form.FieldRenderer name={\"textarea\"} component={TextareaRenderer} />\n <AdminConfig.Form.FieldRenderer name={\"select\"} component={SelectRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"autoComplete\"}\n component={AutoCompleteRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"multiSelect\"}\n component={MultiSelectRenderer}\n />\n {/* @deprecated \"dropdown\" is for BC only./ */}\n <AdminConfig.Form.FieldRenderer name={\"dropdown\"} component={SelectRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"objectAccordionSingle\"}\n component={ObjectRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"objectAccordionMultiple\"}\n component={ObjectAccordionMultipleRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"dynamicZone\"}\n component={DynamicZoneRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"passthrough\"}\n component={PassthroughRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"switch\"} component={SwitchRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"numberInput\"}\n component={NumberInputRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"numberInputs\"}\n component={NumberInputsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"textInputs\"}\n component={TextInputsRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"textareas\"} component={TextareasRenderer} />\n <AdminConfig.Form.FieldRenderer name={\"tags\"} component={TagsRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"radioButtons\"}\n component={RadioButtonsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"checkboxes\"}\n component={CheckboxesRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"dateTimeInput\"}\n component={DateTimeRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"dateTimeInputs\"}\n component={DateTimeInputsRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"hidden\"} component={HiddenRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"keyValueTags\"}\n component={KeyValueTagsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"filePicker\"}\n component={FilePickerRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"multiFilePicker\"}\n component={MultiFilePickerRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"fileUrlPicker\"}\n component={FileUrlPickerRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"codeEditor\"}\n component={CodeEditorRenderer}\n />\n <AdminConfig.Form.FieldRenderer name={\"lexical\"} component={LexicalRenderer} />\n <AdminConfig.Form.FieldRenderer\n name={\"lexicalEditors\"}\n component={LexicalEditorsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"passwordInput\"}\n component={PasswordInputRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"permissions\"}\n component={PermissionsRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"rolesMultiSelect\"}\n component={RolesMultiSelectRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"apiKeyToken\"}\n component={ApiKeyTokenRenderer}\n />\n <AdminConfig.Form.FieldRenderer\n name={\"multiAutoComplete\"}\n component={MultiAutoCompleteRenderer}\n />\n </AdminConfig>\n </>\n );\n};\n"],"names":["DefaultFieldRenderers","RegisterFeature","MultiValueDynamicZoneFeature","AdminConfig","InputRenderer","TextareaRenderer","SelectRenderer","AutoCompleteRenderer","MultiSelectRenderer","ObjectRenderer","ObjectAccordionMultipleRenderer","DynamicZoneRenderer","PassthroughRenderer","SwitchRenderer","NumberInputRenderer","NumberInputsRenderer","TextInputsRenderer","TextareasRenderer","TagsRenderer","RadioButtonsRenderer","CheckboxesRenderer","DateTimeRenderer","DateTimeInputsRenderer","HiddenRenderer","KeyValueTagsRenderer","FilePickerRenderer","MultiFilePickerRenderer","FileUrlPickerRenderer","CodeEditorRenderer","LexicalRenderer","LexicalEditorsRenderer","PasswordInputRenderer","PermissionsRenderer","RolesMultiSelectRenderer","ApiKeyTokenRenderer","MultiAutoCompleteRenderer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCO,MAAMA,wBAAwB,IAC1B,WAAP,GACI,wDACI,oBAACC,iBAAeA;QAAC,SAASC;sBAC1B,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACA,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAa,WAAWC;sBAC9D,oBAACD,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAY,WAAWE;sBAC7D,oBAACF,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAU,WAAWG;sBAC3D,oBAACH,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWI;sBAEf,oBAACJ,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWK;sBAGf,oBAACL,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAY,WAAWG;sBAC7D,oBAACH,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWM;sBAEf,oBAACN,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWO;sBAEf,oBAACP,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWQ;sBAEf,oBAACR,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWS;sBAEf,oBAACT,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAU,WAAWU;sBAC3D,oBAACV,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWW;sBAEf,oBAACX,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWY;sBAEf,oBAACZ,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWa;sBAEf,oBAACb,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAa,WAAWc;sBAC9D,oBAACd,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAQ,WAAWe;sBACzD,oBAACf,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWgB;sBAEf,oBAAChB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWiB;sBAEf,oBAACjB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWkB;sBAEf,oBAAClB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWmB;sBAEf,oBAACnB,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAU,WAAWoB;sBAC3D,oBAACpB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWqB;sBAEf,oBAACrB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWsB;sBAEf,oBAACtB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWuB;sBAEf,oBAACvB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWwB;sBAEf,oBAACxB,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWyB;sBAEf,oBAACzB,YAAY,IAAI,CAAC,aAAa;QAAC,MAAM;QAAW,WAAW0B;sBAC5D,oBAAC1B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW2B;sBAEf,oBAAC3B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW4B;sBAEf,oBAAC5B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW6B;sBAEf,oBAAC7B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW8B;sBAEf,oBAAC9B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAW+B;sBAEf,oBAAC/B,YAAY,IAAI,CAAC,aAAa;QAC3B,MAAM;QACN,WAAWgC"}
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ declare module "../../../features/formModel/abstractions.js" {
3
+ interface IFieldRendererRegistry {
4
+ autoComplete: {
5
+ fieldType: "text" | "number";
6
+ options: true;
7
+ settings: undefined;
8
+ };
9
+ }
10
+ }
11
+ export declare const AutoCompleteRenderer: React.ComponentType<{
12
+ field: import("~/features/formModel/index.js").IFieldVM;
13
+ }>;
@@ -0,0 +1,29 @@
1
+ import react from "react";
2
+ import { createFieldRenderer } from "../../../features/formModel/createFieldRenderer.js";
3
+ import { AutoComplete } from "@webiny/admin-ui";
4
+ const AutoCompleteRenderer = createFieldRenderer(({ field })=>{
5
+ const options = field.options ?? [];
6
+ return /*#__PURE__*/ react.createElement(AutoComplete, {
7
+ label: field.label,
8
+ hint: field.help,
9
+ placeholder: field.placeholder,
10
+ description: field.description,
11
+ note: field.note,
12
+ value: null != field.value ? String(field.value) : "",
13
+ onValueChange: (value)=>{
14
+ field.onChange(value);
15
+ field.onBlur();
16
+ },
17
+ required: field.required,
18
+ disabled: field.disabled,
19
+ validation: field.validation,
20
+ options: options.map((opt)=>({
21
+ label: opt.label,
22
+ value: String(opt.value),
23
+ disabled: opt.disabled
24
+ }))
25
+ });
26
+ });
27
+ export { AutoCompleteRenderer };
28
+
29
+ //# sourceMappingURL=AutoCompleteRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base/Base/FieldRenderers/AutoCompleteRenderer.js","sources":["../../../../src/base/Base/FieldRenderers/AutoCompleteRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { createFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { AutoComplete } from \"@webiny/admin-ui\";\nimport type { IValueOption } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n autoComplete: { fieldType: \"text\" | \"number\"; options: true; settings: undefined };\n }\n}\n\nexport const AutoCompleteRenderer = createFieldRenderer(({ field }) => {\n const options: IValueOption[] = field.options ?? [];\n\n return (\n <AutoComplete\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 onValueChange={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":["AutoCompleteRenderer","createFieldRenderer","field","options","AutoComplete","String","value","opt"],"mappings":";;;AAWO,MAAMA,uBAAuBC,oBAAoB,CAAC,EAAEC,KAAK,EAAE;IAC9D,MAAMC,UAA0BD,MAAM,OAAO,IAAI,EAAE;IAEnD,OAAO,WAAP,GACI,oBAACE,cAAYA;QACT,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,eAAeI,CAAAA;YACXJ,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"}
@@ -5,18 +5,22 @@ import { LexicalEditor } from "../../../components/LexicalEditor/LexicalEditor.j
5
5
  import { FormComponentDescription, FormComponentLabel, FormComponentNote } from "@webiny/admin-ui";
6
6
  const placeholderStyles = {
7
7
  position: "absolute",
8
- top: 40,
9
- left: 25
8
+ top: 0,
9
+ left: 0,
10
+ padding: "8px 12px",
11
+ marginTop: 0,
12
+ color: "var(--text-color-neutral-muted)"
10
13
  };
11
14
  const contentEditableStyles = {
12
15
  minHeight: 200,
13
16
  display: "block",
14
- padding: 10
17
+ padding: "8px 12px"
15
18
  };
16
19
  const styles = {
17
- backgroundColor: "#fff",
18
- border: "1px solid #e1e1e1",
19
- padding: "10px 14px",
20
+ backgroundColor: "var(--color-neutral-base)",
21
+ border: "1px solid var(--border-color-neutral-muted)",
22
+ borderTop: "none",
23
+ borderRadius: "0 0 var(--radius-md) var(--radius-md)",
20
24
  minHeight: 200,
21
25
  maxHeight: 350
22
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/LexicalRenderer.js","sources":["../../../../src/base/Base/FieldRenderers/LexicalRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { StaticToolbar } from \"@webiny/lexical-editor\";\nimport { createFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { LexicalEditor } from \"~/components/LexicalEditor/LexicalEditor.js\";\nimport type { RichTextValueWithHtml } from \"~/components/LexicalEditor/lexicalValueWithHtml.js\";\nimport { FormComponentLabel } from \"@webiny/admin-ui\";\nimport { FormComponentDescription } from \"@webiny/admin-ui\";\nimport { FormComponentNote } from \"@webiny/admin-ui\";\n\ndeclare module \"../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n lexical: {\n fieldType: \"lexical\";\n settings: undefined;\n };\n }\n}\n\nconst placeholderStyles: React.CSSProperties = { position: \"absolute\", top: 40, left: 25 };\n\nconst contentEditableStyles: React.CSSProperties = {\n minHeight: 200,\n display: \"block\",\n padding: 10\n};\n\nconst styles: React.CSSProperties = {\n backgroundColor: \"#fff\",\n border: \"1px solid #e1e1e1\",\n padding: \"10px 14px\",\n minHeight: 200,\n maxHeight: 350\n};\n\nexport const LexicalRenderer = createFieldRenderer<\"lexical\">(({ field }) => {\n const value = field.value as RichTextValueWithHtml | undefined;\n const toolbar = <StaticToolbar />;\n\n return (\n <>\n <FormComponentLabel text={field.label} hint={field.help} disabled={field.disabled} />\n <FormComponentDescription text={field.description} disabled={field.disabled} />\n <LexicalEditor\n placeholder={field.placeholder || \"Enter your text here...\"}\n staticToolbar={toolbar}\n placeholderStyles={placeholderStyles}\n contentEditableStyles={contentEditableStyles}\n styles={styles}\n value={value}\n onChange={value => field.onChange(value)}\n />\n {field.note ? <FormComponentNote text={field.note} disabled={field.disabled} /> : null}\n </>\n );\n});\n"],"names":["placeholderStyles","contentEditableStyles","styles","LexicalRenderer","createFieldRenderer","field","value","toolbar","StaticToolbar","FormComponentLabel","FormComponentDescription","LexicalEditor","FormComponentNote"],"mappings":";;;;;AAkBA,MAAMA,oBAAyC;IAAE,UAAU;IAAY,KAAK;IAAI,MAAM;AAAG;AAEzF,MAAMC,wBAA6C;IAC/C,WAAW;IACX,SAAS;IACT,SAAS;AACb;AAEA,MAAMC,SAA8B;IAChC,iBAAiB;IACjB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,WAAW;AACf;AAEO,MAAMC,kBAAkBC,oBAA+B,CAAC,EAAEC,KAAK,EAAE;IACpE,MAAMC,QAAQD,MAAM,KAAK;IACzB,MAAME,UAAU,WAAVA,GAAU,oBAACC,eAAaA;IAE9B,OAAO,WAAP,GACI,wDACI,oBAACC,oBAAkBA;QAAC,MAAMJ,MAAM,KAAK;QAAE,MAAMA,MAAM,IAAI;QAAE,UAAUA,MAAM,QAAQ;sBACjF,oBAACK,0BAAwBA;QAAC,MAAML,MAAM,WAAW;QAAE,UAAUA,MAAM,QAAQ;sBAC3E,oBAACM,eAAaA;QACV,aAAaN,MAAM,WAAW,IAAI;QAClC,eAAeE;QACf,mBAAmBP;QACnB,uBAAuBC;QACvB,QAAQC;QACR,OAAOI;QACP,UAAUA,CAAAA,QAASD,MAAM,QAAQ,CAACC;QAErCD,MAAM,IAAI,GAAG,WAAH,GAAG,oBAACO,mBAAiBA;QAAC,MAAMP,MAAM,IAAI;QAAE,UAAUA,MAAM,QAAQ;SAAO;AAG9F"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/LexicalRenderer.js","sources":["../../../../src/base/Base/FieldRenderers/LexicalRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { StaticToolbar } from \"@webiny/lexical-editor\";\nimport { createFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { LexicalEditor } from \"~/components/LexicalEditor/LexicalEditor.js\";\nimport type { RichTextValueWithHtml } from \"~/components/LexicalEditor/lexicalValueWithHtml.js\";\nimport { FormComponentLabel } from \"@webiny/admin-ui\";\nimport { FormComponentDescription } from \"@webiny/admin-ui\";\nimport { FormComponentNote } from \"@webiny/admin-ui\";\n\ndeclare module \"../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n lexical: {\n fieldType: \"lexical\";\n settings: undefined;\n };\n }\n}\n\n// Overlay the contentEditable: same origin + same padding as `contentEditableStyles`, and\n// neutralize the Placeholder component's default -20px margin. This makes the placeholder's\n// first line land exactly on the editor's text start.\nconst placeholderStyles: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n padding: \"8px 12px\",\n marginTop: 0,\n // Font size/family come from the paragraph typography class (applied by RichTextEditor);\n // keep the placeholder muted.\n color: \"var(--text-color-neutral-muted)\"\n};\n\nconst contentEditableStyles: React.CSSProperties = {\n minHeight: 200,\n display: \"block\",\n padding: \"8px 12px\"\n};\n\nconst styles: React.CSSProperties = {\n backgroundColor: \"var(--color-neutral-base)\",\n border: \"1px solid var(--border-color-neutral-muted)\",\n // The static toolbar sits directly above and carries the top border, so the body\n // drops its top border and rounds only the bottom corners — together one seamless\n // rounded container, no internal divider (matches Figma).\n borderTop: \"none\",\n borderRadius: \"0 0 var(--radius-md) var(--radius-md)\",\n // Padding lives on the contentEditable only (avoids doubled inset).\n minHeight: 200,\n maxHeight: 350\n};\n\nexport const LexicalRenderer = createFieldRenderer<\"lexical\">(({ field }) => {\n const value = field.value as RichTextValueWithHtml | undefined;\n const toolbar = <StaticToolbar />;\n\n return (\n <>\n <FormComponentLabel text={field.label} hint={field.help} disabled={field.disabled} />\n <FormComponentDescription text={field.description} disabled={field.disabled} />\n <LexicalEditor\n placeholder={field.placeholder || \"Enter your text here...\"}\n staticToolbar={toolbar}\n placeholderStyles={placeholderStyles}\n contentEditableStyles={contentEditableStyles}\n styles={styles}\n value={value}\n onChange={value => field.onChange(value)}\n />\n {field.note ? <FormComponentNote text={field.note} disabled={field.disabled} /> : null}\n </>\n );\n});\n"],"names":["placeholderStyles","contentEditableStyles","styles","LexicalRenderer","createFieldRenderer","field","value","toolbar","StaticToolbar","FormComponentLabel","FormComponentDescription","LexicalEditor","FormComponentNote"],"mappings":";;;;;AAqBA,MAAMA,oBAAyC;IAC3C,UAAU;IACV,KAAK;IACL,MAAM;IACN,SAAS;IACT,WAAW;IAGX,OAAO;AACX;AAEA,MAAMC,wBAA6C;IAC/C,WAAW;IACX,SAAS;IACT,SAAS;AACb;AAEA,MAAMC,SAA8B;IAChC,iBAAiB;IACjB,QAAQ;IAIR,WAAW;IACX,cAAc;IAEd,WAAW;IACX,WAAW;AACf;AAEO,MAAMC,kBAAkBC,oBAA+B,CAAC,EAAEC,KAAK,EAAE;IACpE,MAAMC,QAAQD,MAAM,KAAK;IACzB,MAAME,UAAU,WAAVA,GAAU,oBAACC,eAAaA;IAE9B,OAAO,WAAP,GACI,wDACI,oBAACC,oBAAkBA;QAAC,MAAMJ,MAAM,KAAK;QAAE,MAAMA,MAAM,IAAI;QAAE,UAAUA,MAAM,QAAQ;sBACjF,oBAACK,0BAAwBA;QAAC,MAAML,MAAM,WAAW;QAAE,UAAUA,MAAM,QAAQ;sBAC3E,oBAACM,eAAaA;QACV,aAAaN,MAAM,WAAW,IAAI;QAClC,eAAeE;QACf,mBAAmBP;QACnB,uBAAuBC;QACvB,QAAQC;QACR,OAAOI;QACP,UAAUA,CAAAA,QAASD,MAAM,QAAQ,CAACC;QAErCD,MAAM,IAAI,GAAG,WAAH,GAAG,oBAACO,mBAAiBA;QAAC,MAAMP,MAAM,IAAI;QAAE,UAAUA,MAAM,QAAQ;SAAO;AAG9F"}
@@ -1,7 +1,8 @@
1
- import react, { useEffect, useMemo } from "react";
1
+ import react, { useEffect, useMemo, 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 { useContainer, 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_outline_svg_ReactComponent } from "@webiny/icons/delete_outline.svg";
@@ -30,6 +31,13 @@ const MultiValueDynamicZone = observer(({ field, addItemLabel, showContainer = t
30
31
  useEffect(()=>()=>presenter.dispose(), [
31
32
  presenter
32
33
  ]);
34
+ const focusInside = hasSubtreeFocusRequest(field.items.flatMap((i)=>i.fields));
35
+ const [containerOpen, setContainerOpen] = useState(true);
36
+ useEffect(()=>{
37
+ if (focusInside) setContainerOpen(true);
38
+ }, [
39
+ focusInside
40
+ ]);
33
41
  const itemCount = field.items.length;
34
42
  const clipboardItem = clipboard.item;
35
43
  const canPaste = null !== clipboardItem && "wby.dz" === clipboardItem.type && "string" == typeof clipboardItem.data[TEMPLATE_DISCRIMINATOR] && field.availableTemplates.some((t)=>t.id === clipboardItem.data[TEMPLATE_DISCRIMINATOR]);
@@ -87,7 +95,8 @@ const MultiValueDynamicZone = observer(({ field, addItemLabel, showContainer = t
87
95
  icon: /*#__PURE__*/ react.createElement(horizontal_rule_svg_ReactComponent, null)
88
96
  }),
89
97
  title: label,
90
- defaultOpen: true
98
+ open: containerOpen,
99
+ onOpenChange: setContainerOpen
91
100
  }, content));
92
101
  });
93
102
  const TemplatedListItem = observer(({ item, index, total, templates, disabled, sortable })=>{
@@ -101,6 +110,13 @@ const TemplatedListItem = observer(({ item, index, total, templates, disabled, s
101
110
  });
102
111
  const template = templates.find((t)=>t.id === item.templateId);
103
112
  const title = template?.label || `Item #${index + 1}`;
113
+ const focusInside = hasSubtreeFocusRequest(item.fields);
114
+ const [open, setOpen] = useState(false);
115
+ useEffect(()=>{
116
+ if (focusInside) setOpen(true);
117
+ }, [
118
+ focusInside
119
+ ]);
104
120
  const onDelete = ()=>{
105
121
  showConfirmation(()=>{
106
122
  item.remove();
@@ -160,7 +176,8 @@ const TemplatedListItem = observer(({ item, index, total, templates, disabled, s
160
176
  }), /*#__PURE__*/ react.createElement(Accordion.Item, {
161
177
  title: title,
162
178
  actions: disabled ? null : actions,
163
- defaultOpen: false,
179
+ open: open,
180
+ onOpenChange: setOpen,
164
181
  draggable: !disabled,
165
182
  dragHandleRef: sortable.handleRef
166
183
  }, /*#__PURE__*/ react.createElement(NestedLayout, {
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js","sources":["../../../../../../src/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion, Button, Tooltip, useToast } from \"@webiny/admin-ui\";\nimport { useFeature, useContainer } 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_outline.svg\";\nimport { ReactComponent as CloneIcon } from \"@webiny/icons/library_add.svg\";\nimport { ReactComponent as ArrowUpIcon } from \"@webiny/icons/expand_less.svg\";\nimport { ReactComponent as ArrowDownIcon } from \"@webiny/icons/expand_more.svg\";\nimport { ReactComponent as HorizontalRuleIcon } from \"@webiny/icons/horizontal_rule.svg\";\nimport type { IObjectFieldItemVM, 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 {\n MultiValueDynamicZonePresenter,\n type IMultiValueDynamicZonePresenter\n} from \"./abstractions.js\";\nimport type { ISortableItemProps } from \"~/presentation/sortable/index.js\";\nimport { Separator } from \"@webiny/admin-ui\";\n\ninterface MultiValueDynamicZoneProps {\n field: IObjectFieldVM;\n addItemLabel: string;\n showContainer?: boolean;\n}\n\nexport const MultiValueDynamicZone = observer(\n ({ field, addItemLabel, showContainer = true }: MultiValueDynamicZoneProps) => {\n const toast = useToast();\n const { clipboard } = useFeature(ClipboardFeature);\n const container = useContainer();\n\n const presenter = useMemo<IMultiValueDynamicZonePresenter>(() => {\n const p = container.resolve(MultiValueDynamicZonePresenter);\n p.init({ type: `dz:${field.name}`, onReorder: (from, to) => field.moveItem(from, to) });\n return p;\n }, []);\n\n useEffect(() => {\n return () => presenter.dispose();\n }, [presenter]);\n\n const itemCount = field.items.length;\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 <div className={\"flex flex-col gap-lg\"}>\n {itemCount > 0 ? (\n <Accordion\n background={\"base\"}\n variant={\"container\"}\n className={\"gap-md flex flex-col\"}\n >\n {field.items.map((item, index) => (\n <TemplatedListItem\n key={item.key}\n item={item}\n index={index}\n total={itemCount}\n templates={field.availableTemplates}\n disabled={field.disabled}\n sortable={presenter.getItemProps(index)}\n />\n ))}\n </Accordion>\n ) : null}\n {!field.disabled && (\n <div className={\"flex gap-sm items-center\"}>\n <AddTemplateButton\n label={addItemLabel}\n templates={field.availableTemplates}\n onSelect={template => field.addItem(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.addItem(pasted.data);\n toast.showSuccessToast({\n title: \"Pasted from clipboard.\"\n });\n }\n }}\n />\n )}\n </div>\n )}\n </div>\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 ?? \"\"} ({itemCount})\n </span>\n </Separator>\n <div className={\"mt-md\"}>{content}</div>\n </>\n );\n }\n\n const label = `${field.label || \"\"}${itemCount ? ` (${itemCount})` : \"\"}`;\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={label}\n defaultOpen={true}\n >\n {content}\n </Accordion.Item>\n </Accordion>\n );\n }\n);\n\ninterface TemplatedListItemProps {\n item: IObjectFieldItemVM;\n index: number;\n total: number;\n templates: { id: string; label: string }[];\n disabled: boolean;\n sortable: ISortableItemProps;\n}\n\nconst TemplatedListItem = observer(\n ({ item, index, total, templates, disabled, sortable }: TemplatedListItemProps) => {\n const toast = useToast();\n const { clipboard } = useFeature(ClipboardFeature);\n const { showConfirmation } = useConfirmationDialog({\n title: \"Delete item\",\n message: \"Are you sure you want to delete this item? This action is not reversible.\",\n acceptLabel: \"Yes, I'm sure!\",\n cancelLabel: \"No, leave it.\"\n });\n\n const template = templates.find(t => t.id === item.templateId);\n const title = template?.label || `Item #${index + 1}`;\n\n const onDelete = () => {\n showConfirmation(() => {\n item.remove();\n });\n };\n\n const actions = (\n <>\n <Accordion.Item.Action\n icon={<Tooltip trigger={<ArrowUpIcon />} content={\"Move up\"} />}\n onClick={item.moveUp}\n disabled={index === 0}\n />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<ArrowDownIcon />} content={\"Move down\"} />}\n onClick={item.moveDown}\n disabled={index === total - 1}\n />\n <Accordion.Item.Action.Separator />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<CopyIcon />} content={\"Copy to clipboard\"} />}\n onClick={() => {\n clipboard.copy({ type: \"wby.dz\", data: item.getClonedData() });\n toast.showSuccessToast({ title: \"Copied to clipboard.\" });\n }}\n />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<CloneIcon />} content={\"Duplicate\"} />}\n onClick={item.duplicate}\n />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<DeleteIcon />} content={\"Delete\"} />}\n onClick={onDelete}\n />\n </>\n );\n\n return (\n <div\n ref={sortable.ref}\n data-sortable-item=\"\"\n className={\"relative\"}\n style={{ opacity: sortable.isDragging ? 0.4 : 1 }}\n >\n {sortable.closestEdge === \"top\" && (\n <DropIndicator position={\"top\"} isFirst={index === 0} />\n )}\n <Accordion.Item\n title={title}\n actions={disabled ? null : actions}\n defaultOpen={false}\n draggable={!disabled}\n dragHandleRef={sortable.handleRef}\n >\n <NestedLayout layout={item.layout} />\n </Accordion.Item>\n {sortable.closestEdge === \"bottom\" && (\n <DropIndicator position={\"bottom\"} isLast={index === total - 1} />\n )}\n </div>\n );\n }\n);\n\nconst DropIndicator = ({\n position,\n isFirst = false,\n isLast = false\n}: {\n position: \"top\" | \"bottom\";\n isFirst?: boolean;\n isLast?: boolean;\n}) => {\n let offset = \"calc(var(--spacing-md) / -2)\";\n if (position === \"top\" && isFirst) {\n offset = \"0px\";\n }\n if (position === \"bottom\" && isLast) {\n offset = \"0px\";\n }\n\n return (\n <div\n className={\"absolute left-0 right-0 z-10\"}\n style={{\n [position]: offset,\n transform: position === \"top\" ? \"translateY(-50%)\" : \"translateY(50%)\"\n }}\n >\n <div className={\"w-full h-[2px] bg-primary rounded-full\"} />\n </div>\n );\n};\n"],"names":["MultiValueDynamicZone","observer","field","addItemLabel","showContainer","toast","useToast","clipboard","useFeature","ClipboardFeature","container","useContainer","presenter","useMemo","p","MultiValueDynamicZonePresenter","from","to","useEffect","itemCount","clipboardItem","canPaste","TEMPLATE_DISCRIMINATOR","t","content","Accordion","item","index","TemplatedListItem","AddTemplateButton","template","Button","PasteIcon","pasted","Separator","label","HorizontalRuleIcon","total","templates","disabled","sortable","showConfirmation","useConfirmationDialog","title","onDelete","actions","Tooltip","ArrowUpIcon","ArrowDownIcon","CopyIcon","CloneIcon","DeleteIcon","DropIndicator","NestedLayout","position","isFirst","isLast","offset"],"mappings":"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"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js","sources":["../../../../../../src/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion, Button, Tooltip, useToast } from \"@webiny/admin-ui\";\nimport { useFeature, useContainer } 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_outline.svg\";\nimport { ReactComponent as CloneIcon } from \"@webiny/icons/library_add.svg\";\nimport { ReactComponent as ArrowUpIcon } from \"@webiny/icons/expand_less.svg\";\nimport { ReactComponent as ArrowDownIcon } from \"@webiny/icons/expand_more.svg\";\nimport { ReactComponent as HorizontalRuleIcon } from \"@webiny/icons/horizontal_rule.svg\";\nimport type { IObjectFieldItemVM, 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 {\n MultiValueDynamicZonePresenter,\n type IMultiValueDynamicZonePresenter\n} from \"./abstractions.js\";\nimport type { ISortableItemProps } from \"~/presentation/sortable/index.js\";\nimport { Separator } from \"@webiny/admin-ui\";\n\ninterface MultiValueDynamicZoneProps {\n field: IObjectFieldVM;\n addItemLabel: string;\n showContainer?: boolean;\n}\n\nexport const MultiValueDynamicZone = observer(\n ({ field, addItemLabel, showContainer = true }: MultiValueDynamicZoneProps) => {\n const toast = useToast();\n const { clipboard } = useFeature(ClipboardFeature);\n const container = useContainer();\n\n const presenter = useMemo<IMultiValueDynamicZonePresenter>(() => {\n const p = container.resolve(MultiValueDynamicZonePresenter);\n p.init({ type: `dz:${field.name}`, onReorder: (from, to) => field.moveItem(from, to) });\n return p;\n }, []);\n\n useEffect(() => {\n return () => presenter.dispose();\n }, [presenter]);\n\n // Force the DZ list container open when a focus request lands anywhere\n // in its subtree, so \"jump to field\" can cascade through collapsed levels.\n const focusInside = hasSubtreeFocusRequest(field.items.flatMap(i => i.fields));\n const [containerOpen, setContainerOpen] = useState(true);\n useEffect(() => {\n if (focusInside) {\n setContainerOpen(true);\n }\n }, [focusInside]);\n\n const itemCount = field.items.length;\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 <div className={\"flex flex-col gap-lg\"}>\n {itemCount > 0 ? (\n <Accordion\n background={\"base\"}\n variant={\"container\"}\n className={\"gap-md flex flex-col\"}\n >\n {field.items.map((item, index) => (\n <TemplatedListItem\n key={item.key}\n item={item}\n index={index}\n total={itemCount}\n templates={field.availableTemplates}\n disabled={field.disabled}\n sortable={presenter.getItemProps(index)}\n />\n ))}\n </Accordion>\n ) : null}\n {!field.disabled && (\n <div className={\"flex gap-sm items-center\"}>\n <AddTemplateButton\n label={addItemLabel}\n templates={field.availableTemplates}\n onSelect={template => field.addItem(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.addItem(pasted.data);\n toast.showSuccessToast({\n title: \"Pasted from clipboard.\"\n });\n }\n }}\n />\n )}\n </div>\n )}\n </div>\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 ?? \"\"} ({itemCount})\n </span>\n </Separator>\n <div className={\"mt-md\"}>{content}</div>\n </>\n );\n }\n\n const label = `${field.label || \"\"}${itemCount ? ` (${itemCount})` : \"\"}`;\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={label}\n open={containerOpen}\n onOpenChange={setContainerOpen}\n >\n {content}\n </Accordion.Item>\n </Accordion>\n );\n }\n);\n\ninterface TemplatedListItemProps {\n item: IObjectFieldItemVM;\n index: number;\n total: number;\n templates: { id: string; label: string }[];\n disabled: boolean;\n sortable: ISortableItemProps;\n}\n\nconst TemplatedListItem = observer(\n ({ item, index, total, templates, disabled, sortable }: TemplatedListItemProps) => {\n const toast = useToast();\n const { clipboard } = useFeature(ClipboardFeature);\n const { showConfirmation } = useConfirmationDialog({\n title: \"Delete item\",\n message: \"Are you sure you want to delete this item? This action is not reversible.\",\n acceptLabel: \"Yes, I'm sure!\",\n cancelLabel: \"No, leave it.\"\n });\n\n const template = templates.find(t => t.id === item.templateId);\n const title = template?.label || `Item #${index + 1}`;\n\n // Force this item open when a focus request lands anywhere in its subtree.\n const focusInside = hasSubtreeFocusRequest(item.fields);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n if (focusInside) {\n setOpen(true);\n }\n }, [focusInside]);\n\n const onDelete = () => {\n showConfirmation(() => {\n item.remove();\n });\n };\n\n const actions = (\n <>\n <Accordion.Item.Action\n icon={<Tooltip trigger={<ArrowUpIcon />} content={\"Move up\"} />}\n onClick={item.moveUp}\n disabled={index === 0}\n />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<ArrowDownIcon />} content={\"Move down\"} />}\n onClick={item.moveDown}\n disabled={index === total - 1}\n />\n <Accordion.Item.Action.Separator />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<CopyIcon />} content={\"Copy to clipboard\"} />}\n onClick={() => {\n clipboard.copy({ type: \"wby.dz\", data: item.getClonedData() });\n toast.showSuccessToast({ title: \"Copied to clipboard.\" });\n }}\n />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<CloneIcon />} content={\"Duplicate\"} />}\n onClick={item.duplicate}\n />\n <Accordion.Item.Action\n icon={<Tooltip trigger={<DeleteIcon />} content={\"Delete\"} />}\n onClick={onDelete}\n />\n </>\n );\n\n return (\n <div\n ref={sortable.ref}\n data-sortable-item=\"\"\n className={\"relative\"}\n style={{ opacity: sortable.isDragging ? 0.4 : 1 }}\n >\n {sortable.closestEdge === \"top\" && (\n <DropIndicator position={\"top\"} isFirst={index === 0} />\n )}\n <Accordion.Item\n title={title}\n actions={disabled ? null : actions}\n open={open}\n onOpenChange={setOpen}\n draggable={!disabled}\n dragHandleRef={sortable.handleRef}\n >\n <NestedLayout layout={item.layout} />\n </Accordion.Item>\n {sortable.closestEdge === \"bottom\" && (\n <DropIndicator position={\"bottom\"} isLast={index === total - 1} />\n )}\n </div>\n );\n }\n);\n\nconst DropIndicator = ({\n position,\n isFirst = false,\n isLast = false\n}: {\n position: \"top\" | \"bottom\";\n isFirst?: boolean;\n isLast?: boolean;\n}) => {\n let offset = \"calc(var(--spacing-md) / -2)\";\n if (position === \"top\" && isFirst) {\n offset = \"0px\";\n }\n if (position === \"bottom\" && isLast) {\n offset = \"0px\";\n }\n\n return (\n <div\n className={\"absolute left-0 right-0 z-10\"}\n style={{\n [position]: offset,\n transform: position === \"top\" ? \"translateY(-50%)\" : \"translateY(50%)\"\n }}\n >\n <div className={\"w-full h-[2px] bg-primary rounded-full\"} />\n </div>\n );\n};\n"],"names":["MultiValueDynamicZone","observer","field","addItemLabel","showContainer","toast","useToast","clipboard","useFeature","ClipboardFeature","container","useContainer","presenter","useMemo","p","MultiValueDynamicZonePresenter","from","to","useEffect","focusInside","hasSubtreeFocusRequest","i","containerOpen","setContainerOpen","useState","itemCount","clipboardItem","canPaste","TEMPLATE_DISCRIMINATOR","t","content","Accordion","item","index","TemplatedListItem","AddTemplateButton","template","Button","PasteIcon","pasted","Separator","label","HorizontalRuleIcon","total","templates","disabled","sortable","showConfirmation","useConfirmationDialog","title","open","setOpen","onDelete","actions","Tooltip","ArrowUpIcon","ArrowDownIcon","CopyIcon","CloneIcon","DeleteIcon","DropIndicator","NestedLayout","position","isFirst","isLast","offset"],"mappings":"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"}
@@ -1,12 +1,20 @@
1
- import react, { useEffect, useMemo } from "react";
1
+ import react, { useEffect, useMemo, useState } from "react";
2
2
  import { observer } from "mobx-react-lite";
3
3
  import { Accordion } from "@webiny/admin-ui";
4
4
  import { useContainer } from "@webiny/app";
5
5
  import { createObjectFieldRenderer } from "../../../../features/formModel/createFieldRenderer.js";
6
6
  import { AddItemButton, ListItemRenderer } from "./ObjectFieldComponents.js";
7
7
  import { SortablePresenter } from "../../../../presentation/sortable/index.js";
8
+ import { hasSubtreeFocusRequest } from "../../../../features/formModel/index.js";
8
9
  const ObjectAccordionMultipleRenderer = createObjectFieldRenderer(({ field })=>{
9
10
  if (!field.isList) return null;
11
+ const focusInside = hasSubtreeFocusRequest(field.items.flatMap((i)=>i.fields));
12
+ const [open, setOpen] = useState(true);
13
+ useEffect(()=>{
14
+ if (focusInside) setOpen(true);
15
+ }, [
16
+ focusInside
17
+ ]);
10
18
  const settings = field.rendererSettings;
11
19
  const showContainer = settings?.container !== false;
12
20
  const addButton = /*#__PURE__*/ react.createElement(AddItemButton, {
@@ -26,7 +34,8 @@ const ObjectAccordionMultipleRenderer = createObjectFieldRenderer(({ field })=>{
26
34
  }, /*#__PURE__*/ react.createElement(Accordion.Item, {
27
35
  title: label,
28
36
  description: field.description,
29
- defaultOpen: true
37
+ open: open,
38
+ onOpenChange: setOpen
30
39
  }, /*#__PURE__*/ react.createElement("div", {
31
40
  className: "flex flex-col gap-lg"
32
41
  }, /*#__PURE__*/ react.createElement(ListItems, {
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion } from \"@webiny/admin-ui\";\nimport { useContainer } from \"@webiny/app\";\nimport { createObjectFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { ListItemRenderer, AddItemButton } from \"./ObjectFieldComponents.js\";\nimport { SortablePresenter } from \"~/presentation/sortable/index.js\";\nimport type { IObjectFieldVM } from \"~/features/formModel/index.js\";\n\ndeclare module \"../../../../features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n objectAccordionMultiple: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n container?: boolean;\n itemTitle?: string | ((data: Record<string, unknown>, index: number) => string);\n itemDescription?:\n | string\n | ((data: Record<string, unknown>, index: number) => string);\n addItemLabel?: string;\n };\n };\n }\n}\n\nexport const ObjectAccordionMultipleRenderer = createObjectFieldRenderer<\"objectAccordionMultiple\">(\n ({ field }) => {\n if (!field.isList) {\n return null;\n }\n\n const settings = field.rendererSettings;\n const showContainer = settings?.container !== false;\n\n const addButton = (\n <AddItemButton\n label={settings?.addItemLabel ?? `Add ${field.label || \"Item\"}`}\n disabled={field.disabled}\n onAdd={() => field.addItem()}\n />\n );\n\n if (!showContainer) {\n return (\n <div className={\"flex flex-col gap-lg\"}>\n <ListItems field={field} />\n {addButton}\n </div>\n );\n }\n\n const label = `${field.label || \"\"} ${field.items.length ? `(${field.items.length})` : \"\"}`;\n\n return (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item title={label} description={field.description} defaultOpen={true}>\n <div className={\"flex flex-col gap-lg\"}>\n <ListItems field={field} />\n {addButton}\n </div>\n </Accordion.Item>\n </Accordion>\n );\n }\n);\n\ninterface ListItemsProps {\n field: IObjectFieldVM;\n}\n\nconst ListItems = observer(({ field }: ListItemsProps) => {\n const settings = field.rendererSettings as\n | {\n itemTitle?: string | ((data: Record<string, unknown>, index: number) => string);\n itemDescription?: string | ((data: Record<string, unknown>, index: number) => string);\n }\n | undefined;\n\n const container = useContainer();\n const sortable = useMemo(() => {\n const p = container.resolve(SortablePresenter);\n p.init({ type: `obj:${field.name}`, onReorder: (from, to) => field.moveItem(from, to) });\n return p;\n }, []);\n\n useEffect(() => {\n return () => sortable.dispose();\n }, [sortable]);\n\n return (\n <div className={\"flex flex-col gap-md\"}>\n {field.items.map((item, index) => (\n <ListItemRenderer\n key={item.key}\n item={item}\n index={index}\n total={field.items.length}\n label={field.label}\n itemTitle={settings?.itemTitle}\n itemDescription={settings?.itemDescription}\n disabled={field.disabled}\n sortable={sortable.getItemProps(index)}\n />\n ))}\n </div>\n );\n});\n"],"names":["ObjectAccordionMultipleRenderer","createObjectFieldRenderer","field","settings","showContainer","addButton","AddItemButton","ListItems","label","Accordion","observer","container","useContainer","sortable","useMemo","p","SortablePresenter","from","to","useEffect","item","index","ListItemRenderer"],"mappings":";;;;;;;AA0BO,MAAMA,kCAAkCC,0BAC3C,CAAC,EAAEC,KAAK,EAAE;IACN,IAAI,CAACA,MAAM,MAAM,EACb,OAAO;IAGX,MAAMC,WAAWD,MAAM,gBAAgB;IACvC,MAAME,gBAAgBD,UAAU,cAAc;IAE9C,MAAME,YAAY,WAAZA,GACF,oBAACC,eAAaA;QACV,OAAOH,UAAU,gBAAgB,CAAC,IAAI,EAAED,MAAM,KAAK,IAAI,QAAQ;QAC/D,UAAUA,MAAM,QAAQ;QACxB,OAAO,IAAMA,MAAM,OAAO;;IAIlC,IAAI,CAACE,eACD,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACG,WAASA;QAAC,OAAOL;QACjBG;IAKb,MAAMG,QAAQ,GAAGN,MAAM,KAAK,IAAI,GAAG,CAAC,EAAEA,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAEA,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAE3F,OAAO,WAAP,GACI,oBAACO,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QAAC,OAAOD;QAAO,aAAaN,MAAM,WAAW;QAAE,aAAa;qBACvE,oBAAC;QAAI,WAAW;qBACZ,oBAACK,WAASA;QAAC,OAAOL;QACjBG;AAKrB;AAOJ,MAAME,YAAYG,SAAS,CAAC,EAAER,KAAK,EAAkB;IACjD,MAAMC,WAAWD,MAAM,gBAAgB;IAOvC,MAAMS,YAAYC;IAClB,MAAMC,WAAWC,QAAQ;QACrB,MAAMC,IAAIJ,UAAU,OAAO,CAACK;QAC5BD,EAAE,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,EAAEb,MAAM,IAAI,EAAE;YAAE,WAAW,CAACe,MAAMC,KAAOhB,MAAM,QAAQ,CAACe,MAAMC;QAAI;QACtF,OAAOH;IACX,GAAG,EAAE;IAELI,UAAU,IACC,IAAMN,SAAS,OAAO,IAC9B;QAACA;KAAS;IAEb,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;OACXX,MAAM,KAAK,CAAC,GAAG,CAAC,CAACkB,MAAMC,QAAAA,WAAAA,GACpB,oBAACC,kBAAgBA;YACb,KAAKF,KAAK,GAAG;YACb,MAAMA;YACN,OAAOC;YACP,OAAOnB,MAAM,KAAK,CAAC,MAAM;YACzB,OAAOA,MAAM,KAAK;YAClB,WAAWC,UAAU;YACrB,iBAAiBA,UAAU;YAC3B,UAAUD,MAAM,QAAQ;YACxB,UAAUW,SAAS,YAAY,CAACQ;;AAKpD"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion } from \"@webiny/admin-ui\";\nimport { useContainer } from \"@webiny/app\";\nimport { createObjectFieldRenderer } from \"~/features/formModel/createFieldRenderer.js\";\nimport { ListItemRenderer, AddItemButton } from \"./ObjectFieldComponents.js\";\nimport { SortablePresenter } from \"~/presentation/sortable/index.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 objectAccordionMultiple: {\n fieldType: \"object\";\n settings?: {\n open?: boolean;\n container?: boolean;\n itemTitle?: string | ((data: Record<string, unknown>, index: number) => string);\n itemDescription?:\n | string\n | ((data: Record<string, unknown>, index: number) => string);\n addItemLabel?: string;\n };\n };\n }\n}\n\nexport const ObjectAccordionMultipleRenderer = createObjectFieldRenderer<\"objectAccordionMultiple\">(\n ({ field }) => {\n if (!field.isList) {\n return null;\n }\n\n // Force the list container 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.items.flatMap(i => i.fields));\n const [open, setOpen] = useState(true);\n useEffect(() => {\n if (focusInside) {\n setOpen(true);\n }\n }, [focusInside]);\n\n const settings = field.rendererSettings;\n const showContainer = settings?.container !== false;\n\n const addButton = (\n <AddItemButton\n label={settings?.addItemLabel ?? `Add ${field.label || \"Item\"}`}\n disabled={field.disabled}\n onAdd={() => field.addItem()}\n />\n );\n\n if (!showContainer) {\n return (\n <div className={\"flex flex-col gap-lg\"}>\n <ListItems field={field} />\n {addButton}\n </div>\n );\n }\n\n const label = `${field.label || \"\"} ${field.items.length ? `(${field.items.length})` : \"\"}`;\n\n return (\n <Accordion background={\"base\"} variant={\"container\"}>\n <Accordion.Item\n title={label}\n description={field.description}\n open={open}\n onOpenChange={setOpen}\n >\n <div className={\"flex flex-col gap-lg\"}>\n <ListItems field={field} />\n {addButton}\n </div>\n </Accordion.Item>\n </Accordion>\n );\n }\n);\n\ninterface ListItemsProps {\n field: IObjectFieldVM;\n}\n\nconst ListItems = observer(({ field }: ListItemsProps) => {\n const settings = field.rendererSettings as\n | {\n itemTitle?: string | ((data: Record<string, unknown>, index: number) => string);\n itemDescription?: string | ((data: Record<string, unknown>, index: number) => string);\n }\n | undefined;\n\n const container = useContainer();\n const sortable = useMemo(() => {\n const p = container.resolve(SortablePresenter);\n p.init({ type: `obj:${field.name}`, onReorder: (from, to) => field.moveItem(from, to) });\n return p;\n }, []);\n\n useEffect(() => {\n return () => sortable.dispose();\n }, [sortable]);\n\n return (\n <div className={\"flex flex-col gap-md\"}>\n {field.items.map((item, index) => (\n <ListItemRenderer\n key={item.key}\n item={item}\n index={index}\n total={field.items.length}\n label={field.label}\n itemTitle={settings?.itemTitle}\n itemDescription={settings?.itemDescription}\n disabled={field.disabled}\n sortable={sortable.getItemProps(index)}\n />\n ))}\n </div>\n );\n});\n"],"names":["ObjectAccordionMultipleRenderer","createObjectFieldRenderer","field","focusInside","hasSubtreeFocusRequest","i","open","setOpen","useState","useEffect","settings","showContainer","addButton","AddItemButton","ListItems","label","Accordion","observer","container","useContainer","sortable","useMemo","p","SortablePresenter","from","to","item","index","ListItemRenderer"],"mappings":";;;;;;;;AA2BO,MAAMA,kCAAkCC,0BAC3C,CAAC,EAAEC,KAAK,EAAE;IACN,IAAI,CAACA,MAAM,MAAM,EACb,OAAO;IAKX,MAAMC,cAAcC,uBAAuBF,MAAM,KAAK,CAAC,OAAO,CAACG,CAAAA,IAAKA,EAAE,MAAM;IAC5E,MAAM,CAACC,MAAMC,QAAQ,GAAGC,SAAS;IACjCC,UAAU;QACN,IAAIN,aACAI,QAAQ;IAEhB,GAAG;QAACJ;KAAY;IAEhB,MAAMO,WAAWR,MAAM,gBAAgB;IACvC,MAAMS,gBAAgBD,UAAU,cAAc;IAE9C,MAAME,YAAY,WAAZA,GACF,oBAACC,eAAaA;QACV,OAAOH,UAAU,gBAAgB,CAAC,IAAI,EAAER,MAAM,KAAK,IAAI,QAAQ;QAC/D,UAAUA,MAAM,QAAQ;QACxB,OAAO,IAAMA,MAAM,OAAO;;IAIlC,IAAI,CAACS,eACD,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACG,WAASA;QAAC,OAAOZ;QACjBU;IAKb,MAAMG,QAAQ,GAAGb,MAAM,KAAK,IAAI,GAAG,CAAC,EAAEA,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAEA,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAE3F,OAAO,WAAP,GACI,oBAACc,WAASA;QAAC,YAAY;QAAQ,SAAS;qBACpC,oBAACA,UAAU,IAAI;QACX,OAAOD;QACP,aAAab,MAAM,WAAW;QAC9B,MAAMI;QACN,cAAcC;qBAEd,oBAAC;QAAI,WAAW;qBACZ,oBAACO,WAASA;QAAC,OAAOZ;QACjBU;AAKrB;AAOJ,MAAME,YAAYG,SAAS,CAAC,EAAEf,KAAK,EAAkB;IACjD,MAAMQ,WAAWR,MAAM,gBAAgB;IAOvC,MAAMgB,YAAYC;IAClB,MAAMC,WAAWC,QAAQ;QACrB,MAAMC,IAAIJ,UAAU,OAAO,CAACK;QAC5BD,EAAE,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,EAAEpB,MAAM,IAAI,EAAE;YAAE,WAAW,CAACsB,MAAMC,KAAOvB,MAAM,QAAQ,CAACsB,MAAMC;QAAI;QACtF,OAAOH;IACX,GAAG,EAAE;IAELb,UAAU,IACC,IAAMW,SAAS,OAAO,IAC9B;QAACA;KAAS;IAEb,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;OACXlB,MAAM,KAAK,CAAC,GAAG,CAAC,CAACwB,MAAMC,QAAAA,WAAAA,GACpB,oBAACC,kBAAgBA;YACb,KAAKF,KAAK,GAAG;YACb,MAAMA;YACN,OAAOC;YACP,OAAOzB,MAAM,KAAK,CAAC,MAAM;YACzB,OAAOA,MAAM,KAAK;YAClB,WAAWQ,UAAU;YACrB,iBAAiBA,UAAU;YAC3B,UAAUR,MAAM,QAAQ;YACxB,UAAUkB,SAAS,YAAY,CAACO;;AAKpD"}
@@ -5,6 +5,7 @@ import { ReactComponent } from "@webiny/icons/add.svg";
5
5
  import { ReactComponent as delete_outline_svg_ReactComponent } from "@webiny/icons/delete_outline.svg";
6
6
  import { ReactComponent as arrow_upward_svg_ReactComponent } from "@webiny/icons/arrow_upward.svg";
7
7
  import { ReactComponent as arrow_downward_svg_ReactComponent } from "@webiny/icons/arrow_downward.svg";
8
+ import { hasSubtreeFocusRequest } from "../../../../features/formModel/index.js";
8
9
  import { LayoutNodeRenderer } from "../../../../features/formModel/FormView.js";
9
10
  import { resolveItemDescription, resolveItemTitle } from "./resolveItemTitle.js";
10
11
  const NestedLayout = observer(({ layout })=>/*#__PURE__*/ react.createElement("div", {
@@ -15,7 +16,7 @@ const NestedLayout = observer(({ layout })=>/*#__PURE__*/ react.createElement("d
15
16
  }))));
16
17
  const ListItemRenderer = observer(({ item, index, total, label, itemTitle, itemDescription, disabled, sortable })=>{
17
18
  const [open, setOpen] = useState(false);
18
- const hasFocusRequest = item.fields.some((f)=>f.focusRequested);
19
+ const hasFocusRequest = hasSubtreeFocusRequest(item.fields);
19
20
  useEffect(()=>{
20
21
  if (hasFocusRequest) setOpen(true);
21
22
  }, [
@@ -1 +1 @@
1
- {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion, Button, IconButton } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete_outline.svg\";\nimport { ReactComponent as ArrowUp } from \"@webiny/icons/arrow_upward.svg\";\nimport { ReactComponent as ArrowDown } from \"@webiny/icons/arrow_downward.svg\";\nimport type { IObjectFieldItemVM, LayoutNodeVM } from \"~/features/formModel/index.js\";\nimport { LayoutNodeRenderer } from \"~/features/formModel/FormView.js\";\nimport { resolveItemTitle, resolveItemDescription } from \"./resolveItemTitle.js\";\nimport type { ISortableItemProps } from \"~/presentation/sortable/index.js\";\n\nexport const NestedLayout = observer(({ layout }: { layout: LayoutNodeVM[] }) => {\n return (\n <div className={\"flex flex-col gap-md\"}>\n {layout.map((node, index) => (\n <LayoutNodeRenderer key={index} node={node} />\n ))}\n </div>\n );\n});\n\nexport interface ListItemRendererProps {\n item: IObjectFieldItemVM;\n index: number;\n total: number;\n label?: string;\n itemTitle?: string | ((data: Record<string, unknown>, index: number) => string);\n itemDescription?: string | ((data: Record<string, unknown>, index: number) => string);\n disabled: boolean;\n sortable?: ISortableItemProps;\n}\n\nexport const ListItemRenderer = observer(\n ({\n item,\n index,\n total,\n label,\n itemTitle,\n itemDescription,\n disabled,\n sortable\n }: ListItemRendererProps) => {\n const [open, setOpen] = useState(false);\n const hasFocusRequest = item.fields.some(f => f.focusRequested);\n\n useEffect(() => {\n if (hasFocusRequest) {\n setOpen(true);\n }\n }, [hasFocusRequest]);\n\n const actions = (\n <>\n <IconButton\n icon={<ArrowDown />}\n onClick={e => {\n e.stopPropagation();\n item.moveDown();\n }}\n variant=\"ghost\"\n disabled={index === total - 1}\n />\n <IconButton\n icon={<ArrowUp />}\n onClick={e => {\n e.stopPropagation();\n item.moveUp();\n }}\n variant=\"ghost\"\n disabled={index === 0}\n />\n <Accordion.Item.Action.Separator />\n <IconButton\n icon={<DeleteIcon />}\n onClick={e => {\n e.stopPropagation();\n item.remove();\n }}\n variant=\"ghost\"\n />\n </>\n );\n\n const accordion = (\n <Accordion\n background={\"base\"}\n variant={\"container\"}\n openClosedIndicatorPosition={\"left\"}\n >\n <Accordion.Item\n title={resolveItemTitle(item, index, label, itemTitle)}\n description={resolveItemDescription(item, index, itemDescription)}\n actions={disabled ? null : actions}\n open={open}\n onOpenChange={setOpen}\n draggable={!disabled && sortable !== undefined}\n dragHandleRef={sortable?.handleRef}\n >\n <NestedLayout layout={item.layout} />\n </Accordion.Item>\n </Accordion>\n );\n\n if (!sortable) {\n return accordion;\n }\n\n return (\n <div\n ref={sortable.ref}\n data-sortable-item=\"\"\n className={\"relative\"}\n style={{ opacity: sortable.isDragging ? 0.4 : 1 }}\n >\n {sortable.closestEdge === \"top\" && (\n <DropIndicator position={\"top\"} isFirst={index === 0} />\n )}\n {accordion}\n {sortable.closestEdge === \"bottom\" && (\n <DropIndicator position={\"bottom\"} isLast={index === total - 1} />\n )}\n </div>\n );\n }\n);\n\nconst DropIndicator = ({\n position,\n isFirst = false,\n isLast = false\n}: {\n position: \"top\" | \"bottom\";\n isFirst?: boolean;\n isLast?: boolean;\n}) => {\n let offset = \"calc(var(--spacing-md) / -2)\";\n if (position === \"top\" && isFirst) {\n offset = \"0px\";\n }\n if (position === \"bottom\" && isLast) {\n offset = \"0px\";\n }\n\n return (\n <div\n className={\"absolute left-0 right-0 z-10\"}\n style={{\n [position]: offset,\n transform: position === \"top\" ? \"translateY(-50%)\" : \"translateY(50%)\"\n }}\n >\n <div className={\"w-full h-[2px] bg-primary rounded-full\"} />\n </div>\n );\n};\n\nexport interface AddItemButtonProps {\n label?: string;\n disabled: boolean;\n onAdd: () => void;\n}\n\nexport const AddItemButton = ({ label, disabled, onAdd }: AddItemButtonProps) => {\n return (\n <div>\n <Button\n icon={<AddIcon />}\n text={label || \"Add Item\"}\n variant={\"tertiary\"}\n onClick={onAdd}\n disabled={disabled}\n />\n </div>\n );\n};\n"],"names":["NestedLayout","observer","layout","node","index","LayoutNodeRenderer","ListItemRenderer","item","total","label","itemTitle","itemDescription","disabled","sortable","open","setOpen","useState","hasFocusRequest","f","useEffect","actions","IconButton","ArrowDown","e","ArrowUp","Accordion","DeleteIcon","accordion","resolveItemTitle","resolveItemDescription","undefined","DropIndicator","position","isFirst","isLast","offset","AddItemButton","onAdd","Button","AddIcon"],"mappings":"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"}
1
+ {"version":3,"file":"base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js","sources":["../../../../../src/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Accordion, Button, IconButton } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete_outline.svg\";\nimport { ReactComponent as ArrowUp } from \"@webiny/icons/arrow_upward.svg\";\nimport { ReactComponent as ArrowDown } from \"@webiny/icons/arrow_downward.svg\";\nimport type { IObjectFieldItemVM, LayoutNodeVM } from \"~/features/formModel/index.js\";\nimport { hasSubtreeFocusRequest } from \"~/features/formModel/index.js\";\nimport { LayoutNodeRenderer } from \"~/features/formModel/FormView.js\";\nimport { resolveItemTitle, resolveItemDescription } from \"./resolveItemTitle.js\";\nimport type { ISortableItemProps } from \"~/presentation/sortable/index.js\";\n\nexport const NestedLayout = observer(({ layout }: { layout: LayoutNodeVM[] }) => {\n return (\n <div className={\"flex flex-col gap-md\"}>\n {layout.map((node, index) => (\n <LayoutNodeRenderer key={index} node={node} />\n ))}\n </div>\n );\n});\n\nexport interface ListItemRendererProps {\n item: IObjectFieldItemVM;\n index: number;\n total: number;\n label?: string;\n itemTitle?: string | ((data: Record<string, unknown>, index: number) => string);\n itemDescription?: string | ((data: Record<string, unknown>, index: number) => string);\n disabled: boolean;\n sortable?: ISortableItemProps;\n}\n\nexport const ListItemRenderer = observer(\n ({\n item,\n index,\n total,\n label,\n itemTitle,\n itemDescription,\n disabled,\n sortable\n }: ListItemRendererProps) => {\n const [open, setOpen] = useState(false);\n const hasFocusRequest = hasSubtreeFocusRequest(item.fields);\n\n useEffect(() => {\n if (hasFocusRequest) {\n setOpen(true);\n }\n }, [hasFocusRequest]);\n\n const actions = (\n <>\n <IconButton\n icon={<ArrowDown />}\n onClick={e => {\n e.stopPropagation();\n item.moveDown();\n }}\n variant=\"ghost\"\n disabled={index === total - 1}\n />\n <IconButton\n icon={<ArrowUp />}\n onClick={e => {\n e.stopPropagation();\n item.moveUp();\n }}\n variant=\"ghost\"\n disabled={index === 0}\n />\n <Accordion.Item.Action.Separator />\n <IconButton\n icon={<DeleteIcon />}\n onClick={e => {\n e.stopPropagation();\n item.remove();\n }}\n variant=\"ghost\"\n />\n </>\n );\n\n const accordion = (\n <Accordion\n background={\"base\"}\n variant={\"container\"}\n openClosedIndicatorPosition={\"left\"}\n >\n <Accordion.Item\n title={resolveItemTitle(item, index, label, itemTitle)}\n description={resolveItemDescription(item, index, itemDescription)}\n actions={disabled ? null : actions}\n open={open}\n onOpenChange={setOpen}\n draggable={!disabled && sortable !== undefined}\n dragHandleRef={sortable?.handleRef}\n >\n <NestedLayout layout={item.layout} />\n </Accordion.Item>\n </Accordion>\n );\n\n if (!sortable) {\n return accordion;\n }\n\n return (\n <div\n ref={sortable.ref}\n data-sortable-item=\"\"\n className={\"relative\"}\n style={{ opacity: sortable.isDragging ? 0.4 : 1 }}\n >\n {sortable.closestEdge === \"top\" && (\n <DropIndicator position={\"top\"} isFirst={index === 0} />\n )}\n {accordion}\n {sortable.closestEdge === \"bottom\" && (\n <DropIndicator position={\"bottom\"} isLast={index === total - 1} />\n )}\n </div>\n );\n }\n);\n\nconst DropIndicator = ({\n position,\n isFirst = false,\n isLast = false\n}: {\n position: \"top\" | \"bottom\";\n isFirst?: boolean;\n isLast?: boolean;\n}) => {\n let offset = \"calc(var(--spacing-md) / -2)\";\n if (position === \"top\" && isFirst) {\n offset = \"0px\";\n }\n if (position === \"bottom\" && isLast) {\n offset = \"0px\";\n }\n\n return (\n <div\n className={\"absolute left-0 right-0 z-10\"}\n style={{\n [position]: offset,\n transform: position === \"top\" ? \"translateY(-50%)\" : \"translateY(50%)\"\n }}\n >\n <div className={\"w-full h-[2px] bg-primary rounded-full\"} />\n </div>\n );\n};\n\nexport interface AddItemButtonProps {\n label?: string;\n disabled: boolean;\n onAdd: () => void;\n}\n\nexport const AddItemButton = ({ label, disabled, onAdd }: AddItemButtonProps) => {\n return (\n <div>\n <Button\n icon={<AddIcon />}\n text={label || \"Add Item\"}\n variant={\"tertiary\"}\n onClick={onAdd}\n disabled={disabled}\n />\n </div>\n );\n};\n"],"names":["NestedLayout","observer","layout","node","index","LayoutNodeRenderer","ListItemRenderer","item","total","label","itemTitle","itemDescription","disabled","sortable","open","setOpen","useState","hasFocusRequest","hasSubtreeFocusRequest","useEffect","actions","IconButton","ArrowDown","e","ArrowUp","Accordion","DeleteIcon","accordion","resolveItemTitle","resolveItemDescription","undefined","DropIndicator","position","isFirst","isLast","offset","AddItemButton","onAdd","Button","AddIcon"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import react from "react";
1
+ import react, { useEffect, useState } from "react";
2
2
  import { Accordion } from "@webiny/admin-ui";
3
3
  import { createObjectFieldRenderer } from "../../../../features/formModel/createFieldRenderer.js";
4
4
  import { NestedLayout } from "./ObjectFieldComponents.js";
5
+ import { hasSubtreeFocusRequest } from "../../../../features/formModel/index.js";
5
6
  function resolveTitle(field, itemTitle) {
6
7
  if (!itemTitle) return field.label;
7
8
  if ("string" == typeof itemTitle) {
@@ -27,13 +28,21 @@ const ObjectRenderer = createObjectFieldRenderer(({ field })=>{
27
28
  if (settings?.container === false) return /*#__PURE__*/ react.createElement(NestedLayout, {
28
29
  layout: field.layout
29
30
  });
31
+ const focusInside = hasSubtreeFocusRequest(field.fields);
32
+ const [open, setOpen] = useState(settings?.open ?? true);
33
+ useEffect(()=>{
34
+ if (focusInside) setOpen(true);
35
+ }, [
36
+ focusInside
37
+ ]);
30
38
  return /*#__PURE__*/ react.createElement(Accordion, {
31
39
  background: "base",
32
40
  variant: "container"
33
41
  }, /*#__PURE__*/ react.createElement(Accordion.Item, {
34
42
  title: resolveTitle(field, settings?.itemTitle),
35
43
  description: resolveDescription(field, settings?.itemDescription),
36
- defaultOpen: settings?.open ?? true,
44
+ open: open,
45
+ onOpenChange: setOpen,
37
46
  className: "pl-sm"
38
47
  }, /*#__PURE__*/ react.createElement(NestedLayout, {
39
48
  layout: field.layout