7a3e92fe0b
The order of the selectableItems was not the same as the command groups so the navigation with arrow keys inside the command menu was broken. Before: https://github.com/user-attachments/assets/a3487b58-9c26-4522-9e7b-584d30396a21 After: https://github.com/user-attachments/assets/bd60263b-b4e2-4d41-bad1-eef9115caec6
102 lines
3.4 KiB
TypeScript
102 lines
3.4 KiB
TypeScript
import { CommandGroup } from '@/command-menu/components/CommandGroup';
|
|
import { CommandMenuList } from '@/command-menu/components/CommandMenuList';
|
|
import { ResetContextToSelectionCommandButton } from '@/command-menu/components/ResetContextToSelectionCommandButton';
|
|
import { RESET_CONTEXT_TO_SELECTION } from '@/command-menu/constants/ResetContextToSelection';
|
|
import { useMatchingCommandMenuCommands } from '@/command-menu/hooks/useMatchingCommandMenuCommands';
|
|
import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState';
|
|
import { Command } from '@/command-menu/types/Command';
|
|
import { contextStoreCurrentObjectMetadataItemComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemComponentState';
|
|
import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem';
|
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
|
import { useLingui } from '@lingui/react/macro';
|
|
import { useRecoilValue } from 'recoil';
|
|
import { isDefined } from 'twenty-shared';
|
|
|
|
export type CommandGroupConfig = {
|
|
heading: string;
|
|
items?: Command[];
|
|
};
|
|
|
|
export const CommandMenu = () => {
|
|
const { t } = useLingui();
|
|
|
|
const commandMenuSearch = useRecoilValue(commandMenuSearchState);
|
|
|
|
const {
|
|
noResults,
|
|
copilotCommands,
|
|
matchingStandardActionRecordSelectionCommands,
|
|
matchingStandardActionObjectCommands,
|
|
matchingWorkflowRunRecordSelectionCommands,
|
|
matchingStandardActionGlobalCommands,
|
|
matchingWorkflowRunGlobalCommands,
|
|
matchingNavigateCommands,
|
|
fallbackCommands,
|
|
} = useMatchingCommandMenuCommands({
|
|
commandMenuSearch,
|
|
});
|
|
|
|
const previousContextStoreCurrentObjectMetadataItem =
|
|
useRecoilComponentValueV2(
|
|
contextStoreCurrentObjectMetadataItemComponentState,
|
|
'command-menu-previous',
|
|
);
|
|
|
|
const currentObjectMetadataItem = useRecoilComponentValueV2(
|
|
contextStoreCurrentObjectMetadataItemComponentState,
|
|
);
|
|
|
|
const commandGroups: CommandGroupConfig[] = [
|
|
{
|
|
heading: t`Copilot`,
|
|
items: copilotCommands,
|
|
},
|
|
{
|
|
heading: t`Record Selection`,
|
|
items: matchingStandardActionRecordSelectionCommands.concat(
|
|
matchingWorkflowRunRecordSelectionCommands,
|
|
),
|
|
},
|
|
{
|
|
heading: currentObjectMetadataItem?.labelPlural ?? t`Object`,
|
|
items: matchingStandardActionObjectCommands,
|
|
},
|
|
{
|
|
heading: t`Global`,
|
|
items: matchingStandardActionGlobalCommands
|
|
.concat(matchingNavigateCommands)
|
|
.concat(matchingWorkflowRunGlobalCommands),
|
|
},
|
|
{
|
|
heading: t`Search ''${commandMenuSearch}'' with...`,
|
|
items: fallbackCommands,
|
|
},
|
|
];
|
|
|
|
const selectableItems: Command[] = commandGroups.flatMap(
|
|
(group) => group.items ?? [],
|
|
);
|
|
|
|
const selectableItemIds = selectableItems.map((item) => item.id);
|
|
|
|
if (isDefined(previousContextStoreCurrentObjectMetadataItem)) {
|
|
selectableItemIds.unshift(RESET_CONTEXT_TO_SELECTION);
|
|
}
|
|
|
|
return (
|
|
<CommandMenuList
|
|
commandGroups={commandGroups}
|
|
selectableItemIds={selectableItemIds}
|
|
noResults={noResults}
|
|
>
|
|
{isDefined(previousContextStoreCurrentObjectMetadataItem) && (
|
|
<CommandGroup heading={t`Context`}>
|
|
<SelectableItem itemId={RESET_CONTEXT_TO_SELECTION}>
|
|
<ResetContextToSelectionCommandButton />
|
|
</SelectableItem>
|
|
</CommandGroup>
|
|
)}
|
|
</CommandMenuList>
|
|
);
|
|
};
|