Skip to content

Commit 15c8f04

Browse files
committed
feat: added resolved variants permission handling logic
1 parent 47a6f29 commit 15c8f04

16 files changed

Lines changed: 109 additions & 12 deletions

src/visualBuilder/components/FieldToolbar.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { EntryPermissions } from "../utils/getEntryPermissions";
4343
import { FieldLocationAppList } from "./FieldLocationAppList";
4444
import { FieldLocationIcon } from "./FieldLocationIcon";
4545
import { WorkflowStageDetails } from "../utils/getWorkflowStageDetails";
46+
import { ResolvedVariantPermissions } from "../utils/getResolvedVariantPermissions";
4647

4748
export type FieldDetails = Pick<
4849
VisualBuilderCslpEventDetails,
@@ -57,6 +58,7 @@ interface MultipleFieldToolbarProps {
5758
isVariant?: boolean;
5859
entryPermissions?: EntryPermissions | undefined;
5960
entryWorkflowStageDetails?: WorkflowStageDetails | undefined;
61+
resolvedVariantPermissions?: ResolvedVariantPermissions | undefined;
6062
}
6163

6264
function handleReplaceAsset(fieldMetadata: CslpData) {
@@ -117,6 +119,7 @@ function FieldToolbarComponent(
117119
isVariant: isVariantOrParentOfVariant,
118120
entryPermissions,
119121
entryWorkflowStageDetails,
122+
resolvedVariantPermissions,
120123
} = props;
121124
const { fieldMetadata, editableElement: targetElement } = eventDetails;
122125
const [isFormLoading, setIsFormLoading] = useState(false);
@@ -157,8 +160,9 @@ function FieldToolbarComponent(
157160
editableElement: targetElement,
158161
fieldMetadata,
159162
},
163+
resolvedVariantPermissions,
160164
entryPermissions,
161-
entryWorkflowStageDetails
165+
entryWorkflowStageDetails,
162166
);
163167
disableFieldActions = isDisabled;
164168

