@contentstack/live-preview-utils 3.1.2 → 3.1.3

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 (146) hide show
  1. package/README.md +1 -1
  2. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
  3. package/dist/legacy/livePreview/eventManager/postMessageEvent.hooks.js +1 -1
  4. package/dist/legacy/preview/contentstack-live-preview-HOC.cjs +6 -2
  5. package/dist/legacy/preview/contentstack-live-preview-HOC.cjs.map +1 -1
  6. package/dist/legacy/preview/contentstack-live-preview-HOC.js +6 -2
  7. package/dist/legacy/preview/contentstack-live-preview-HOC.js.map +1 -1
  8. package/dist/legacy/visualBuilder/components/FieldToolbar.cjs +26 -17
  9. package/dist/legacy/visualBuilder/components/FieldToolbar.cjs.map +1 -1
  10. package/dist/legacy/visualBuilder/components/FieldToolbar.js +26 -17
  11. package/dist/legacy/visualBuilder/components/FieldToolbar.js.map +1 -1
  12. package/dist/legacy/visualBuilder/components/addInstanceButton.cjs +39 -11
  13. package/dist/legacy/visualBuilder/components/addInstanceButton.cjs.map +1 -1
  14. package/dist/legacy/visualBuilder/components/addInstanceButton.d.cts +5 -0
  15. package/dist/legacy/visualBuilder/components/addInstanceButton.d.ts +5 -0
  16. package/dist/legacy/visualBuilder/components/addInstanceButton.js +39 -11
  17. package/dist/legacy/visualBuilder/components/addInstanceButton.js.map +1 -1
  18. package/dist/legacy/visualBuilder/generators/generateAddInstanceButtons.cjs +8 -2
  19. package/dist/legacy/visualBuilder/generators/generateAddInstanceButtons.cjs.map +1 -1
  20. package/dist/legacy/visualBuilder/generators/generateAddInstanceButtons.d.cts +9 -3
  21. package/dist/legacy/visualBuilder/generators/generateAddInstanceButtons.d.ts +9 -3
  22. package/dist/legacy/visualBuilder/generators/generateAddInstanceButtons.js +8 -2
  23. package/dist/legacy/visualBuilder/generators/generateAddInstanceButtons.js.map +1 -1
  24. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs +7 -0
  25. package/dist/legacy/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  26. package/dist/legacy/visualBuilder/listeners/mouseClick.js +7 -0
  27. package/dist/legacy/visualBuilder/listeners/mouseClick.js.map +1 -1
  28. package/dist/legacy/visualBuilder/utils/enableInlineEditing.cjs +94 -0
  29. package/dist/legacy/visualBuilder/utils/enableInlineEditing.cjs.map +1 -0
  30. package/dist/legacy/visualBuilder/utils/enableInlineEditing.d.cts +11 -0
  31. package/dist/legacy/visualBuilder/utils/enableInlineEditing.d.ts +11 -0
  32. package/dist/legacy/visualBuilder/utils/enableInlineEditing.js +74 -0
  33. package/dist/legacy/visualBuilder/utils/enableInlineEditing.js.map +1 -0
  34. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs +20 -110
  35. package/dist/legacy/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  36. package/dist/legacy/visualBuilder/utils/handleIndividualFields.d.cts +3 -5
  37. package/dist/legacy/visualBuilder/utils/handleIndividualFields.d.ts +3 -5
  38. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js +18 -114
  39. package/dist/legacy/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  40. package/dist/legacy/visualBuilder/utils/handleInlineEditableField.cjs +81 -0
  41. package/dist/legacy/visualBuilder/utils/handleInlineEditableField.cjs.map +1 -0
  42. package/dist/legacy/visualBuilder/utils/handleInlineEditableField.d.cts +16 -0
  43. package/dist/legacy/visualBuilder/utils/handleInlineEditableField.d.ts +16 -0
  44. package/dist/legacy/visualBuilder/utils/handleInlineEditableField.js +58 -0
  45. package/dist/legacy/visualBuilder/utils/handleInlineEditableField.js.map +1 -0
  46. package/dist/legacy/visualBuilder/utils/isFieldMultiple.cjs +35 -0
  47. package/dist/legacy/visualBuilder/utils/isFieldMultiple.cjs.map +1 -0
  48. package/dist/legacy/visualBuilder/utils/isFieldMultiple.d.cts +6 -0
  49. package/dist/legacy/visualBuilder/utils/isFieldMultiple.d.ts +6 -0
  50. package/dist/legacy/visualBuilder/utils/isFieldMultiple.js +12 -0
  51. package/dist/legacy/visualBuilder/utils/isFieldMultiple.js.map +1 -0
  52. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.cjs +14 -20
  53. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.cjs.map +1 -1
  54. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.d.cts +1 -1
  55. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.d.ts +1 -1
  56. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.js +14 -20
  57. package/dist/legacy/visualBuilder/utils/multipleElementAddButton.js.map +1 -1
  58. package/dist/legacy/visualBuilder/utils/pasteAsPlainText.cjs +44 -0
  59. package/dist/legacy/visualBuilder/utils/pasteAsPlainText.cjs.map +1 -0
  60. package/dist/legacy/visualBuilder/utils/pasteAsPlainText.d.cts +5 -0
  61. package/dist/legacy/visualBuilder/utils/pasteAsPlainText.d.ts +5 -0
  62. package/dist/legacy/visualBuilder/utils/pasteAsPlainText.js +21 -0
  63. package/dist/legacy/visualBuilder/utils/pasteAsPlainText.js.map +1 -0
  64. package/dist/legacy/visualBuilder/utils/types/index.types.cjs.map +1 -1
  65. package/dist/legacy/visualBuilder/utils/types/index.types.d.cts +6 -1
  66. package/dist/legacy/visualBuilder/utils/types/index.types.d.ts +6 -1
  67. package/dist/legacy/visualBuilder/utils/types/index.types.js.map +1 -1
  68. package/dist/legacy/visualBuilder/visualBuilder.style.cjs +9 -1
  69. package/dist/legacy/visualBuilder/visualBuilder.style.cjs.map +1 -1
  70. package/dist/legacy/visualBuilder/visualBuilder.style.d.cts +2 -1
  71. package/dist/legacy/visualBuilder/visualBuilder.style.d.ts +2 -1
  72. package/dist/legacy/visualBuilder/visualBuilder.style.js +9 -1
  73. package/dist/legacy/visualBuilder/visualBuilder.style.js.map +1 -1
  74. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.cjs +1 -1
  75. package/dist/modern/livePreview/eventManager/postMessageEvent.hooks.js +1 -1
  76. package/dist/modern/preview/contentstack-live-preview-HOC.cjs +6 -2
  77. package/dist/modern/preview/contentstack-live-preview-HOC.cjs.map +1 -1
  78. package/dist/modern/preview/contentstack-live-preview-HOC.js +6 -2
  79. package/dist/modern/preview/contentstack-live-preview-HOC.js.map +1 -1
  80. package/dist/modern/visualBuilder/components/FieldToolbar.cjs +26 -16
  81. package/dist/modern/visualBuilder/components/FieldToolbar.cjs.map +1 -1
  82. package/dist/modern/visualBuilder/components/FieldToolbar.js +26 -16
  83. package/dist/modern/visualBuilder/components/FieldToolbar.js.map +1 -1
  84. package/dist/modern/visualBuilder/components/addInstanceButton.cjs +38 -11
  85. package/dist/modern/visualBuilder/components/addInstanceButton.cjs.map +1 -1
  86. package/dist/modern/visualBuilder/components/addInstanceButton.d.cts +5 -0
  87. package/dist/modern/visualBuilder/components/addInstanceButton.d.ts +5 -0
  88. package/dist/modern/visualBuilder/components/addInstanceButton.js +38 -11
  89. package/dist/modern/visualBuilder/components/addInstanceButton.js.map +1 -1
  90. package/dist/modern/visualBuilder/generators/generateAddInstanceButtons.cjs +8 -2
  91. package/dist/modern/visualBuilder/generators/generateAddInstanceButtons.cjs.map +1 -1
  92. package/dist/modern/visualBuilder/generators/generateAddInstanceButtons.d.cts +9 -3
  93. package/dist/modern/visualBuilder/generators/generateAddInstanceButtons.d.ts +9 -3
  94. package/dist/modern/visualBuilder/generators/generateAddInstanceButtons.js +8 -2
  95. package/dist/modern/visualBuilder/generators/generateAddInstanceButtons.js.map +1 -1
  96. package/dist/modern/visualBuilder/listeners/mouseClick.cjs +7 -0
  97. package/dist/modern/visualBuilder/listeners/mouseClick.cjs.map +1 -1
  98. package/dist/modern/visualBuilder/listeners/mouseClick.js +7 -0
  99. package/dist/modern/visualBuilder/listeners/mouseClick.js.map +1 -1
  100. package/dist/modern/visualBuilder/utils/enableInlineEditing.cjs +94 -0
  101. package/dist/modern/visualBuilder/utils/enableInlineEditing.cjs.map +1 -0
  102. package/dist/modern/visualBuilder/utils/enableInlineEditing.d.cts +11 -0
  103. package/dist/modern/visualBuilder/utils/enableInlineEditing.d.ts +11 -0
  104. package/dist/modern/visualBuilder/utils/enableInlineEditing.js +74 -0
  105. package/dist/modern/visualBuilder/utils/enableInlineEditing.js.map +1 -0
  106. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs +20 -110
  107. package/dist/modern/visualBuilder/utils/handleIndividualFields.cjs.map +1 -1
  108. package/dist/modern/visualBuilder/utils/handleIndividualFields.d.cts +3 -5
  109. package/dist/modern/visualBuilder/utils/handleIndividualFields.d.ts +3 -5
  110. package/dist/modern/visualBuilder/utils/handleIndividualFields.js +18 -114
  111. package/dist/modern/visualBuilder/utils/handleIndividualFields.js.map +1 -1
  112. package/dist/modern/visualBuilder/utils/handleInlineEditableField.cjs +81 -0
  113. package/dist/modern/visualBuilder/utils/handleInlineEditableField.cjs.map +1 -0
  114. package/dist/modern/visualBuilder/utils/handleInlineEditableField.d.cts +16 -0
  115. package/dist/modern/visualBuilder/utils/handleInlineEditableField.d.ts +16 -0
  116. package/dist/modern/visualBuilder/utils/handleInlineEditableField.js +58 -0
  117. package/dist/modern/visualBuilder/utils/handleInlineEditableField.js.map +1 -0
  118. package/dist/modern/visualBuilder/utils/isFieldMultiple.cjs +35 -0
  119. package/dist/modern/visualBuilder/utils/isFieldMultiple.cjs.map +1 -0
  120. package/dist/modern/visualBuilder/utils/isFieldMultiple.d.cts +6 -0
  121. package/dist/modern/visualBuilder/utils/isFieldMultiple.d.ts +6 -0
  122. package/dist/modern/visualBuilder/utils/isFieldMultiple.js +12 -0
  123. package/dist/modern/visualBuilder/utils/isFieldMultiple.js.map +1 -0
  124. package/dist/modern/visualBuilder/utils/multipleElementAddButton.cjs +14 -18
  125. package/dist/modern/visualBuilder/utils/multipleElementAddButton.cjs.map +1 -1
  126. package/dist/modern/visualBuilder/utils/multipleElementAddButton.d.cts +1 -1
  127. package/dist/modern/visualBuilder/utils/multipleElementAddButton.d.ts +1 -1
  128. package/dist/modern/visualBuilder/utils/multipleElementAddButton.js +14 -18
  129. package/dist/modern/visualBuilder/utils/multipleElementAddButton.js.map +1 -1
  130. package/dist/modern/visualBuilder/utils/pasteAsPlainText.cjs +44 -0
  131. package/dist/modern/visualBuilder/utils/pasteAsPlainText.cjs.map +1 -0
  132. package/dist/modern/visualBuilder/utils/pasteAsPlainText.d.cts +5 -0
  133. package/dist/modern/visualBuilder/utils/pasteAsPlainText.d.ts +5 -0
  134. package/dist/modern/visualBuilder/utils/pasteAsPlainText.js +21 -0
  135. package/dist/modern/visualBuilder/utils/pasteAsPlainText.js.map +1 -0
  136. package/dist/modern/visualBuilder/utils/types/index.types.cjs.map +1 -1
  137. package/dist/modern/visualBuilder/utils/types/index.types.d.cts +6 -1
  138. package/dist/modern/visualBuilder/utils/types/index.types.d.ts +6 -1
  139. package/dist/modern/visualBuilder/utils/types/index.types.js.map +1 -1
  140. package/dist/modern/visualBuilder/visualBuilder.style.cjs +9 -1
  141. package/dist/modern/visualBuilder/visualBuilder.style.cjs.map +1 -1
  142. package/dist/modern/visualBuilder/visualBuilder.style.d.cts +2 -1
  143. package/dist/modern/visualBuilder/visualBuilder.style.d.ts +2 -1
  144. package/dist/modern/visualBuilder/visualBuilder.style.js +9 -1
  145. package/dist/modern/visualBuilder/visualBuilder.style.js.map +1 -1
  146. package/package.json +3 -2
