Skip to content

Commit 49261f6

Browse files
authored
Merge pull request #430 from contentstack/stage_v3
v3.2.1
2 parents 7ae545b + dab1ddd commit 49261f6

13 files changed

Lines changed: 211 additions & 139 deletions

File tree

CHANGELOG.md

Lines changed: 86 additions & 110 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ npm install @contentstack/live-preview-utils
1515
Alternatively, if you want to include the package directly in your website HTML code, use the following command:
1616

1717
```html
18-
<script type='module' integrity='sha384-Q1kNLAr9TbfZ9lsUUXH&#x2F;vW79LERzfbYJc7aLNSYjKFLzBZQDp&#x2F;Jk09+ADHo9mhEq' crossorigin="anonymous">
19-
import ContentstackLivePreview from 'https://esm.sh/@contentstack/live-preview-utils@3.2.0';
18+
<script type='module' integrity='sha384-A8av+t5rI9uSevzozgzaoIRdBTs5pn1tt7F&#x2F;ekJQ7NAE1l3RenCKeJeMUTdrbtcM' crossorigin="anonymous">
19+
import ContentstackLivePreview from 'https://esm.sh/@contentstack/live-preview-utils@3.2.1';
2020
2121
ContentstackLivePreview.init({
2222
stackDetails: {

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@contentstack/live-preview-utils",
3-
"version": "3.2.0",
3+
"version": "3.2.1",
44
"description": "Contentstack provides the Live Preview SDK to establish a communication channel between the various Contentstack SDKs and your website, transmitting live changes to the preview pane.",
55
"type": "module",
66
"types": "dist/legacy/index.d.ts",

src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ class LightLivePreviewHoC {
7171
}
7272

7373
const ContentstackLivePreview =
74-
process.env.PURGE_PREVIEW_SDK || process.env.REACT_APP_PURGE_PREVIEW_SDK
74+
typeof process !== "undefined" &&
75+
(process?.env?.PURGE_PREVIEW_SDK === "true" ||
76+
process?.env?.REACT_APP_PURGE_PREVIEW_SDK === "true")
7577
? LightLivePreviewHoC
7678
: ContentstackLivePreviewHOC;
7779

src/logger/logger.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ export class PublicLogger {
88
| Console["info"],
99
message: any[]
1010
): void {
11-
if (process?.env?.NODE_ENV !== "test") {
11+
if (
12+
typeof process !== "undefined" &&
13+
process?.env?.NODE_ENV !== "test"
14+
) {
1215
logCallback("Live_Preview_SDK:", ...message);
1316
}
1417
}

src/visualBuilder/__test__/index.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ vi.mock("../utils/visualBuilderPostMessage", async () => {
3535
Object.defineProperty(globalThis, "crypto", {
3636
value: {
3737
getRandomValues: (arr: Array<any>) => crypto.randomBytes(arr.length),
38+
randomUUID: () => crypto.randomUUID()
3839
},
3940
});
4041
// Increase the timeout for the test

src/visualBuilder/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ export class VisualBuilder {
296296
if (!config.enable || config.mode < ILivePreviewModeConfig.BUILDER) {
297297
return;
298298
}
299+
299300
visualBuilderPostMessage
300301
?.send<IVisualBuilderInitEvent>("init", {
301302
isSSR: config.ssr,

src/visualBuilder/listeners/mouseClick.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { generateThread } from "../generators/generateThread";
2929
import { isCollabThread } from "../generators/generateThread";
3030
import { toggleCollabPopup } from "../generators/generateThread";
3131
import { fixSvgXPath } from "../utils/collabUtils";
32+
import { v4 as uuidV4 } from "uuid";
3233

3334
type HandleBuilderInteractionParams = Omit<
3435
EventListenerHandlerParams,
@@ -79,6 +80,22 @@ async function handleBuilderInteraction(
7980
(eventTarget.hasAttribute("data-cslp") ||
8081
eventTarget.closest("[data-cslp]"));
8182

83+
// if multiple elements with the same cslp element are found,
84+
// assign a unique ID to each element which we can use to identify
85+
// them in updateFocussedState and other places where we
86+
// would have queried the element by data-cslp
87+
const duplicates = document.querySelectorAll(
88+
`[data-cslp="${eventTarget?.getAttribute("data-cslp")}"]`
89+
);
90+
if (duplicates.length > 1) {
91+
duplicates.forEach((ele) => {
92+
if (!ele.hasAttribute("data-cslp-unique-id")) {
93+
const uniqueId = `cslp-${uuidV4()}`;
94+
ele.setAttribute("data-cslp-unique-id", uniqueId);
95+
}
96+
});
97+
}
98+
8299
// if the target element is a studio-ui element, return
83100
// this is currently used for the "Edit in Studio" button
84101
if (eventTarget?.getAttribute("data-studio-ui") === "true") {

src/visualBuilder/utils/__test__/handleFieldMouseDown.test.ts

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,26 +128,36 @@ describe("handle numeric field key down", () => {
128128
});
129129

130130
describe("handle keydown in button contenteditable", () => {
131-
let button: HTMLButtonElement | undefined;
132-
let spiedPreventDefault: MockInstance<(e: []) => void> | undefined;
133-
let spiedInsertSpaceAtCursor:
134-
| MockInstance<(typeof insertSpaceAtCursor)["insertSpaceAtCursor"]>
135-
| undefined;
131+
let spiedSendFieldEvent: MockInstance<() => void> | undefined;
132+
133+
beforeEach(() => {
134+
spiedSendFieldEvent = vi
135+
.spyOn(generateOverlay, "sendFieldEvent")
136+
.mockImplementation(() => {});
137+
const visualBuilderContainer = document.createElement("div");
138+
visualBuilderContainer.classList.add("visual-builder__container");
139+
document.body.appendChild(visualBuilderContainer);
140+
});
141+
142+
afterEach(() => {
143+
vi.clearAllMocks();
144+
});
136145

137146
test("should insert space in button content-editable", () => {
147+
let spiedPreventDefault: MockInstance<(e: []) => void> | undefined;
138148
vi.spyOn(window, "getSelection").mockReturnValue({
139-
// @ts-ignore
149+
// @ts-expect-error mocking only required properties
140150
getRangeAt: (n: number) => ({
141151
startOffset: 0,
142152
endOffset: 0,
143153
}),
144154
});
145-
spiedInsertSpaceAtCursor = vi.spyOn(
155+
const spiedInsertSpaceAtCursor = vi.spyOn(
146156
insertSpaceAtCursor,
147157
"insertSpaceAtCursor"
148158
);
149159

150-
button = document.createElement("button");
160+
const button = document.createElement("button");
151161
button.innerHTML = "Test";
152162
button.setAttribute("contenteditable", "true");
153163
button.setAttribute(
@@ -169,6 +179,47 @@ describe("handle keydown in button contenteditable", () => {
169179

170180
expect(spiedPreventDefault).toHaveBeenCalledTimes(1);
171181
expect(spiedInsertSpaceAtCursor).toHaveBeenCalledWith(button);
182+
expect(spiedSendFieldEvent).toHaveBeenCalled();
183+
});
184+
185+
test("should insert space in span content-editable inside button", () => {
186+
let spiedPreventDefault: MockInstance<(e: []) => void> | undefined;
187+
vi.spyOn(window, "getSelection").mockReturnValue({
188+
// @ts-expect-error mocking only required properties
189+
getRangeAt: (n: number) => ({
190+
startOffset: 0,
191+
endOffset: 0,
192+
}),
193+
});
194+
const spiedInsertSpaceAtCursor = vi.spyOn(
195+
insertSpaceAtCursor,
196+
"insertSpaceAtCursor"
197+
);
198+
199+
const button = document.createElement("button");
200+
const span = document.createElement("span");
201+
button.appendChild(span);
202+
span.setAttribute("contenteditable", "true");
203+
span.setAttribute(
204+
VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY,
205+
"single_line"
206+
);
207+
208+
span.addEventListener("keydown", (e) => {
209+
spiedPreventDefault = vi.spyOn(e, "preventDefault");
210+
handleFieldKeyDown(e);
211+
});
212+
213+
const keyDownEvent = new KeyboardEvent("keydown", {
214+
bubbles: true,
215+
key: "Space",
216+
code: "Space",
217+
});
218+
span.dispatchEvent(keyDownEvent);
219+
220+
expect(spiedPreventDefault).toHaveBeenCalledTimes(1);
221+
expect(spiedInsertSpaceAtCursor).toHaveBeenCalledWith(span);
222+
expect(spiedSendFieldEvent).toHaveBeenCalled();
172223
});
173224
});
174225

0 commit comments

Comments
 (0)