Feat: Navbar customization (#17728)
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> Co-authored-by: Devessier <baptiste@devessier.fr>
This commit is contained in:
+24
-3
@@ -37,10 +37,31 @@ export const STANDARD_NAVIGATION_MENU_ITEMS = {
|
||||
STANDARD_OBJECTS.task.views.allTasks.universalIdentifier,
|
||||
position: 5,
|
||||
},
|
||||
allWorkflows: {
|
||||
workflowsFolder: {
|
||||
universalIdentifier: '20202020-b007-4b07-8b07-c0aba11c0007',
|
||||
viewUniversalIdentifier:
|
||||
STANDARD_OBJECTS.workflow.views.allWorkflows.universalIdentifier,
|
||||
name: 'Workflows',
|
||||
position: 6,
|
||||
},
|
||||
workflowsFolderAllWorkflows: {
|
||||
universalIdentifier: '20202020-b008-4b08-8b08-c0aba11c0008',
|
||||
viewUniversalIdentifier:
|
||||
STANDARD_OBJECTS.workflow.views.allWorkflows.universalIdentifier,
|
||||
folderUniversalIdentifier: '20202020-b007-4b07-8b07-c0aba11c0007',
|
||||
position: 0,
|
||||
},
|
||||
workflowsFolderAllWorkflowRuns: {
|
||||
universalIdentifier: '20202020-b009-4b09-8b09-c0aba11c0009',
|
||||
viewUniversalIdentifier:
|
||||
STANDARD_OBJECTS.workflowRun.views.allWorkflowRuns.universalIdentifier,
|
||||
folderUniversalIdentifier: '20202020-b007-4b07-8b07-c0aba11c0007',
|
||||
position: 1,
|
||||
},
|
||||
workflowsFolderAllWorkflowVersions: {
|
||||
universalIdentifier: '20202020-b00a-4b0a-8b0a-c0aba11c000a',
|
||||
viewUniversalIdentifier:
|
||||
STANDARD_OBJECTS.workflowVersion.views.allWorkflowVersions
|
||||
.universalIdentifier,
|
||||
folderUniversalIdentifier: '20202020-b007-4b07-8b07-c0aba11c0007',
|
||||
position: 2,
|
||||
},
|
||||
} as const;
|
||||
|
||||
+62
-3
@@ -7,6 +7,25 @@ import { addFlatNavigationMenuItemToMapsAndUpdateIndex } from 'src/engine/metada
|
||||
import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
|
||||
import { STANDARD_NAVIGATION_MENU_ITEMS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-navigation-menu-item.constant';
|
||||
import { createStandardNavigationMenuItemFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/navigation-menu-item/create-standard-navigation-menu-item-flat-metadata.util';
|
||||
import {
|
||||
createStandardNavigationMenuItemFolderFlatMetadata,
|
||||
createStandardNavigationMenuItemFolderItemFlatMetadata,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/navigation-menu-item/create-standard-navigation-menu-item-folder-flat-metadata.util';
|
||||
|
||||
const FLAT_NAVIGATION_MENU_ITEM_NAMES = [
|
||||
'allCompanies',
|
||||
'allDashboards',
|
||||
'allNotes',
|
||||
'allOpportunities',
|
||||
'allPeople',
|
||||
'allTasks',
|
||||
] as const;
|
||||
|
||||
const WORKFLOWS_FOLDER_ITEM_NAMES = [
|
||||
'workflowsFolderAllWorkflows',
|
||||
'workflowsFolderAllWorkflowRuns',
|
||||
'workflowsFolderAllWorkflowVersions',
|
||||
] as const;
|
||||
|
||||
export const buildStandardFlatNavigationMenuItemMaps = ({
|
||||
now,
|
||||
@@ -26,9 +45,7 @@ export const buildStandardFlatNavigationMenuItemMaps = ({
|
||||
byUserWorkspaceIdAndFolderId: {},
|
||||
};
|
||||
|
||||
for (const navigationMenuItemName of Object.keys(
|
||||
STANDARD_NAVIGATION_MENU_ITEMS,
|
||||
) as Array<keyof typeof STANDARD_NAVIGATION_MENU_ITEMS>) {
|
||||
for (const navigationMenuItemName of FLAT_NAVIGATION_MENU_ITEM_NAMES) {
|
||||
const navigationMenuItemDefinition =
|
||||
STANDARD_NAVIGATION_MENU_ITEMS[navigationMenuItemName];
|
||||
|
||||
@@ -54,5 +71,47 @@ export const buildStandardFlatNavigationMenuItemMaps = ({
|
||||
});
|
||||
}
|
||||
|
||||
const workflowsFolderDefinition =
|
||||
STANDARD_NAVIGATION_MENU_ITEMS.workflowsFolder;
|
||||
const workflowsFolderId = v4();
|
||||
const workflowsFolder = createStandardNavigationMenuItemFolderFlatMetadata({
|
||||
universalIdentifier: workflowsFolderDefinition.universalIdentifier,
|
||||
name: workflowsFolderDefinition.name,
|
||||
position: workflowsFolderDefinition.position,
|
||||
navigationMenuItemId: workflowsFolderId,
|
||||
workspaceId,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
});
|
||||
|
||||
addFlatNavigationMenuItemToMapsAndUpdateIndex({
|
||||
flatNavigationMenuItem: workflowsFolder,
|
||||
flatNavigationMenuItemMaps,
|
||||
});
|
||||
|
||||
for (const folderItemName of WORKFLOWS_FOLDER_ITEM_NAMES) {
|
||||
const folderItemDefinition = STANDARD_NAVIGATION_MENU_ITEMS[folderItemName];
|
||||
|
||||
const folderItem = createStandardNavigationMenuItemFolderItemFlatMetadata({
|
||||
universalIdentifier: folderItemDefinition.universalIdentifier,
|
||||
viewUniversalIdentifier: folderItemDefinition.viewUniversalIdentifier,
|
||||
folderId: workflowsFolderId,
|
||||
folderUniversalIdentifier: folderItemDefinition.folderUniversalIdentifier,
|
||||
position: folderItemDefinition.position,
|
||||
navigationMenuItemId: v4(),
|
||||
workspaceId,
|
||||
twentyStandardApplicationId,
|
||||
dependencyFlatEntityMaps: {
|
||||
flatViewMaps,
|
||||
},
|
||||
now,
|
||||
});
|
||||
|
||||
addFlatNavigationMenuItemToMapsAndUpdateIndex({
|
||||
flatNavigationMenuItem: folderItem,
|
||||
flatNavigationMenuItemMaps,
|
||||
});
|
||||
}
|
||||
|
||||
return flatNavigationMenuItemMaps;
|
||||
};
|
||||
|
||||
+1
@@ -65,6 +65,7 @@ export const createStandardNavigationMenuItemFlatMetadata = ({
|
||||
folderUniversalIdentifier: null,
|
||||
name: null,
|
||||
position,
|
||||
link: null,
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
};
|
||||
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
|
||||
import { type FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type';
|
||||
import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
|
||||
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
|
||||
|
||||
export const createStandardNavigationMenuItemFolderFlatMetadata = ({
|
||||
universalIdentifier,
|
||||
name,
|
||||
position,
|
||||
navigationMenuItemId,
|
||||
workspaceId,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}: {
|
||||
universalIdentifier: string;
|
||||
name: string;
|
||||
position: number;
|
||||
navigationMenuItemId: string;
|
||||
workspaceId: string;
|
||||
twentyStandardApplicationId: string;
|
||||
now: string;
|
||||
}): FlatNavigationMenuItem => ({
|
||||
id: navigationMenuItemId,
|
||||
universalIdentifier,
|
||||
applicationId: twentyStandardApplicationId,
|
||||
applicationUniversalIdentifier:
|
||||
TWENTY_STANDARD_APPLICATION.universalIdentifier,
|
||||
workspaceId,
|
||||
userWorkspaceId: null,
|
||||
targetRecordId: null,
|
||||
targetObjectMetadataId: null,
|
||||
targetObjectMetadataUniversalIdentifier: null,
|
||||
viewId: null,
|
||||
viewUniversalIdentifier: null,
|
||||
folderId: null,
|
||||
folderUniversalIdentifier: null,
|
||||
name,
|
||||
position,
|
||||
link: null,
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
});
|
||||
|
||||
export const createStandardNavigationMenuItemFolderItemFlatMetadata = ({
|
||||
universalIdentifier,
|
||||
viewUniversalIdentifier,
|
||||
folderId,
|
||||
folderUniversalIdentifier,
|
||||
position,
|
||||
navigationMenuItemId,
|
||||
workspaceId,
|
||||
twentyStandardApplicationId,
|
||||
dependencyFlatEntityMaps: { flatViewMaps },
|
||||
now,
|
||||
}: {
|
||||
universalIdentifier: string;
|
||||
viewUniversalIdentifier: string;
|
||||
folderId: string;
|
||||
folderUniversalIdentifier: string;
|
||||
position: number;
|
||||
navigationMenuItemId: string;
|
||||
workspaceId: string;
|
||||
twentyStandardApplicationId: string;
|
||||
dependencyFlatEntityMaps: {
|
||||
flatViewMaps: FlatEntityMaps<FlatView>;
|
||||
};
|
||||
now: string;
|
||||
}): FlatNavigationMenuItem => {
|
||||
const flatView = findFlatEntityByUniversalIdentifier({
|
||||
flatEntityMaps: flatViewMaps,
|
||||
universalIdentifier: viewUniversalIdentifier,
|
||||
});
|
||||
|
||||
if (!flatView) {
|
||||
throw new Error(
|
||||
`View not found for universal identifier ${viewUniversalIdentifier}`,
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
id: navigationMenuItemId,
|
||||
universalIdentifier,
|
||||
applicationId: twentyStandardApplicationId,
|
||||
applicationUniversalIdentifier:
|
||||
TWENTY_STANDARD_APPLICATION.universalIdentifier,
|
||||
workspaceId,
|
||||
userWorkspaceId: null,
|
||||
targetRecordId: null,
|
||||
targetObjectMetadataId: null,
|
||||
targetObjectMetadataUniversalIdentifier: null,
|
||||
viewId: flatView.id,
|
||||
viewUniversalIdentifier: flatView.universalIdentifier,
|
||||
folderId,
|
||||
folderUniversalIdentifier,
|
||||
name: null,
|
||||
link: null,
|
||||
position,
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
};
|
||||
};
|
||||
+2
@@ -13,6 +13,7 @@ import { computeStandardOpportunityViewFields } from 'src/engine/workspace-manag
|
||||
import { computeStandardPersonViewFields } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-person-view-fields.util';
|
||||
import { computeStandardTaskViewFields } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-task-view-fields.util';
|
||||
import { computeStandardWorkflowRunViewFields } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-run-view-fields.util';
|
||||
import { computeStandardWorkflowVersionViewFields } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-version-view-fields.util';
|
||||
import { computeStandardWorkflowViewFields } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/compute-standard-workflow-view-fields.util';
|
||||
import { type CreateStandardViewFieldArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/create-standard-view-field-flat-metadata.util';
|
||||
|
||||
@@ -32,6 +33,7 @@ const STANDARD_FLAT_VIEW_FIELD_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
task: computeStandardTaskViewFields,
|
||||
workflow: computeStandardWorkflowViewFields,
|
||||
workflowRun: computeStandardWorkflowRunViewFields,
|
||||
workflowVersion: computeStandardWorkflowVersionViewFields,
|
||||
} as const satisfies {
|
||||
[P in AllStandardObjectName]?: StandardViewFieldBuilder<P>;
|
||||
};
|
||||
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
|
||||
import {
|
||||
createStandardViewFieldFlatMetadata,
|
||||
type CreateStandardViewFieldArgs,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/view-field/create-standard-view-field-flat-metadata.util';
|
||||
|
||||
export const computeStandardWorkflowVersionViewFields = (
|
||||
args: Omit<CreateStandardViewFieldArgs<'workflowVersion'>, 'context'>,
|
||||
): Record<string, FlatViewField> => {
|
||||
return {
|
||||
allWorkflowVersionsName: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'workflowVersion',
|
||||
context: {
|
||||
viewName: 'allWorkflowVersions',
|
||||
viewFieldName: 'name',
|
||||
fieldName: 'name',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
allWorkflowVersionsWorkflow: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'workflowVersion',
|
||||
context: {
|
||||
viewName: 'allWorkflowVersions',
|
||||
viewFieldName: 'workflow',
|
||||
fieldName: 'workflow',
|
||||
position: 1,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
allWorkflowVersionsStatus: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'workflowVersion',
|
||||
context: {
|
||||
viewName: 'allWorkflowVersions',
|
||||
viewFieldName: 'status',
|
||||
fieldName: 'status',
|
||||
position: 2,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
allWorkflowVersionsUpdatedAt: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'workflowVersion',
|
||||
context: {
|
||||
viewName: 'allWorkflowVersions',
|
||||
viewFieldName: 'updatedAt',
|
||||
fieldName: 'updatedAt',
|
||||
position: 3,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
allWorkflowVersionsRuns: createStandardViewFieldFlatMetadata({
|
||||
...args,
|
||||
objectName: 'workflowVersion',
|
||||
context: {
|
||||
viewName: 'allWorkflowVersions',
|
||||
viewFieldName: 'runs',
|
||||
fieldName: 'runs',
|
||||
position: 4,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
+2
@@ -13,6 +13,7 @@ import { computeStandardOpportunityViews } from 'src/engine/workspace-manager/tw
|
||||
import { computeStandardPersonViews } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/compute-standard-person-views.util';
|
||||
import { computeStandardTaskViews } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/compute-standard-task-views.util';
|
||||
import { computeStandardWorkflowRunViews } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/compute-standard-workflow-run-views.util';
|
||||
import { computeStandardWorkflowVersionViews } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/compute-standard-workflow-version-views.util';
|
||||
import { computeStandardWorkflowViews } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/compute-standard-workflow-views.util';
|
||||
import { type CreateStandardViewArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/view/create-standard-view-flat-metadata.util';
|
||||
|
||||
@@ -32,6 +33,7 @@ const STANDARD_FLAT_VIEW_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
task: computeStandardTaskViews,
|
||||
workflow: computeStandardWorkflowViews,
|
||||
workflowRun: computeStandardWorkflowRunViews,
|
||||
workflowVersion: computeStandardWorkflowVersionViews,
|
||||
} as const satisfies {
|
||||
[P in AllStandardObjectName]?: StandardViewBuilder<P>;
|
||||
};
|
||||
|
||||
+2
-2
@@ -15,11 +15,11 @@ export const computeStandardWorkflowRunViews = (
|
||||
objectName: 'workflowRun',
|
||||
context: {
|
||||
viewName: 'allWorkflowRuns',
|
||||
name: 'All Workflow Runs',
|
||||
name: 'Runs',
|
||||
type: ViewType.TABLE,
|
||||
key: ViewKey.INDEX,
|
||||
position: 0,
|
||||
icon: 'IconList',
|
||||
icon: 'IconPlayerPlay',
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
|
||||
import { ViewKey } from 'src/engine/metadata-modules/view/enums/view-key.enum';
|
||||
import { ViewType } from 'src/engine/metadata-modules/view/enums/view-type.enum';
|
||||
import {
|
||||
createStandardViewFlatMetadata,
|
||||
type CreateStandardViewArgs,
|
||||
} from 'src/engine/workspace-manager/twenty-standard-application/utils/view/create-standard-view-flat-metadata.util';
|
||||
|
||||
export const computeStandardWorkflowVersionViews = (
|
||||
args: Omit<CreateStandardViewArgs<'workflowVersion'>, 'context'>,
|
||||
): Record<string, FlatView> => {
|
||||
return {
|
||||
allWorkflowVersions: createStandardViewFlatMetadata({
|
||||
...args,
|
||||
objectName: 'workflowVersion',
|
||||
context: {
|
||||
viewName: 'allWorkflowVersions',
|
||||
name: 'Versions',
|
||||
type: ViewType.TABLE,
|
||||
key: ViewKey.INDEX,
|
||||
position: 0,
|
||||
icon: 'IconRestore',
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
+1
-1
@@ -19,7 +19,7 @@ export const computeStandardWorkflowViews = (
|
||||
type: ViewType.TABLE,
|
||||
key: ViewKey.INDEX,
|
||||
position: 0,
|
||||
icon: 'IconList',
|
||||
icon: 'IconTable',
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
+20
-5
@@ -1,12 +1,13 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { msg, t } from '@lingui/core/macro';
|
||||
import { isNonEmptyString } from '@sniptt/guards';
|
||||
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type';
|
||||
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
|
||||
import { NavigationMenuItemExceptionCode } from 'src/engine/metadata-modules/navigation-menu-item/navigation-menu-item.exception';
|
||||
import { type MetadataUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-maps.type';
|
||||
import { validateFlatEntityCircularDependency } from 'src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util';
|
||||
import {
|
||||
type FailedFlatEntityValidation,
|
||||
@@ -24,12 +25,14 @@ export class FlatNavigationMenuItemValidatorService {
|
||||
hasTargetRecordId,
|
||||
hasTargetObjectMetadataId,
|
||||
hasViewId,
|
||||
hasLink,
|
||||
name,
|
||||
isUpdate = false,
|
||||
}: {
|
||||
hasTargetRecordId: boolean;
|
||||
hasTargetObjectMetadataId: boolean;
|
||||
hasViewId: boolean;
|
||||
hasLink: boolean;
|
||||
name: string | null | undefined;
|
||||
isUpdate?: boolean;
|
||||
}): FlatEntityValidationError<NavigationMenuItemExceptionCode>[] {
|
||||
@@ -61,17 +64,25 @@ export class FlatNavigationMenuItemValidatorService {
|
||||
}
|
||||
|
||||
const isFolder =
|
||||
!hasTargetRecordId && !hasTargetObjectMetadataId && !hasViewId;
|
||||
!hasTargetRecordId &&
|
||||
!hasTargetObjectMetadataId &&
|
||||
!hasViewId &&
|
||||
!hasLink;
|
||||
const isViewLink = hasViewId;
|
||||
const isRecordLink = hasTargetRecordId && hasTargetObjectMetadataId;
|
||||
const isExternalLink =
|
||||
!hasTargetRecordId && !hasTargetObjectMetadataId && !hasViewId && hasLink;
|
||||
const typeCount =
|
||||
(isFolder ? 1 : 0) + (isViewLink ? 1 : 0) + (isRecordLink ? 1 : 0);
|
||||
(isFolder ? 1 : 0) +
|
||||
(isViewLink ? 1 : 0) +
|
||||
(isRecordLink ? 1 : 0) +
|
||||
(isExternalLink ? 1 : 0);
|
||||
|
||||
if (typeCount === 0) {
|
||||
errors.push({
|
||||
code: NavigationMenuItemExceptionCode.INVALID_NAVIGATION_MENU_ITEM_INPUT,
|
||||
message: t`Navigation menu item must be either a folder (with name), a view link (with viewId), or a record link (with targetRecordId and targetObjectMetadataId)`,
|
||||
userFriendlyMessage: msg`Navigation menu item must be either a folder (with name), a view link (with viewId), or a record link (with targetRecordId and targetObjectMetadataId)`,
|
||||
message: t`Navigation menu item must be either a folder (with name), a view link (with viewId), a record link (with targetRecordId and targetObjectMetadataId), or an external link (with link)`,
|
||||
userFriendlyMessage: msg`Navigation menu item must be either a folder (with name), a view link (with viewId), a record link (with targetRecordId and targetObjectMetadataId), or an external link (with link)`,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -182,6 +193,9 @@ export class FlatNavigationMenuItemValidatorService {
|
||||
flatNavigationMenuItem.targetObjectMetadataUniversalIdentifier,
|
||||
),
|
||||
hasViewId: isDefined(flatNavigationMenuItem.viewUniversalIdentifier),
|
||||
hasLink:
|
||||
isDefined(flatNavigationMenuItem.link) &&
|
||||
isNonEmptyString(flatNavigationMenuItem.link),
|
||||
name: flatNavigationMenuItem.name,
|
||||
isUpdate: false,
|
||||
});
|
||||
@@ -317,6 +331,7 @@ export class FlatNavigationMenuItemValidatorService {
|
||||
toFlatNavigationMenuItem.targetObjectMetadataUniversalIdentifier,
|
||||
),
|
||||
hasViewId: isDefined(toFlatNavigationMenuItem.viewUniversalIdentifier),
|
||||
hasLink: isNonEmptyString((toFlatNavigationMenuItem.link ?? '').trim()),
|
||||
name: isDefined(nameUpdate) ? nameUpdate : toFlatNavigationMenuItem.name,
|
||||
isUpdate: true,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user