@@ -36,6 +36,7 @@ import {
36
36
  getFieldVariantStatus,
37
37
  VariantRevertDropdown
38
38
  } from "./FieldRevert/FieldRevertComponent.js";
39
+ import { LoadingIcon } from "./icons/loading.js";
39
40
  import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
40
41
  var TOOLTIP_TOP_EDGE_BUFFER = 96;
41
42
  function handleReplaceAsset(fieldMetadata) {
@@ -68,22 +69,19 @@ function handleEdit(fieldMetadata) {
68
69
  );
69
70
  }
70
71
  function handleFormFieldFocus(eventDetails) {
71
- const { editableElement, fieldMetadata, cslpData } = eventDetails;
72
- visualBuilderPostMessage?.send(VisualBuilderPostMessageEvents.TOGGLE_FORM, {
73
- fieldMetadata,
74
- cslpData
75
- }).then(() => {
76
- visualBuilderPostMessage?.send(
77
- VisualBuilderPostMessageEvents.FOCUS_FIELD,
78
- {
79
- DOMEditStack: getDOMEditStack(editableElement)
80
- }
81
- );
82
- });
72
+ const { editableElement } = eventDetails;
73
+ return visualBuilderPostMessage?.send(
74
+ VisualBuilderPostMessageEvents.FOCUS_FIELD,
75
+ {
76
+ DOMEditStack: getDOMEditStack(editableElement),
77
+ toggleVisibility: true
78
+ }
79
+ );
83
80
  }
84
81
  function FieldToolbarComponent(props) {
85
82
  const { eventDetails, isVariant: isVariantOrParentOfVariant } = props;
86
83
  const { fieldMetadata, editableElement: targetElement } = eventDetails;
84
+ const [isFormLoading, setIsFormLoading] = useState(false);
87
85
  const parentPath = fieldMetadata?.multipleFieldMetadata?.parentDetails?.parentCslpValue || "";
88
86
  const isVariant = !!fieldMetadata?.variant || isVariantOrParentOfVariant;
89
87
  const direction = getChildrenDirection(targetElement, parentPath);
@@ -108,12 +106,12 @@ function FieldToolbarComponent(props) {
108
106
  }
109
107
  fieldType = getFieldType(fieldSchema);
110
108
  isModalEditable = ALLOWED_MODAL_EDITABLE_FIELD.includes(fieldType);
111
- isReplaceAllowed = ALLOWED_REPLACE_FIELDS.includes(fieldType);
112
109
  Icon = fieldIcons[fieldType];
113
110
  isMultiple = fieldSchema.multiple || false;
114
111
  if (fieldType === FieldDataType.REFERENCE)
115
112
  isMultiple = fieldSchema.field_metadata.ref_multiple;
116
113
  isWholeMultipleField = isMultiple && (fieldMetadata.fieldPathWithIndex === fieldMetadata.instance.fieldPathWithIndex || fieldMetadata.multipleFieldMetadata?.index === -1);
114
+ isReplaceAllowed = ALLOWED_REPLACE_FIELDS.includes(fieldType) && !isWholeMultipleField;
117
115
  }
118
116
  const invertTooltipPosition = targetElement.getBoundingClientRect().top <= TOOLTIP_TOP_EDGE_BUFFER;
119
117
  const editButton = Icon ? /* @__PURE__ */ jsx(
@@ -180,14 +178,26 @@ function FieldToolbarComponent(props) {
180
178
  {
181
179
  "visual-builder__tooltip--bottom": invertTooltipPosition,
182
180
  [visualBuilderStyles()["visual-builder__tooltip--bottom"]]: invertTooltipPosition
181
+ },
182
+ {
183
+ [visualBuilderStyles()["visual-builder__button--comment-loader"]]: isFormLoading,
184
+ "visual-builder__button--comment-loader": isFormLoading
183
185
  }
184
186
  ),
185
187
  "data-tooltip": "Form",
186
188
  "data-testid": `visual-builder-form`,
187
- onClick: (e) => {
188
- handleFormFieldFocus(eventDetails);
189
+ onClick: async (e) => {
190
+ e.preventDefault();
191
+ e.stopPropagation();
192
+ setIsFormLoading(true);
193
+ try {
194
+ await handleFormFieldFocus(eventDetails);
195
+ } finally {
196
+ setIsFormLoading(false);
197
+ }
189
198
  },
190
- children: /* @__PURE__ */ jsx(FormIcon, {})
199
+ disabled: isFormLoading,
200
+ children: isFormLoading ? /* @__PURE__ */ jsx(LoadingIcon, {}) : /* @__PURE__ */ jsx(FormIcon, {})
191
201
  }
192
202
  );
