Skip to content

Commit acf2fb4

Browse files
authored
Merge pull request #290 from contentstack/handle-remove-focus-event
Handle remove focus event
2 parents 95dfca1 + 384d1a4 commit acf2fb4

3 files changed

Lines changed: 40 additions & 30 deletions

File tree

src/visualBuilder/generators/generateOverlay.tsx

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export function hideFocusOverlay(elements: HideOverlayParams): void {
106106
visualBuilderOverlayWrapper,
107107
focusedToolbar,
108108
resizeObserver,
109-
noTrigger
109+
noTrigger,
110110
} = elements;
111111

112112
if (visualBuilderOverlayWrapper) {
@@ -119,13 +119,23 @@ export function hideFocusOverlay(elements: HideOverlayParams): void {
119119
}
120120
});
121121

122-
if(!noTrigger){
122+
if (!noTrigger) {
123123
sendFieldEvent({
124124
visualBuilderContainer,
125125
eventType: VisualBuilderPostMessageEvents.UPDATE_FIELD,
126126
});
127+
} else {
128+
const { previousSelectedEditableDOM, focusFieldValue } =
129+
VisualBuilder.VisualBuilderGlobalState.value || {};
130+
if (
131+
previousSelectedEditableDOM &&
132+
"innerText" in previousSelectedEditableDOM &&
133+
focusFieldValue != null
134+
) {
135+
previousSelectedEditableDOM.innerText = focusFieldValue;
136+
}
127137
}
128-
138+
VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue = null;
129139
cleanIndividualFieldResidual({
130140
overlayWrapper: visualBuilderOverlayWrapper,
131141
visualBuilderContainer: visualBuilderContainer,
@@ -136,23 +146,22 @@ export function hideFocusOverlay(elements: HideOverlayParams): void {
136146
}
137147
interface ISendFieldEventParams {
138148
visualBuilderContainer: HTMLElement | null;
139-
eventType: VisualBuilderPostMessageEvents.UPDATE_FIELD | VisualBuilderPostMessageEvents.SYNC_FIELD
149+
eventType:
150+
| VisualBuilderPostMessageEvents.UPDATE_FIELD
151+
| VisualBuilderPostMessageEvents.SYNC_FIELD;
140152
}
141153
export function sendFieldEvent(options: ISendFieldEventParams): void {
142-
const {
143-
visualBuilderContainer,
144-
eventType
145-
} = options;
146-
const previousSelectedEditableDOM = VisualBuilder.VisualBuilderGlobalState.value.previousSelectedEditableDOM;
154+
const { visualBuilderContainer, eventType } = options;
155+
const previousSelectedEditableDOM =
156+
VisualBuilder.VisualBuilderGlobalState.value
157+
.previousSelectedEditableDOM;
147158
const pseudoEditableElement = visualBuilderContainer?.querySelector(
148159
"div.visual-builder__pseudo-editable-element"
149160
);
150161
if (
151162
previousSelectedEditableDOM &&
152-
(
153-
previousSelectedEditableDOM.hasAttribute("contenteditable") ||
154-
pseudoEditableElement
155-
)
163+
(previousSelectedEditableDOM.hasAttribute("contenteditable") ||
164+
pseudoEditableElement)
156165
) {
157166
const actualEditedElement =
158167
pseudoEditableElement ||
@@ -164,37 +173,31 @@ export function sendFieldEvent(options: ISendFieldEventParams): void {
164173
: actualEditedElement.textContent;
165174

166175
const fieldMetadata = extractDetailsFromCslp(
167-
previousSelectedEditableDOM.getAttribute(
168-
"data-cslp"
169-
) as string
176+
previousSelectedEditableDOM.getAttribute("data-cslp") as string
170177
);
171178

172179
FieldSchemaMap.getFieldSchema(
173180
fieldMetadata.content_type_uid,
174181
fieldMetadata.fieldPath
175182
)
176183
.then((fieldSchema) => {
177-
if (fieldSchema && eventType === VisualBuilderPostMessageEvents.UPDATE_FIELD) {
184+
if (
185+
fieldSchema &&
186+
eventType === VisualBuilderPostMessageEvents.UPDATE_FIELD
187+
) {
178188
const fieldType = getFieldType(fieldSchema);
179-
if (
180-
fieldType &&
181-
fieldType === FieldDataType.MULTILINE
182-
) {
183-
data =
184-
getMultilinePlaintext(actualEditedElement);
189+
if (fieldType && fieldType === FieldDataType.MULTILINE) {
190+
data = getMultilinePlaintext(actualEditedElement);
185191
(actualEditedElement as HTMLElement).innerText =
186192
data as string;
187193
}
188194
}
189195
})
190196
.finally(() => {
191-
visualBuilderPostMessage?.send(
192-
eventType,
193-
{
194-
data,
195-
fieldMetadata,
196-
}
197-
);
197+
visualBuilderPostMessage?.send(eventType, {
198+
data,
199+
fieldMetadata,
200+
});
198201
});
199202
}
200203
}

src/visualBuilder/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ interface VisualBuilderGlobalStateImpl {
4747
previousSelectedEditableDOM: HTMLElement | Element | null;
4848
previousHoveredTargetDOM: Element | null;
4949
previousEmptyBlockParents: Element[] | [];
50+
focusFieldValue: string | null;
5051
audienceMode: boolean;
5152
locale: string;
5253
variant: string | null;
@@ -63,6 +64,7 @@ export class VisualBuilder {
6364
previousSelectedEditableDOM: null,
6465
previousHoveredTargetDOM: null,
6566
previousEmptyBlockParents: [],
67+
focusFieldValue: null,
6668
audienceMode: false,
6769
locale: Config.get().stackDetails.masterLocale || "en-us",
6870
variant: null,
@@ -336,6 +338,7 @@ export class VisualBuilder {
336338
previousSelectedEditableDOM: null,
337339
previousHoveredTargetDOM: null,
338340
previousEmptyBlockParents: [],
341+
focusFieldValue: null,
339342
audienceMode: false,
340343
locale: "en-us",
341344
variant: null,

src/visualBuilder/utils/handleIndividualFields.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ export async function handleIndividualFields(
141141
// * title, single single_line, single multi_line, single number
142142
if (ALLOWED_INLINE_EDITABLE_FIELD.includes(fieldType)) {
143143
let actualEditableField = editableElement as HTMLElement;
144+
145+
VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue =
146+
actualEditableField?.innerText;
147+
144148
const elementComputedDisplay =
145149
window.getComputedStyle(actualEditableField).display;
146150

0 commit comments

Comments
 (0)