Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
2c4e0ee
chore: fieldlocation fetch completed
SahilCs15 Jun 29, 2025
26a70f4
chore: rendered the fieldmodifier apps added an event listner to send…
SahilCs15 Jun 30, 2025
c394b1f
chore: added test cases for the field location data
SahilCs15 Jul 1, 2025
bf2cc68
fix: undo unneccsary changes
SahilCs15 Jul 1, 2025
a0ff5b0
fix: resolved the issues
SahilCs15 Jul 3, 2025
000168e
feat: hovertoolbar component and rendering
csAyushDubey Jul 4, 2025
d9a0d09
chore: talismanrc update
csAyushDubey Jul 4, 2025
bc21aae
test: fieldlabelwrapper
csAyushDubey Jul 4, 2025
d2c1c70
Merge pull request #449 from contentstack/Field-modifiers-in-canvas
sairaj-cs Jul 7, 2025
88a81a4
redner the app on dom
SahilCs15 Jul 9, 2025
19f865a
Merge pull request #450 from contentstack/VE-6701-Hover-Toolbar-Support
csAyushDubey Jul 9, 2025
1cae0c3
fix: disable scroll when field modifer is active
SahilCs15 Jul 9, 2025
42c1576
feat: fieldLabelWrapper changes
csAyushDubey Jul 9, 2025
bab4171
fix: tooltip arrow change
csAyushDubey Jul 10, 2025
bfd84b7
Merge pull request #453 from contentstack/VE-6698-reference-map-sync
csAyushDubey Jul 10, 2025
8478bbc
fix: missed rendering case
csAyushDubey Jul 10, 2025
14ba432
fix:removed uncessary changes
SahilCs15 Jul 11, 2025
764fc0b
Merge branch 'render-field-modifier-in-canvas' into disable-scroll-wh…
SahilCs15 Jul 11, 2025
12be298
fix: addresed the requested cahnges
SahilCs15 Jul 14, 2025
51204af
chore: cleanup commit
csAyushDubey Jul 15, 2025
71f24d8
fix: tests
csAyushDubey Jul 15, 2025
8830f3c
chore: increased test timeout for CI
csAyushDubey Jul 15, 2025
eb2d72f
chore: incresed hook timeout for CI
csAyushDubey Jul 15, 2025
abfd640
chore: added retry to vitest
csAyushDubey Jul 15, 2025
da638dd
chore: increased timeout further
csAyushDubey Jul 15, 2025
cd63458
Merge pull request #458 from contentstack/disable-scroll-when-field-m…
SahilCs15 Jul 15, 2025
0d36fbc
Merge pull request #455 from contentstack/VE-6600-Hover-Toolbar-Support
csAyushDubey Jul 16, 2025
aa16fa2
Merge branch 'develop_v3' into VE-5474-Field-Modifier-support-for-can…
SahilCs15 Jul 16, 2025
c8e3a35
fix: fixed conficts
SahilCs15 Jul 16, 2025
435a028
fix: fixed the required changes
SahilCs15 Jul 16, 2025
37dccb8
fix: removed not requied changes
SahilCs15 Jul 16, 2025
366fc87
Merge pull request #460 from contentstack/VE-5474-Field-Modifier-supp…
SahilCs15 Jul 16, 2025
a80d08d
fix: no hovertoolbar when focussed
csAyushDubey Jul 16, 2025
69328d4
Merge pull request #461 from contentstack/VE-6600-Hover-Toolbar-Support
csAyushDubey Jul 16, 2025
cc71759
fix: changed order in tooltip and customcursor hiding
csAyushDubey Jul 18, 2025
565d56d
Merge pull request #464 from contentstack/VE-6600-Hover-Toolbar-Support
csAyushDubey Jul 18, 2025
b43682d
fix: modified the way we were handling fieldlocation data fetch (#462)
SahilCs15 Jul 18, 2025
ac4fdb3
fix: field parent clickability
csAyushDubey Jul 22, 2025
3b897a4
Merge pull request #467 from contentstack/VE-7005-hover-toolbar-click…
csAyushDubey Jul 22, 2025
6b83664
chore(VE-6918/error-text): warning message improved
csAdityaPachauri Jul 15, 2025
ec3ccab
chore(VE-6918/error-text): component name changed to title case
csAdityaPachauri Jul 23, 2025
7ecfb19
chore(VE-6918/error-text): unit test file added
csAdityaPachauri Jul 25, 2025
3d5afdc
Merge branch 'main' of https://github.com/contentstack/live-preview-s…
csAdityaPachauri Jul 30, 2025
baea843
Merge pull request #475 from contentstack/VE-6918/error-text-main
csAdityaPachauri Jul 30, 2025
13ace62
fix: removed edit icon when the click is on the container (#478)
SahilCs15 Aug 4, 2025
7682fc4
Merge pull request #479 from contentstack/VE_6673
contentstackMridul Aug 5, 2025
5de0102
Merge branch 'stage_v3' into develop_v3
faraazb-contentstack Aug 7, 2025
ce60715
Merge branch 'develop_v3' into dev-VE-7062-disable-entry-edit-workflo…
faraazb-contentstack Aug 7, 2025
81c84bc
Merge branch 'main' into develop_v3
faraazb-contentstack Aug 7, 2025
0bbf435
Merge branch 'develop_v3' into dev-VE-7062-disable-entry-edit-workflo…
faraazb-contentstack Aug 7, 2025
2e5044e
Merge branch 'VE-7062-disable-entry-edit-workflow-stage' into dev-VE-…
faraazb-contentstack Aug 7, 2025
b26c4ac
Merge branch 'VE-7062-disable-entry-edit-workflow-stage' into dev-VE-…
faraazb-contentstack Aug 8, 2025
289c505
Merge branch 'VE-7062-disable-entry-edit-workflow-stage' into dev-VE-…
faraazb-contentstack Aug 11, 2025
fb85e53
Merge pull request #489 from contentstack/dev-VE-7062-disable-entry-e…
faraazb Aug 13, 2025
625d820
VB-248 fixed the cursor moving to the start with a explicitly adding …
SahilCs15 Aug 22, 2025
41de9c3
chore: added test cases for testing the pseudo element
SahilCs15 Sep 2, 2025
07ffb6e
chore: added test cases and updated .talismanrc
SahilCs15 Sep 2, 2025
4e8d5e8
Merge branch 'develop_v4' into VB-248-dev
SahilCs15 Sep 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .talismanrc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ fileignoreconfig:
checksum: d0ef271ee5381d9feab06bda6e7e89bd0a882fee87495627bd811c1f0a5459c7
- filename: package-lock.json
checksum: fd06363871d0ee16ebfb5d9d0cc479e0922a615bb76584b80bb6933ee6c3e237
- filename: src/visualBuilder/utils/__test__/handleFieldMouseDown.test.ts
checksum: dc20802eab76834de7aadb797b14076f1f1a9c0662b32493563fe68fd5cd6e16
- filename: CHANGELOG.md
checksum: 873106e25dafe0355c55724936cfe0ecc9d0192a2a82c98eddaf5648f23d5ee7
version: "1.0"
113 changes: 113 additions & 0 deletions src/visualBuilder/utils/__test__/enableInlineEditing.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ vi.mock("../../generators/generatePseudoEditableField", () => ({
generatePseudoEditableElement: vi.fn(() => {
const pseudoElement = document.createElement("div");
pseudoElement.setAttribute("data-testid", "pseudo-element");
pseudoElement.className = "visual-builder__pseudo-editable-element";
return pseudoElement;
}),
isEllipsisActive: vi.fn(() => false),
Expand Down Expand Up @@ -276,4 +277,116 @@ describe("enableInlineEditing", () => {
VisualBuilder.VisualBuilderGlobalState.value.focusFieldValue
).toBe("Test content");
});

it("should create pseudo element when field is last edited", () => {
document.body.appendChild(editableElement);
editableElement.setAttribute("data-cs-last-edited", "true");

enableInlineEditing({
expectedFieldData: "Test content",
editableElement,
fieldType: FieldDataType.SINGLELINE,
elements: {
visualBuilderContainer,
resizeObserver,
lastEditedField: null,
},
});

expect(generatePseudoEditableElement).toHaveBeenCalled();
expect(editableElement.style.visibility).toBe("hidden");
expect(resizeObserver.observe).toHaveBeenCalled();

document.body.removeChild(editableElement);
});

it("should set data-cs-last-edited attribute on editable element", () => {
enableInlineEditing({
expectedFieldData: "Test content",
editableElement,
fieldType: FieldDataType.SINGLELINE,
elements: {
visualBuilderContainer,
resizeObserver,
lastEditedField: null,
},
});

expect(editableElement.getAttribute("data-cs-last-edited")).toBe("true");
});

it("should create pseudo element when field is last edited even with same content", () => {
document.body.appendChild(editableElement);
editableElement.setAttribute("data-cs-last-edited", "true");
editableElement.textContent = "Test content";
editableElement.innerText = "Test content";

enableInlineEditing({
expectedFieldData: "Test content",
editableElement,
fieldType: FieldDataType.SINGLELINE,
elements: {
visualBuilderContainer,
resizeObserver,
lastEditedField: null,
},
});

expect(generatePseudoEditableElement).toHaveBeenCalled();
expect(editableElement.style.visibility).toBe("hidden");

document.body.removeChild(editableElement);
});

it("should not create pseudo element when field is not last edited and content matches", () => {
const otherElement = document.createElement("div");
otherElement.setAttribute("data-cs-last-edited", "true");
document.body.appendChild(otherElement);

editableElement.textContent = "Test content";
editableElement.innerText = "Test content";

enableInlineEditing({
expectedFieldData: "Test content",
editableElement,
fieldType: FieldDataType.SINGLELINE,
elements: {
visualBuilderContainer,
resizeObserver,
lastEditedField: null,
},
});

expect(generatePseudoEditableElement).not.toHaveBeenCalled();
expect(editableElement.style.visibility).toBe("");
expect(editableElement.getAttribute("data-cs-last-edited")).toBe("true");

document.body.removeChild(otherElement);
});

it("should not create nested pseudo elements when pseudo element is clicked", () => {
document.body.appendChild(editableElement);
editableElement.setAttribute("data-cs-last-edited", "true");

enableInlineEditing({
expectedFieldData: "Test content",
editableElement,
fieldType: FieldDataType.SINGLELINE,
elements: {
visualBuilderContainer,
resizeObserver,
lastEditedField: null,
},
});

expect(generatePseudoEditableElement).toHaveBeenCalled();
expect(editableElement.style.visibility).toBe("hidden");

const pseudoElement = visualBuilderContainer.querySelector(".visual-builder__pseudo-editable-element");
expect(pseudoElement).toBeTruthy();
expect(pseudoElement?.getAttribute("data-cslp")).toBeNull();
expect(editableElement.getAttribute("data-cs-last-edited")).toBe("true");

document.body.removeChild(editableElement);
});
});
65 changes: 65 additions & 0 deletions src/visualBuilder/utils/__test__/handleFieldMouseDown.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -328,4 +328,69 @@ describe("`handleFieldInput`", () => {
VisualBuilder.VisualBuilderGlobalState.value.focusFieldReceivedInput
).toBe(true);
});

test("should manage data-cs-last-edited attribute when field receives input", () => {
const previousField = document.createElement("div");
previousField.setAttribute("data-cs-last-edited", "true");
document.body.appendChild(previousField);

const inputEvent = new InputEvent("input", {
bubbles: true,
});
h1.dispatchEvent(inputEvent);

expect(previousField.getAttribute("data-cs-last-edited")).toBeNull();
expect(h1.getAttribute("data-cs-last-edited")).toBe("true");

document.body.removeChild(previousField);
});

test("should not change data-cs-last-edited attribute when same field receives input", () => {
h1.setAttribute("data-cs-last-edited", "true");

const inputEvent = new InputEvent("input", {
bubbles: true,
});
h1.dispatchEvent(inputEvent);

expect(h1.getAttribute("data-cs-last-edited")).toBe("true");
});

test("should set data-cs-last-edited attribute on new field when no previous field exists", () => {
const inputEvent = new InputEvent("input", {
bubbles: true,
});
h1.dispatchEvent(inputEvent);

expect(h1.getAttribute("data-cs-last-edited")).toBe("true");
});

test("should transfer data-cs-last-edited attribute between multiple fields", () => {
const field1 = document.createElement("div");
const field2 = document.createElement("div");
field1.setAttribute(VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY, "number");
field2.setAttribute(VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY, "number");
field1.setAttribute("data-cs-last-edited", "true");

field1.addEventListener("input", handleFieldInput);
field2.addEventListener("input", handleFieldInput);

document.body.appendChild(field1);
document.body.appendChild(field2);

const inputEvent1 = new InputEvent("input", { bubbles: true });
field1.dispatchEvent(inputEvent1);

expect(field1.getAttribute("data-cs-last-edited")).toBe("true");
expect(field2.getAttribute("data-cs-last-edited")).toBeNull();

const inputEvent2 = new InputEvent("input", { bubbles: true });
field2.dispatchEvent(inputEvent2);

expect(field1.getAttribute("data-cs-last-edited")).toBeNull();
expect(field2.getAttribute("data-cs-last-edited")).toBe("true");

document.body.removeChild(field1);
document.body.removeChild(field2);
});
});
11 changes: 9 additions & 2 deletions src/visualBuilder/utils/enableInlineEditing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export function enableInlineEditing({
const elementComputedDisplay =
window.getComputedStyle(actualEditableField).display;


let textContent =
(editableElement as HTMLElement).innerText ||
editableElement.textContent ||
Expand All @@ -41,14 +42,17 @@ export function enableInlineEditing({
actualEditableField.addEventListener("paste", pasteAsPlainText);
}
const expectedTextContent = expectedFieldData;

const isFieldLastEdited = document.querySelector("[data-cs-last-edited]") === editableElement;
if (
(expectedTextContent && textContent !== expectedTextContent) ||
isEllipsisActive(editableElement as HTMLElement)
isEllipsisActive(editableElement as HTMLElement) ||
isFieldLastEdited
) {
// TODO: Testing will be done in the E2E.
const pseudoEditableField = generatePseudoEditableElement(
{ editableElement: editableElement as HTMLElement },
{ textContent: expectedFieldData }
{ textContent: expectedFieldData }
);

(editableElement as HTMLElement).style.visibility = "hidden";
Expand Down Expand Up @@ -90,6 +94,9 @@ export function enableInlineEditing({
actualEditableField.setAttribute("contenteditable", "true");
actualEditableField.addEventListener("input", handleFieldInput);
actualEditableField.addEventListener("keydown", handleFieldKeyDown);

editableElement.setAttribute("data-cs-last-edited", "true");

// focus on the contenteditable element to start accepting input
actualEditableField.focus();

Expand Down
6 changes: 6 additions & 0 deletions src/visualBuilder/utils/handleFieldMouseDown.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ export function handleFieldInput(e: Event): void {
const fieldType = targetElement.getAttribute(
VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY
) as FieldDataType | null;

const previousLastEditedElement = document.querySelector("[data-cs-last-edited]");
if (previousLastEditedElement !== targetElement) {
previousLastEditedElement?.removeAttribute("data-cs-last-edited");
targetElement.setAttribute("data-cs-last-edited", "true");
}
if (
event.type === "input" &&
ALLOWED_INLINE_EDITABLE_FIELD.includes(fieldType as FieldDataType)
Expand Down
Loading