193
203
  const toggleVariantDropdown = () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/components/FieldToolbar.tsx"],"sourcesContent":["import { CslpData } from \"../../cslp/types/cslp.types\";\nimport getChildrenDirection from \"../utils/getChildrenDirection\";\nimport {\n ALLOWED_MODAL_EDITABLE_FIELD,\n ALLOWED_REPLACE_FIELDS,\n DEFAULT_MULTIPLE_FIELDS,\n} from \"../utils/constants\";\nimport { getFieldType } from \"../utils/getFieldType\";\nimport {\n handleDeleteInstance,\n handleMoveInstance,\n} from \"../utils/instanceHandlers\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { FieldDataType, ISchemaFieldMap } from \"../utils/types/index.types\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\nimport {\n CaretIcon,\n DeleteIcon,\n MoveLeftIcon,\n MoveRightIcon,\n ReplaceAssetIcon,\n} from \"./icons\";\nimport { fieldIcons } from \"./icons/fields\";\nimport classNames from \"classnames\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport CommentIcon from \"./CommentIcon\";\nimport React, { useEffect, useState } from \"preact/compat\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport { IReferenceContentTypeSchema } from \"../../cms/types/contentTypeSchema.types\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { FormIcon } from \"./icons\";\nimport { getDOMEditStack } from \"../utils/getCsDataOfElement\";\nimport { VariantIcon } from \"./icons/variant\";\nimport {\n BASE_VARIANT_STATUS,\n FieldRevertComponent,\n getFieldVariantStatus,\n IVariantStatus,\n VariantRevertDropdown,\n} from \"./FieldRevert/FieldRevertComponent\";\n\nexport type FieldDetails = Pick<\n VisualBuilderCslpEventDetails,\n \"editableElement\" | \"fieldMetadata\"\n>;\n\nconst TOOLTIP_TOP_EDGE_BUFFER = 96;\n\ninterface MultipleFieldToolbarProps {\n eventDetails: VisualBuilderCslpEventDetails;\n hideOverlay: () => void;\n isVariant?: boolean;\n}\n\nfunction handleReplaceAsset(fieldMetadata: CslpData) {\n // TODO avoid sending whole fieldMetadata\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.OPEN_ASSET_MODAL,\n {\n fieldMetadata,\n }\n );\n}\n\nfunction handleReplaceReference(fieldMetadata: CslpData) {\n const isMultipleInstance =\n fieldMetadata.multipleFieldMetadata.index > -1 &&\n fieldMetadata.fieldPathWithIndex ===\n fieldMetadata.multipleFieldMetadata.parentDetails?.parentPath;\n const entryPath = isMultipleInstance\n ? fieldMetadata.instance.fieldPathWithIndex\n : fieldMetadata.fieldPathWithIndex;\n\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.OPEN_REFERENCE_MODAL,\n {\n entry_uid: fieldMetadata.entry_uid,\n content_type_uid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n fieldPath: fieldMetadata.fieldPath,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n entryPath,\n }\n );\n}\n\nfunction handleEdit(fieldMetadata: CslpData) {\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.OPEN_FIELD_EDIT_MODAL,\n { fieldMetadata }\n );\n}\n\nfunction handleFormFieldFocus(eventDetails: VisualBuilderCslpEventDetails) {\n const { editableElement, fieldMetadata, cslpData } = eventDetails;\n visualBuilderPostMessage\n ?.send(VisualBuilderPostMessageEvents.TOGGLE_FORM, {\n fieldMetadata,\n cslpData,\n })\n .then(() => {\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.FOCUS_FIELD,\n {\n DOMEditStack: getDOMEditStack(editableElement),\n }\n );\n });\n}\n\nfunction FieldToolbarComponent(\n props: MultipleFieldToolbarProps\n): JSX.Element | null {\n const { eventDetails, isVariant: isVariantOrParentOfVariant } = props;\n const { fieldMetadata, editableElement: targetElement } = eventDetails;\n\n const parentPath =\n fieldMetadata?.multipleFieldMetadata?.parentDetails?.parentCslpValue ||\n \"\";\n const isVariant = !!fieldMetadata?.variant || isVariantOrParentOfVariant;\n const direction = getChildrenDirection(targetElement, parentPath);\n const [fieldSchema, setFieldSchema] = useState<ISchemaFieldMap | null>(\n null\n );\n const [fieldVariantStatus, setFieldVariantStatus] =\n useState<IVariantStatus>(BASE_VARIANT_STATUS);\n const [isOpenVariantRevert, setIsOpenVariantRevert] =\n useState<boolean>(false);\n\n let isModalEditable = false;\n let isReplaceAllowed = false;\n let isMultiple = false;\n let Icon = null;\n let fieldType = null;\n let isWholeMultipleField = false;\n\n if (fieldSchema) {\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement: targetElement,\n fieldMetadata,\n });\n\n // field is disabled, no actions needed\n if (isDisabled) {\n return null;\n }\n\n fieldType = getFieldType(fieldSchema);\n isModalEditable = ALLOWED_MODAL_EDITABLE_FIELD.includes(fieldType);\n isReplaceAllowed = ALLOWED_REPLACE_FIELDS.includes(fieldType);\n\n Icon = fieldIcons[fieldType];\n\n isMultiple = fieldSchema.multiple || false;\n if (fieldType === FieldDataType.REFERENCE)\n isMultiple = (fieldSchema as IReferenceContentTypeSchema)\n .field_metadata.ref_multiple;\n\n // field is multiple but an instance is not selected\n // instead the whole field (all instances) is selected.\n // Currently, when whole featured_blogs is selected in canvas,\n // the fieldPathWithIndex and instance.fieldPathWithIndex are the same\n // cannot rely on -1 index, as the non-negative index then refers to the index of\n // the featured_blogs block in page_components\n // It is not needed except taxanomy.\n isWholeMultipleField =\n isMultiple &&\n (fieldMetadata.fieldPathWithIndex ===\n fieldMetadata.instance.fieldPathWithIndex ||\n fieldMetadata.multipleFieldMetadata?.index === -1);\n\n // if (\n // DEFAULT_MULTIPLE_FIELDS.includes(fieldType) &&\n // isWholeMultipleField &&\n // !isVariant\n // ) {\n // return null;\n // }\n }\n\n const invertTooltipPosition =\n targetElement.getBoundingClientRect().top <= TOOLTIP_TOP_EDGE_BUFFER;\n\n const editButton = Icon ? (\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__edit-button\"\n className={classNames(\n \"visual-builder__button visual-builder__button--secondary visual-builder__button--edit\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__button--edit\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n )}\n data-tooltip={\"Edit\"}\n onClick={(e) => {\n // TODO the listener for field path is attached to the common parent requiring\n // propagation to be stopped, should ideally only attach onClick to fieldpath dropdown\n e.preventDefault();\n e.stopPropagation();\n handleEdit(fieldMetadata);\n }}\n >\n <Icon />\n </button>\n ) : null;\n\n const replaceButton = fieldType ? (\n <button\n className={classNames(\n \"visual-builder__replace-button visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n )}\n data-tooltip={\"Replace\"}\n data-testid={`visual-builder-replace-${fieldType}`}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (fieldType === FieldDataType.REFERENCE) {\n handleReplaceReference(fieldMetadata);\n return;\n } else if (fieldType === FieldDataType.FILE) {\n handleReplaceAsset(fieldMetadata);\n return;\n }\n }}\n >\n <ReplaceAssetIcon />\n </button>\n ) : null;\n\n const formButton = (\n <button\n className={classNames(\n \"visual-builder__replace-button visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n )}\n data-tooltip={\"Form\"}\n data-testid={`visual-builder-form`}\n onClick={(e) => {\n handleFormFieldFocus(eventDetails);\n }}\n >\n <FormIcon />\n </button>\n );\n\n const toggleVariantDropdown = () => {\n setIsOpenVariantRevert(!isOpenVariantRevert);\n };\n\n const closeVariantDropdown = () => {\n setIsOpenVariantRevert(false);\n };\n\n const variantButton = (\n <button\n className={classNames(\n \"visual-builder__variant-button visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n visualBuilderStyles()[\"visual-builder__variant-button\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n )}\n data-tooltip={\"Variant Revert\"}\n data-testid={`visual-builder-canvas-variant-revert`}\n onClick={toggleVariantDropdown}\n >\n <VariantIcon />\n <CaretIcon open={isOpenVariantRevert} />\n </button>\n );\n\n const totalElementCount = targetElement?.parentNode?.childElementCount ?? 1;\n const indexOfElement = fieldMetadata?.multipleFieldMetadata?.index;\n\n const disableMoveLeft = indexOfElement === 0; // first element\n const disableMoveRight = indexOfElement === totalElementCount - 1; // last element\n\n useEffect(() => {\n async function fetchFieldSchema() {\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n );\n if (fieldSchema) {\n setFieldSchema(fieldSchema);\n }\n const variantStatus = await getFieldVariantStatus(fieldMetadata);\n setFieldVariantStatus(variantStatus ?? BASE_VARIANT_STATUS);\n }\n fetchFieldSchema();\n }, [fieldMetadata]);\n\n useEffect(() => {\n const event = visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.DELETE_INSTANCE,\n (args: { data: { path: string } }) => {\n if (\n args.data?.path ===\n fieldMetadata.instance.fieldPathWithIndex\n ) {\n props.hideOverlay();\n }\n }\n );\n return () => {\n event?.unregister();\n };\n }, []);\n\n const multipleFieldToolbarButtonClasses = classNames(\n \"visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n );\n\n return (\n <div\n className={classNames(\n \"visual-builder__field-toolbar-container\",\n visualBuilderStyles()[\"visual-builder__field-toolbar-container\"]\n )}\n >\n <div\n className={classNames(\n \"visual-builder__focused-toolbar__multiple-field-toolbar\",\n visualBuilderStyles()[\n \"visual-builder__focused-toolbar__multiple-field-toolbar\"\n ]\n )}\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar\"\n >\n <div\n className={classNames(\n \"visual-builder__focused-toolbar__button-group\",\n visualBuilderStyles()[\n \"visual-builder__focused-toolbar__button-group\"\n ]\n )}\n >\n <>\n {isVariant ? (\n <VariantRevertDropdown\n fieldDataName={fieldMetadata.fieldPathWithIndex}\n fieldMetadata={fieldMetadata}\n variantStatus={fieldVariantStatus}\n isOpen={isOpenVariantRevert}\n closeDropdown={closeVariantDropdown}\n invertTooltipPosition={invertTooltipPosition}\n toggleVariantDropdown={toggleVariantDropdown}\n />\n ) : null}\n {isMultiple && !isWholeMultipleField ? (\n <>\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__move-left-button\"\n className={\n multipleFieldToolbarButtonClasses\n }\n data-tooltip={\n direction === \"vertical\"\n ? \"Move up\"\n : \"Move left\"\n }\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleMoveInstance(\n fieldMetadata,\n \"previous\"\n );\n }}\n disabled={disableMoveLeft}\n >\n <MoveLeftIcon\n className={classNames({\n \"visual-builder__rotate--90\":\n direction === \"vertical\",\n [visualBuilderStyles()[\n \"visual-builder__rotate--90\"\n ]]: direction === \"vertical\",\n })}\n disabled={disableMoveLeft}\n />\n </button>\n\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__move-right-button\"\n className={\n multipleFieldToolbarButtonClasses\n }\n data-tooltip={\n direction === \"vertical\"\n ? \"Move down\"\n : \"Move right\"\n }\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleMoveInstance(\n fieldMetadata,\n \"next\"\n );\n }}\n disabled={disableMoveRight}\n >\n <MoveRightIcon\n className={classNames({\n \"visual-builder__rotate--90\":\n direction === \"vertical\",\n [visualBuilderStyles()[\n \"visual-builder__rotate--90\"\n ]]: direction === \"vertical\",\n })}\n disabled={disableMoveRight}\n />\n </button>\n\n {isModalEditable ? editButton : null}\n {formButton}\n {isReplaceAllowed ? replaceButton : null}\n\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__delete-button\"\n className={\n multipleFieldToolbarButtonClasses\n }\n data-tooltip={\"Delete\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleDeleteInstance(fieldMetadata);\n }}\n >\n <DeleteIcon />\n </button>\n </>\n ) : (\n <>\n {isModalEditable ? editButton : null}\n {isReplaceAllowed ? replaceButton : null}\n {formButton}\n {fieldSchema ? (\n <CommentIcon\n fieldMetadata={fieldMetadata}\n fieldSchema={fieldSchema}\n invertTooltipPosition={\n invertTooltipPosition\n }\n />\n ) : null}\n </>\n )}\n </>\n </div>\n </div>\n </div>\n );\n}\n\nexport default FieldToolbarComponent;\n"],"mappings":"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","names":["fieldSchema"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/components/FieldToolbar.tsx"],"sourcesContent":["import { CslpData } from \"../../cslp/types/cslp.types\";\nimport getChildrenDirection from \"../utils/getChildrenDirection\";\nimport {\n ALLOWED_MODAL_EDITABLE_FIELD,\n ALLOWED_REPLACE_FIELDS,\n DEFAULT_MULTIPLE_FIELDS,\n} from \"../utils/constants\";\nimport { getFieldType } from \"../utils/getFieldType\";\nimport {\n handleDeleteInstance,\n handleMoveInstance,\n} from \"../utils/instanceHandlers\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { FieldDataType, ISchemaFieldMap } from \"../utils/types/index.types\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\nimport {\n CaretIcon,\n DeleteIcon,\n MoveLeftIcon,\n MoveRightIcon,\n ReplaceAssetIcon,\n} from \"./icons\";\nimport { fieldIcons } from \"./icons/fields\";\nimport classNames from \"classnames\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport CommentIcon from \"./CommentIcon\";\nimport React, { useEffect, useState } from \"preact/compat\";\nimport { FieldSchemaMap } from \"../utils/fieldSchemaMap\";\nimport { isFieldDisabled } from \"../utils/isFieldDisabled\";\nimport { IReferenceContentTypeSchema } from \"../../cms/types/contentTypeSchema.types\";\nimport { VisualBuilderCslpEventDetails } from \"../types/visualBuilder.types\";\nimport { FormIcon } from \"./icons\";\nimport { getDOMEditStack } from \"../utils/getCsDataOfElement\";\nimport { VariantIcon } from \"./icons/variant\";\nimport {\n BASE_VARIANT_STATUS,\n FieldRevertComponent,\n getFieldVariantStatus,\n IVariantStatus,\n VariantRevertDropdown,\n} from \"./FieldRevert/FieldRevertComponent\";\nimport { LoadingIcon } from \"./icons/loading\";\n\nexport type FieldDetails = Pick<\n VisualBuilderCslpEventDetails,\n \"editableElement\" | \"fieldMetadata\"\n>;\n\nconst TOOLTIP_TOP_EDGE_BUFFER = 96;\n\ninterface MultipleFieldToolbarProps {\n eventDetails: VisualBuilderCslpEventDetails;\n hideOverlay: () => void;\n isVariant?: boolean;\n}\n\nfunction handleReplaceAsset(fieldMetadata: CslpData) {\n // TODO avoid sending whole fieldMetadata\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.OPEN_ASSET_MODAL,\n {\n fieldMetadata,\n }\n );\n}\n\nfunction handleReplaceReference(fieldMetadata: CslpData) {\n const isMultipleInstance =\n fieldMetadata.multipleFieldMetadata.index > -1 &&\n fieldMetadata.fieldPathWithIndex ===\n fieldMetadata.multipleFieldMetadata.parentDetails?.parentPath;\n const entryPath = isMultipleInstance\n ? fieldMetadata.instance.fieldPathWithIndex\n : fieldMetadata.fieldPathWithIndex;\n\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.OPEN_REFERENCE_MODAL,\n {\n entry_uid: fieldMetadata.entry_uid,\n content_type_uid: fieldMetadata.content_type_uid,\n locale: fieldMetadata.locale,\n fieldPath: fieldMetadata.fieldPath,\n fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,\n entryPath,\n }\n );\n}\n\nfunction handleEdit(fieldMetadata: CslpData) {\n visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.OPEN_FIELD_EDIT_MODAL,\n { fieldMetadata }\n );\n}\n\nfunction handleFormFieldFocus(eventDetails: VisualBuilderCslpEventDetails) {\n const { editableElement } = eventDetails;\n return visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.FOCUS_FIELD,\n {\n DOMEditStack: getDOMEditStack(editableElement),\n toggleVisibility: true,\n }\n );\n}\n\nfunction FieldToolbarComponent(\n props: MultipleFieldToolbarProps\n): JSX.Element | null {\n const { eventDetails, isVariant: isVariantOrParentOfVariant } = props;\n const { fieldMetadata, editableElement: targetElement } = eventDetails;\n const [isFormLoading, setIsFormLoading] = useState(false);\n\n const parentPath =\n fieldMetadata?.multipleFieldMetadata?.parentDetails?.parentCslpValue ||\n \"\";\n const isVariant = !!fieldMetadata?.variant || isVariantOrParentOfVariant;\n const direction = getChildrenDirection(targetElement, parentPath);\n const [fieldSchema, setFieldSchema] = useState<ISchemaFieldMap | null>(\n null\n );\n const [fieldVariantStatus, setFieldVariantStatus] =\n useState<IVariantStatus>(BASE_VARIANT_STATUS);\n const [isOpenVariantRevert, setIsOpenVariantRevert] =\n useState<boolean>(false);\n\n let isModalEditable = false;\n let isReplaceAllowed = false;\n let isMultiple = false;\n let Icon = null;\n let fieldType = null;\n let isWholeMultipleField = false;\n\n if (fieldSchema) {\n const { isDisabled } = isFieldDisabled(fieldSchema, {\n editableElement: targetElement,\n fieldMetadata,\n });\n\n // field is disabled, no actions needed\n if (isDisabled) {\n return null;\n }\n\n fieldType = getFieldType(fieldSchema);\n isModalEditable = ALLOWED_MODAL_EDITABLE_FIELD.includes(fieldType);\n\n Icon = fieldIcons[fieldType];\n\n isMultiple = fieldSchema.multiple || false;\n if (fieldType === FieldDataType.REFERENCE)\n isMultiple = (fieldSchema as IReferenceContentTypeSchema)\n .field_metadata.ref_multiple;\n\n // field is multiple but an instance is not selected\n // instead the whole field (all instances) is selected.\n // Currently, when whole featured_blogs is selected in canvas,\n // the fieldPathWithIndex and instance.fieldPathWithIndex are the same\n // cannot rely on -1 index, as the non-negative index then refers to the index of\n // the featured_blogs block in page_components\n // It is not needed except taxanomy.\n isWholeMultipleField =\n isMultiple &&\n (fieldMetadata.fieldPathWithIndex ===\n fieldMetadata.instance.fieldPathWithIndex ||\n fieldMetadata.multipleFieldMetadata?.index === -1);\n\n isReplaceAllowed = ALLOWED_REPLACE_FIELDS.includes(fieldType) && !isWholeMultipleField;\n // if (\n // DEFAULT_MULTIPLE_FIELDS.includes(fieldType) &&\n // isWholeMultipleField &&\n // !isVariant\n // ) {\n // return null;\n // }\n }\n\n const invertTooltipPosition =\n targetElement.getBoundingClientRect().top <= TOOLTIP_TOP_EDGE_BUFFER;\n\n const editButton = Icon ? (\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__edit-button\"\n className={classNames(\n \"visual-builder__button visual-builder__button--secondary visual-builder__button--edit\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__button--edit\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n )}\n data-tooltip={\"Edit\"}\n onClick={(e) => {\n // TODO the listener for field path is attached to the common parent requiring\n // propagation to be stopped, should ideally only attach onClick to fieldpath dropdown\n e.preventDefault();\n e.stopPropagation();\n handleEdit(fieldMetadata);\n }}\n >\n <Icon />\n </button>\n ) : null;\n\n const replaceButton = fieldType ? (\n <button\n className={classNames(\n \"visual-builder__replace-button visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n )}\n data-tooltip={\"Replace\"}\n data-testid={`visual-builder-replace-${fieldType}`}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n if (fieldType === FieldDataType.REFERENCE) {\n handleReplaceReference(fieldMetadata);\n return;\n } else if (fieldType === FieldDataType.FILE) {\n handleReplaceAsset(fieldMetadata);\n return;\n }\n }}\n >\n <ReplaceAssetIcon />\n </button>\n ) : null;\n\n const formButton = (\n <button\n className={classNames(\n \"visual-builder__replace-button visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n },\n {\n [visualBuilderStyles()[\"visual-builder__button--comment-loader\"]]: isFormLoading,\n \"visual-builder__button--comment-loader\": isFormLoading\n }\n )}\n data-tooltip={\"Form\"}\n data-testid={`visual-builder-form`}\n onClick={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsFormLoading(true);\n try {\n await handleFormFieldFocus(eventDetails);\n } finally {\n setIsFormLoading(false);\n }\n }}\n disabled={isFormLoading}\n >\n {isFormLoading ? <LoadingIcon /> : <FormIcon />}\n </button>\n );\n\n const toggleVariantDropdown = () => {\n setIsOpenVariantRevert(!isOpenVariantRevert);\n };\n\n const closeVariantDropdown = () => {\n setIsOpenVariantRevert(false);\n };\n\n const variantButton = (\n <button\n className={classNames(\n \"visual-builder__variant-button visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n visualBuilderStyles()[\"visual-builder__variant-button\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n )}\n data-tooltip={\"Variant Revert\"}\n data-testid={`visual-builder-canvas-variant-revert`}\n onClick={toggleVariantDropdown}\n >\n <VariantIcon />\n <CaretIcon open={isOpenVariantRevert} />\n </button>\n );\n\n const totalElementCount = targetElement?.parentNode?.childElementCount ?? 1;\n const indexOfElement = fieldMetadata?.multipleFieldMetadata?.index;\n\n const disableMoveLeft = indexOfElement === 0; // first element\n const disableMoveRight = indexOfElement === totalElementCount - 1; // last element\n\n useEffect(() => {\n async function fetchFieldSchema() {\n const fieldSchema = await FieldSchemaMap.getFieldSchema(\n fieldMetadata.content_type_uid,\n fieldMetadata.fieldPath\n );\n if (fieldSchema) {\n setFieldSchema(fieldSchema);\n }\n const variantStatus = await getFieldVariantStatus(fieldMetadata);\n setFieldVariantStatus(variantStatus ?? BASE_VARIANT_STATUS);\n }\n fetchFieldSchema();\n }, [fieldMetadata]);\n\n useEffect(() => {\n const event = visualBuilderPostMessage?.on(\n VisualBuilderPostMessageEvents.DELETE_INSTANCE,\n (args: { data: { path: string } }) => {\n if (\n args.data?.path ===\n fieldMetadata.instance.fieldPathWithIndex\n ) {\n props.hideOverlay();\n }\n }\n );\n return () => {\n event?.unregister();\n };\n }, []);\n\n const multipleFieldToolbarButtonClasses = classNames(\n \"visual-builder__button visual-builder__button--secondary\",\n visualBuilderStyles()[\"visual-builder__button\"],\n visualBuilderStyles()[\"visual-builder__button--secondary\"],\n visualBuilderStyles()[\"visual-builder__tooltip\"],\n {\n \"visual-builder__tooltip--bottom\": invertTooltipPosition,\n [visualBuilderStyles()[\"visual-builder__tooltip--bottom\"]]:\n invertTooltipPosition,\n }\n );\n\n return (\n <div\n className={classNames(\n \"visual-builder__field-toolbar-container\",\n visualBuilderStyles()[\"visual-builder__field-toolbar-container\"]\n )}\n >\n <div\n className={classNames(\n \"visual-builder__focused-toolbar__multiple-field-toolbar\",\n visualBuilderStyles()[\n \"visual-builder__focused-toolbar__multiple-field-toolbar\"\n ]\n )}\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar\"\n >\n <div\n className={classNames(\n \"visual-builder__focused-toolbar__button-group\",\n visualBuilderStyles()[\n \"visual-builder__focused-toolbar__button-group\"\n ]\n )}\n >\n <>\n {isVariant ? (\n <VariantRevertDropdown\n fieldDataName={fieldMetadata.fieldPathWithIndex}\n fieldMetadata={fieldMetadata}\n variantStatus={fieldVariantStatus}\n isOpen={isOpenVariantRevert}\n closeDropdown={closeVariantDropdown}\n invertTooltipPosition={invertTooltipPosition}\n toggleVariantDropdown={toggleVariantDropdown}\n />\n ) : null}\n {isMultiple && !isWholeMultipleField ? (\n <>\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__move-left-button\"\n className={\n multipleFieldToolbarButtonClasses\n }\n data-tooltip={\n direction === \"vertical\"\n ? \"Move up\"\n : \"Move left\"\n }\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleMoveInstance(\n fieldMetadata,\n \"previous\"\n );\n }}\n disabled={disableMoveLeft}\n >\n <MoveLeftIcon\n className={classNames({\n \"visual-builder__rotate--90\":\n direction === \"vertical\",\n [visualBuilderStyles()[\n \"visual-builder__rotate--90\"\n ]]: direction === \"vertical\",\n })}\n disabled={disableMoveLeft}\n />\n </button>\n\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__move-right-button\"\n className={\n multipleFieldToolbarButtonClasses\n }\n data-tooltip={\n direction === \"vertical\"\n ? \"Move down\"\n : \"Move right\"\n }\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleMoveInstance(\n fieldMetadata,\n \"next\"\n );\n }}\n disabled={disableMoveRight}\n >\n <MoveRightIcon\n className={classNames({\n \"visual-builder__rotate--90\":\n direction === \"vertical\",\n [visualBuilderStyles()[\n \"visual-builder__rotate--90\"\n ]]: direction === \"vertical\",\n })}\n disabled={disableMoveRight}\n />\n </button>\n\n {isModalEditable ? editButton : null}\n {formButton}\n {isReplaceAllowed ? replaceButton : null}\n\n <button\n data-testid=\"visual-builder__focused-toolbar__multiple-field-toolbar__delete-button\"\n className={\n multipleFieldToolbarButtonClasses\n }\n data-tooltip={\"Delete\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleDeleteInstance(fieldMetadata);\n }}\n >\n <DeleteIcon />\n </button>\n </>\n ) : (\n <>\n {isModalEditable ? editButton : null}\n {isReplaceAllowed ? replaceButton : null}\n {formButton}\n {fieldSchema ? (\n <CommentIcon\n fieldMetadata={fieldMetadata}\n fieldSchema={fieldSchema}\n invertTooltipPosition={\n invertTooltipPosition\n }\n />\n ) : null}\n </>\n )}\n </>\n </div>\n </div>\n </div>\n );\n}\n\nexport default FieldToolbarComponent;\n"],"mappings":"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","names":["fieldSchema"]}
