diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/constants/DefaultRecordActionsConfig.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/constants/DefaultRecordActionsConfig.tsx
index bdf8aafe0..47da913f3 100644
--- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/constants/DefaultRecordActionsConfig.tsx
+++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/constants/DefaultRecordActionsConfig.tsx
@@ -5,6 +5,7 @@ import { ExportMultipleRecordsAction } from '@/action-menu/actions/record-action
import { RestoreMultipleRecordsAction } from '@/action-menu/actions/record-actions/multiple-records/components/RestoreMultipleRecordsAction';
import { MultipleRecordsActionKeys } from '@/action-menu/actions/record-actions/multiple-records/types/MultipleRecordsActionKeys';
import { CreateNewTableRecordNoSelectionRecordAction } from '@/action-menu/actions/record-actions/no-selection/components/CreateNewTableRecordNoSelectionRecordAction';
+import { CreateNewViewNoSelectionRecord } from '@/action-menu/actions/record-actions/no-selection/components/CreateNewViewNoSelectionRecord';
import { HideDeletedRecordsNoSelectionRecordAction } from '@/action-menu/actions/record-actions/no-selection/components/HideDeletedRecordsNoSelectionRecordAction';
import { ImportRecordsNoSelectionRecordAction } from '@/action-menu/actions/record-actions/no-selection/components/ImportRecordsNoSelectionRecordAction';
import { SeeDeletedRecordsNoSelectionRecordAction } from '@/action-menu/actions/record-actions/no-selection/components/SeeDeletedRecordsNoSelectionRecordAction';
@@ -41,6 +42,7 @@ import {
IconFileImport,
IconHeart,
IconHeartOff,
+ IconLayout,
IconPlus,
IconRefresh,
IconRotate2,
@@ -276,13 +278,28 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
availableOn: [ActionViewType.INDEX_PAGE_NO_SELECTION],
component: ,
},
+ [NoSelectionRecordActionKeys.CREATE_NEW_VIEW]: {
+ type: ActionType.Standard,
+ scope: ActionScope.Object,
+ key: NoSelectionRecordActionKeys.CREATE_NEW_VIEW,
+ label: msg`Create View`,
+ shortLabel: msg`Create View`,
+ position: 11,
+ Icon: IconLayout,
+ accent: 'default',
+ isPinned: false,
+ shouldBeRegistered: ({ isSoftDeleteFilterActive }) =>
+ !isSoftDeleteFilterActive,
+ availableOn: [ActionViewType.INDEX_PAGE_NO_SELECTION],
+ component: ,
+ },
[NoSelectionRecordActionKeys.HIDE_DELETED_RECORDS]: {
type: ActionType.Standard,
scope: ActionScope.Object,
key: NoSelectionRecordActionKeys.HIDE_DELETED_RECORDS,
label: msg`Hide deleted records`,
shortLabel: msg`Hide deleted`,
- position: 11,
+ position: 12,
Icon: IconEyeOff,
accent: 'default',
isPinned: false,
@@ -297,7 +314,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: SingleRecordActionKeys.DESTROY,
label: msg`Permanently destroy record`,
shortLabel: msg`Destroy`,
- position: 12,
+ position: 13,
Icon: IconTrashX,
accent: 'danger',
isPinned: true,
@@ -316,7 +333,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
scope: ActionScope.RecordSelection,
key: SingleRecordActionKeys.NAVIGATE_TO_PREVIOUS_RECORD,
label: msg`Navigate to previous record`,
- position: 13,
+ position: 14,
isPinned: true,
Icon: IconChevronUp,
shouldBeRegistered: ({ isInRightDrawer }) => !isInRightDrawer,
@@ -328,7 +345,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
scope: ActionScope.RecordSelection,
key: SingleRecordActionKeys.NAVIGATE_TO_NEXT_RECORD,
label: msg`Navigate to next record`,
- position: 14,
+ position: 15,
isPinned: true,
Icon: IconChevronDown,
shouldBeRegistered: ({ isInRightDrawer }) => !isInRightDrawer,
@@ -341,7 +358,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: MultipleRecordsActionKeys.DESTROY,
label: msg`Permanently destroy records`,
shortLabel: msg`Destroy`,
- position: 15,
+ position: 16,
Icon: IconTrashX,
accent: 'danger',
isPinned: true,
@@ -366,7 +383,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: SingleRecordActionKeys.RESTORE,
label: msg`Restore record`,
shortLabel: msg`Restore`,
- position: 16,
+ position: 17,
Icon: IconRefresh,
accent: 'default',
isPinned: true,
@@ -394,7 +411,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: MultipleRecordsActionKeys.RESTORE,
label: msg`Restore records`,
shortLabel: msg`Restore`,
- position: 17,
+ position: 18,
Icon: IconRefresh,
accent: 'default',
isPinned: true,
@@ -419,7 +436,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: NoSelectionRecordActionKeys.GO_TO_WORKFLOWS,
label: msg`Go to workflows`,
shortLabel: msg`See workflows`,
- position: 18,
+ position: 19,
Icon: IconSettingsAutomation,
accent: 'default',
isPinned: false,
@@ -451,7 +468,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: NoSelectionRecordActionKeys.GO_TO_PEOPLE,
label: msg`Go to People`,
shortLabel: msg`People`,
- position: 19,
+ position: 20,
Icon: IconUser,
isPinned: false,
availableOn: [
@@ -482,7 +499,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: NoSelectionRecordActionKeys.GO_TO_COMPANIES,
label: msg`Go to Companies`,
shortLabel: msg`Companies`,
- position: 20,
+ position: 21,
Icon: IconBuildingSkyscraper,
isPinned: false,
availableOn: [
@@ -513,7 +530,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: NoSelectionRecordActionKeys.GO_TO_OPPORTUNITIES,
label: msg`Go to Opportunities`,
shortLabel: msg`Opportunities`,
- position: 21,
+ position: 22,
Icon: IconTargetArrow,
isPinned: false,
availableOn: [
@@ -546,7 +563,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: NoSelectionRecordActionKeys.GO_TO_SETTINGS,
label: msg`Go to Settings`,
shortLabel: msg`Settings`,
- position: 22,
+ position: 23,
Icon: IconSettings,
isPinned: false,
availableOn: [
@@ -572,7 +589,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: NoSelectionRecordActionKeys.GO_TO_TASKS,
label: msg`Go to Tasks`,
shortLabel: msg`Tasks`,
- position: 23,
+ position: 24,
Icon: IconCheckbox,
isPinned: false,
availableOn: [
@@ -603,7 +620,7 @@ export const DEFAULT_RECORD_ACTIONS_CONFIG: Record<
key: NoSelectionRecordActionKeys.GO_TO_NOTES,
label: msg`Go to Notes`,
shortLabel: msg`Notes`,
- position: 24,
+ position: 25,
Icon: IconCheckbox,
isPinned: false,
availableOn: [
diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/no-selection/components/CreateNewViewNoSelectionRecord.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/no-selection/components/CreateNewViewNoSelectionRecord.tsx
new file mode 100644
index 000000000..978f046cc
--- /dev/null
+++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/no-selection/components/CreateNewViewNoSelectionRecord.tsx
@@ -0,0 +1,45 @@
+import { Action } from '@/action-menu/actions/components/Action';
+import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow';
+import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
+import { getRecordIndexIdFromObjectNamePluralAndViewId } from '@/object-record/utils/getRecordIndexIdFromObjectNamePluralAndViewId';
+import { useOpenDropdown } from '@/ui/layout/dropdown/hooks/useOpenDropdown';
+import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
+import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
+import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode';
+import { viewPickerReferenceViewIdComponentState } from '@/views/view-picker/states/viewPickerReferenceViewIdComponentState';
+import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId';
+
+export const CreateNewViewNoSelectionRecord = () => {
+ const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow();
+ const { openDropdown } = useOpenDropdown();
+
+ const currentViewId = useRecoilComponentValueV2(
+ contextStoreCurrentViewIdComponentState,
+ );
+
+ if (!currentViewId) {
+ throw new Error('Current view ID is not defined');
+ }
+
+ const recordIndexId = getRecordIndexIdFromObjectNamePluralAndViewId(
+ objectMetadataItem.namePlural,
+ currentViewId,
+ );
+
+ const setViewPickerReferenceViewId = useSetRecoilComponentStateV2(
+ viewPickerReferenceViewIdComponentState,
+ recordIndexId,
+ );
+
+ const { setViewPickerMode } = useViewPickerMode(recordIndexId);
+
+ const handleAddViewButtonClick = () => {
+ setViewPickerReferenceViewId(currentViewId);
+ setViewPickerMode('create-empty');
+ openDropdown({
+ dropdownComponentInstanceIdFromProps: VIEW_PICKER_DROPDOWN_ID,
+ });
+ };
+
+ return ;
+};
diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/no-selection/types/NoSelectionRecordActionsKeys.ts b/packages/twenty-front/src/modules/action-menu/actions/record-actions/no-selection/types/NoSelectionRecordActionsKeys.ts
index dc34f4edb..96f96712e 100644
--- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/no-selection/types/NoSelectionRecordActionsKeys.ts
+++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/no-selection/types/NoSelectionRecordActionsKeys.ts
@@ -11,4 +11,5 @@ export enum NoSelectionRecordActionKeys {
GO_TO_SETTINGS = 'go-to-settings',
GO_TO_TASKS = 'go-to-tasks',
GO_TO_NOTES = 'go-to-notes',
+ CREATE_NEW_VIEW = 'create-view',
}