Skip to content

Commit 696a803

Browse files
chore: remove formatting changes and do a global mock for getEntryPermissionsCached
1 parent 781d7ec commit 696a803

15 files changed

Lines changed: 325 additions & 62 deletions

src/visualBuilder/components/FieldToolbar.tsx

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ import { getDOMEditStack } from "../utils/getCsDataOfElement";
3434
import { VariantIcon } from "./icons/variant";
3535
import {
3636
BASE_VARIANT_STATUS,
37-
FieldRevertComponent,
3837
getFieldVariantStatus,
3938
IVariantStatus,
4039
VariantRevertDropdown,
4140
} from "./FieldRevert/FieldRevertComponent";
4241
import { LoadingIcon } from "./icons/loading";
42+
import { EntryPermissions } from "../utils/getEntryPermissions";
4343

4444
export type FieldDetails = Pick<
4545
VisualBuilderCslpEventDetails,
@@ -52,6 +52,7 @@ interface MultipleFieldToolbarProps {
5252
eventDetails: VisualBuilderCslpEventDetails;
5353
hideOverlay: () => void;
5454
isVariant?: boolean;
55+
entryPermissions?: EntryPermissions;
5556
}
5657

5758
function handleReplaceAsset(fieldMetadata: CslpData) {
@@ -107,7 +108,11 @@ function handleFormFieldFocus(eventDetails: VisualBuilderCslpEventDetails) {
107108
function FieldToolbarComponent(
108109
props: MultipleFieldToolbarProps
109110
): JSX.Element | null {
110-
const { eventDetails, isVariant: isVariantOrParentOfVariant } = props;
111+
const {
112+
eventDetails,
113+
isVariant: isVariantOrParentOfVariant,
114+
entryPermissions,
115+
} = props;
111116
const { fieldMetadata, editableElement: targetElement } = eventDetails;
112117
const [isFormLoading, setIsFormLoading] = useState(false);
113118

@@ -131,16 +136,17 @@ function FieldToolbarComponent(
131136
let fieldType = null;
132137
let isWholeMultipleField = false;
133138

139+
let disableFieldActions = false;
134140
if (fieldSchema) {
135-
const { isDisabled } = isFieldDisabled(fieldSchema, {
136-
editableElement: targetElement,
137-
fieldMetadata,
138-
});
139-
140-
// field is disabled, no actions needed
141-
if (isDisabled) {
142-
return null;
143-
}
141+
const { isDisabled } = isFieldDisabled(
142+
fieldSchema,
143+
{
144+
editableElement: targetElement,
145+
fieldMetadata,
146+
},
147+
entryPermissions
148+
);
149+
disableFieldActions = isDisabled;
144150

145151
fieldType = getFieldType(fieldSchema);
146152
isModalEditable = ALLOWED_MODAL_EDITABLE_FIELD.includes(fieldType);
@@ -165,7 +171,8 @@ function FieldToolbarComponent(
165171
fieldMetadata.instance.fieldPathWithIndex ||
166172
fieldMetadata.multipleFieldMetadata?.index === -1);
167173

168-
isReplaceAllowed = ALLOWED_REPLACE_FIELDS.includes(fieldType) && !isWholeMultipleField;
174+
isReplaceAllowed =
175+
ALLOWED_REPLACE_FIELDS.includes(fieldType) && !isWholeMultipleField;
169176
// if (
170177
// DEFAULT_MULTIPLE_FIELDS.includes(fieldType) &&
171178
// isWholeMultipleField &&
@@ -201,6 +208,7 @@ function FieldToolbarComponent(
201208
e.stopPropagation();
202209
handleEdit(fieldMetadata);
203210
}}
211+
disabled={disableFieldActions}
204212
>
205213
<Icon />
206214
</button>
@@ -232,6 +240,7 @@ function FieldToolbarComponent(
232240
return;
233241
}
234242
}}
243+
disabled={disableFieldActions}
235244
>
236245
<ReplaceAssetIcon />
237246
</button>
@@ -250,8 +259,10 @@ function FieldToolbarComponent(
250259
invertTooltipPosition,
251260
},
252261
{
253-
[visualBuilderStyles()["visual-builder__button--comment-loader"]]: isFormLoading,
254-
"visual-builder__button--comment-loader": isFormLoading
262+
[visualBuilderStyles()[
263+
"visual-builder__button--comment-loader"
264+
]]: isFormLoading,
265+
"visual-builder__button--comment-loader": isFormLoading,
255266
}
256267
)}
257268
data-tooltip={"Form"}
@@ -409,7 +420,9 @@ function FieldToolbarComponent(
409420
"previous"
410421
);
411422
}}
412-
disabled={disableMoveLeft}
423+
disabled={
424+
disableFieldActions || disableMoveLeft
425+
}
413426
>
414427
<MoveLeftIcon
415428
className={classNames({
@@ -419,7 +432,10 @@ function FieldToolbarComponent(
419432
"visual-builder__rotate--90"
420433
]]: direction === "vertical",
421434
})}
422-
disabled={disableMoveLeft}
435+
disabled={
436+
disableFieldActions ||
437+
disableMoveLeft
438+
}
423439
/>
424440
</button>
425441