@@ -36,28 +36,55 @@ module.exports = __toCommonJS(addInstanceButton_exports);
36
36
  var import_classnames = __toESM(require("classnames"), 1);
37
37
  var import_visualBuilder = require("../visualBuilder.style.cjs");
38
38
  var import_icons = require("./icons/index.cjs");
39
+ var import_visualBuilderPostMessage = __toESM(require("../utils/visualBuilderPostMessage.cjs"), 1);
40
+ var import_postMessage = require("../utils/types/postMessage.types.cjs");
39
41
  var import_jsx_runtime = require("preact/jsx-runtime");
40
42
  function AddInstanceButtonComponent(props) {
41
43
  const fieldSchema = props.fieldSchema;
42
- const disabled = fieldSchema && "max_instance" in fieldSchema && fieldSchema.max_instance ? props.value.length >= fieldSchema.max_instance : false;
44
+ const fieldMetadata = props.fieldMetadata;
45
+ const index = props.index;
46
+ const loading = props.loading;
47
+ const onClick = async (event) => {
48
+ loading.value = true;
49
+ try {
50
+ await import_visualBuilderPostMessage.default?.send(
51
+ import_postMessage.VisualBuilderPostMessageEvents.ADD_INSTANCE,
52
+ {
53
+ fieldMetadata,
54
+ index
55
+ }
56
+ );
57
+ } catch (error) {
58
+ console.error("Visual Builder: Failed to add instance", error);
59
+ }
60
+ loading.value = false;
61
+ props.onClick(event);
62
+ };
63
+ const buttonClassName = (0, import_classnames.default)(
64
+ "visual-builder__add-button",
65
+ (0, import_visualBuilder.visualBuilderStyles)()["visual-builder__add-button"],
66
+ {
67
+ "visual-builder__add-button--with-label": props.label
68
+ },
69
+ {
70
+ [(0, import_visualBuilder.visualBuilderStyles)()["visual-builder__add-button--loading"]]: loading.value
71
+ },
72
+ (0, import_visualBuilder.visualBuilderStyles)()["visual-builder__tooltip"]
73
+ );
74
+ const maxInstances = fieldSchema && fieldSchema.data_type !== "block" ? fieldSchema.max_instance : void 0;
75
+ const isMaxInstances = maxInstances ? props.value.length >= maxInstances : false;
76
+ const disabled = loading.value || isMaxInstances;
43
77
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
44
78
  "button",
45
79
  {
46
- className: (0, import_classnames.default)(
47
- "visual-builder__add-button",
48
- (0, import_visualBuilder.visualBuilderStyles)()["visual-builder__add-button"],
49
- {
50
- "visual-builder__add-button--with-label": props.label
51
- },
52
- (0, import_visualBuilder.visualBuilderStyles)()["visual-builder__tooltip"]
53
- ),
80
+ className: buttonClassName,
54
81
  "data-tooltip": "Add section",
55
82
  "data-testid": "visual-builder-add-instance-button",
56
83
  disabled,
57
- title: disabled && fieldSchema && "max_instance" in fieldSchema ? `Max ${fieldSchema.max_instance} instances allowed` : void 0,
84
+ title: maxInstances && isMaxInstances ? `Max ${maxInstances} instances allowed` : void 0,
58
85
  onClick: (e) => {
59
86
  const event = e;
60
- props.onClick(event);
87
+ onClick(event);
61
88
  },
62
89
  children: [
63
90
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PlusIcon, {}),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/components/addInstanceButton.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport classNames from \"classnames\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { PlusIcon } from \"./icons\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\n\ninterface AddInstanceButtonProps {\n value: any;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n fieldSchema: ISchemaFieldMap | undefined;\n}\n\nfunction AddInstanceButtonComponent(\n props: AddInstanceButtonProps\n): JSX.Element {\n const fieldSchema = props.fieldSchema;\n const disabled =\n fieldSchema && \"max_instance\" in fieldSchema && fieldSchema.max_instance\n ? props.value.length >= fieldSchema.max_instance\n : false;\n\n return (\n <button\n className={classNames(\n \"visual-builder__add-button\",\n visualBuilderStyles()[\"visual-builder__add-button\"],\n {\n \"visual-builder__add-button--with-label\": props.label,\n },\n visualBuilderStyles()[\"visual-builder__tooltip\"]\n )}\n data-tooltip={\"Add section\"}\n data-testid=\"visual-builder-add-instance-button\"\n disabled={disabled}\n title={\n disabled && fieldSchema && \"max_instance\" in fieldSchema\n ? `Max ${fieldSchema.max_instance} instances allowed`\n : undefined\n }\n onClick={(e) => {\n const event = e as unknown as MouseEvent;\n props.onClick(event);\n }}\n >\n <PlusIcon />\n {props.label ? (\n <span\n title={props.label}\n className={classNames(\n \"visual-builder__add-button-label\",\n visualBuilderStyles()[\n \"visual-builder__add-button-label\"\n ]\n )}\n >\n {props.label}\n </span>\n ) : null}\n </button>\n );\n}\n\nexport default AddInstanceButtonComponent;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAAuB;AACvB,2BAAoC;AACpC,mBAAyB;AAoBjB;AAVR,SAAS,2BACL,OACW;AACX,QAAM,cAAc,MAAM;AAC1B,QAAM,WACF,eAAe,kBAAkB,eAAe,YAAY,eACtD,MAAM,MAAM,UAAU,YAAY,eAClC;AAEV,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAW,kBAAAA;AAAA,QACP;AAAA,YACA,0CAAoB,EAAE,4BAA4B;AAAA,QAClD;AAAA,UACI,0CAA0C,MAAM;AAAA,QACpD;AAAA,YACA,0CAAoB,EAAE,yBAAyB;AAAA,MACnD;AAAA,MACA,gBAAc;AAAA,MACd,eAAY;AAAA,MACZ;AAAA,MACA,OACI,YAAY,eAAe,kBAAkB,cACvC,OAAO,YAAY,YAAY,uBAC/B;AAAA,MAEV,SAAS,CAAC,MAAM;AACZ,cAAM,QAAQ;AACd,cAAM,QAAQ,KAAK;AAAA,MACvB;AAAA,MAEA;AAAA,oDAAC,yBAAS;AAAA,QACT,MAAM,QACH;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,MAAM;AAAA,YACb,eAAW,kBAAAA;AAAA,cACP;AAAA,kBACA,0CAAoB,EAChB,kCACJ;AAAA,YACJ;AAAA,YAEC,gBAAM;AAAA;AAAA,QACX,IACA;AAAA;AAAA;AAAA,EACR;AAER;AAEA,IAAO,4BAAQ;","names":["classNames"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/components/addInstanceButton.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport classNames from \"classnames\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { PlusIcon } from \"./icons\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\nimport { Signal } from \"@preact/signals\";\n\ninterface AddInstanceButtonProps {\n value: any;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n fieldSchema: ISchemaFieldMap | undefined;\n fieldMetadata: CslpData;\n index: number;\n loading: Signal<boolean>;\n}\n\nfunction AddInstanceButtonComponent(\n props: AddInstanceButtonProps\n): JSX.Element {\n const fieldSchema = props.fieldSchema;\n const fieldMetadata = props.fieldMetadata;\n const index = props.index;\n const loading = props.loading;\n\n const onClick = async (event: MouseEvent) => {\n loading.value = true;\n try {\n await visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.ADD_INSTANCE,\n {\n fieldMetadata,\n index,\n }\n );\n } catch (error) {\n console.error(\"Visual Builder: Failed to add instance\", error);\n }\n loading.value = false;\n props.onClick(event);\n };\n\n const buttonClassName = classNames(\n \"visual-builder__add-button\",\n visualBuilderStyles()[\"visual-builder__add-button\"],\n {\n \"visual-builder__add-button--with-label\": props.label,\n },\n {\n [visualBuilderStyles()[\"visual-builder__add-button--loading\"]]:\n loading.value,\n },\n visualBuilderStyles()[\"visual-builder__tooltip\"]\n );\n\n const maxInstances =\n fieldSchema && fieldSchema.data_type !== \"block\"\n ? fieldSchema.max_instance\n : undefined;\n const isMaxInstances = maxInstances\n ? props.value.length >= maxInstances\n : false;\n const disabled = loading.value || isMaxInstances;\n\n return (\n <button\n className={buttonClassName}\n data-tooltip={\"Add section\"}\n data-testid=\"visual-builder-add-instance-button\"\n disabled={disabled}\n title={\n maxInstances && isMaxInstances\n ? `Max ${maxInstances} instances allowed`\n : undefined\n }\n onClick={(e) => {\n const event = e as unknown as MouseEvent;\n onClick(event);\n }}\n >\n <PlusIcon />\n {props.label ? (\n <span\n title={props.label}\n className={classNames(\n \"visual-builder__add-button-label\",\n visualBuilderStyles()[\n \"visual-builder__add-button-label\"\n ]\n )}\n >\n {props.label}\n </span>\n ) : null}\n </button>\n );\n}\n\nexport default AddInstanceButtonComponent;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAAuB;AACvB,2BAAoC;AACpC,mBAAyB;AAGzB,sCAAqC;AACrC,yBAA+C;AA6DvC;AAhDR,SAAS,2BACL,OACW;AACX,QAAM,cAAc,MAAM;AAC1B,QAAM,gBAAgB,MAAM;AAC5B,QAAM,QAAQ,MAAM;AACpB,QAAM,UAAU,MAAM;AAEtB,QAAM,UAAU,OAAO,UAAsB;AACzC,YAAQ,QAAQ;AAChB,QAAI;AACA,YAAM,gCAAAA,SAA0B;AAAA,QAC5B,kDAA+B;AAAA,QAC/B;AAAA,UACI;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,0CAA0C,KAAK;AAAA,IACjE;AACA,YAAQ,QAAQ;AAChB,UAAM,QAAQ,KAAK;AAAA,EACvB;AAEA,QAAM,sBAAkB,kBAAAC;AAAA,IACpB;AAAA,QACA,0CAAoB,EAAE,4BAA4B;AAAA,IAClD;AAAA,MACI,0CAA0C,MAAM;AAAA,IACpD;AAAA,IACA;AAAA,MACI,KAAC,0CAAoB,EAAE,qCAAqC,CAAC,GACzD,QAAQ;AAAA,IAChB;AAAA,QACA,0CAAoB,EAAE,yBAAyB;AAAA,EACnD;AAEA,QAAM,eACF,eAAe,YAAY,cAAc,UACnC,YAAY,eACZ;AACV,QAAM,iBAAiB,eACjB,MAAM,MAAM,UAAU,eACtB;AACN,QAAM,WAAW,QAAQ,SAAS;AAElC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,MACX,gBAAc;AAAA,MACd,eAAY;AAAA,MACZ;AAAA,MACA,OACI,gBAAgB,iBACV,OAAO,YAAY,uBACnB;AAAA,MAEV,SAAS,CAAC,MAAM;AACZ,cAAM,QAAQ;AACd,gBAAQ,KAAK;AAAA,MACjB;AAAA,MAEA;AAAA,oDAAC,yBAAS;AAAA,QACT,MAAM,QACH;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,MAAM;AAAA,YACb,eAAW,kBAAAA;AAAA,cACP;AAAA,kBACA,0CAAoB,EAChB,kCACJ;AAAA,YACJ;AAAA,YAEC,gBAAM;AAAA;AAAA,QACX,IACA;AAAA;AAAA;AAAA,EACR;AAER;AAEA,IAAO,4BAAQ;","names":["visualBuilderPostMessage","classNames"]}
@@ -1,4 +1,6 @@
1
1
  import { ISchemaFieldMap } from '../utils/types/index.types.cjs';
2
+ import { CslpData } from '../../cslp/types/cslp.types.cjs';
3
+ import { Signal } from '@preact/signals';
2
4
  import '../../cms/types/contentTypeSchema.types.cjs';
3
5
 
4
6
  interface AddInstanceButtonProps {
@@ -6,6 +8,9 @@ interface AddInstanceButtonProps {
6
8
  onClick: (event: MouseEvent) => void;
7
9
  label?: string | undefined;
8
10
  fieldSchema: ISchemaFieldMap | undefined;
11
+ fieldMetadata: CslpData;
12
+ index: number;
13
+ loading: Signal<boolean>;
9
14
  }
10
15
  declare function AddInstanceButtonComponent(props: AddInstanceButtonProps): JSX.Element;
11
16
 
@@ -1,4 +1,6 @@
1
1
  import { ISchemaFieldMap } from '../utils/types/index.types.js';
2
+ import { CslpData } from '../../cslp/types/cslp.types.js';
3
+ import { Signal } from '@preact/signals';
2
4
  import '../../cms/types/contentTypeSchema.types.js';
3
5
 
4
6
  interface AddInstanceButtonProps {
@@ -6,6 +8,9 @@ interface AddInstanceButtonProps {
6
8
  onClick: (event: MouseEvent) => void;
7
9
  label?: string | undefined;
8
10
  fieldSchema: ISchemaFieldMap | undefined;
11
+ fieldMetadata: CslpData;
12
+ index: number;
13
+ loading: Signal<boolean>;
9
14
  }
10
15
  declare function AddInstanceButtonComponent(props: AddInstanceButtonProps): JSX.Element;
11
16
 
@@ -4,28 +4,55 @@ import "../../chunk-5WRI5ZAA.js";
4
4
  import classNames from "classnames";
5
5
  import { visualBuilderStyles } from "../visualBuilder.style.js";
6
6
  import { PlusIcon } from "./icons/index.js";
7
+ import visualBuilderPostMessage from "../utils/visualBuilderPostMessage.js";
8
+ import { VisualBuilderPostMessageEvents } from "../utils/types/postMessage.types.js";
7
9
  import { jsx, jsxs } from "preact/jsx-runtime";
8
10
  function AddInstanceButtonComponent(props) {
9
11
  const fieldSchema = props.fieldSchema;
10
- const disabled = fieldSchema && "max_instance" in fieldSchema && fieldSchema.max_instance ? props.value.length >= fieldSchema.max_instance : false;
12
+ const fieldMetadata = props.fieldMetadata;
13
+ const index = props.index;
14
+ const loading = props.loading;
15
+ const onClick = async (event) => {
16
+ loading.value = true;
17
+ try {
18
+ await visualBuilderPostMessage?.send(
19
+ VisualBuilderPostMessageEvents.ADD_INSTANCE,
20
+ {
21
+ fieldMetadata,
22
+ index
23
+ }
24
+ );
25
+ } catch (error) {
26
+ console.error("Visual Builder: Failed to add instance", error);
27
+ }
28
+ loading.value = false;
29
+ props.onClick(event);
30
+ };
31
+ const buttonClassName = classNames(
32
+ "visual-builder__add-button",
33
+ visualBuilderStyles()["visual-builder__add-button"],
34
+ {
35
+ "visual-builder__add-button--with-label": props.label
36
+ },
37
+ {
38
+ [visualBuilderStyles()["visual-builder__add-button--loading"]]: loading.value
39
+ },
40
+ visualBuilderStyles()["visual-builder__tooltip"]
41
+ );
42
+ const maxInstances = fieldSchema && fieldSchema.data_type !== "block" ? fieldSchema.max_instance : void 0;
43
+ const isMaxInstances = maxInstances ? props.value.length >= maxInstances : false;
44
+ const disabled = loading.value || isMaxInstances;
11
45
  return /* @__PURE__ */ jsxs(
12
46
  "button",
13
47
  {
14
- className: classNames(
15
- "visual-builder__add-button",
16
- visualBuilderStyles()["visual-builder__add-button"],
17
- {
18
- "visual-builder__add-button--with-label": props.label
19
- },
20
- visualBuilderStyles()["visual-builder__tooltip"]
21
- ),
48
+ className: buttonClassName,
22
49
  "data-tooltip": "Add section",
23
50
  "data-testid": "visual-builder-add-instance-button",
24
51
  disabled,
25
- title: disabled && fieldSchema && "max_instance" in fieldSchema ? `Max ${fieldSchema.max_instance} instances allowed` : void 0,
52
+ title: maxInstances && isMaxInstances ? `Max ${maxInstances} instances allowed` : void 0,
26
53
  onClick: (e) => {
27
54
  const event = e;
28
- props.onClick(event);
55
+ onClick(event);
29
56
  },
30
57
  children: [
31
58
  /* @__PURE__ */ jsx(PlusIcon, {}),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/components/addInstanceButton.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport classNames from \"classnames\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { PlusIcon } from \"./icons\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\n\ninterface AddInstanceButtonProps {\n value: any;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n fieldSchema: ISchemaFieldMap | undefined;\n}\n\nfunction AddInstanceButtonComponent(\n props: AddInstanceButtonProps\n): JSX.Element {\n const fieldSchema = props.fieldSchema;\n const disabled =\n fieldSchema && \"max_instance\" in fieldSchema && fieldSchema.max_instance\n ? props.value.length >= fieldSchema.max_instance\n : false;\n\n return (\n <button\n className={classNames(\n \"visual-builder__add-button\",\n visualBuilderStyles()[\"visual-builder__add-button\"],\n {\n \"visual-builder__add-button--with-label\": props.label,\n },\n visualBuilderStyles()[\"visual-builder__tooltip\"]\n )}\n data-tooltip={\"Add section\"}\n data-testid=\"visual-builder-add-instance-button\"\n disabled={disabled}\n title={\n disabled && fieldSchema && \"max_instance\" in fieldSchema\n ? `Max ${fieldSchema.max_instance} instances allowed`\n : undefined\n }\n onClick={(e) => {\n const event = e as unknown as MouseEvent;\n props.onClick(event);\n }}\n >\n <PlusIcon />\n {props.label ? (\n <span\n title={props.label}\n className={classNames(\n \"visual-builder__add-button-label\",\n visualBuilderStyles()[\n \"visual-builder__add-button-label\"\n ]\n )}\n >\n {props.label}\n </span>\n ) : null}\n </button>\n );\n}\n\nexport default AddInstanceButtonComponent;\n"],"mappings":";;;AACA,OAAO,gBAAgB;AACvB,SAAS,2BAA2B;AACpC,SAAS,gBAAgB;AAoBjB,SAsBI,KAtBJ;AAVR,SAAS,2BACL,OACW;AACX,QAAM,cAAc,MAAM;AAC1B,QAAM,WACF,eAAe,kBAAkB,eAAe,YAAY,eACtD,MAAM,MAAM,UAAU,YAAY,eAClC;AAEV,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,oBAAoB,EAAE,4BAA4B;AAAA,QAClD;AAAA,UACI,0CAA0C,MAAM;AAAA,QACpD;AAAA,QACA,oBAAoB,EAAE,yBAAyB;AAAA,MACnD;AAAA,MACA,gBAAc;AAAA,MACd,eAAY;AAAA,MACZ;AAAA,MACA,OACI,YAAY,eAAe,kBAAkB,cACvC,OAAO,YAAY,YAAY,uBAC/B;AAAA,MAEV,SAAS,CAAC,MAAM;AACZ,cAAM,QAAQ;AACd,cAAM,QAAQ,KAAK;AAAA,MACvB;AAAA,MAEA;AAAA,4BAAC,YAAS;AAAA,QACT,MAAM,QACH;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,MAAM;AAAA,YACb,WAAW;AAAA,cACP;AAAA,cACA,oBAAoB,EAChB,kCACJ;AAAA,YACJ;AAAA,YAEC,gBAAM;AAAA;AAAA,QACX,IACA;AAAA;AAAA;AAAA,EACR;AAER;AAEA,IAAO,4BAAQ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/components/addInstanceButton.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport classNames from \"classnames\";\nimport { visualBuilderStyles } from \"../visualBuilder.style\";\nimport { PlusIcon } from \"./icons\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport visualBuilderPostMessage from \"../utils/visualBuilderPostMessage\";\nimport { VisualBuilderPostMessageEvents } from \"../utils/types/postMessage.types\";\nimport { Signal } from \"@preact/signals\";\n\ninterface AddInstanceButtonProps {\n value: any;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n fieldSchema: ISchemaFieldMap | undefined;\n fieldMetadata: CslpData;\n index: number;\n loading: Signal<boolean>;\n}\n\nfunction AddInstanceButtonComponent(\n props: AddInstanceButtonProps\n): JSX.Element {\n const fieldSchema = props.fieldSchema;\n const fieldMetadata = props.fieldMetadata;\n const index = props.index;\n const loading = props.loading;\n\n const onClick = async (event: MouseEvent) => {\n loading.value = true;\n try {\n await visualBuilderPostMessage?.send(\n VisualBuilderPostMessageEvents.ADD_INSTANCE,\n {\n fieldMetadata,\n index,\n }\n );\n } catch (error) {\n console.error(\"Visual Builder: Failed to add instance\", error);\n }\n loading.value = false;\n props.onClick(event);\n };\n\n const buttonClassName = classNames(\n \"visual-builder__add-button\",\n visualBuilderStyles()[\"visual-builder__add-button\"],\n {\n \"visual-builder__add-button--with-label\": props.label,\n },\n {\n [visualBuilderStyles()[\"visual-builder__add-button--loading\"]]:\n loading.value,\n },\n visualBuilderStyles()[\"visual-builder__tooltip\"]\n );\n\n const maxInstances =\n fieldSchema && fieldSchema.data_type !== \"block\"\n ? fieldSchema.max_instance\n : undefined;\n const isMaxInstances = maxInstances\n ? props.value.length >= maxInstances\n : false;\n const disabled = loading.value || isMaxInstances;\n\n return (\n <button\n className={buttonClassName}\n data-tooltip={\"Add section\"}\n data-testid=\"visual-builder-add-instance-button\"\n disabled={disabled}\n title={\n maxInstances && isMaxInstances\n ? `Max ${maxInstances} instances allowed`\n : undefined\n }\n onClick={(e) => {\n const event = e as unknown as MouseEvent;\n onClick(event);\n }}\n >\n <PlusIcon />\n {props.label ? (\n <span\n title={props.label}\n className={classNames(\n \"visual-builder__add-button-label\",\n visualBuilderStyles()[\n \"visual-builder__add-button-label\"\n ]\n )}\n >\n {props.label}\n </span>\n ) : null}\n </button>\n );\n}\n\nexport default AddInstanceButtonComponent;\n"],"mappings":";;;AACA,OAAO,gBAAgB;AACvB,SAAS,2BAA2B;AACpC,SAAS,gBAAgB;AAGzB,OAAO,8BAA8B;AACrC,SAAS,sCAAsC;AA6DvC,SAeI,KAfJ;AAhDR,SAAS,2BACL,OACW;AACX,QAAM,cAAc,MAAM;AAC1B,QAAM,gBAAgB,MAAM;AAC5B,QAAM,QAAQ,MAAM;AACpB,QAAM,UAAU,MAAM;AAEtB,QAAM,UAAU,OAAO,UAAsB;AACzC,YAAQ,QAAQ;AAChB,QAAI;AACA,YAAM,0BAA0B;AAAA,QAC5B,+BAA+B;AAAA,QAC/B;AAAA,UACI;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,0CAA0C,KAAK;AAAA,IACjE;AACA,YAAQ,QAAQ;AAChB,UAAM,QAAQ,KAAK;AAAA,EACvB;AAEA,QAAM,kBAAkB;AAAA,IACpB;AAAA,IACA,oBAAoB,EAAE,4BAA4B;AAAA,IAClD;AAAA,MACI,0CAA0C,MAAM;AAAA,IACpD;AAAA,IACA;AAAA,MACI,CAAC,oBAAoB,EAAE,qCAAqC,CAAC,GACzD,QAAQ;AAAA,IAChB;AAAA,IACA,oBAAoB,EAAE,yBAAyB;AAAA,EACnD;AAEA,QAAM,eACF,eAAe,YAAY,cAAc,UACnC,YAAY,eACZ;AACV,QAAM,iBAAiB,eACjB,MAAM,MAAM,UAAU,eACtB;AACN,QAAM,WAAW,QAAQ,SAAS;AAElC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,MACX,gBAAc;AAAA,MACd,eAAY;AAAA,MACZ;AAAA,MACA,OACI,gBAAgB,iBACV,OAAO,YAAY,uBACnB;AAAA,MAEV,SAAS,CAAC,MAAM;AACZ,cAAM,QAAQ;AACd,gBAAQ,KAAK;AAAA,MACjB;AAAA,MAEA;AAAA,4BAAC,YAAS;AAAA,QACT,MAAM,QACH;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,MAAM;AAAA,YACb,WAAW;AAAA,cACP;AAAA,cACA,oBAAoB,EAChB,kCACJ;AAAA,YACJ;AAAA,YAEC,gBAAM;AAAA;AAAA,QACX,IACA;AAAA;AAAA;AAAA,EACR;AAER;AAEA,IAAO,4BAAQ;","names":[]}
@@ -38,8 +38,11 @@ var import_preact = require("preact");
38
38
  var import_addInstanceButton = __toESM(require("../components/addInstanceButton.cjs"), 1);
39
39
  var import_jsx_runtime = require("preact/jsx-runtime");
40
40
  function generateAddInstanceButton({
41
- fieldSchema,
42
41
  value,
42
+ fieldSchema,
43
+ fieldMetadata,
44
+ index,
45
+ loading,
43
46
  onClick,
44
47
  label
45
48
  }) {
@@ -48,10 +51,13 @@ function generateAddInstanceButton({
48
51
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49
52
  import_addInstanceButton.default,
50
53
  {
54
+ loading,
55
+ index,
51
56
  value,
52
57
  label,
53
58
  onClick,
54
- fieldSchema
59
+ fieldSchema,
60
+ fieldMetadata
55
61
  }
56
62
  ),
57
63
  wrapper
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/generators/generateAddInstanceButtons.tsx"],"sourcesContent":["import { render } from \"preact\";\nimport AddInstanceButtonComponent from \"../components/addInstanceButton\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\n\n/**\n * Generates a button element, when clicked, triggers the provided callback function.\n * @param onClickCallback - The function to be called when the button is clicked.\n * @returns The generated button element.\n */\nexport function generateAddInstanceButton({\n fieldSchema,\n value,\n onClick,\n label,\n}: {\n value: any;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n fieldSchema: ISchemaFieldMap | undefined;\n}): HTMLButtonElement {\n const wrapper = document.createDocumentFragment();\n\n render(\n <AddInstanceButtonComponent\n value={value}\n label={label}\n onClick={onClick}\n fieldSchema={fieldSchema}\n />,\n wrapper\n );\n\n const button = wrapper.children[0] as HTMLButtonElement;\n return button;\n}\n\n/**\n * Returns an array of HTMLButtonElement instances that can be used to add new instances to the visual builder.\n * @param visualBuilderContainer - The HTMLDivElement that contains the visual builder.\n * @param getAllButtons - If true, returns all add instance buttons. If false, returns only the previous and next buttons.\n * @returns An array of HTMLButtonElement instances or null if there are less than 2 buttons.\n */\nexport function getAddInstanceButtons(\n visualBuilderContainer: HTMLDivElement,\n getAllButtons = false\n): HTMLButtonElement[] | [HTMLButtonElement, HTMLButtonElement] | null {\n const buttons = visualBuilderContainer.getElementsByClassName(\n \"visual-builder__add-button\"\n );\n\n if (getAllButtons) {\n return Array.from(buttons) as HTMLButtonElement[];\n }\n\n if (buttons.length < 2) {\n return null;\n }\n\n const previousButton = buttons[0] as HTMLButtonElement;\n const nextButton = buttons[1] as HTMLButtonElement;\n\n return [previousButton, nextButton];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AACvB,+BAAuC;AAsB/B;AAdD,SAAS,0BAA0B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKsB;AAClB,QAAM,UAAU,SAAS,uBAAuB;AAEhD;AAAA,IACI;AAAA,MAAC,yBAAAA;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAS,QAAQ,SAAS,CAAC;AACjC,SAAO;AACX;AAQO,SAAS,sBACZ,wBACA,gBAAgB,OACmD;AACnE,QAAM,UAAU,uBAAuB;AAAA,IACnC;AAAA,EACJ;AAEA,MAAI,eAAe;AACf,WAAO,MAAM,KAAK,OAAO;AAAA,EAC7B;AAEA,MAAI,QAAQ,SAAS,GAAG;AACpB,WAAO;AAAA,EACX;AAEA,QAAM,iBAAiB,QAAQ,CAAC;AAChC,QAAM,aAAa,QAAQ,CAAC;AAE5B,SAAO,CAAC,gBAAgB,UAAU;AACtC;","names":["AddInstanceButtonComponent"]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/generators/generateAddInstanceButtons.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport { render } from \"preact\";\nimport AddInstanceButtonComponent from \"../components/addInstanceButton\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { Signal } from \"@preact/signals\";\n\n/**\n * Generates a button element, when clicked, sends the add instance message and\n * then calls the provided callback function.\n * @param onClickCallback - The function to be called when the button is clicked.\n * @returns The generated button element.\n */\nexport function generateAddInstanceButton({\n value,\n fieldSchema,\n fieldMetadata,\n index,\n loading,\n onClick,\n label,\n}: {\n fieldSchema: ISchemaFieldMap | undefined;\n value: any;\n fieldMetadata: CslpData;\n index: number;\n loading: Signal<boolean>;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n}): HTMLButtonElement {\n const wrapper = document.createDocumentFragment();\n\n render(\n <AddInstanceButtonComponent\n loading={loading}\n index={index}\n value={value}\n label={label}\n onClick={onClick}\n fieldSchema={fieldSchema}\n fieldMetadata={fieldMetadata}\n />,\n wrapper\n );\n\n const button = wrapper.children[0] as HTMLButtonElement;\n return button;\n}\n\n/**\n * Returns an array of HTMLButtonElement instances that can be used to add new instances to the visual builder.\n * @param visualBuilderContainer - The HTMLDivElement that contains the visual builder.\n * @param getAllButtons - If true, returns all add instance buttons. If false, returns only the previous and next buttons.\n * @returns An array of HTMLButtonElement instances or null if there are less than 2 buttons.\n */\nexport function getAddInstanceButtons(\n visualBuilderContainer: HTMLDivElement,\n getAllButtons = false\n): HTMLButtonElement[] | [HTMLButtonElement, HTMLButtonElement] | null {\n const buttons = visualBuilderContainer.getElementsByClassName(\n \"visual-builder__add-button\"\n );\n\n if (getAllButtons) {\n return Array.from(buttons) as HTMLButtonElement[];\n }\n\n if (buttons.length < 2) {\n return null;\n }\n\n const previousButton = buttons[0] as HTMLButtonElement;\n const nextButton = buttons[1] as HTMLButtonElement;\n\n return [previousButton, nextButton];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAuB;AACvB,+BAAuC;AA+B/B;AApBD,SAAS,0BAA0B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAQsB;AAClB,QAAM,UAAU,SAAS,uBAAuB;AAEhD;AAAA,IACI;AAAA,MAAC,yBAAAA;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAS,QAAQ,SAAS,CAAC;AACjC,SAAO;AACX;AAQO,SAAS,sBACZ,wBACA,gBAAgB,OACmD;AACnE,QAAM,UAAU,uBAAuB;AAAA,IACnC;AAAA,EACJ;AAEA,MAAI,eAAe;AACf,WAAO,MAAM,KAAK,OAAO;AAAA,EAC7B;AAEA,MAAI,QAAQ,SAAS,GAAG;AACpB,WAAO;AAAA,EACX;AAEA,QAAM,iBAAiB,QAAQ,CAAC;AAChC,QAAM,aAAa,QAAQ,CAAC;AAE5B,SAAO,CAAC,gBAAgB,UAAU;AACtC;","names":["AddInstanceButtonComponent"]}
@@ -1,16 +1,22 @@
1
1
  import { ISchemaFieldMap } from '../utils/types/index.types.cjs';
2
+ import { CslpData } from '../../cslp/types/cslp.types.cjs';
3
+ import { Signal } from '@preact/signals';
2
4
  import '../../cms/types/contentTypeSchema.types.cjs';
3
5
 
4
6
  /**
5
- * Generates a button element, when clicked, triggers the provided callback function.
7
+ * Generates a button element, when clicked, sends the add instance message and
8
+ * then calls the provided callback function.
6
9
  * @param onClickCallback - The function to be called when the button is clicked.
7
10
  * @returns The generated button element.
8
11
  */
9
- declare function generateAddInstanceButton({ fieldSchema, value, onClick, label, }: {
12
+ declare function generateAddInstanceButton({ value, fieldSchema, fieldMetadata, index, loading, onClick, label, }: {
13
+ fieldSchema: ISchemaFieldMap | undefined;
10
14
  value: any;
15
+ fieldMetadata: CslpData;
16
+ index: number;
17
+ loading: Signal<boolean>;
11
18
  onClick: (event: MouseEvent) => void;
12
19
  label?: string | undefined;
13
- fieldSchema: ISchemaFieldMap | undefined;
14
20
  }): HTMLButtonElement;
15
21
  /**
16
22
  * Returns an array of HTMLButtonElement instances that can be used to add new instances to the visual builder.
@@ -1,16 +1,22 @@
1
1
  import { ISchemaFieldMap } from '../utils/types/index.types.js';
2
+ import { CslpData } from '../../cslp/types/cslp.types.js';
3
+ import { Signal } from '@preact/signals';
2
4
  import '../../cms/types/contentTypeSchema.types.js';
3
5
 
4
6
  /**
5
- * Generates a button element, when clicked, triggers the provided callback function.
7
+ * Generates a button element, when clicked, sends the add instance message and
8
+ * then calls the provided callback function.
6
9
  * @param onClickCallback - The function to be called when the button is clicked.
7
10
  * @returns The generated button element.
8
11
  */
9
- declare function generateAddInstanceButton({ fieldSchema, value, onClick, label, }: {
12
+ declare function generateAddInstanceButton({ value, fieldSchema, fieldMetadata, index, loading, onClick, label, }: {
13
+ fieldSchema: ISchemaFieldMap | undefined;
10
14
  value: any;
15
+ fieldMetadata: CslpData;
16
+ index: number;
17
+ loading: Signal<boolean>;
11
18
  onClick: (event: MouseEvent) => void;
12
19
  label?: string | undefined;
13
- fieldSchema: ISchemaFieldMap | undefined;
14
20
  }): HTMLButtonElement;
15
21
  /**
16
22
  * Returns an array of HTMLButtonElement instances that can be used to add new instances to the visual builder.
@@ -5,8 +5,11 @@ import { render } from "preact";
5
5
  import AddInstanceButtonComponent from "../components/addInstanceButton.js";
6
6
  import { jsx } from "preact/jsx-runtime";
7
7
  function generateAddInstanceButton({
8
- fieldSchema,
9
8
  value,
9
+ fieldSchema,
10
+ fieldMetadata,
11
+ index,
12
+ loading,
10
13
  onClick,
11
14
  label
12
15
  }) {
@@ -15,10 +18,13 @@ function generateAddInstanceButton({
15
18
  /* @__PURE__ */ jsx(
16
19
  AddInstanceButtonComponent,
17
20
  {
21
+ loading,
22
+ index,
18
23
  value,
19
24
  label,
20
25
  onClick,
21
- fieldSchema
26
+ fieldSchema,
27
+ fieldMetadata
22
28
  }
23
29
  ),
24
30
  wrapper
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/visualBuilder/generators/generateAddInstanceButtons.tsx"],"sourcesContent":["import { render } from \"preact\";\nimport AddInstanceButtonComponent from \"../components/addInstanceButton\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\n\n/**\n * Generates a button element, when clicked, triggers the provided callback function.\n * @param onClickCallback - The function to be called when the button is clicked.\n * @returns The generated button element.\n */\nexport function generateAddInstanceButton({\n fieldSchema,\n value,\n onClick,\n label,\n}: {\n value: any;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n fieldSchema: ISchemaFieldMap | undefined;\n}): HTMLButtonElement {\n const wrapper = document.createDocumentFragment();\n\n render(\n <AddInstanceButtonComponent\n value={value}\n label={label}\n onClick={onClick}\n fieldSchema={fieldSchema}\n />,\n wrapper\n );\n\n const button = wrapper.children[0] as HTMLButtonElement;\n return button;\n}\n\n/**\n * Returns an array of HTMLButtonElement instances that can be used to add new instances to the visual builder.\n * @param visualBuilderContainer - The HTMLDivElement that contains the visual builder.\n * @param getAllButtons - If true, returns all add instance buttons. If false, returns only the previous and next buttons.\n * @returns An array of HTMLButtonElement instances or null if there are less than 2 buttons.\n */\nexport function getAddInstanceButtons(\n visualBuilderContainer: HTMLDivElement,\n getAllButtons = false\n): HTMLButtonElement[] | [HTMLButtonElement, HTMLButtonElement] | null {\n const buttons = visualBuilderContainer.getElementsByClassName(\n \"visual-builder__add-button\"\n );\n\n if (getAllButtons) {\n return Array.from(buttons) as HTMLButtonElement[];\n }\n\n if (buttons.length < 2) {\n return null;\n }\n\n const previousButton = buttons[0] as HTMLButtonElement;\n const nextButton = buttons[1] as HTMLButtonElement;\n\n return [previousButton, nextButton];\n}\n"],"mappings":";;;AAAA,SAAS,cAAc;AACvB,OAAO,gCAAgC;AAsB/B;AAdD,SAAS,0BAA0B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKsB;AAClB,QAAM,UAAU,SAAS,uBAAuB;AAEhD;AAAA,IACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAS,QAAQ,SAAS,CAAC;AACjC,SAAO;AACX;AAQO,SAAS,sBACZ,wBACA,gBAAgB,OACmD;AACnE,QAAM,UAAU,uBAAuB;AAAA,IACnC;AAAA,EACJ;AAEA,MAAI,eAAe;AACf,WAAO,MAAM,KAAK,OAAO;AAAA,EAC7B;AAEA,MAAI,QAAQ,SAAS,GAAG;AACpB,WAAO;AAAA,EACX;AAEA,QAAM,iBAAiB,QAAQ,CAAC;AAChC,QAAM,aAAa,QAAQ,CAAC;AAE5B,SAAO,CAAC,gBAAgB,UAAU;AACtC;","names":[]}
1
+ {"version":3,"sources":["../../../../src/visualBuilder/generators/generateAddInstanceButtons.tsx"],"sourcesContent":["import React from \"preact/compat\";\nimport { render } from \"preact\";\nimport AddInstanceButtonComponent from \"../components/addInstanceButton\";\nimport { ISchemaFieldMap } from \"../utils/types/index.types\";\nimport { CslpData } from \"../../cslp/types/cslp.types\";\nimport { Signal } from \"@preact/signals\";\n\n/**\n * Generates a button element, when clicked, sends the add instance message and\n * then calls the provided callback function.\n * @param onClickCallback - The function to be called when the button is clicked.\n * @returns The generated button element.\n */\nexport function generateAddInstanceButton({\n value,\n fieldSchema,\n fieldMetadata,\n index,\n loading,\n onClick,\n label,\n}: {\n fieldSchema: ISchemaFieldMap | undefined;\n value: any;\n fieldMetadata: CslpData;\n index: number;\n loading: Signal<boolean>;\n onClick: (event: MouseEvent) => void;\n label?: string | undefined;\n}): HTMLButtonElement {\n const wrapper = document.createDocumentFragment();\n\n render(\n <AddInstanceButtonComponent\n loading={loading}\n index={index}\n value={value}\n label={label}\n onClick={onClick}\n fieldSchema={fieldSchema}\n fieldMetadata={fieldMetadata}\n />,\n wrapper\n );\n\n const button = wrapper.children[0] as HTMLButtonElement;\n return button;\n}\n\n/**\n * Returns an array of HTMLButtonElement instances that can be used to add new instances to the visual builder.\n * @param visualBuilderContainer - The HTMLDivElement that contains the visual builder.\n * @param getAllButtons - If true, returns all add instance buttons. If false, returns only the previous and next buttons.\n * @returns An array of HTMLButtonElement instances or null if there are less than 2 buttons.\n */\nexport function getAddInstanceButtons(\n visualBuilderContainer: HTMLDivElement,\n getAllButtons = false\n): HTMLButtonElement[] | [HTMLButtonElement, HTMLButtonElement] | null {\n const buttons = visualBuilderContainer.getElementsByClassName(\n \"visual-builder__add-button\"\n );\n\n if (getAllButtons) {\n return Array.from(buttons) as HTMLButtonElement[];\n }\n\n if (buttons.length < 2) {\n return null;\n }\n\n const previousButton = buttons[0] as HTMLButtonElement;\n const nextButton = buttons[1] as HTMLButtonElement;\n\n return [previousButton, nextButton];\n}\n"],"mappings":";;;AACA,SAAS,cAAc;AACvB,OAAO,gCAAgC;AA+B/B;AApBD,SAAS,0BAA0B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAQsB;AAClB,QAAM,UAAU,SAAS,uBAAuB;AAEhD;AAAA,IACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,SAAS,QAAQ,SAAS,CAAC;AACjC,SAAO;AACX;AAQO,SAAS,sBACZ,wBACA,gBAAgB,OACmD;AACnE,QAAM,UAAU,uBAAuB;AAAA,IACnC;AAAA,EACJ;AAEA,MAAI,eAAe;AACf,WAAO,MAAM,KAAK,OAAO;AAAA,EAC7B;AAEA,MAAI,QAAQ,SAAS,GAAG;AACpB,WAAO;AAAA,EACX;AAEA,QAAM,iBAAiB,QAAQ,CAAC;AAChC,QAAM,aAAa,QAAQ,CAAC;AAE5B,SAAO,CAAC,gBAAgB,UAAU;AACtC;","names":[]}
@@ -72,6 +72,13 @@ async function handleBuilderInteraction(params) {
72
72
  if (eventTarget?.getAttribute("data-studio-ui") === "true") {
73
73
  return;
74
74
  }
75
+ if (params.event.altKey) {
76
+ if (isAnchorElement) {
77
+ params.event.preventDefault();
78
+ params.event.stopPropagation();
79
+ }
80
+ return;
81
+ }
75
82
  if (isAnchorElement || elementHasCslp && !eventTarget.closest(".visual-builder__empty-block")) {
76
83
  params.event.preventDefault();
77
84
  params.event.stopPropagation();