Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
30975d3
feat: adding post messages to link unlinked ct to variant group
karancs06 Oct 10, 2025
0817211
fix: updated console
karancs06 Oct 10, 2025
6936fef
feat: test cases added
karancs06 Oct 13, 2025
17e8f5d
fix: string and focus unfocus on variant link
karancs06 Oct 14, 2025
8f2da6e
fix: addressed changes
karancs06 Oct 14, 2025
9e568d8
fix: removing revalidate post message
karancs06 Oct 27, 2025
879d4d9
Merge pull request #518 from contentstack/VB-602
hiteshshetty-dev Oct 30, 2025
b84c08a
Merge branch 'develop_v4' into VB-530-support-to-link-unlinked-ct-to-…
karancs06 Oct 30, 2025
88394b6
Merge pull request #517 from contentstack/feature/VB-499-resolved-var…
csAyushDubey Oct 31, 2025
cb98dad
fix: requested changes done
karancs06 Nov 3, 2025
1ba39e6
fix: response of postmessage changed
karancs06 Nov 3, 2025
13cb10f
fix: remove console
karancs06 Nov 3, 2025
300b479
fix: formatting removed
karancs06 Nov 3, 2025
19572da
Merge pull request #520 from contentstack/VB-629
hiteshshetty-dev Nov 5, 2025
1b594a6
Merge pull request #519 from contentstack/VB-633
hiteshshetty-dev Nov 5, 2025
ad51ff2
fix: changes requested
karancs06 Nov 7, 2025
2628269
fix: lowercase
karancs06 Nov 10, 2025
c0d9611
fix: object freeze
karancs06 Nov 11, 2025
388370e
Merge branch 'develop_v4' into VB-530-support-to-link-unlinked-ct-to-…
karancs06 Nov 13, 2025
4c9d670
Merge pull request #514 from contentstack/VB-530-support-to-link-unli…
karancs06 Nov 13, 2025
d9857f9
Merge pull request #523 from contentstack/stage_v4
hiteshshetty-dev Nov 13, 2025
74e6e5b
fix: partial state clear when DOM is not visible during mutuation and…
hiteshshetty-dev Nov 24, 2025
48e6c69
chore: add TODOs for overlay and toolbar position logic to consolidat…
hiteshshetty-dev Nov 24, 2025
a1ee15d
Merge remote-tracking branch 'origin/main' into develop_v4
hiteshshetty-dev Nov 24, 2025
34b7e42
fix: handle empty data-cslp attributes in getEntryIdentifiersInCurren…
hiteshshetty-dev Nov 25, 2025
2188110
Merge pull request #527 from contentstack/VB-593-v2
hiteshshetty-dev Nov 25, 2025
b1da67e
test: add additional header element to getEntryIdentifiersInCurrentPa…
hiteshshetty-dev Nov 26, 2025
ba91cb0
fix: handle invalid data-cslp attributes across multiple components t…
hiteshshetty-dev Nov 26, 2025
9000f02
Merge pull request #528 from contentstack/VB-576
hiteshshetty-dev Dec 1, 2025
84f8a26
Vitest 3 optimizing (#524)
karancs06 Dec 3, 2025
2ea5c3b
Merge branch 'stage_v4' into develop_v4
karancs06 Dec 4, 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
92 changes: 76 additions & 16 deletions src/visualBuilder/components/fieldLabelWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { extractDetailsFromCslp } from "../../cslp";
import { CslpData } from "../../cslp/types/cslp.types";
import { VisualBuilderCslpEventDetails } from "../types/visualBuilder.types";
import { FieldSchemaMap } from "../utils/fieldSchemaMap";
import { isFieldDisabled } from "../utils/isFieldDisabled";
import { DisableReason, isFieldDisabled } from "../utils/isFieldDisabled";
import visualBuilderPostMessage from "../utils/visualBuilderPostMessage";
import { CaretIcon, CaretRightIcon, InfoIcon } from "./icons";
import { LoadingIcon } from "./icons/loading";
Expand All @@ -18,6 +18,8 @@ import { ContentTypeIcon } from "./icons";
import { ToolbarTooltip } from "./Tooltip";
import { fetchEntryPermissionsAndStageDetails } from "../utils/fetchEntryPermissionsAndStageDetails";
import { VariantIndicator } from "./VariantIndicator";
import { handleRevalidateFieldData } from "../eventManager/useRevalidateFieldDataPostMessageEvent";
import { RESULT_TYPES } from "../utils/constants";

interface ReferenceParentMap {
[entryUid: string]: {
Expand Down Expand Up @@ -111,9 +113,11 @@ function FieldLabelWrapperComponent(
const allPaths = uniqBy(
[
props.fieldMetadata,
...props.parentPaths.map((path) => {
return extractDetailsFromCslp(path);
}),
...props.parentPaths
.filter((path) => path)
.map((path) => {
return extractDetailsFromCslp(path);
}),
],
"cslpValue"
);
Expand All @@ -129,7 +133,7 @@ function FieldLabelWrapperComponent(
getReferenceParentMap()
]);
const entryUid = props.fieldMetadata.entry_uid;

const referenceData = referenceParentMap[entryUid];
const isReference = !!referenceData;

Expand All @@ -140,12 +144,14 @@ function FieldLabelWrapperComponent(
const domAncestor = eventDetails.editableElement.closest(`[data-cslp]:not([data-cslp^="${props.fieldMetadata.content_type_uid}"])`);
if(domAncestor) {
const domAncestorCslp = domAncestor.getAttribute("data-cslp");
const domAncestorDetails = extractDetailsFromCslp(domAncestorCslp!);
const domAncestorContentTypeUid = domAncestorDetails.content_type_uid;
const domAncestorContentParent = referenceData?.find(data => data.contentTypeUid === domAncestorContentTypeUid);
if(domAncestorContentParent) {
referenceFieldName = domAncestorContentParent.referenceFieldName;
parentContentTypeName = domAncestorContentParent.contentTypeTitle;
if (domAncestorCslp) {
const domAncestorDetails = extractDetailsFromCslp(domAncestorCslp);
const domAncestorContentTypeUid = domAncestorDetails.content_type_uid;
const domAncestorContentParent = referenceData?.find(data => data.contentTypeUid === domAncestorContentTypeUid);
if(domAncestorContentParent) {
referenceFieldName = domAncestorContentParent.referenceFieldName;
parentContentTypeName = domAncestorContentParent.contentTypeTitle;
}
}
}
}
Expand Down Expand Up @@ -173,6 +179,38 @@ function FieldLabelWrapperComponent(
entryWorkflowStageDetails,
);

const handleLinkVariant = async () => {
try {
if (fieldSchema.field_metadata?.canLinkVariant) {
const result = await visualBuilderPostMessage?.send<{
type: typeof RESULT_TYPES.SUCCESS | typeof RESULT_TYPES.ERROR;
message: string;
}>(
VisualBuilderPostMessageEvents.OPEN_LINK_VARIANT_MODAL,
{
contentTypeUid:
props.fieldMetadata.content_type_uid,
}
);

// If the modal was closed or linking failed, do nothing
if (!result || result.type === RESULT_TYPES.ERROR) {
return;
}

// If linking was successful and requires revalidation, revalidate
if (result.type === RESULT_TYPES.SUCCESS) {
await handleRevalidateFieldData();
}
}
} catch (error) {
console.error(
"Error in link variant modal flow:",
error
);
}
};

const currentFieldDisplayName =
displayNames?.[props.fieldMetadata.cslpValue] ??
fieldSchema.display_name;
Expand All @@ -190,8 +228,30 @@ function FieldLabelWrapperComponent(
"visual-builder__tooltip--persistent"
]
)}
data-tooltip={reason}
data-tooltip={!reason?.includes(DisableReason.CanLinkVariant)
? reason
: undefined}
>
{reason
.includes(DisableReason.CanLinkVariant) && (
<div
className={visualBuilderStyles()["visual-builder__custom-tooltip"]}
onClick={handleLinkVariant}
>
{(() => {
const [before, after] = reason.split(
DisableReason.UnderlinedAndClickableWord
);
return (
<>
{before}
<span style={{ textDecoration: "underline" }}>{DisableReason.UnderlinedAndClickableWord}</span>
{after}
</>
);
})()}
</div>
)}
<InfoIcon />
</div>
) : hasParentPaths ? (
Expand Down Expand Up @@ -305,11 +365,11 @@ function FieldLabelWrapperComponent(
>
{
currentField.isReference && !dataLoading && !error ?
<div
className={classNames(
"visual-builder__reference-icon-container",
<div
className={classNames(
"visual-builder__reference-icon-container",
visualBuilderStyles()["visual-builder__reference-icon-container"]
)}
)}
>
<div
className={classNames(
Expand Down
Loading
Loading