@@ -441,7 +457,9 @@ function FieldToolbarComponent(
441457
"next"
442458
);
443459
}}
444-
disabled={disableMoveRight}
460+
disabled={
461+
disableFieldActions || disableMoveRight
462+
}
445463
>
446464
<MoveRightIcon
447465
className={classNames({
@@ -451,7 +469,10 @@ function FieldToolbarComponent(
451469
"visual-builder__rotate--90"
452470
]]: direction === "vertical",
453471
})}
454-
disabled={disableMoveRight}
472+
disabled={
473+
disableFieldActions ||
474+
disableMoveRight
475+
}
455476
/>
456477
</button>
457478

@@ -470,6 +491,7 @@ function FieldToolbarComponent(
470491
e.stopPropagation();
471492
handleDeleteInstance(fieldMetadata);
472493
}}
494+
disabled={disableFieldActions}
473495
>
474496
<DeleteIcon />
475497
</button>

src/visualBuilder/components/fieldLabelWrapper.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { visualBuilderStyles } from "../visualBuilder.style";
1414
import { CslpError } from "./CslpError";
1515
import { hasPostMessageError } from "../utils/errorHandling";
1616
import { VisualBuilderPostMessageEvents } from "../utils/types/postMessage.types";
17+
import { getEntryPermissionsCached } from "../utils/getEntryPermissionsCached";
1718