src/visualBuilder/components/__test__/fieldLabelWrapper.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ describe("FieldLabelWrapperComponent", () => {
297297
expect(isFieldDisabled).toHaveBeenCalledWith(
298298
mockFieldSchema,
299299
mockEventDetails,
300+
undefined,
300301
{
301302
update: {
302303
create: true,

src/visualBuilder/components/fieldLabelWrapper.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,20 @@ function FieldLabelWrapperComponent(
156156
return;
157157
}
158158

159-
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails } =
159+
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =
160160
await fetchEntryPermissionsAndStageDetails({
161161
entryUid: props.fieldMetadata.entry_uid,
162162
contentTypeUid: props.fieldMetadata.content_type_uid,
163163
locale: props.fieldMetadata.locale,
164164
variantUid: props.fieldMetadata.variant,
165+
fieldPathWithIndex: props.fieldMetadata.fieldPathWithIndex,
165166
});
166167
const { isDisabled: fieldDisabled, reason } = isFieldDisabled(
167168
fieldSchema,
168169
eventDetails,
170+
resolvedVariantPermissions,
169171
entryAcl,
170-
entryWorkflowStageDetails
172+
entryWorkflowStageDetails,
171173
);
172174

173175
const currentFieldDisplayName =

src/visualBuilder/eventManager/useVariantsPostMessageEvent.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ interface LocaleEvent {
3737
}
3838

3939
function isLowerOrderVariant(variant_uid: string, dataCslp: string, variantOrder: string[]): boolean {
40+
if(!variantOrder || variantOrder.length === 0) {
41+
return false;
42+
}
4043
const indexOfVariant = variantOrder.indexOf(variant_uid);
4144
let indexOfDataCslp = -1;
4245
for (let i = variantOrder.length-1; i >= 0; i--) {

src/visualBuilder/generators/generateToolbar.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,13 @@ export async function appendFieldToolbar(
5151
) && !isHover
5252
)
5353
return;
54-
const { acl: entryPermissions, workflowStage: entryWorkflowStageDetails } =
54+
const { acl: entryPermissions, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =
5555
await fetchEntryPermissionsAndStageDetails({
5656
entryUid: eventDetails.fieldMetadata.entry_uid,
5757
contentTypeUid: eventDetails.fieldMetadata.content_type_uid,
5858
locale: eventDetails.fieldMetadata.locale,
5959
variantUid: eventDetails.fieldMetadata.variant,
60+
fieldPathWithIndex: eventDetails.fieldMetadata.fieldPathWithIndex,
6061
});
6162
const wrapper = document.createDocumentFragment();
6263
render(
@@ -66,6 +67,7 @@ export async function appendFieldToolbar(
6667
isVariant={isVariant}
6768
entryPermissions={entryPermissions}
6869
entryWorkflowStageDetails={entryWorkflowStageDetails}
70+
resolvedVariantPermissions={resolvedVariantPermissions}
6971
/>,
7072
wrapper
7173
);

src/visualBuilder/listeners/mouseClick.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,23 +310,26 @@ async function handleFieldSchemaAndIndividualFields(
310310
fieldPath,
311311
locale,
312312
variant: variantUid,
313+
fieldPathWithIndex,
313314
} = fieldMetadata;
314315
const fieldSchema = await FieldSchemaMap.getFieldSchema(
315316
content_type_uid,
316317
fieldPath
317318
);
318-
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails } =
319+
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =
319320
await fetchEntryPermissionsAndStageDetails({
320321
entryUid: entry_uid,
321322
contentTypeUid: content_type_uid,
322323
locale,
323324
variantUid,
325+
fieldPathWithIndex,
324326
});
325327

326328
if (fieldSchema) {
327329
const { isDisabled } = isFieldDisabled(
328330
fieldSchema,
329331
eventDetails,
332+
resolvedVariantPermissions,
330333
entryAcl,
331334
entryWorkflowStageDetails
332335
);

src/visualBuilder/listeners/mouseHover.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,18 @@ async function addOutline(params?: AddOutlineParams): Promise<void> {
8787
fieldPath
8888
);
8989
if (!fieldSchema) return;
90-
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails } =
90+
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =
9191
await fetchEntryPermissionsAndStageDetails({
9292
entryUid: fieldMetadata.entry_uid,
9393
contentTypeUid: fieldMetadata.content_type_uid,
9494
locale: fieldMetadata.locale,
9595
variantUid: fieldMetadata.variant,
96+
fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,
9697
});
9798
const { isDisabled } = isFieldDisabled(
9899
fieldSchema,
99100
eventDetails,
101+
resolvedVariantPermissions,
100102
entryAcl,
101103
entryWorkflowStageDetails
102104
);
@@ -372,16 +374,18 @@ async function generateCursor({
372374
if (!fieldSchema) {
373375
return;
374376
}
375-
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails } =
377+
const { acl: entryAcl, workflowStage: entryWorkflowStageDetails, resolvedVariantPermissions } =
376378
await fetchEntryPermissionsAndStageDetails({
377379
entryUid: fieldMetadata.entry_uid,
378380
contentTypeUid: fieldMetadata.content_type_uid,
379381
locale: fieldMetadata.locale,
380382
variantUid: fieldMetadata.variant,
383+
fieldPathWithIndex: fieldMetadata.fieldPathWithIndex,
381384
});
382385
const { isDisabled: fieldDisabled } = isFieldDisabled(
383386
fieldSchema,
384387
eventDetails,
388+
resolvedVariantPermissions,
385389
entryAcl,
386390
entryWorkflowStageDetails
387391
);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ describe("handleIndividualFields", () => {
7474
expect(getFieldType).toHaveBeenCalledWith(fieldSchema);
7575
expect(isFieldDisabled).toHaveBeenCalledWith(
7676
fieldSchema,
77-
eventDetails,
77+
eventDetails,
78+
{
79+
update: true,
80+
},
7881
{
7982
read: true,
8083
update: true,

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ import { FieldDetails } from "../../components/FieldToolbar";
55
import Config from "../../../configManager/configManager";
66
import { VisualBuilder } from "../..";
77
import { EntryPermissions } from "../getEntryPermissions";
8+
import { ResolvedVariantPermissions } from "../getResolvedVariantPermissions";
9+
10+
const resolvedVariantPermissions: ResolvedVariantPermissions = {
11+
update: true,
12+
};
813

914
describe("isFieldDisabled", () => {
1015
it("should return disabled state due to read-only role", () => {
@@ -247,7 +252,7 @@ describe("isFieldDisabled", () => {
247252
},
248253
};
249254

250-
const result = isFieldDisabled(fieldSchemaMap, eventFieldDetails, {
255+
const result = isFieldDisabled(fieldSchemaMap, eventFieldDetails, resolvedVariantPermissions, {
251256
update: false,
252257
create: true,
253258
read: true,
@@ -292,6 +297,7 @@ describe("isFieldDisabled", () => {
292297
const result = isFieldDisabled(
293298
fieldSchemaMap,
294299
eventFieldDetails,
300+
resolvedVariantPermissions,
295301
entryPermissions,
296302
workflowStageDetails
297303
);
@@ -332,6 +338,7 @@ describe("isFieldDisabled", () => {
332338
const result = isFieldDisabled(
333339
fieldSchemaMap,
334340
eventFieldDetails,
341+
resolvedVariantPermissions,
335342
entryPermissions,
336343
workflowStageDetails
337344
);
@@ -372,6 +379,7 @@ describe("isFieldDisabled", () => {
372379
const result = isFieldDisabled(
373380
fieldSchemaMap,
374381
eventFieldDetails,
382+
resolvedVariantPermissions,
375383
entryPermissions,
376384
workflowStageDetails
377385
);
@@ -408,6 +416,7 @@ describe("isFieldDisabled", () => {
408416
const result = isFieldDisabled(
409417
fieldSchemaMap,
410418
eventFieldDetails,
419+
resolvedVariantPermissions,
411420
entryPermissions,
412421
workflowStageDetails
413422
);
@@ -448,6 +457,7 @@ describe("isFieldDisabled", () => {
448457
const result = isFieldDisabled(
449458
fieldSchemaMap,
450459
eventFieldDetails,
460+
resolvedVariantPermissions,
451461
entryPermissions,
452462
// @ts-expect-error testing missing name property
453463
workflowStageDetails
@@ -493,6 +503,7 @@ describe("isFieldDisabled", () => {
493503
const result = isFieldDisabled(
494504
fieldSchemaMap,
495505
eventFieldDetails,
506+
resolvedVariantPermissions,
496507
entryPermissions,
497508
workflowStageDetails
498509
);
@@ -524,6 +535,7 @@ describe("isFieldDisabled", () => {
524535
const result = isFieldDisabled(
525536
fieldSchemaMap,
526537
eventFieldDetails,
538+
resolvedVariantPermissions,
527539
entryPermissions,
528540
undefined
529541
);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ describe("updateFocussedState", () => {
223223
editableElement: editableElementMock,
224224
fieldMetadata: expect.any(Object),
225225
},
226+
{
227+
update: true,
228+
},
226229
mockEntryPermissions,
227230
mockWorkflowStageDetails
228231
);

0 commit comments

Comments
 (0)