fix(customHomePage): fix splitting a row below when editing global module (#14230)

This commit is contained in:
v-tarasevich-blitz-brain 2025-07-28 16:52:47 +03:00 committed by GitHub
parent a24b6f215d
commit d022df4736
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 86 additions and 4 deletions

View File

@ -368,6 +368,7 @@ describe('useModuleOperations', () => {
mockPersonalTemplate,
'urn:li:pageModule:1',
position,
true,
);
expect(mockSetPersonalTemplate).toHaveBeenCalledWith(updatedTemplate);
expect(mockUpsertTemplate).toHaveBeenCalledWith(updatedTemplate, true, mockPersonalTemplate);
@ -422,6 +423,7 @@ describe('useModuleOperations', () => {
mockGlobalTemplate,
'urn:li:pageModule:2',
position,
true,
);
expect(mockSetGlobalTemplate).toHaveBeenCalledWith(updatedTemplate);
expect(mockUpsertTemplate).toHaveBeenCalledWith(updatedTemplate, false, mockPersonalTemplate);
@ -476,6 +478,7 @@ describe('useModuleOperations', () => {
mockGlobalTemplate,
'urn:li:pageModule:2',
position,
true,
);
expect(mockSetPersonalTemplate).toHaveBeenCalledWith(updatedTemplate);
expect(mockUpsertTemplate).toHaveBeenCalledWith(updatedTemplate, true, null);
@ -532,6 +535,7 @@ describe('useModuleOperations', () => {
mockPersonalTemplate,
'urn:li:pageModule:1',
position,
true,
);
expect(mockSetPersonalTemplate).toHaveBeenCalledWith(updatedTemplate);
expect(mockUpsertTemplate).toHaveBeenCalledWith(updatedTemplate, true, mockPersonalTemplate);
@ -1410,6 +1414,7 @@ describe('useModuleOperations', () => {
mockPersonalTemplate,
mockGlobalModuleToEdit.urn,
position,
false, // shouldRemoveEmptyRow = false (to replace a module we should keep empty row)
);
// Should add the new personal module in the same position
@ -1664,6 +1669,7 @@ describe('useModuleOperations', () => {
mockPersonalTemplate,
mockGlobalModuleToEdit.urn,
position,
false,
);
// Should not proceed with template update if removal fails

View File

@ -224,6 +224,7 @@ describe('useTemplateOperations', () => {
templateWithMultipleModules,
'urn:li:pageModule:2',
position,
true,
);
expect(updatedTemplate).not.toBeNull();
@ -288,6 +289,7 @@ describe('useTemplateOperations', () => {
templateWithDuplicateUrns,
'urn:li:pageModule:duplicate',
position,
true,
);
expect(updatedTemplate).not.toBeNull();
@ -344,6 +346,7 @@ describe('useTemplateOperations', () => {
templateWithMultipleModules,
'urn:li:pageModule:2',
position,
true,
);
expect(updatedTemplate).not.toBeNull();
@ -398,6 +401,7 @@ describe('useTemplateOperations', () => {
templateWithMultipleModules,
'urn:li:pageModule:2',
position,
true,
);
expect(updatedTemplate).not.toBeNull();
@ -406,7 +410,7 @@ describe('useTemplateOperations', () => {
expect(updatedTemplate?.properties?.rows?.[0]?.modules?.[0]?.urn).toBe('urn:li:pageModule:1');
});
it('should remove entire row when last module is removed', () => {
it('should remove entire row when last module is removed if removing of empty rows is enabled', () => {
const { result } = renderHook(() => useTemplateOperations(setPersonalTemplate));
const templateWithSingleModule: PageTemplateFragment = {
@ -456,6 +460,7 @@ describe('useTemplateOperations', () => {
templateWithSingleModule,
'urn:li:pageModule:1',
position,
true,
);
expect(updatedTemplate).not.toBeNull();
@ -463,6 +468,65 @@ describe('useTemplateOperations', () => {
expect(updatedTemplate?.properties?.rows?.[0]?.modules?.[0]?.urn).toBe('urn:li:pageModule:2');
});
it('should not remove entire row when last module is removed if removing of empty rows is disabled', () => {
const { result } = renderHook(() => useTemplateOperations(setPersonalTemplate));
const templateWithSingleModule: PageTemplateFragment = {
...mockTemplate,
properties: {
...mockTemplate.properties!,
rows: [
{
modules: [
{
urn: 'urn:li:pageModule:1',
type: EntityType.DatahubPageModule,
properties: {
name: 'Module 1',
type: DataHubPageModuleType.Link,
visibility: { scope: PageModuleScope.Personal },
params: {},
},
},
],
},
{
modules: [
{
urn: 'urn:li:pageModule:2',
type: EntityType.DatahubPageModule,
properties: {
name: 'Module 2',
type: DataHubPageModuleType.Link,
visibility: { scope: PageModuleScope.Personal },
params: {},
},
},
],
},
],
},
};
const position: ModulePositionInput = {
rowIndex: 0,
rowSide: 'left',
moduleIndex: 0,
};
const updatedTemplate = result.current.removeModuleFromTemplate(
templateWithSingleModule,
'urn:li:pageModule:1',
position,
false,
);
expect(updatedTemplate).not.toBeNull();
expect(updatedTemplate?.properties?.rows).toHaveLength(2);
expect(updatedTemplate?.properties?.rows?.[0]?.modules?.length).toBe(0);
expect(updatedTemplate?.properties?.rows?.[1]?.modules?.[0]?.urn).toBe('urn:li:pageModule:2');
});
it('should return original template when module is not found', () => {
const { result } = renderHook(() => useTemplateOperations(setPersonalTemplate));
@ -476,6 +540,7 @@ describe('useTemplateOperations', () => {
mockTemplate,
'urn:li:pageModule:nonexistent',
position,
true,
);
expect(updatedTemplate).toBe(mockTemplate);
@ -494,6 +559,7 @@ describe('useTemplateOperations', () => {
mockTemplate,
'urn:li:pageModule:1',
position,
true,
);
expect(updatedTemplate).toBe(mockTemplate);
@ -512,6 +578,7 @@ describe('useTemplateOperations', () => {
mockTemplate,
'urn:li:pageModule:1',
position,
true,
);
expect(updatedTemplate).toBe(mockTemplate);
@ -526,7 +593,12 @@ describe('useTemplateOperations', () => {
moduleIndex: 0,
};
const updatedTemplate = result.current.removeModuleFromTemplate(null, 'urn:li:pageModule:1', position);
const updatedTemplate = result.current.removeModuleFromTemplate(
null,
'urn:li:pageModule:1',
position,
true,
);
expect(updatedTemplate).toBeNull();
});
@ -556,6 +628,7 @@ describe('useTemplateOperations', () => {
templateWithEmptyRow,
'urn:li:pageModule:1',
position,
true,
);
expect(updatedTemplate).toBe(templateWithEmptyRow);

View File

@ -154,6 +154,7 @@ export function useModuleOperations(
templateToUpdate: PageTemplateFragment | null,
moduleUrn: string,
position: ModulePositionInput,
shouldRemoveEmptyRow: boolean,
) => PageTemplateFragment | null,
upsertTemplate: (
templateToUpsert: PageTemplateFragment | null,
@ -284,7 +285,7 @@ export function useModuleOperations(
}
// Update template state
const updatedTemplate = removeModuleFromTemplate(templateToUpdate, module.urn, position);
const updatedTemplate = removeModuleFromTemplate(templateToUpdate, module.urn, position, true);
// Update local state immediately for optimistic UI
updateTemplateStateOptimistically(context, updatedTemplate, isPersonal);
@ -395,6 +396,7 @@ export function useModuleOperations(
templateToUpdate,
originalModuleData.urn,
position,
false,
);
if (updatedTemplate) {

View File

@ -120,6 +120,7 @@ export function useTemplateOperations(setPersonalTemplate: (template: PageTempla
templateToUpdate: PageTemplateFragment | null,
moduleUrn: string,
position: ModulePositionInput,
shouldRemoveEmptyRow: boolean,
): PageTemplateFragment | null => {
if (!isValidRemovalPosition(templateToUpdate, position)) {
return templateToUpdate;
@ -142,7 +143,7 @@ export function useTemplateOperations(setPersonalTemplate: (template: PageTempla
}
// If the row is now empty, remove the entire row
if (updatedModules.length === 0) {
if (shouldRemoveEmptyRow && updatedModules.length === 0) {
newRows.splice(rowIndex!, 1);
} else {
row.modules = updatedModules;