1819
async function getFieldDisplayNames(fieldMetadata: CslpData[]) {
1920
const result = await visualBuilderPostMessage?.send<{
@@ -86,9 +87,15 @@ function FieldLabelWrapperComponent(
8687
return;
8788
}
8889

90+
const entryPermissions = await getEntryPermissionsCached({
91+
entryUid: props.fieldMetadata.entry_uid,
92+
contentTypeUid: props.fieldMetadata.content_type_uid,
93+
locale: props.fieldMetadata.locale,
94+
});
8995
const { isDisabled: fieldDisabled, reason } = isFieldDisabled(
9096
fieldSchema,
91-
eventDetails
97+
eventDetails,
98+
entryPermissions
9299
);
93100

94101
const currentFieldDisplayName =

src/visualBuilder/generators/generateToolbar.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import React from "preact/compat";
12
import { VisualBuilderCslpEventDetails } from "../types/visualBuilder.types";
23
import {
34
DATA_CSLP_ATTR_SELECTOR,
@@ -12,6 +13,7 @@ import { isFieldDisabled } from "../utils/isFieldDisabled";
1213
import FieldToolbarComponent from "../components/FieldToolbar";
1314
import { render } from "preact";
1415
import FieldLabelWrapperComponent from "../components/fieldLabelWrapper";
16+
import { getEntryPermissionsCached } from "../utils/getEntryPermissionsCached";
1517

1618
export function appendFocusedToolbar(
1719
eventDetails: VisualBuilderCslpEventDetails,
@@ -28,24 +30,30 @@ export function appendFocusedToolbar(
2830
);
2931
}
3032

31-
export function appendFieldToolbar(
33+
export async function appendFieldToolbar(
3234
eventDetails: VisualBuilderCslpEventDetails,
3335
focusedToolbarElement: HTMLDivElement,
3436
hideOverlay: () => void,
3537
isVariant: boolean = false
36-
): void {
38+
): Promise<void> {
3739
if (
3840
focusedToolbarElement.querySelector(
3941
".visual-builder__focused-toolbar__multiple-field-toolbar"
4042
)
4143
)
4244
return;
45+
const entryPermissions = await getEntryPermissionsCached({
46+
entryUid: eventDetails.fieldMetadata.entry_uid,
47+
contentTypeUid: eventDetails.fieldMetadata.content_type_uid,
48+
locale: eventDetails.fieldMetadata.locale,
49+
});
4350
const wrapper = document.createDocumentFragment();
4451
render(
4552
<FieldToolbarComponent
4653
eventDetails={eventDetails}
4754
hideOverlay={hideOverlay}
4855
isVariant={isVariant}
56+
entryPermissions={entryPermissions}
4957
/>,
5058
wrapper
5159
);

src/visualBuilder/listeners/mouseClick.ts

Lines changed: 12 additions & 2 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 { getEntryPermissionsCached } from "../utils/getEntryPermissionsCached";
3233

3334
type HandleBuilderInteractionParams = Omit<
3435
EventListenerHandlerParams,
@@ -279,14 +280,23 @@ async function handleFieldSchemaAndIndividualFields(
279280
editableElement: Element,
280281
previousSelectedElement: Element | null
281282
) {
282-
const { content_type_uid, fieldPath } = fieldMetadata;
283+
const { content_type_uid, entry_uid, fieldPath, locale } = fieldMetadata;
283284
const fieldSchema = await FieldSchemaMap.getFieldSchema(
284285
content_type_uid,
285286
fieldPath
286287
);
288+
const entryAcl = await getEntryPermissionsCached({
289+
entryUid: entry_uid,
290+
contentTypeUid: content_type_uid,
291+
locale,
292+
});
287293

288294
if (fieldSchema) {
289-
const { isDisabled } = isFieldDisabled(fieldSchema, eventDetails);
295+
const { isDisabled } = isFieldDisabled(
296+
fieldSchema,
297+
eventDetails,
298+
entryAcl
299+
);
290300
if (isDisabled) {
291301
addOverlay({
292302
overlayWrapper: params.overlayWrapper,

src/visualBuilder/listeners/mouseHover.ts

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { visualBuilderStyles } from "../visualBuilder.style";
1313
import { VB_EmptyBlockParentClass } from "../..";
1414
import Config from "../../configManager/configManager";
1515
import { isCollabThread } from "../generators/generateThread";
16+
import { getEntryPermissionsCached } from "../utils/getEntryPermissionsCached";
1617

1718
const config = Config.get();
1819
export interface HandleMouseHoverParams
@@ -233,16 +234,24 @@ async function handleMouseHover(params: HandleMouseHoverParams): Promise<void> {
233234
FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath).then(
234235
(fieldSchema) => {
235236
if (!fieldSchema) return;
236-
if (!params.customCursor) return;
237-
const { isDisabled: fieldDisabled } = isFieldDisabled(
238-
fieldSchema,
239-
eventDetails
240-
);
241-
const fieldType = getFieldType(fieldSchema);
242-
generateCustomCursor({
243-
fieldType,
244-
customCursor: params.customCursor,
245-
fieldDisabled,
237+
238+
getEntryPermissionsCached({
239+
entryUid: fieldMetadata.entry_uid,
240+
contentTypeUid: fieldMetadata.content_type_uid,
241+
locale: fieldMetadata.locale,
242+
}).then((entryAcl) => {
243+
if (!params.customCursor) return;
244+
const { isDisabled: fieldDisabled } = isFieldDisabled(
245+
fieldSchema,
246+
eventDetails,
247+
entryAcl
248+
);
249+
const fieldType = getFieldType(fieldSchema);
250+
generateCustomCursor({
251+
fieldType,
252+
customCursor: params.customCursor,
253+
fieldDisabled,
254+
});
246255
});
247256
}
248257
);
@@ -259,9 +268,18 @@ async function handleMouseHover(params: HandleMouseHoverParams): Promise<void> {
259268
FieldSchemaMap.getFieldSchema(content_type_uid, fieldPath).then(
260269
(fieldSchema) => {
261270
if (!fieldSchema) return;
262-
const { isDisabled: fieldDisabled, reason } =
263-
isFieldDisabled(fieldSchema, eventDetails);
264-
addOutline(editableElement, fieldDisabled);
271+
getEntryPermissionsCached({
272+
entryUid: fieldMetadata.entry_uid,
273+
contentTypeUid: fieldMetadata.content_type_uid,
274+
locale: fieldMetadata.locale,
275+
}).then((entryAcl) => {
276+
const { isDisabled: fieldDisabled } = isFieldDisabled(
277+
fieldSchema,
278+
eventDetails,
279+
entryAcl
280+
);
281+
addOutline(editableElement, fieldDisabled);
282+
});
265283
}
266284
);
267285
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,16 @@ describe("handleIndividualFields", () => {
7171
expect(FieldSchemaMap.getFieldSchema).toHaveBeenCalledWith("contentTypeUid", "fieldPath");
7272
expect(getFieldData).toHaveBeenCalledWith({ content_type_uid: "contentTypeUid", entry_uid: "entryUid", locale: "en-us" }, "fieldPathWithIndex");
7373
expect(getFieldType).toHaveBeenCalledWith(fieldSchema);
74-
expect(isFieldDisabled).toHaveBeenCalledWith(fieldSchema, eventDetails);
74+
expect(isFieldDisabled).toHaveBeenCalledWith(
75+
fieldSchema,
76+
eventDetails,
77+
{
78+
read: true,
79+
update: true,
80+
delete: true,
81+
publish: true,
82+
}
83+
);
7584
expect(eventDetails.editableElement.getAttribute(VISUAL_BUILDER_FIELD_TYPE_ATTRIBUTE_KEY)).toBe(fieldType);
7685
});
7786

0 commit comments

Comments
 (0)