Replace hotkey scopes by focus stack (Part 6 - Remove Hotkey scopes 🫳🎤) (#13127)
# Replace hotkey scopes by focus stack (Part 6 - Remove Hotkey scopes) This PR is the last part of a refactoring aiming to deprecate the hotkey scopes api in favor of the new focus stack api which is more robust. Part 1: https://github.com/twentyhq/twenty/pull/12673 Part 2: https://github.com/twentyhq/twenty/pull/12798 Part 3: https://github.com/twentyhq/twenty/pull/12910 Part 4: https://github.com/twentyhq/twenty/pull/12933 Part 5: https://github.com/twentyhq/twenty/pull/13106 In this part, we completely remove the hotkey scopes.
This commit is contained in:
@ -0,0 +1,324 @@
|
|||||||
|
import { DEFAULT_RECORD_ACTIONS_CONFIG } from '@/action-menu/actions/record-actions/constants/DefaultRecordActionsConfig';
|
||||||
|
import { NoSelectionRecordActionKeys } from '@/action-menu/actions/record-actions/no-selection/types/NoSelectionRecordActionsKeys';
|
||||||
|
import { SingleRecordActionKeys } from '@/action-menu/actions/record-actions/single-record/types/SingleRecordActionsKey';
|
||||||
|
import { ActionConfig } from '@/action-menu/actions/types/ActionConfig';
|
||||||
|
import { ActionScope } from '@/action-menu/actions/types/ActionScope';
|
||||||
|
import { ActionType } from '@/action-menu/actions/types/ActionType';
|
||||||
|
import { DefaultRecordActionConfigKeys } from '@/action-menu/actions/types/DefaultRecordActionConfigKeys';
|
||||||
|
import { IconHeart, IconPlus } from 'twenty-ui/display';
|
||||||
|
import { inheritActionsFromDefaultConfig } from '../inheritActionsFromDefaultConfig';
|
||||||
|
|
||||||
|
const MockComponent = <div>Mock Component</div>;
|
||||||
|
|
||||||
|
describe('inheritActionsFromDefaultConfig', () => {
|
||||||
|
it('should return empty object when no action keys are provided', () => {
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: {},
|
||||||
|
actionKeys: [],
|
||||||
|
propertiesToOverwrite: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result).toEqual({});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return only provided config when no default action keys are specified', () => {
|
||||||
|
const customConfig: Record<string, ActionConfig> = {
|
||||||
|
'custom-action': {
|
||||||
|
type: ActionType.Standard,
|
||||||
|
scope: ActionScope.Object,
|
||||||
|
key: 'custom-action',
|
||||||
|
label: 'Custom Action',
|
||||||
|
position: 100,
|
||||||
|
Icon: IconPlus,
|
||||||
|
shouldBeRegistered: () => true,
|
||||||
|
component: MockComponent,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: customConfig,
|
||||||
|
actionKeys: [],
|
||||||
|
propertiesToOverwrite: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result).toEqual(customConfig);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should inherit actions from default config', () => {
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
SingleRecordActionKeys.ADD_TO_FAVORITES,
|
||||||
|
];
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: {},
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]:
|
||||||
|
DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD
|
||||||
|
],
|
||||||
|
[SingleRecordActionKeys.ADD_TO_FAVORITES]:
|
||||||
|
DEFAULT_RECORD_ACTIONS_CONFIG[SingleRecordActionKeys.ADD_TO_FAVORITES],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should overwrite specific properties of inherited actions', () => {
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
];
|
||||||
|
|
||||||
|
const propertiesToOverwrite = {
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]: {
|
||||||
|
label: 'Custom Create Label',
|
||||||
|
position: 999,
|
||||||
|
isPinned: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: {},
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite,
|
||||||
|
});
|
||||||
|
|
||||||
|
const expectedAction = {
|
||||||
|
...DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD
|
||||||
|
],
|
||||||
|
label: 'Custom Create Label',
|
||||||
|
position: 999,
|
||||||
|
isPinned: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]: expectedAction,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should overwrite properties for multiple actions', () => {
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
SingleRecordActionKeys.ADD_TO_FAVORITES,
|
||||||
|
];
|
||||||
|
|
||||||
|
const propertiesToOverwrite = {
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]: {
|
||||||
|
position: 10,
|
||||||
|
},
|
||||||
|
[SingleRecordActionKeys.ADD_TO_FAVORITES]: {
|
||||||
|
label: 'Custom Favorite Label',
|
||||||
|
Icon: IconHeart,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: {},
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]).toEqual({
|
||||||
|
...DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD
|
||||||
|
],
|
||||||
|
position: 10,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result[SingleRecordActionKeys.ADD_TO_FAVORITES]).toEqual({
|
||||||
|
...DEFAULT_RECORD_ACTIONS_CONFIG[SingleRecordActionKeys.ADD_TO_FAVORITES],
|
||||||
|
label: 'Custom Favorite Label',
|
||||||
|
Icon: IconHeart,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should only overwrite properties for specified actions', () => {
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
SingleRecordActionKeys.ADD_TO_FAVORITES,
|
||||||
|
];
|
||||||
|
|
||||||
|
const propertiesToOverwrite = {
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]: {
|
||||||
|
position: 10,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: {},
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]).toEqual({
|
||||||
|
...DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD
|
||||||
|
],
|
||||||
|
position: 10,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result[SingleRecordActionKeys.ADD_TO_FAVORITES]).toEqual(
|
||||||
|
DEFAULT_RECORD_ACTIONS_CONFIG[SingleRecordActionKeys.ADD_TO_FAVORITES],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should merge inherited actions with provided config', () => {
|
||||||
|
const customConfig: Record<string, ActionConfig> = {
|
||||||
|
'custom-action': {
|
||||||
|
type: ActionType.Standard,
|
||||||
|
scope: ActionScope.Object,
|
||||||
|
key: 'custom-action',
|
||||||
|
label: 'Custom Action',
|
||||||
|
position: 100,
|
||||||
|
Icon: IconPlus,
|
||||||
|
shouldBeRegistered: () => true,
|
||||||
|
component: MockComponent,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
];
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: customConfig,
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]:
|
||||||
|
DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD
|
||||||
|
],
|
||||||
|
'custom-action': customConfig['custom-action'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should prioritize provided config over inherited actions when keys conflict', () => {
|
||||||
|
const customConfig: Record<string, ActionConfig> = {
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]: {
|
||||||
|
type: ActionType.Standard,
|
||||||
|
scope: ActionScope.Object,
|
||||||
|
key: NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
label: 'Overridden Create Action',
|
||||||
|
position: 999,
|
||||||
|
Icon: IconHeart,
|
||||||
|
shouldBeRegistered: () => false,
|
||||||
|
component: MockComponent,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
];
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: customConfig,
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]).toEqual(
|
||||||
|
customConfig[NoSelectionRecordActionKeys.CREATE_NEW_RECORD],
|
||||||
|
);
|
||||||
|
expect(result[NoSelectionRecordActionKeys.CREATE_NEW_RECORD].label).toBe(
|
||||||
|
'Overridden Create Action',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle complex scenario with inheritance, overrides, and custom config', () => {
|
||||||
|
const customConfig: Record<string, ActionConfig> = {
|
||||||
|
'custom-action-1': {
|
||||||
|
type: ActionType.Standard,
|
||||||
|
scope: ActionScope.Object,
|
||||||
|
key: 'custom-action-1',
|
||||||
|
label: 'Custom Action 1',
|
||||||
|
position: 50,
|
||||||
|
Icon: IconPlus,
|
||||||
|
shouldBeRegistered: () => true,
|
||||||
|
component: MockComponent,
|
||||||
|
},
|
||||||
|
[SingleRecordActionKeys.ADD_TO_FAVORITES]: {
|
||||||
|
type: ActionType.Standard,
|
||||||
|
scope: ActionScope.RecordSelection,
|
||||||
|
key: SingleRecordActionKeys.ADD_TO_FAVORITES,
|
||||||
|
label: 'Completely Custom Favorites',
|
||||||
|
position: 1000,
|
||||||
|
Icon: IconHeart,
|
||||||
|
shouldBeRegistered: () => false,
|
||||||
|
component: MockComponent,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
SingleRecordActionKeys.ADD_TO_FAVORITES,
|
||||||
|
SingleRecordActionKeys.REMOVE_FROM_FAVORITES,
|
||||||
|
];
|
||||||
|
|
||||||
|
const propertiesToOverwrite = {
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]: {
|
||||||
|
label: 'Modified Create Label',
|
||||||
|
position: 5,
|
||||||
|
},
|
||||||
|
[SingleRecordActionKeys.REMOVE_FROM_FAVORITES]: {
|
||||||
|
isPinned: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: customConfig,
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(Object.keys(result)).toHaveLength(4);
|
||||||
|
|
||||||
|
expect(result['custom-action-1']).toEqual(customConfig['custom-action-1']);
|
||||||
|
|
||||||
|
expect(result[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]).toEqual({
|
||||||
|
...DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD
|
||||||
|
],
|
||||||
|
label: 'Modified Create Label',
|
||||||
|
position: 5,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result[SingleRecordActionKeys.ADD_TO_FAVORITES]).toEqual(
|
||||||
|
customConfig[SingleRecordActionKeys.ADD_TO_FAVORITES],
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result[SingleRecordActionKeys.REMOVE_FROM_FAVORITES]).toEqual({
|
||||||
|
...DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
SingleRecordActionKeys.REMOVE_FROM_FAVORITES
|
||||||
|
],
|
||||||
|
isPinned: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty overrides gracefully', () => {
|
||||||
|
const actionKeys: DefaultRecordActionConfigKeys[] = [
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD,
|
||||||
|
];
|
||||||
|
|
||||||
|
const propertiesToOverwrite = {
|
||||||
|
[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = inheritActionsFromDefaultConfig({
|
||||||
|
config: {},
|
||||||
|
actionKeys,
|
||||||
|
propertiesToOverwrite,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result[NoSelectionRecordActionKeys.CREATE_NEW_RECORD]).toEqual(
|
||||||
|
DEFAULT_RECORD_ACTIONS_CONFIG[
|
||||||
|
NoSelectionRecordActionKeys.CREATE_NEW_RECORD
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -1,6 +1,5 @@
|
|||||||
import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
import { Key } from 'ts-key-enum';
|
import { Key } from 'ts-key-enum';
|
||||||
import { Button } from 'twenty-ui/input';
|
import { Button } from 'twenty-ui/input';
|
||||||
import { getOsControlSymbol } from 'twenty-ui/utilities';
|
import { getOsControlSymbol } from 'twenty-ui/utilities';
|
||||||
@ -18,7 +17,6 @@ export const CmdEnterActionButton = ({
|
|||||||
keys: [`${Key.Control}+${Key.Enter}`, `${Key.Meta}+${Key.Enter}`],
|
keys: [`${Key.Control}+${Key.Enter}`, `${Key.Meta}+${Key.Enter}`],
|
||||||
callback: () => onClick(),
|
callback: () => onClick(),
|
||||||
focusId: SIDE_PANEL_FOCUS_ID,
|
focusId: SIDE_PANEL_FOCUS_ID,
|
||||||
scope: AppHotkeyScope.CommandMenuOpen,
|
|
||||||
dependencies: [onClick],
|
dependencies: [onClick],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -7,12 +7,10 @@ import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
|||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { useToggleDropdown } from '@/ui/layout/dropdown/hooks/useToggleDropdown';
|
import { useToggleDropdown } from '@/ui/layout/dropdown/hooks/useToggleDropdown';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { useTheme } from '@emotion/react';
|
import { useTheme } from '@emotion/react';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
@ -39,7 +37,6 @@ export const CommandMenuActionMenuDropdown = () => {
|
|||||||
dropdownComponentInstanceIdFromProps: dropdownId,
|
dropdownComponentInstanceIdFromProps: dropdownId,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
scope: AppHotkeyScope.CommandMenuOpen,
|
|
||||||
dependencies: [toggleDropdown],
|
dependencies: [toggleDropdown],
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -86,7 +83,6 @@ export const CommandMenuActionMenuDropdown = () => {
|
|||||||
selectableListInstanceId={actionMenuId}
|
selectableListInstanceId={actionMenuId}
|
||||||
focusId={dropdownId}
|
focusId={dropdownId}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{recordSelectionActions.map((action) => (
|
{recordSelectionActions.map((action) => (
|
||||||
<ActionComponent action={action} key={action.key} />
|
<ActionComponent action={action} key={action.key} />
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
|
|||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
@ -89,7 +88,6 @@ export const RecordIndexActionMenuDropdown = () => {
|
|||||||
focusId={dropdownId}
|
focusId={dropdownId}
|
||||||
selectableItemIdArray={selectedItemIdArray}
|
selectableItemIdArray={selectedItemIdArray}
|
||||||
selectableListInstanceId={dropdownId}
|
selectableListInstanceId={dropdownId}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{recordIndexActions.map((action) => (
|
{recordIndexActions.map((action) => (
|
||||||
<ActionComponent action={action} key={action.key} />
|
<ActionComponent action={action} key={action.key} />
|
||||||
|
|||||||
@ -13,7 +13,6 @@ import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
|||||||
import { getShowPageTabListComponentId } from '@/ui/layout/show-page/utils/getShowPageTabListComponentId';
|
import { getShowPageTabListComponentId } from '@/ui/layout/show-page/utils/getShowPageTabListComponentId';
|
||||||
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
|
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { useComponentInstanceStateContext } from '@/ui/utilities/state/component-state/hooks/useComponentInstanceStateContext';
|
import { useComponentInstanceStateContext } from '@/ui/utilities/state/component-state/hooks/useComponentInstanceStateContext';
|
||||||
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
@ -123,7 +122,6 @@ export const RecordShowRightDrawerOpenRecordButton = ({
|
|||||||
keys: ['ctrl+Enter,meta+Enter'],
|
keys: ['ctrl+Enter,meta+Enter'],
|
||||||
callback: handleOpenRecord,
|
callback: handleOpenRecord,
|
||||||
focusId: SIDE_PANEL_FOCUS_ID,
|
focusId: SIDE_PANEL_FOCUS_ID,
|
||||||
scope: AppHotkeyScope.CommandMenuOpen,
|
|
||||||
dependencies: [handleOpenRecord],
|
dependencies: [handleOpenRecord],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import { v4 } from 'uuid';
|
|||||||
import { useUploadAttachmentFile } from '@/activities/files/hooks/useUploadAttachmentFile';
|
import { useUploadAttachmentFile } from '@/activities/files/hooks/useUploadAttachmentFile';
|
||||||
import { useUpsertActivity } from '@/activities/hooks/useUpsertActivity';
|
import { useUpsertActivity } from '@/activities/hooks/useUpsertActivity';
|
||||||
import { canCreateActivityState } from '@/activities/states/canCreateActivityState';
|
import { canCreateActivityState } from '@/activities/states/canCreateActivityState';
|
||||||
import { ActivityEditorHotkeyScope } from '@/activities/types/ActivityEditorHotkeyScope';
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
|
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
|
||||||
@ -23,6 +22,7 @@ import { Task } from '@/activities/types/Task';
|
|||||||
import { filterAttachmentsToRestore } from '@/activities/utils/filterAttachmentsToRestore';
|
import { filterAttachmentsToRestore } from '@/activities/utils/filterAttachmentsToRestore';
|
||||||
import { getActivityAttachmentIdsToDelete } from '@/activities/utils/getActivityAttachmentIdsToDelete';
|
import { getActivityAttachmentIdsToDelete } from '@/activities/utils/getActivityAttachmentIdsToDelete';
|
||||||
import { getActivityAttachmentPathsToRestore } from '@/activities/utils/getActivityAttachmentPathsToRestore';
|
import { getActivityAttachmentPathsToRestore } from '@/activities/utils/getActivityAttachmentPathsToRestore';
|
||||||
|
import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
||||||
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
|
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
|
||||||
import { useDeleteManyRecords } from '@/object-record/hooks/useDeleteManyRecords';
|
import { useDeleteManyRecords } from '@/object-record/hooks/useDeleteManyRecords';
|
||||||
import { useLazyFetchAllRecords } from '@/object-record/hooks/useLazyFetchAllRecords';
|
import { useLazyFetchAllRecords } from '@/object-record/hooks/useLazyFetchAllRecords';
|
||||||
@ -307,7 +307,6 @@ export const ActivityRichTextEditor = ({
|
|||||||
editor.domElement?.blur();
|
editor.domElement?.blur();
|
||||||
},
|
},
|
||||||
focusId: activityId,
|
focusId: activityId,
|
||||||
scope: ActivityEditorHotkeyScope.ActivityBody,
|
|
||||||
dependencies: [editor],
|
dependencies: [editor],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -346,8 +345,7 @@ export const ActivityRichTextEditor = ({
|
|||||||
useHotkeysOnFocusedElement({
|
useHotkeysOnFocusedElement({
|
||||||
keys: '*',
|
keys: '*',
|
||||||
callback: handleAllKeys,
|
callback: handleAllKeys,
|
||||||
focusId: activityId,
|
focusId: SIDE_PANEL_FOCUS_ID,
|
||||||
scope: ActivityEditorHotkeyScope.ActivityBody,
|
|
||||||
dependencies: [handleAllKeys],
|
dependencies: [handleAllKeys],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -380,8 +378,8 @@ export const ActivityRichTextEditor = ({
|
|||||||
type: FocusComponentType.ACTIVITY_RICH_TEXT_EDITOR,
|
type: FocusComponentType.ACTIVITY_RICH_TEXT_EDITOR,
|
||||||
},
|
},
|
||||||
focusId: activityId,
|
focusId: activityId,
|
||||||
hotkeyScope: {
|
globalHotkeysConfig: {
|
||||||
scope: ActivityEditorHotkeyScope.ActivityBody,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import { useMultipleRecordPickerPerformSearch } from '@/object-record/record-pic
|
|||||||
import { multipleRecordPickerPickableMorphItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerPickableMorphItemsComponentState';
|
import { multipleRecordPickerPickableMorphItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerPickableMorphItemsComponentState';
|
||||||
import { multipleRecordPickerSearchFilterComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchFilterComponentState';
|
import { multipleRecordPickerSearchFilterComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchFilterComponentState';
|
||||||
import { multipleRecordPickerSearchableObjectMetadataItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchableObjectMetadataItemsComponentState';
|
import { multipleRecordPickerSearchableObjectMetadataItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchableObjectMetadataItemsComponentState';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
@ -95,10 +94,9 @@ export const useOpenActivityTargetCellEditMode = () => {
|
|||||||
type: FocusComponentType.DROPDOWN,
|
type: FocusComponentType.DROPDOWN,
|
||||||
instanceId: recordPickerInstanceId,
|
instanceId: recordPickerInstanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
globalHotkeysConfig: {
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: recordPickerInstanceId,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
|
|||||||
@ -1,4 +0,0 @@
|
|||||||
export enum ActivityEditorHotkeyScope {
|
|
||||||
ActivityTitle = 'activity-title',
|
|
||||||
ActivityBody = 'activity-body',
|
|
||||||
}
|
|
||||||
@ -32,7 +32,6 @@ import { getRecordIndexIdFromObjectNamePluralAndViewId } from '@/object-record/u
|
|||||||
import { AppBasePath } from '@/types/AppBasePath';
|
import { AppBasePath } from '@/types/AppBasePath';
|
||||||
import { AppPath } from '@/types/AppPath';
|
import { AppPath } from '@/types/AppPath';
|
||||||
import { PageFocusId } from '@/types/PageFocusId';
|
import { PageFocusId } from '@/types/PageFocusId';
|
||||||
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
|
|
||||||
import { useResetFocusStackToFocusItem } from '@/ui/utilities/focus/hooks/useResetFocusStackToFocusItem';
|
import { useResetFocusStackToFocusItem } from '@/ui/utilities/focus/hooks/useResetFocusStackToFocusItem';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
@ -153,15 +152,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: true,
|
enableGlobalHotkeysWithModifiers: true,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: true,
|
enableGlobalHotkeysConflictingWithKeyboard: true,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.RecordShowPage,
|
|
||||||
customScopes: {
|
|
||||||
goto: true,
|
|
||||||
keyboardShortcutMenu: true,
|
|
||||||
searchRecords: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -178,10 +168,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.SignInUp,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -198,10 +184,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.InviteTeam,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -218,10 +200,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.CreateProfile,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -238,10 +216,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.CreateWorkspace,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -258,10 +232,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.SyncEmail,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -278,10 +248,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.InviteTeam,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -298,10 +264,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.PlanRequired,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -318,17 +280,6 @@ export const PageChangeEffect = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: PageHotkeyScope.Settings,
|
|
||||||
customScopes: {
|
|
||||||
goto: false,
|
|
||||||
keyboardShortcutMenu: false,
|
|
||||||
commandMenu: false,
|
|
||||||
commandMenuOpen: false,
|
|
||||||
searchRecords: false,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import { COMMAND_MENU_SEARCH_BAR_PADDING } from '@/command-menu/constants/Comman
|
|||||||
import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
||||||
import { hasUserSelectedCommandState } from '@/command-menu/states/hasUserSelectedCommandState';
|
import { hasUserSelectedCommandState } from '@/command-menu/states/hasUserSelectedCommandState';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
|
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useSetRecoilState } from 'recoil';
|
import { useSetRecoilState } from 'recoil';
|
||||||
@ -78,7 +77,6 @@ export const CommandMenuList = ({
|
|||||||
selectableListInstanceId="command-menu-list"
|
selectableListInstanceId="command-menu-list"
|
||||||
focusId={SIDE_PANEL_FOCUS_ID}
|
focusId={SIDE_PANEL_FOCUS_ID}
|
||||||
selectableItemIdArray={selectableItemIds}
|
selectableItemIdArray={selectableItemIds}
|
||||||
hotkeyScope={AppHotkeyScope.CommandMenuOpen}
|
|
||||||
onSelect={() => {
|
onSelect={() => {
|
||||||
setHasUserSelectedCommand(true);
|
setHasUserSelectedCommand(true);
|
||||||
}}
|
}}
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
import { COMMAND_MENU_ANIMATION_VARIANTS } from '@/command-menu/constants/CommandMenuAnimationVariants';
|
import { COMMAND_MENU_ANIMATION_VARIANTS } from '@/command-menu/constants/CommandMenuAnimationVariants';
|
||||||
import { COMMAND_MENU_CLICK_OUTSIDE_ID } from '@/command-menu/constants/CommandMenuClickOutsideId';
|
import { COMMAND_MENU_CLICK_OUTSIDE_ID } from '@/command-menu/constants/CommandMenuClickOutsideId';
|
||||||
|
import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
||||||
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
|
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
|
||||||
import { CommandMenuAnimationVariant } from '@/command-menu/types/CommandMenuAnimationVariant';
|
import { CommandMenuAnimationVariant } from '@/command-menu/types/CommandMenuAnimationVariant';
|
||||||
import { CommandMenuHotkeyScope } from '@/command-menu/types/CommandMenuHotkeyScope';
|
|
||||||
import { RECORD_CHIP_CLICK_OUTSIDE_ID } from '@/object-record/record-table/constants/RecordChipClickOutsideId';
|
import { RECORD_CHIP_CLICK_OUTSIDE_ID } from '@/object-record/record-table/constants/RecordChipClickOutsideId';
|
||||||
import { SLASH_MENU_DROPDOWN_CLICK_OUTSIDE_ID } from '@/ui/input/constants/SlashMenuDropdownClickOutsideId';
|
import { SLASH_MENU_DROPDOWN_CLICK_OUTSIDE_ID } from '@/ui/input/constants/SlashMenuDropdownClickOutsideId';
|
||||||
import { RootStackingContextZIndices } from '@/ui/layout/constants/RootStackingContextZIndices';
|
import { RootStackingContextZIndices } from '@/ui/layout/constants/RootStackingContextZIndices';
|
||||||
import { PAGE_HEADER_COMMAND_MENU_BUTTON_CLICK_OUTSIDE_ID } from '@/ui/layout/page-header/constants/PageHeaderCommandMenuButtonClickOutsideId';
|
import { PAGE_HEADER_COMMAND_MENU_BUTTON_CLICK_OUTSIDE_ID } from '@/ui/layout/page-header/constants/PageHeaderCommandMenuButtonClickOutsideId';
|
||||||
import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState';
|
import { currentFocusIdSelector } from '@/ui/utilities/focus/states/currentFocusIdSelector';
|
||||||
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
|
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
|
||||||
import { WORKFLOW_DIAGRAM_CREATE_STEP_NODE_CLICK_OUTSIDE_ID } from '@/workflow/workflow-diagram/constants/WorkflowDiagramCreateStepNodeClickOutsideId';
|
import { WORKFLOW_DIAGRAM_CREATE_STEP_NODE_CLICK_OUTSIDE_ID } from '@/workflow/workflow-diagram/constants/WorkflowDiagramCreateStepNodeClickOutsideId';
|
||||||
import { WORKFLOW_DIAGRAM_EDGE_OPTIONS_CLICK_OUTSIDE_ID } from '@/workflow/workflow-diagram/constants/WorkflowDiagramEdgeOptionsClickOutsideId';
|
import { WORKFLOW_DIAGRAM_EDGE_OPTIONS_CLICK_OUTSIDE_ID } from '@/workflow/workflow-diagram/constants/WorkflowDiagramEdgeOptionsClickOutsideId';
|
||||||
@ -55,11 +55,11 @@ export const CommandMenuOpenContainer = ({
|
|||||||
const handleClickOutside = useRecoilCallback(
|
const handleClickOutside = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
(event: MouseEvent | TouchEvent) => {
|
(event: MouseEvent | TouchEvent) => {
|
||||||
const hotkeyScope = snapshot
|
const currentFocusId = snapshot
|
||||||
.getLoadable(currentHotkeyScopeState)
|
.getLoadable(currentFocusIdSelector)
|
||||||
.getValue();
|
.getValue();
|
||||||
|
|
||||||
if (hotkeyScope?.scope === CommandMenuHotkeyScope.CommandMenuFocused) {
|
if (currentFocusId === SIDE_PANEL_FOCUS_ID) {
|
||||||
event.stopImmediatePropagation();
|
event.stopImmediatePropagation();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
closeCommandMenu();
|
closeCommandMenu();
|
||||||
|
|||||||
@ -8,18 +8,6 @@ import { commandMenuNavigationStackState } from '@/command-menu/states/commandMe
|
|||||||
import { commandMenuPageInfoState } from '@/command-menu/states/commandMenuPageInfoState';
|
import { commandMenuPageInfoState } from '@/command-menu/states/commandMenuPageInfoState';
|
||||||
import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState';
|
import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState';
|
||||||
import { isCommandMenuOpenedState } from '@/command-menu/states/isCommandMenuOpenedState';
|
import { isCommandMenuOpenedState } from '@/command-menu/states/isCommandMenuOpenedState';
|
||||||
import { CommandMenuHotkeyScope } from '@/command-menu/types/CommandMenuHotkeyScope';
|
|
||||||
|
|
||||||
const mockGoBackToPreviousHotkeyScope = jest.fn();
|
|
||||||
const mockSetHotkeyScopeAndMemorizePreviousScope = jest.fn();
|
|
||||||
|
|
||||||
jest.mock('@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope', () => ({
|
|
||||||
usePreviousHotkeyScope: () => ({
|
|
||||||
goBackToPreviousHotkeyScope: mockGoBackToPreviousHotkeyScope,
|
|
||||||
setHotkeyScopeAndMemorizePreviousScope:
|
|
||||||
mockSetHotkeyScopeAndMemorizePreviousScope,
|
|
||||||
}),
|
|
||||||
}));
|
|
||||||
|
|
||||||
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||||
<RecoilRoot>
|
<RecoilRoot>
|
||||||
@ -71,13 +59,6 @@ describe('useCommandMenu', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(result.current.isCommandMenuOpened).toBe(true);
|
expect(result.current.isCommandMenuOpened).toBe(true);
|
||||||
expect(mockSetHotkeyScopeAndMemorizePreviousScope).toHaveBeenCalledWith({
|
|
||||||
scope: CommandMenuHotkeyScope.CommandMenuFocused,
|
|
||||||
memoizeKey: 'command-menu',
|
|
||||||
customScopes: {
|
|
||||||
commandMenuOpen: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
act(() => {
|
act(() => {
|
||||||
result.current.commandMenu.closeCommandMenu();
|
result.current.commandMenu.closeCommandMenu();
|
||||||
@ -96,13 +77,6 @@ describe('useCommandMenu', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(result.current.isCommandMenuOpened).toBe(true);
|
expect(result.current.isCommandMenuOpened).toBe(true);
|
||||||
expect(mockSetHotkeyScopeAndMemorizePreviousScope).toHaveBeenCalledWith({
|
|
||||||
scope: CommandMenuHotkeyScope.CommandMenuFocused,
|
|
||||||
memoizeKey: 'command-menu',
|
|
||||||
customScopes: {
|
|
||||||
commandMenuOpen: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
act(() => {
|
act(() => {
|
||||||
result.current.commandMenu.toggleCommandMenu();
|
result.current.commandMenu.toggleCommandMenu();
|
||||||
@ -110,21 +84,4 @@ describe('useCommandMenu', () => {
|
|||||||
|
|
||||||
expect(result.current.isCommandMenuOpened).toBe(false);
|
expect(result.current.isCommandMenuOpened).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call goBackToPreviousHotkeyScope when closing the command menu', () => {
|
|
||||||
const { result } = renderHooks();
|
|
||||||
|
|
||||||
act(() => {
|
|
||||||
result.current.commandMenu.openCommandMenu();
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(result.current.isCommandMenuOpened).toBe(true);
|
|
||||||
expect(mockGoBackToPreviousHotkeyScope).not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
act(() => {
|
|
||||||
result.current.commandMenu.closeCommandMenu();
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(mockGoBackToPreviousHotkeyScope).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -6,15 +6,12 @@ import { commandMenuNavigationStackState } from '@/command-menu/states/commandMe
|
|||||||
import { commandMenuPageInfoState } from '@/command-menu/states/commandMenuPageInfoState';
|
import { commandMenuPageInfoState } from '@/command-menu/states/commandMenuPageInfoState';
|
||||||
import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState';
|
import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState';
|
||||||
import { hasUserSelectedCommandState } from '@/command-menu/states/hasUserSelectedCommandState';
|
import { hasUserSelectedCommandState } from '@/command-menu/states/hasUserSelectedCommandState';
|
||||||
import { CommandMenuHotkeyScope } from '@/command-menu/types/CommandMenuHotkeyScope';
|
|
||||||
import { getShowPageTabListComponentId } from '@/ui/layout/show-page/utils/getShowPageTabListComponentId';
|
import { getShowPageTabListComponentId } from '@/ui/layout/show-page/utils/getShowPageTabListComponentId';
|
||||||
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
|
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
|
||||||
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
export const useCommandMenuHistory = () => {
|
export const useCommandMenuHistory = () => {
|
||||||
const { closeCommandMenu } = useCommandMenu();
|
const { closeCommandMenu } = useCommandMenu();
|
||||||
const setHotkeyScope = useSetHotkeyScope();
|
|
||||||
|
|
||||||
const goBackFromCommandMenu = useRecoilCallback(
|
const goBackFromCommandMenu = useRecoilCallback(
|
||||||
({ snapshot, set }) => {
|
({ snapshot, set }) => {
|
||||||
@ -69,78 +66,64 @@ export const useCommandMenuHistory = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
set(hasUserSelectedCommandState, false);
|
set(hasUserSelectedCommandState, false);
|
||||||
|
|
||||||
setHotkeyScope(CommandMenuHotkeyScope.CommandMenuFocused, {
|
|
||||||
commandMenuOpen: true,
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
[closeCommandMenu, setHotkeyScope],
|
[closeCommandMenu],
|
||||||
);
|
);
|
||||||
|
|
||||||
const navigateCommandMenuHistory = useRecoilCallback(
|
const navigateCommandMenuHistory = useRecoilCallback(({ snapshot, set }) => {
|
||||||
({ snapshot, set }) => {
|
return (pageIndex: number) => {
|
||||||
return (pageIndex: number) => {
|
const currentNavigationStack = snapshot
|
||||||
const currentNavigationStack = snapshot
|
.getLoadable(commandMenuNavigationStackState)
|
||||||
.getLoadable(commandMenuNavigationStackState)
|
.getValue();
|
||||||
.getValue();
|
|
||||||
|
|
||||||
const newNavigationStack = currentNavigationStack.slice(
|
const newNavigationStack = currentNavigationStack.slice(0, pageIndex + 1);
|
||||||
0,
|
|
||||||
pageIndex + 1,
|
set(commandMenuNavigationStackState, newNavigationStack);
|
||||||
|
|
||||||
|
const newNavigationStackItem = newNavigationStack.at(-1);
|
||||||
|
|
||||||
|
if (!isDefined(newNavigationStackItem)) {
|
||||||
|
throw new Error(
|
||||||
|
`No command menu navigation stack item found for index ${pageIndex}`,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
set(commandMenuNavigationStackState, newNavigationStack);
|
set(commandMenuPageState, newNavigationStackItem.page);
|
||||||
|
set(commandMenuPageInfoState, {
|
||||||
|
title: newNavigationStackItem.pageTitle,
|
||||||
|
Icon: newNavigationStackItem.pageIcon,
|
||||||
|
instanceId: newNavigationStackItem.pageId,
|
||||||
|
});
|
||||||
|
const currentMorphItems = snapshot
|
||||||
|
.getLoadable(commandMenuNavigationMorphItemByPageState)
|
||||||
|
.getValue();
|
||||||
|
|
||||||
const newNavigationStackItem = newNavigationStack.at(-1);
|
for (const [pageId, morphItem] of currentMorphItems.entries()) {
|
||||||
|
if (!newNavigationStack.some((item) => item.pageId === pageId)) {
|
||||||
if (!isDefined(newNavigationStackItem)) {
|
set(
|
||||||
throw new Error(
|
activeTabIdComponentState.atomFamily({
|
||||||
`No command menu navigation stack item found for index ${pageIndex}`,
|
instanceId: getShowPageTabListComponentId({
|
||||||
|
pageId,
|
||||||
|
targetObjectId: morphItem.recordId,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
null,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
set(commandMenuPageState, newNavigationStackItem.page);
|
const newMorphItems = new Map(
|
||||||
set(commandMenuPageInfoState, {
|
Array.from(currentMorphItems.entries()).filter(([pageId]) =>
|
||||||
title: newNavigationStackItem.pageTitle,
|
newNavigationStack.some((item) => item.pageId === pageId),
|
||||||
Icon: newNavigationStackItem.pageIcon,
|
),
|
||||||
instanceId: newNavigationStackItem.pageId,
|
);
|
||||||
});
|
|
||||||
const currentMorphItems = snapshot
|
|
||||||
.getLoadable(commandMenuNavigationMorphItemByPageState)
|
|
||||||
.getValue();
|
|
||||||
|
|
||||||
for (const [pageId, morphItem] of currentMorphItems.entries()) {
|
set(commandMenuNavigationMorphItemByPageState, newMorphItems);
|
||||||
if (!newNavigationStack.some((item) => item.pageId === pageId)) {
|
|
||||||
set(
|
|
||||||
activeTabIdComponentState.atomFamily({
|
|
||||||
instanceId: getShowPageTabListComponentId({
|
|
||||||
pageId,
|
|
||||||
targetObjectId: morphItem.recordId,
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
null,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const newMorphItems = new Map(
|
set(hasUserSelectedCommandState, false);
|
||||||
Array.from(currentMorphItems.entries()).filter(([pageId]) =>
|
};
|
||||||
newNavigationStack.some((item) => item.pageId === pageId),
|
}, []);
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
set(commandMenuNavigationMorphItemByPageState, newMorphItems);
|
|
||||||
|
|
||||||
set(hasUserSelectedCommandState, false);
|
|
||||||
|
|
||||||
setHotkeyScope(CommandMenuHotkeyScope.CommandMenuFocused, {
|
|
||||||
commandMenuOpen: true,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
},
|
|
||||||
[setHotkeyScope],
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
goBackFromCommandMenu,
|
goBackFromCommandMenu,
|
||||||
|
|||||||
@ -1,16 +1,16 @@
|
|||||||
import { COMMAND_MENU_COMPONENT_INSTANCE_ID } from '@/command-menu/constants/CommandMenuComponentInstanceId';
|
import { COMMAND_MENU_COMPONENT_INSTANCE_ID } from '@/command-menu/constants/CommandMenuComponentInstanceId';
|
||||||
|
import { SIDE_PANEL_FOCUS_ID } from '@/command-menu/constants/SidePanelFocusId';
|
||||||
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
|
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
|
||||||
import { useCommandMenuHistory } from '@/command-menu/hooks/useCommandMenuHistory';
|
import { useCommandMenuHistory } from '@/command-menu/hooks/useCommandMenuHistory';
|
||||||
import { useOpenRecordsSearchPageInCommandMenu } from '@/command-menu/hooks/useOpenRecordsSearchPageInCommandMenu';
|
import { useOpenRecordsSearchPageInCommandMenu } from '@/command-menu/hooks/useOpenRecordsSearchPageInCommandMenu';
|
||||||
import { useSetGlobalCommandMenuContext } from '@/command-menu/hooks/useSetGlobalCommandMenuContext';
|
import { useSetGlobalCommandMenuContext } from '@/command-menu/hooks/useSetGlobalCommandMenuContext';
|
||||||
import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState';
|
import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState';
|
||||||
import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState';
|
import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState';
|
||||||
import { CommandMenuHotkeyScope } from '@/command-menu/types/CommandMenuHotkeyScope';
|
|
||||||
import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages';
|
import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages';
|
||||||
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
||||||
import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu';
|
import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu';
|
||||||
import { useGlobalHotkeys } from '@/ui/utilities/hotkey/hooks/useGlobalHotkeys';
|
import { useGlobalHotkeys } from '@/ui/utilities/hotkey/hooks/useGlobalHotkeys';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { isNonEmptyString } from '@sniptt/guards';
|
import { isNonEmptyString } from '@sniptt/guards';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
@ -43,7 +43,6 @@ export const useCommandMenuHotKeys = () => {
|
|||||||
toggleCommandMenu();
|
toggleCommandMenu();
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
AppHotkeyScope.CommandMenu,
|
|
||||||
[closeKeyboardShortcutMenu, toggleCommandMenu],
|
[closeKeyboardShortcutMenu, toggleCommandMenu],
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -53,26 +52,24 @@ export const useCommandMenuHotKeys = () => {
|
|||||||
openRecordsSearchPage();
|
openRecordsSearchPage();
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
AppHotkeyScope.SearchRecords,
|
|
||||||
[openRecordsSearchPage],
|
[openRecordsSearchPage],
|
||||||
{
|
{
|
||||||
ignoreModifiers: true,
|
ignoreModifiers: true,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
useGlobalHotkeys(
|
useHotkeysOnFocusedElement({
|
||||||
[Key.Escape],
|
keys: [Key.Escape],
|
||||||
() => {
|
callback: () => {
|
||||||
goBackFromCommandMenu();
|
goBackFromCommandMenu();
|
||||||
},
|
},
|
||||||
true,
|
focusId: SIDE_PANEL_FOCUS_ID,
|
||||||
CommandMenuHotkeyScope.CommandMenuFocused,
|
dependencies: [goBackFromCommandMenu],
|
||||||
[goBackFromCommandMenu],
|
});
|
||||||
);
|
|
||||||
|
|
||||||
useGlobalHotkeys(
|
useHotkeysOnFocusedElement({
|
||||||
[Key.Backspace, Key.Delete],
|
keys: [Key.Backspace, Key.Delete],
|
||||||
() => {
|
callback: () => {
|
||||||
if (isNonEmptyString(commandMenuSearch)) {
|
if (isNonEmptyString(commandMenuSearch)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -91,17 +88,13 @@ export const useCommandMenuHotKeys = () => {
|
|||||||
goBackFromCommandMenu();
|
goBackFromCommandMenu();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
true,
|
focusId: SIDE_PANEL_FOCUS_ID,
|
||||||
CommandMenuHotkeyScope.CommandMenuFocused,
|
dependencies: [
|
||||||
[
|
|
||||||
commandMenuPage,
|
commandMenuPage,
|
||||||
commandMenuSearch,
|
commandMenuSearch,
|
||||||
contextStoreTargetedRecordsRuleComponent,
|
contextStoreTargetedRecordsRuleComponent,
|
||||||
goBackFromCommandMenu,
|
goBackFromCommandMenu,
|
||||||
setGlobalCommandMenuContext,
|
setGlobalCommandMenuContext,
|
||||||
],
|
],
|
||||||
{
|
});
|
||||||
preventDefault: false,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import { commandMenuPageState } from '@/command-menu/states/commandMenuPageState
|
|||||||
import { hasUserSelectedCommandState } from '@/command-menu/states/hasUserSelectedCommandState';
|
import { hasUserSelectedCommandState } from '@/command-menu/states/hasUserSelectedCommandState';
|
||||||
import { isCommandMenuClosingState } from '@/command-menu/states/isCommandMenuClosingState';
|
import { isCommandMenuClosingState } from '@/command-menu/states/isCommandMenuClosingState';
|
||||||
import { isCommandMenuOpenedState } from '@/command-menu/states/isCommandMenuOpenedState';
|
import { isCommandMenuOpenedState } from '@/command-menu/states/isCommandMenuOpenedState';
|
||||||
import { CommandMenuHotkeyScope } from '@/command-menu/types/CommandMenuHotkeyScope';
|
|
||||||
import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages';
|
import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages';
|
||||||
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
|
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
|
||||||
import { isDragSelectionStartEnabledState } from '@/ui/utilities/drag-select/states/internal/isDragSelectionStartEnabledState';
|
import { isDragSelectionStartEnabledState } from '@/ui/utilities/drag-select/states/internal/isDragSelectionStartEnabledState';
|
||||||
@ -61,13 +60,9 @@ export const useNavigateCommandMenu = () => {
|
|||||||
type: FocusComponentType.SIDE_PANEL,
|
type: FocusComponentType.SIDE_PANEL,
|
||||||
instanceId: COMMAND_MENU_COMPONENT_INSTANCE_ID,
|
instanceId: COMMAND_MENU_COMPONENT_INSTANCE_ID,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
globalHotkeysConfig: {
|
||||||
scope: CommandMenuHotkeyScope.CommandMenuFocused,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
customScopes: {
|
|
||||||
commandMenuOpen: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
memoizeKey: COMMAND_MENU_COMPONENT_INSTANCE_ID,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
copyContextStoreStates({
|
copyContextStoreStates({
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
export enum CommandMenuHotkeyScope {
|
|
||||||
CommandMenuFocused = 'command-menu-focused',
|
|
||||||
}
|
|
||||||
@ -159,7 +159,6 @@ export const CurrentWorkspaceMemberFavorites = ({
|
|||||||
onSubmit={handleSubmitRename}
|
onSubmit={handleSubmitRename}
|
||||||
onCancel={handleCancelRename}
|
onCancel={handleCancelRename}
|
||||||
onClickOutside={handleClickOutside}
|
onClickOutside={handleClickOutside}
|
||||||
hotkeyScope="favorites-folder-input"
|
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<FavoritesDroppable droppableId={`folder-header-${folder.folderId}`}>
|
<FavoritesDroppable droppableId={`folder-header-${folder.folderId}`}>
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { CurrentWorkspaceMemberFavorites } from '@/favorites/components/CurrentWorkspaceMemberFavorites';
|
import { CurrentWorkspaceMemberFavorites } from '@/favorites/components/CurrentWorkspaceMemberFavorites';
|
||||||
import { FavoriteFolderHotkeyScope } from '@/favorites/constants/FavoriteFolderRightIconDropdownHotkeyScope';
|
|
||||||
import { useCreateFavoriteFolder } from '@/favorites/hooks/useCreateFavoriteFolder';
|
import { useCreateFavoriteFolder } from '@/favorites/hooks/useCreateFavoriteFolder';
|
||||||
import { useFavoritesByFolder } from '@/favorites/hooks/useFavoritesByFolder';
|
import { useFavoritesByFolder } from '@/favorites/hooks/useFavoritesByFolder';
|
||||||
import { isFavoriteFolderCreatingState } from '@/favorites/states/isFavoriteFolderCreatingState';
|
import { isFavoriteFolderCreatingState } from '@/favorites/states/isFavoriteFolderCreatingState';
|
||||||
@ -71,9 +70,6 @@ export const FavoriteFolders = ({
|
|||||||
onSubmit={handleSubmitFavoriteFolderCreation}
|
onSubmit={handleSubmitFavoriteFolderCreation}
|
||||||
onCancel={handleCancelFavoriteFolderCreation}
|
onCancel={handleCancelFavoriteFolderCreation}
|
||||||
onClickOutside={handleClickOutside}
|
onClickOutside={handleClickOutside}
|
||||||
hotkeyScope={
|
|
||||||
FavoriteFolderHotkeyScope.FavoriteFolderNavigationInput
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</NavigationDrawerAnimatedCollapseWrapper>
|
</NavigationDrawerAnimatedCollapseWrapper>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -1,4 +0,0 @@
|
|||||||
export enum FavoriteFolderHotkeyScope {
|
|
||||||
FavoriteFolderRightIconDropdown = 'favorite-folder-right-icon-dropdown',
|
|
||||||
FavoriteFolderNavigationInput = 'favorite-folder-navigation-input',
|
|
||||||
}
|
|
||||||
@ -9,7 +9,6 @@ import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
|||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
||||||
@ -68,7 +67,6 @@ export const FavoriteFolderPicker = ({
|
|||||||
onSubmit?.();
|
onSubmit?.();
|
||||||
},
|
},
|
||||||
focusId: dropdownId,
|
focusId: dropdownId,
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
|
||||||
dependencies: [onSubmit, isFavoriteFolderCreating],
|
dependencies: [onSubmit, isFavoriteFolderCreating],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -88,7 +86,6 @@ export const FavoriteFolderPicker = ({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
focusId: instanceId,
|
focusId: instanceId,
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
|
||||||
dependencies: [
|
dependencies: [
|
||||||
filteredFolders,
|
filteredFolders,
|
||||||
showNoFolderOption,
|
showNoFolderOption,
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
|
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
|
|
||||||
import { useKeyboardShortcutMenu } from '../hooks/useKeyboardShortcutMenu';
|
import { useKeyboardShortcutMenu } from '../hooks/useKeyboardShortcutMenu';
|
||||||
import { isKeyboardShortcutMenuOpenedState } from '../states/isKeyboardShortcutMenuOpenedState';
|
import { isKeyboardShortcutMenuOpenedState } from '../states/isKeyboardShortcutMenuOpenedState';
|
||||||
@ -23,7 +22,6 @@ export const KeyboardShortcutMenu = () => {
|
|||||||
toggleKeyboardShortcutMenu();
|
toggleKeyboardShortcutMenu();
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
AppHotkeyScope.KeyboardShortcutMenu,
|
|
||||||
[toggleKeyboardShortcutMenu],
|
[toggleKeyboardShortcutMenu],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import { Key } from 'ts-key-enum';
|
|||||||
|
|
||||||
import { KEYBOARD_SHORTCUTS_GENERAL } from '@/keyboard-shortcut-menu/constants/KeyboardShortcutsGeneral';
|
import { KEYBOARD_SHORTCUTS_GENERAL } from '@/keyboard-shortcut-menu/constants/KeyboardShortcutsGeneral';
|
||||||
import { KEYBOARD_SHORTCUTS_TABLE } from '@/keyboard-shortcut-menu/constants/KeyboardShortcutsTable';
|
import { KEYBOARD_SHORTCUTS_TABLE } from '@/keyboard-shortcut-menu/constants/KeyboardShortcutsTable';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
KEYBOARD_SHORTCUT_MENU_INSTANCE_ID,
|
KEYBOARD_SHORTCUT_MENU_INSTANCE_ID,
|
||||||
@ -24,7 +23,6 @@ export const KeyboardShortcutMenuOpenContent = () => {
|
|||||||
closeKeyboardShortcutMenu();
|
closeKeyboardShortcutMenu();
|
||||||
},
|
},
|
||||||
focusId: KEYBOARD_SHORTCUT_MENU_INSTANCE_ID,
|
focusId: KEYBOARD_SHORTCUT_MENU_INSTANCE_ID,
|
||||||
scope: AppHotkeyScope.KeyboardShortcutMenuOpen,
|
|
||||||
dependencies: [closeKeyboardShortcutMenu],
|
dependencies: [closeKeyboardShortcutMenu],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import { act } from 'react';
|
|||||||
import { RecoilRoot, useRecoilValue } from 'recoil';
|
import { RecoilRoot, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { isKeyboardShortcutMenuOpenedState } from '@/keyboard-shortcut-menu/states/isKeyboardShortcutMenuOpenedState';
|
import { isKeyboardShortcutMenuOpenedState } from '@/keyboard-shortcut-menu/states/isKeyboardShortcutMenuOpenedState';
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
|
|
||||||
import { useKeyboardShortcutMenu } from '../useKeyboardShortcutMenu';
|
import { useKeyboardShortcutMenu } from '../useKeyboardShortcutMenu';
|
||||||
|
|
||||||
@ -68,9 +67,6 @@ describe('useKeyboardShortcutMenu', () => {
|
|||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
|
||||||
scope: AppHotkeyScope.KeyboardShortcutMenuOpen,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
expect(result.current.isKeyboardShortcutMenuOpened).toBe(true);
|
expect(result.current.isKeyboardShortcutMenuOpened).toBe(true);
|
||||||
|
|
||||||
@ -100,9 +96,6 @@ describe('useKeyboardShortcutMenu', () => {
|
|||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
|
||||||
scope: AppHotkeyScope.KeyboardShortcutMenuOpen,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
expect(result.current.isKeyboardShortcutMenuOpened).toBe(true);
|
expect(result.current.isKeyboardShortcutMenuOpened).toBe(true);
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
|
|
||||||
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -28,9 +26,6 @@ export const useKeyboardShortcutMenu = () => {
|
|||||||
enableGlobalHotkeysConflictingWithKeyboard: false,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
enableGlobalHotkeysWithModifiers: false,
|
enableGlobalHotkeysWithModifiers: false,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
|
||||||
scope: AppHotkeyScope.KeyboardShortcutMenuOpen,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[pushFocusItemToFocusStack],
|
[pushFocusItemToFocusStack],
|
||||||
|
|||||||
@ -23,7 +23,6 @@ import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/uti
|
|||||||
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
|
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
|
||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuSectionLabel } from '@/ui/layout/dropdown/components/DropdownMenuSectionLabel';
|
import { DropdownMenuSectionLabel } from '@/ui/layout/dropdown/components/DropdownMenuSectionLabel';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
||||||
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
@ -148,7 +147,6 @@ export const AdvancedFilterFieldSelectMenu = ({
|
|||||||
focusId={advancedFilterFieldSelectDropdownId}
|
focusId={advancedFilterFieldSelectDropdownId}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
selectableListInstanceId={advancedFilterFieldSelectDropdownId}
|
selectableListInstanceId={advancedFilterFieldSelectDropdownId}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{shouldShowVisibleFields && (
|
{shouldShowVisibleFields && (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import { SelectControl } from '@/ui/input/components/SelectControl';
|
|||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
||||||
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
@ -69,7 +68,6 @@ export const AdvancedFilterRecordFilterOperandSelectContent = ({
|
|||||||
(operand) => operand,
|
(operand) => operand,
|
||||||
)}
|
)}
|
||||||
selectableListInstanceId={dropdownId}
|
selectableListInstanceId={dropdownId}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{operandsForFilterType.map((filterOperand, index) => (
|
{operandsForFilterType.map((filterOperand, index) => (
|
||||||
<SelectableListItem
|
<SelectableListItem
|
||||||
|
|||||||
@ -18,7 +18,6 @@ import { CompositeFieldSubFieldName } from '@/settings/data-model/types/Composit
|
|||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader';
|
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader';
|
||||||
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
@ -130,7 +129,6 @@ export const AdvancedFilterSubFieldSelectMenu = ({
|
|||||||
focusId={advancedFilterFieldSelectDropdownId}
|
focusId={advancedFilterFieldSelectDropdownId}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
selectableListInstanceId={advancedFilterFieldSelectDropdownId}
|
selectableListInstanceId={advancedFilterFieldSelectDropdownId}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{compositeFieldTypeIsFilterableByAnySubField && (
|
{compositeFieldTypeIsFilterableByAnySubField && (
|
||||||
<SelectableListItem
|
<SelectableListItem
|
||||||
|
|||||||
@ -14,7 +14,6 @@ import { getDefaultSubFieldNameForCompositeFilterableFieldType } from '@/object-
|
|||||||
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
|
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
|
||||||
import { isCompositeTypeNonFilterableByAnySubField } from '@/object-record/record-filter/utils/isCompositeTypeNonFilterableByAnySubField';
|
import { isCompositeTypeNonFilterableByAnySubField } from '@/object-record/record-filter/utils/isCompositeTypeNonFilterableByAnySubField';
|
||||||
import { CompositeFieldSubFieldName } from '@/settings/data-model/types/CompositeFieldSubFieldName';
|
import { CompositeFieldSubFieldName } from '@/settings/data-model/types/CompositeFieldSubFieldName';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
@ -82,10 +81,6 @@ export const useSelectFieldUsedInAdvancedFilterDropdown = () => {
|
|||||||
type: FocusComponentType.DROPDOWN,
|
type: FocusComponentType.DROPDOWN,
|
||||||
instanceId: fieldMetadataItem.id,
|
instanceId: fieldMetadataItem.id,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
|
||||||
},
|
|
||||||
memoizeKey: fieldMetadataItem.id,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import { useObjectFilterDropdownFilterValue } from '@/object-record/object-filte
|
|||||||
import { BooleanDisplay } from '@/ui/field/display/components/BooleanDisplay';
|
import { BooleanDisplay } from '@/ui/field/display/components/BooleanDisplay';
|
||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
||||||
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
@ -58,7 +57,6 @@ export const ObjectFilterDropdownBooleanSelect = () => {
|
|||||||
selectableListInstanceId="boolean-select"
|
selectableListInstanceId="boolean-select"
|
||||||
selectableItemIdArray={options.map((option) => option.toString())}
|
selectableItemIdArray={options.map((option) => option.toString())}
|
||||||
focusId="boolean-select"
|
focusId="boolean-select"
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
<DropdownMenuItemsContainer hasMaxHeight>
|
<DropdownMenuItemsContainer hasMaxHeight>
|
||||||
{options.map((option) => (
|
{options.map((option) => (
|
||||||
|
|||||||
@ -13,7 +13,6 @@ import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/ob
|
|||||||
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
|
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
|
||||||
import { objectFilterDropdownCurrentRecordFilterComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownCurrentRecordFilterComponentState';
|
import { objectFilterDropdownCurrentRecordFilterComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownCurrentRecordFilterComponentState';
|
||||||
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
||||||
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
@ -103,7 +102,6 @@ export const ObjectFilterDropdownOptionSelect = ({
|
|||||||
resetSelectedItem();
|
resetSelectedItem();
|
||||||
},
|
},
|
||||||
focusId,
|
focusId,
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
|
||||||
dependencies: [closeDropdown, resetSelectedItem],
|
dependencies: [closeDropdown, resetSelectedItem],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -154,7 +152,6 @@ export const ObjectFilterDropdownOptionSelect = ({
|
|||||||
selectableListInstanceId={componentInstanceId}
|
selectableListInstanceId={componentInstanceId}
|
||||||
selectableItemIdArray={objectRecordsIds}
|
selectableItemIdArray={objectRecordsIds}
|
||||||
focusId={focusId}
|
focusId={focusId}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
<DropdownMenuItemsContainer hasMaxHeight>
|
<DropdownMenuItemsContainer hasMaxHeight>
|
||||||
{showNoResult ? (
|
{showNoResult ? (
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenu
|
|||||||
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
@ -110,7 +109,6 @@ export const ObjectOptionsDropdownLayoutContent = () => {
|
|||||||
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
<DropdownMenuItemsContainer scrollable={false}>
|
<DropdownMenuItemsContainer scrollable={false}>
|
||||||
<SelectableListItem
|
<SelectableListItem
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent
|
|||||||
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader';
|
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader';
|
||||||
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
||||||
@ -61,7 +60,6 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => {
|
|||||||
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
<SelectableListItem
|
<SelectableListItem
|
||||||
itemId={ViewOpenRecordInType.SIDE_PANEL}
|
itemId={ViewOpenRecordInType.SIDE_PANEL}
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
|||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
||||||
@ -91,7 +90,6 @@ export const ObjectOptionsDropdownMenuContent = () => {
|
|||||||
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
<DropdownMenuItemsContainer scrollable={false}>
|
<DropdownMenuItemsContainer scrollable={false}>
|
||||||
<SelectableListItem
|
<SelectableListItem
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import { useUpdateObjectViewOptions } from '@/object-record/object-options-dropd
|
|||||||
import { IconPicker } from '@/ui/input/components/IconPicker';
|
import { IconPicker } from '@/ui/input/components/IconPicker';
|
||||||
import { TextInputV2 } from '@/ui/input/components/TextInputV2';
|
import { TextInputV2 } from '@/ui/input/components/TextInputV2';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
@ -86,7 +85,6 @@ export const ObjectOptionsDropdownMenuViewName = ({
|
|||||||
await updateViewFromCurrentState();
|
await updateViewFromCurrentState();
|
||||||
},
|
},
|
||||||
focusId: VIEW_PICKER_DROPDOWN_ID,
|
focusId: VIEW_PICKER_DROPDOWN_ID,
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
|
||||||
dependencies: [viewPickerIsPersisting, updateViewFromCurrentState],
|
dependencies: [viewPickerIsPersisting, updateViewFromCurrentState],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent
|
|||||||
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader';
|
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader';
|
||||||
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
||||||
@ -75,7 +74,6 @@ export const ObjectOptionsDropdownRecordGroupSortContent = () => {
|
|||||||
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
<SelectableListItem
|
<SelectableListItem
|
||||||
itemId={RecordGroupSort.Manual}
|
itemId={RecordGroupSort.Manual}
|
||||||
|
|||||||
@ -14,7 +14,6 @@ import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenu
|
|||||||
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
||||||
@ -113,7 +112,6 @@ export const ObjectOptionsDropdownRecordGroupsContent = () => {
|
|||||||
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
selectableListInstanceId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
focusId={OBJECT_OPTIONS_DROPDOWN_ID}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{currentView?.key !== 'INDEX' && (
|
{currentView?.key !== 'INDEX' && (
|
||||||
<>
|
<>
|
||||||
@ -181,7 +179,6 @@ export const ObjectOptionsDropdownRecordGroupsContent = () => {
|
|||||||
selectableListInstanceId={hiddenGroupsSelectableListId}
|
selectableListInstanceId={hiddenGroupsSelectableListId}
|
||||||
focusId={hiddenGroupsSelectableListId}
|
focusId={hiddenGroupsSelectableListId}
|
||||||
selectableItemIdArray={['HiddenGroups']}
|
selectableItemIdArray={['HiddenGroups']}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
<SelectableListItem
|
<SelectableListItem
|
||||||
itemId="HiddenGroups"
|
itemId="HiddenGroups"
|
||||||
|
|||||||
@ -24,13 +24,11 @@ import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/Drop
|
|||||||
import { DropdownMenuSectionLabel } from '@/ui/layout/dropdown/components/DropdownMenuSectionLabel';
|
import { DropdownMenuSectionLabel } from '@/ui/layout/dropdown/components/DropdownMenuSectionLabel';
|
||||||
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator';
|
||||||
import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton';
|
import { StyledHeaderDropdownButton } from '@/ui/layout/dropdown/components/StyledHeaderDropdownButton';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
||||||
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
|
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states/selectedItemIdComponentState';
|
||||||
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
|
||||||
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
@ -82,10 +80,6 @@ const StyledDropdownMenuHeaderEndComponent = styled.div`
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export type ObjectSortDropdownButtonProps = {
|
|
||||||
hotkeyScope: HotkeyScope;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const ObjectSortDropdownButton = () => {
|
export const ObjectSortDropdownButton = () => {
|
||||||
const { resetRecordSortDropdownSearchInput } =
|
const { resetRecordSortDropdownSearchInput } =
|
||||||
useResetRecordSortDropdownSearchInput();
|
useResetRecordSortDropdownSearchInput();
|
||||||
@ -237,7 +231,6 @@ export const ObjectSortDropdownButton = () => {
|
|||||||
selectableListInstanceId={OBJECT_SORT_DROPDOWN_ID}
|
selectableListInstanceId={OBJECT_SORT_DROPDOWN_ID}
|
||||||
selectableItemIdArray={selectableItemIdArray}
|
selectableItemIdArray={selectableItemIdArray}
|
||||||
focusId={OBJECT_SORT_DROPDOWN_ID}
|
focusId={OBJECT_SORT_DROPDOWN_ID}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{isRecordSortDirectionMenuUnfolded && (
|
{isRecordSortDirectionMenuUnfolded && (
|
||||||
<StyledSelectedSortDirectionContainer>
|
<StyledSelectedSortDirectionContainer>
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import { useFocusedRecordBoardCard } from '@/object-record/record-board/hooks/us
|
|||||||
import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection';
|
import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection';
|
||||||
import { recordBoardSelectedRecordIdsComponentSelector } from '@/object-record/record-board/states/selectors/recordBoardSelectedRecordIdsComponentSelector';
|
import { recordBoardSelectedRecordIdsComponentSelector } from '@/object-record/record-board/states/selectors/recordBoardSelectedRecordIdsComponentSelector';
|
||||||
import { useResetFocusStackToRecordIndex } from '@/object-record/record-index/hooks/useResetFocusStackToRecordIndex';
|
import { useResetFocusStackToRecordIndex } from '@/object-record/record-index/hooks/useResetFocusStackToRecordIndex';
|
||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
import { PageFocusId } from '@/types/PageFocusId';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|
||||||
@ -35,8 +35,7 @@ export const RecordBoardBodyEscapeHotkeyEffect = () => {
|
|||||||
useHotkeysOnFocusedElement({
|
useHotkeysOnFocusedElement({
|
||||||
keys: [Key.Escape],
|
keys: [Key.Escape],
|
||||||
callback: handleEscape,
|
callback: handleEscape,
|
||||||
focusId: recordBoardId,
|
focusId: PageFocusId.RecordIndex,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [handleEscape],
|
dependencies: [handleEscape],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import { Key } from 'ts-key-enum';
|
|||||||
import { RecordBoardContext } from '@/object-record/record-board/contexts/RecordBoardContext';
|
import { RecordBoardContext } from '@/object-record/record-board/contexts/RecordBoardContext';
|
||||||
import { useRecordBoardCardNavigation } from '@/object-record/record-board/hooks/useRecordBoardCardNavigation';
|
import { useRecordBoardCardNavigation } from '@/object-record/record-board/hooks/useRecordBoardCardNavigation';
|
||||||
import { useRecordBoardSelectAllHotkeys } from '@/object-record/record-board/hooks/useRecordBoardSelectAllHotkeys';
|
import { useRecordBoardSelectAllHotkeys } from '@/object-record/record-board/hooks/useRecordBoardSelectAllHotkeys';
|
||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
|
||||||
import { PageFocusId } from '@/types/PageFocusId';
|
import { PageFocusId } from '@/types/PageFocusId';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
|
|
||||||
@ -19,13 +18,12 @@ export const RecordBoardHotkeyEffect = () => {
|
|||||||
move('down');
|
move('down');
|
||||||
},
|
},
|
||||||
focusId: PageFocusId.RecordIndex,
|
focusId: PageFocusId.RecordIndex,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [move],
|
dependencies: [move],
|
||||||
});
|
});
|
||||||
|
|
||||||
useRecordBoardSelectAllHotkeys({
|
useRecordBoardSelectAllHotkeys({
|
||||||
recordBoardId,
|
recordBoardId,
|
||||||
focusId: recordBoardId,
|
focusId: PageFocusId.RecordIndex,
|
||||||
});
|
});
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import { focusedRecordBoardCardIndexesComponentState } from '@/object-record/rec
|
|||||||
import { isRecordBoardCardFocusActiveComponentState } from '@/object-record/record-board/states/isRecordBoardCardFocusActiveComponentState';
|
import { isRecordBoardCardFocusActiveComponentState } from '@/object-record/record-board/states/isRecordBoardCardFocusActiveComponentState';
|
||||||
import { isRecordBoardCardFocusedComponentFamilyState } from '@/object-record/record-board/states/isRecordBoardCardFocusedComponentFamilyState';
|
import { isRecordBoardCardFocusedComponentFamilyState } from '@/object-record/record-board/states/isRecordBoardCardFocusedComponentFamilyState';
|
||||||
import { BoardCardIndexes } from '@/object-record/record-board/types/BoardCardIndexes';
|
import { BoardCardIndexes } from '@/object-record/record-board/types/BoardCardIndexes';
|
||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -100,15 +99,6 @@ export const useFocusedRecordBoardCard = (recordBoardId?: string) => {
|
|||||||
type: FocusComponentType.RECORD_BOARD_CARD,
|
type: FocusComponentType.RECORD_BOARD_CARD,
|
||||||
instanceId: focusId,
|
instanceId: focusId,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
customScopes: {
|
|
||||||
goto: true,
|
|
||||||
keyboardShortcutMenu: true,
|
|
||||||
searchRecords: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
memoizeKey: focusId,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
set(focusedBoardCardIndexesState, boardCardIndexes);
|
set(focusedBoardCardIndexesState, boardCardIndexes);
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { useRecordBoardCardNavigation } from '@/object-record/record-board/hooks/useRecordBoardCardNavigation';
|
import { useRecordBoardCardNavigation } from '@/object-record/record-board/hooks/useRecordBoardCardNavigation';
|
||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { Key } from 'ts-key-enum';
|
import { Key } from 'ts-key-enum';
|
||||||
|
|
||||||
@ -16,7 +15,6 @@ export const useRecordBoardArrowKeysEffect = ({
|
|||||||
keys: [Key.ArrowLeft],
|
keys: [Key.ArrowLeft],
|
||||||
callback: () => move('left'),
|
callback: () => move('left'),
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [move],
|
dependencies: [move],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -24,7 +22,6 @@ export const useRecordBoardArrowKeysEffect = ({
|
|||||||
keys: [Key.ArrowRight],
|
keys: [Key.ArrowRight],
|
||||||
callback: () => move('right'),
|
callback: () => move('right'),
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [move],
|
dependencies: [move],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -32,7 +29,6 @@ export const useRecordBoardArrowKeysEffect = ({
|
|||||||
keys: [Key.ArrowUp],
|
keys: [Key.ArrowUp],
|
||||||
callback: () => move('up'),
|
callback: () => move('up'),
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [move],
|
dependencies: [move],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -40,7 +36,6 @@ export const useRecordBoardArrowKeysEffect = ({
|
|||||||
keys: [Key.ArrowDown],
|
keys: [Key.ArrowDown],
|
||||||
callback: () => move('down'),
|
callback: () => move('down'),
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [move],
|
dependencies: [move],
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -2,11 +2,11 @@ import { useOpenRecordInCommandMenu } from '@/command-menu/hooks/useOpenRecordIn
|
|||||||
import { RecordBoardContext } from '@/object-record/record-board/contexts/RecordBoardContext';
|
import { RecordBoardContext } from '@/object-record/record-board/contexts/RecordBoardContext';
|
||||||
import { useActiveRecordBoardCard } from '@/object-record/record-board/hooks/useActiveRecordBoardCard';
|
import { useActiveRecordBoardCard } from '@/object-record/record-board/hooks/useActiveRecordBoardCard';
|
||||||
import { useFocusedRecordBoardCard } from '@/object-record/record-board/hooks/useFocusedRecordBoardCard';
|
import { useFocusedRecordBoardCard } from '@/object-record/record-board/hooks/useFocusedRecordBoardCard';
|
||||||
|
import { useRecordBoardSelectAllHotkeys } from '@/object-record/record-board/hooks/useRecordBoardSelectAllHotkeys';
|
||||||
import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection';
|
import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection';
|
||||||
import { RecordBoardCardContext } from '@/object-record/record-board/record-board-card/contexts/RecordBoardCardContext';
|
import { RecordBoardCardContext } from '@/object-record/record-board/record-board-card/contexts/RecordBoardCardContext';
|
||||||
import { isRecordBoardCardSelectedComponentFamilyState } from '@/object-record/record-board/states/isRecordBoardCardSelectedComponentFamilyState';
|
import { isRecordBoardCardSelectedComponentFamilyState } from '@/object-record/record-board/states/isRecordBoardCardSelectedComponentFamilyState';
|
||||||
import { recordBoardSelectedRecordIdsComponentSelector } from '@/object-record/record-board/states/selectors/recordBoardSelectedRecordIdsComponentSelector';
|
import { recordBoardSelectedRecordIdsComponentSelector } from '@/object-record/record-board/states/selectors/recordBoardSelectedRecordIdsComponentSelector';
|
||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
@ -65,7 +65,6 @@ export const useRecordBoardCardHotkeys = (focusId: string) => {
|
|||||||
keys: ['x'],
|
keys: ['x'],
|
||||||
callback: handleSelectCard,
|
callback: handleSelectCard,
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [handleSelectCard],
|
dependencies: [handleSelectCard],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -77,7 +76,6 @@ export const useRecordBoardCardHotkeys = (focusId: string) => {
|
|||||||
],
|
],
|
||||||
callback: handleOpenRecordInCommandMenu,
|
callback: handleOpenRecordInCommandMenu,
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [handleOpenRecordInCommandMenu],
|
dependencies: [handleOpenRecordInCommandMenu],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -85,7 +83,11 @@ export const useRecordBoardCardHotkeys = (focusId: string) => {
|
|||||||
keys: [Key.Escape],
|
keys: [Key.Escape],
|
||||||
callback: handleEscape,
|
callback: handleEscape,
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [handleEscape],
|
dependencies: [handleEscape],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useRecordBoardSelectAllHotkeys({
|
||||||
|
recordBoardId,
|
||||||
|
focusId,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,10 +1,5 @@
|
|||||||
import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection';
|
import { useSelectAllCards } from '@/object-record/record-board/hooks/useSelectAllCards';
|
||||||
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
|
|
||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
|
||||||
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
|
||||||
import { useRecoilCallback } from 'recoil';
|
|
||||||
|
|
||||||
export const useRecordBoardSelectAllHotkeys = ({
|
export const useRecordBoardSelectAllHotkeys = ({
|
||||||
recordBoardId,
|
recordBoardId,
|
||||||
@ -13,33 +8,13 @@ export const useRecordBoardSelectAllHotkeys = ({
|
|||||||
recordBoardId: string;
|
recordBoardId: string;
|
||||||
focusId: string;
|
focusId: string;
|
||||||
}) => {
|
}) => {
|
||||||
const recordIndexAllRecordIdsState = useRecoilComponentCallbackStateV2(
|
const { selectAllCards } = useSelectAllCards(recordBoardId);
|
||||||
recordIndexAllRecordIdsComponentSelector,
|
|
||||||
);
|
|
||||||
|
|
||||||
const { setRecordAsSelected } = useRecordBoardSelection(recordBoardId);
|
|
||||||
|
|
||||||
const selectAll = useRecoilCallback(
|
|
||||||
({ snapshot }) =>
|
|
||||||
() => {
|
|
||||||
const allRecordIds = getSnapshotValue(
|
|
||||||
snapshot,
|
|
||||||
recordIndexAllRecordIdsState,
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const recordId of allRecordIds) {
|
|
||||||
setRecordAsSelected(recordId, true);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[recordIndexAllRecordIdsState, setRecordAsSelected],
|
|
||||||
);
|
|
||||||
|
|
||||||
useHotkeysOnFocusedElement({
|
useHotkeysOnFocusedElement({
|
||||||
keys: ['ctrl+a', 'meta+a'],
|
keys: ['ctrl+a', 'meta+a'],
|
||||||
callback: selectAll,
|
callback: selectAllCards,
|
||||||
focusId,
|
focusId,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
dependencies: [selectAllCards],
|
||||||
dependencies: [selectAll],
|
|
||||||
options: {
|
options: {
|
||||||
enableOnFormTags: false,
|
enableOnFormTags: false,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -0,0 +1,63 @@
|
|||||||
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection';
|
||||||
|
import { isRecordBoardCardSelectedComponentFamilyState } from '@/object-record/record-board/states/isRecordBoardCardSelectedComponentFamilyState';
|
||||||
|
import { allCardsSelectedStatusComponentSelector } from '@/object-record/record-board/states/selectors/allCardsSelectedStatusComponentSelector';
|
||||||
|
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
|
||||||
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
|
|
||||||
|
export const useSelectAllCards = (recordBoardId?: string) => {
|
||||||
|
const allCardsSelectedStatusSelector = useRecoilComponentCallbackStateV2(
|
||||||
|
allCardsSelectedStatusComponentSelector,
|
||||||
|
recordBoardId,
|
||||||
|
);
|
||||||
|
const isRecordBoardCardSelectedFamilyState =
|
||||||
|
useRecoilComponentCallbackStateV2(
|
||||||
|
isRecordBoardCardSelectedComponentFamilyState,
|
||||||
|
recordBoardId,
|
||||||
|
);
|
||||||
|
const recordIndexAllRecordIdsSelector = useRecoilComponentCallbackStateV2(
|
||||||
|
recordIndexAllRecordIdsComponentSelector,
|
||||||
|
recordBoardId,
|
||||||
|
);
|
||||||
|
|
||||||
|
const { resetRecordSelection } = useRecordBoardSelection(recordBoardId);
|
||||||
|
|
||||||
|
const selectAllCards = useRecoilCallback(
|
||||||
|
({ set, snapshot }) =>
|
||||||
|
() => {
|
||||||
|
const allCardsSelectedStatus = getSnapshotValue(
|
||||||
|
snapshot,
|
||||||
|
allCardsSelectedStatusSelector,
|
||||||
|
);
|
||||||
|
|
||||||
|
const allRecordIds = getSnapshotValue(
|
||||||
|
snapshot,
|
||||||
|
recordIndexAllRecordIdsSelector,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (allCardsSelectedStatus === 'all') {
|
||||||
|
resetRecordSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const recordId of allRecordIds) {
|
||||||
|
const isSelected =
|
||||||
|
allCardsSelectedStatus === 'none' ||
|
||||||
|
allCardsSelectedStatus === 'some';
|
||||||
|
|
||||||
|
set(isRecordBoardCardSelectedFamilyState(recordId), isSelected);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
allCardsSelectedStatusSelector,
|
||||||
|
recordIndexAllRecordIdsSelector,
|
||||||
|
resetRecordSelection,
|
||||||
|
isRecordBoardCardSelectedFamilyState,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
selectAllCards,
|
||||||
|
};
|
||||||
|
};
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
import { RecordBoardComponentInstanceContext } from '@/object-record/record-board/states/contexts/RecordBoardComponentInstanceContext';
|
||||||
|
import { recordBoardSelectedRecordIdsComponentSelector } from '@/object-record/record-board/states/selectors/recordBoardSelectedRecordIdsComponentSelector';
|
||||||
|
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
|
||||||
|
import { AllRowsSelectedStatus } from '@/object-record/record-table/types/AllRowSelectedStatus';
|
||||||
|
import { createComponentSelectorV2 } from '@/ui/utilities/state/component-state/utils/createComponentSelectorV2';
|
||||||
|
|
||||||
|
export const allCardsSelectedStatusComponentSelector =
|
||||||
|
createComponentSelectorV2<AllRowsSelectedStatus>({
|
||||||
|
key: 'allCardsSelectedStatusComponentSelector',
|
||||||
|
componentInstanceContext: RecordBoardComponentInstanceContext,
|
||||||
|
get:
|
||||||
|
({ instanceId }) =>
|
||||||
|
({ get }) => {
|
||||||
|
const allRecordIds = get(
|
||||||
|
recordIndexAllRecordIdsComponentSelector.selectorFamily({
|
||||||
|
instanceId,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
const selectedRecordIds = get(
|
||||||
|
recordBoardSelectedRecordIdsComponentSelector.selectorFamily({
|
||||||
|
instanceId,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
const numberOfSelectedCards = selectedRecordIds.length;
|
||||||
|
|
||||||
|
const allCardsSelectedStatus =
|
||||||
|
numberOfSelectedCards === 0
|
||||||
|
? 'none'
|
||||||
|
: selectedRecordIds.length === allRecordIds.length
|
||||||
|
? 'all'
|
||||||
|
: 'some';
|
||||||
|
|
||||||
|
return allCardsSelectedStatus;
|
||||||
|
},
|
||||||
|
});
|
||||||
@ -1,4 +0,0 @@
|
|||||||
export enum RecordBoardColumnHotkeyScope {
|
|
||||||
BoardColumn = 'board-column',
|
|
||||||
ColumnHeader = 'column-header',
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
export enum BoardHotkeyScope {
|
|
||||||
BoardFocus = 'board-focus',
|
|
||||||
}
|
|
||||||
@ -14,11 +14,13 @@ import { MIN_DATE } from '@/ui/input/components/internal/date/constants/MinDate'
|
|||||||
import { useDateParser } from '@/ui/input/components/internal/hooks/useDateParser';
|
import { useDateParser } from '@/ui/input/components/internal/hooks/useDateParser';
|
||||||
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
|
||||||
import { OverlayContainer } from '@/ui/layout/overlay/components/OverlayContainer';
|
import { OverlayContainer } from '@/ui/layout/overlay/components/OverlayContainer';
|
||||||
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
|
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
|
||||||
import { isStandaloneVariableString } from '@/workflow/utils/isStandaloneVariableString';
|
import { isStandaloneVariableString } from '@/workflow/utils/isStandaloneVariableString';
|
||||||
import { css } from '@emotion/react';
|
import { css } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { ChangeEvent, KeyboardEvent, useId, useRef, useState } from 'react';
|
import { ChangeEvent, KeyboardEvent, useId, useRef, useState } from 'react';
|
||||||
|
import { Key } from 'ts-key-enum';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
|
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
|
||||||
import { Nullable } from 'twenty-ui/utilities';
|
import { Nullable } from 'twenty-ui/utilities';
|
||||||
@ -290,6 +292,13 @@ export const FormDateTimeFieldInput = ({
|
|||||||
onChange(null);
|
onChange(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useHotkeysOnFocusedElement({
|
||||||
|
keys: [Key.Escape],
|
||||||
|
callback: handlePickerEscape,
|
||||||
|
focusId: instanceId,
|
||||||
|
dependencies: [handlePickerEscape],
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FormFieldInputContainer>
|
<FormFieldInputContainer>
|
||||||
{label ? <InputLabel>{label}</InputLabel> : null}
|
{label ? <InputLabel>{label}</InputLabel> : null}
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import { FormFieldInputHotKeyScope } from '@/object-record/record-field/form-types/constants/FormFieldInputHotKeyScope';
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -10,7 +9,7 @@ type FormFieldInputInnerContainerProps = {
|
|||||||
hasRightElement: boolean;
|
hasRightElement: boolean;
|
||||||
multiline?: boolean;
|
multiline?: boolean;
|
||||||
readonly?: boolean;
|
readonly?: boolean;
|
||||||
preventSetHotkeyScope?: boolean;
|
preventFocusStackUpdate?: boolean;
|
||||||
formFieldInputInstanceId: string;
|
formFieldInputInstanceId: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -51,7 +50,7 @@ export const FormFieldInputInnerContainer = forwardRef(
|
|||||||
hasRightElement,
|
hasRightElement,
|
||||||
multiline,
|
multiline,
|
||||||
readonly,
|
readonly,
|
||||||
preventSetHotkeyScope = false,
|
preventFocusStackUpdate = false,
|
||||||
onClick,
|
onClick,
|
||||||
formFieldInputInstanceId,
|
formFieldInputInstanceId,
|
||||||
}: HTMLAttributes<HTMLDivElement> & FormFieldInputInnerContainerProps,
|
}: HTMLAttributes<HTMLDivElement> & FormFieldInputInnerContainerProps,
|
||||||
@ -64,14 +63,16 @@ export const FormFieldInputInnerContainer = forwardRef(
|
|||||||
const handleFocus = (e: React.FocusEvent<HTMLDivElement>) => {
|
const handleFocus = (e: React.FocusEvent<HTMLDivElement>) => {
|
||||||
onFocus?.(e);
|
onFocus?.(e);
|
||||||
|
|
||||||
if (!preventSetHotkeyScope) {
|
if (!preventFocusStackUpdate) {
|
||||||
pushFocusItemToFocusStack({
|
pushFocusItemToFocusStack({
|
||||||
focusId: formFieldInputInstanceId,
|
focusId: formFieldInputInstanceId,
|
||||||
component: {
|
component: {
|
||||||
type: FocusComponentType.FORM_FIELD_INPUT,
|
type: FocusComponentType.FORM_FIELD_INPUT,
|
||||||
instanceId: formFieldInputInstanceId,
|
instanceId: formFieldInputInstanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: { scope: FormFieldInputHotKeyScope.FormFieldInput },
|
globalHotkeysConfig: {
|
||||||
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -79,7 +80,7 @@ export const FormFieldInputInnerContainer = forwardRef(
|
|||||||
const handleBlur = (e: React.FocusEvent<HTMLDivElement>) => {
|
const handleBlur = (e: React.FocusEvent<HTMLDivElement>) => {
|
||||||
onBlur?.(e);
|
onBlur?.(e);
|
||||||
|
|
||||||
if (!preventSetHotkeyScope) {
|
if (!preventFocusStackUpdate) {
|
||||||
removeFocusItemFromFocusStackById({
|
removeFocusItemFromFocusStackById({
|
||||||
focusId: formFieldInputInstanceId,
|
focusId: formFieldInputInstanceId,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import { FormFieldInputInnerContainer } from '@/object-record/record-field/form-
|
|||||||
import { FormFieldInputRowContainer } from '@/object-record/record-field/form-types/components/FormFieldInputRowContainer';
|
import { FormFieldInputRowContainer } from '@/object-record/record-field/form-types/components/FormFieldInputRowContainer';
|
||||||
import { FormFieldPlaceholder } from '@/object-record/record-field/form-types/components/FormFieldPlaceholder';
|
import { FormFieldPlaceholder } from '@/object-record/record-field/form-types/components/FormFieldPlaceholder';
|
||||||
import { VariableChipStandalone } from '@/object-record/record-field/form-types/components/VariableChipStandalone';
|
import { VariableChipStandalone } from '@/object-record/record-field/form-types/components/VariableChipStandalone';
|
||||||
import { FormMultiSelectFieldInputHotKeyScope } from '@/object-record/record-field/form-types/constants/FormMultiSelectFieldInputHotKeyScope';
|
|
||||||
import { VariablePickerComponent } from '@/object-record/record-field/form-types/types/VariablePickerComponent';
|
import { VariablePickerComponent } from '@/object-record/record-field/form-types/types/VariablePickerComponent';
|
||||||
import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId';
|
import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId';
|
||||||
import { FieldMultiSelectValue } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMultiSelectValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
@ -87,9 +86,6 @@ export const FormMultiSelectFieldInput = ({
|
|||||||
const instanceId = useId();
|
const instanceId = useId();
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
|
|
||||||
const hotkeyScope =
|
|
||||||
FormMultiSelectFieldInputHotKeyScope.FormMultiSelectFieldInput;
|
|
||||||
|
|
||||||
const { pushFocusItemToFocusStack } = usePushFocusItemToFocusStack();
|
const { pushFocusItemToFocusStack } = usePushFocusItemToFocusStack();
|
||||||
const { removeFocusItemFromFocusStackById } =
|
const { removeFocusItemFromFocusStackById } =
|
||||||
useRemoveFocusItemFromFocusStackById();
|
useRemoveFocusItemFromFocusStackById();
|
||||||
@ -135,7 +131,9 @@ export const FormMultiSelectFieldInput = ({
|
|||||||
type: FocusComponentType.FORM_FIELD_INPUT,
|
type: FocusComponentType.FORM_FIELD_INPUT,
|
||||||
instanceId,
|
instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: { scope: hotkeyScope },
|
globalHotkeysConfig: {
|
||||||
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -262,7 +260,7 @@ export const FormMultiSelectFieldInput = ({
|
|||||||
selectableListComponentInstanceId={
|
selectableListComponentInstanceId={
|
||||||
SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID
|
SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID
|
||||||
}
|
}
|
||||||
focusId={hotkeyScope}
|
focusId={instanceId}
|
||||||
options={options}
|
options={options}
|
||||||
onCancel={onCancel}
|
onCancel={onCancel}
|
||||||
onOptionSelected={onOptionSelected}
|
onOptionSelected={onOptionSelected}
|
||||||
|
|||||||
@ -135,7 +135,6 @@ export const FormNumberFieldInput = ({
|
|||||||
}
|
}
|
||||||
value={draftValue.value}
|
value={draftValue.value}
|
||||||
copyButton={false}
|
copyButton={false}
|
||||||
hotkeyScope="record-create"
|
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
disabled={readonly}
|
disabled={readonly}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import { FormFieldInputInnerContainer } from '@/object-record/record-field/form-
|
|||||||
import { FormFieldInputRowContainer } from '@/object-record/record-field/form-types/components/FormFieldInputRowContainer';
|
import { FormFieldInputRowContainer } from '@/object-record/record-field/form-types/components/FormFieldInputRowContainer';
|
||||||
import { VariableChipStandalone } from '@/object-record/record-field/form-types/components/VariableChipStandalone';
|
import { VariableChipStandalone } from '@/object-record/record-field/form-types/components/VariableChipStandalone';
|
||||||
import { VariablePickerComponent } from '@/object-record/record-field/form-types/types/VariablePickerComponent';
|
import { VariablePickerComponent } from '@/object-record/record-field/form-types/types/VariablePickerComponent';
|
||||||
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
|
||||||
import { InputLabel } from '@/ui/input/components/InputLabel';
|
import { InputLabel } from '@/ui/input/components/InputLabel';
|
||||||
import { Select } from '@/ui/input/components/Select';
|
import { Select } from '@/ui/input/components/Select';
|
||||||
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
|
||||||
@ -38,8 +37,6 @@ export const FormSelectFieldInput = ({
|
|||||||
|
|
||||||
const instanceId = useId();
|
const instanceId = useId();
|
||||||
|
|
||||||
const hotkeyScope = InlineCellHotkeyScope.InlineCell;
|
|
||||||
|
|
||||||
const { removeFocusItemFromFocusStackById } =
|
const { removeFocusItemFromFocusStackById } =
|
||||||
useRemoveFocusItemFromFocusStackById();
|
useRemoveFocusItemFromFocusStackById();
|
||||||
|
|
||||||
@ -124,7 +121,6 @@ export const FormSelectFieldInput = ({
|
|||||||
keys: Key.Escape,
|
keys: Key.Escape,
|
||||||
callback: onCancel,
|
callback: onCancel,
|
||||||
focusId: instanceId,
|
focusId: instanceId,
|
||||||
scope: hotkeyScope,
|
|
||||||
dependencies: [onCancel],
|
dependencies: [onCancel],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -175,7 +175,7 @@ export const FormSingleRecordPicker = ({
|
|||||||
<StyledFormSelectContainer
|
<StyledFormSelectContainer
|
||||||
formFieldInputInstanceId={componentId}
|
formFieldInputInstanceId={componentId}
|
||||||
hasRightElement={isDefined(VariablePicker) && !disabled}
|
hasRightElement={isDefined(VariablePicker) && !disabled}
|
||||||
preventSetHotkeyScope={true}
|
preventFocusStackUpdate={true}
|
||||||
>
|
>
|
||||||
<FormSingleRecordFieldChip
|
<FormSingleRecordFieldChip
|
||||||
draftValue={draftValue}
|
draftValue={draftValue}
|
||||||
|
|||||||
@ -104,7 +104,6 @@ export const FormUuidFieldInput = ({
|
|||||||
placeholder={placeholder ?? 'Enter a UUID'}
|
placeholder={placeholder ?? 'Enter a UUID'}
|
||||||
value={draftValue.value}
|
value={draftValue.value}
|
||||||
copyButton={false}
|
copyButton={false}
|
||||||
hotkeyScope="record-create"
|
|
||||||
disabled={readonly}
|
disabled={readonly}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
export enum FormFieldInputHotKeyScope {
|
|
||||||
FormFieldInput = 'form-field-input',
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
export enum FormMultiSelectFieldInputHotKeyScope {
|
|
||||||
FormMultiSelectFieldInput = 'form-multi-select-field-input',
|
|
||||||
}
|
|
||||||
@ -15,10 +15,8 @@ import {
|
|||||||
} from '@/object-record/record-field/types/FieldMetadata';
|
} from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { isFieldRelationFromManyObjects } from '@/object-record/record-field/types/guards/isFieldRelationFromManyObjects';
|
import { isFieldRelationFromManyObjects } from '@/object-record/record-field/types/guards/isFieldRelationFromManyObjects';
|
||||||
import { isFieldRelationToOneObject } from '@/object-record/record-field/types/guards/isFieldRelationToOneObject';
|
import { isFieldRelationToOneObject } from '@/object-record/record-field/types/guards/isFieldRelationToOneObject';
|
||||||
import { INLINE_CELL_HOTKEY_SCOPE_MEMOIZE_KEY } from '@/object-record/record-inline-cell/constants/InlineCellHotkeyScopeMemoizeKey';
|
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById';
|
||||||
@ -128,11 +126,9 @@ export const useOpenFieldInputEditMode = () => {
|
|||||||
prefix,
|
prefix,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
globalHotkeysConfig: {
|
||||||
scope: DEFAULT_CELL_SCOPE.scope,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
customScopes: DEFAULT_CELL_SCOPE.customScopes,
|
|
||||||
},
|
},
|
||||||
memoizeKey: INLINE_CELL_HOTKEY_SCOPE_MEMOIZE_KEY,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import {
|
|||||||
FieldInputClickOutsideEvent,
|
FieldInputClickOutsideEvent,
|
||||||
FieldInputEvent,
|
FieldInputEvent,
|
||||||
} from '@/object-record/record-field/types/FieldInputEvent';
|
} from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { usePersistField } from '../../../hooks/usePersistField';
|
import { usePersistField } from '../../../hooks/usePersistField';
|
||||||
|
|
||||||
@ -83,7 +82,6 @@ export const AddressFieldInput = ({
|
|||||||
onClickOutside={handleClickOutside}
|
onClickOutside={handleClickOutside}
|
||||||
onEnter={handleEnter}
|
onEnter={handleEnter}
|
||||||
onEscape={handleEscape}
|
onEscape={handleEscape}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
onTab={handleTab}
|
onTab={handleTab}
|
||||||
onShiftTab={handleShiftTab}
|
onShiftTab={handleShiftTab}
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import { useArrayField } from '@/object-record/record-field/meta-types/hooks/useArrayField';
|
import { useArrayField } from '@/object-record/record-field/meta-types/hooks/useArrayField';
|
||||||
import { ArrayFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/ArrayFieldMenuItem';
|
import { ArrayFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/ArrayFieldMenuItem';
|
||||||
import { MultiItemFieldInput } from '@/object-record/record-field/meta-types/input/components/MultiItemFieldInput';
|
import { MultiItemFieldInput } from '@/object-record/record-field/meta-types/input/components/MultiItemFieldInput';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
@ -23,7 +22,6 @@ export const ArrayFieldInput = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<MultiItemFieldInput
|
<MultiItemFieldInput
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
newItemLabel="Add Item"
|
newItemLabel="Add Item"
|
||||||
items={arrayItems}
|
items={arrayItems}
|
||||||
onPersist={persistArrayField}
|
onPersist={persistArrayField}
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import {
|
|||||||
FieldInputClickOutsideEvent,
|
FieldInputClickOutsideEvent,
|
||||||
FieldInputEvent,
|
FieldInputEvent,
|
||||||
} from '@/object-record/record-field/types/FieldInputEvent';
|
} from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
|
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
|
||||||
|
|
||||||
@ -132,7 +131,6 @@ export const CurrencyFieldInput = ({
|
|||||||
onTab={handleTab}
|
onTab={handleTab}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
onSelect={handleSelect}
|
onSelect={handleSelect}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import { DateInput } from '@/ui/field/input/components/DateInput';
|
|||||||
|
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
import { Nullable } from 'twenty-ui/utilities';
|
import { Nullable } from 'twenty-ui/utilities';
|
||||||
@ -88,7 +87,6 @@ export const DateFieldInput = ({
|
|||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
onClear={handleClear}
|
onClear={handleClear}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import { FieldInputEvent } from '@/object-record/record-field/meta-types/input/c
|
|||||||
|
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { Nullable } from 'twenty-ui/utilities';
|
import { Nullable } from 'twenty-ui/utilities';
|
||||||
import { usePersistField } from '../../../hooks/usePersistField';
|
import { usePersistField } from '../../../hooks/usePersistField';
|
||||||
@ -84,7 +83,6 @@ export const DateTimeFieldInput = ({
|
|||||||
isDateTimeInput
|
isDateTimeInput
|
||||||
onClear={handleClear}
|
onClear={handleClear}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import { useEmailsField } from '@/object-record/record-field/meta-types/hooks/us
|
|||||||
import { EmailsFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/EmailsFieldMenuItem';
|
import { EmailsFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/EmailsFieldMenuItem';
|
||||||
import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState';
|
import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState';
|
||||||
import { emailSchema } from '@/object-record/record-field/validation-schemas/emailSchema';
|
import { emailSchema } from '@/object-record/record-field/validation-schemas/emailSchema';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
@ -88,7 +87,6 @@ export const EmailsFieldInput = ({
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
onError={handleError}
|
onError={handleError}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import {
|
|||||||
FieldInputClickOutsideEvent,
|
FieldInputClickOutsideEvent,
|
||||||
FieldInputEvent,
|
FieldInputEvent,
|
||||||
} from '@/object-record/record-field/types/FieldInputEvent';
|
} from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
|
|
||||||
type FullNameFieldInputProps = {
|
type FullNameFieldInputProps = {
|
||||||
@ -101,7 +100,6 @@ export const FullNameFieldInput = ({
|
|||||||
onShiftTab={handleShiftTab}
|
onShiftTab={handleShiftTab}
|
||||||
onTab={handleTab}
|
onTab={handleTab}
|
||||||
onPaste={handlePaste}
|
onPaste={handlePaste}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import { useLinksField } from '@/object-record/record-field/meta-types/hooks/use
|
|||||||
import { LinksFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/LinksFieldMenuItem';
|
import { LinksFieldMenuItem } from '@/object-record/record-field/meta-types/input/components/LinksFieldMenuItem';
|
||||||
import { getFieldLinkDefinedLinks } from '@/object-record/record-field/meta-types/input/utils/getFieldLinkDefinedLinks';
|
import { getFieldLinkDefinedLinks } from '@/object-record/record-field/meta-types/input/utils/getFieldLinkDefinedLinks';
|
||||||
import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState';
|
import { recordFieldInputIsFieldInErrorComponentState } from '@/object-record/record-field/states/recordFieldInputIsFieldInErrorComponentState';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { absoluteUrlSchema } from 'twenty-shared/utils';
|
import { absoluteUrlSchema } from 'twenty-shared/utils';
|
||||||
@ -85,7 +84,6 @@ export const LinksFieldInput = ({
|
|||||||
url={link.url}
|
url={link.url}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -67,7 +67,6 @@ const StyledErrorDiv = styled.div`
|
|||||||
type HTMLInputProps = InputHTMLAttributes<HTMLInputElement>;
|
type HTMLInputProps = InputHTMLAttributes<HTMLInputElement>;
|
||||||
|
|
||||||
export type MultiItemBaseInputProps = Omit<HTMLInputProps, 'onChange'> & {
|
export type MultiItemBaseInputProps = Omit<HTMLInputProps, 'onChange'> & {
|
||||||
hotkeyScope?: string;
|
|
||||||
onClickOutside?: () => void;
|
onClickOutside?: () => void;
|
||||||
onEnter?: () => void;
|
onEnter?: () => void;
|
||||||
onEscape?: () => void;
|
onEscape?: () => void;
|
||||||
@ -97,7 +96,6 @@ export const MultiItemBaseInput = forwardRef<
|
|||||||
className,
|
className,
|
||||||
value,
|
value,
|
||||||
placeholder,
|
placeholder,
|
||||||
hotkeyScope = 'dropdown-menu-input',
|
|
||||||
onChange,
|
onChange,
|
||||||
onClickOutside,
|
onClickOutside,
|
||||||
onEnter = () => {},
|
onEnter = () => {},
|
||||||
@ -125,7 +123,6 @@ export const MultiItemBaseInput = forwardRef<
|
|||||||
onClickOutside,
|
onClickOutside,
|
||||||
onTab,
|
onTab,
|
||||||
onShiftTab,
|
onShiftTab,
|
||||||
hotkeyScope,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -37,7 +37,6 @@ type MultiItemFieldInputProps<T> = {
|
|||||||
handleSetPrimary: () => void;
|
handleSetPrimary: () => void;
|
||||||
handleDelete: () => void;
|
handleDelete: () => void;
|
||||||
}) => React.ReactNode;
|
}) => React.ReactNode;
|
||||||
hotkeyScope: string;
|
|
||||||
newItemLabel?: string;
|
newItemLabel?: string;
|
||||||
fieldMetadataType: FieldMetadataType;
|
fieldMetadataType: FieldMetadataType;
|
||||||
renderInput?: MultiItemBaseInputProps['renderInput'];
|
renderInput?: MultiItemBaseInputProps['renderInput'];
|
||||||
@ -55,7 +54,6 @@ export const MultiItemFieldInput = <T,>({
|
|||||||
validateInput,
|
validateInput,
|
||||||
formatInput,
|
formatInput,
|
||||||
renderItem,
|
renderItem,
|
||||||
hotkeyScope,
|
|
||||||
newItemLabel,
|
newItemLabel,
|
||||||
fieldMetadataType,
|
fieldMetadataType,
|
||||||
renderInput,
|
renderInput,
|
||||||
@ -67,6 +65,10 @@ export const MultiItemFieldInput = <T,>({
|
|||||||
onCancel?.();
|
onCancel?.();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const instanceId = useAvailableComponentInstanceIdOrThrow(
|
||||||
|
RecordFieldComponentInstanceContext,
|
||||||
|
);
|
||||||
|
|
||||||
useListenClickOutside({
|
useListenClickOutside({
|
||||||
refs: [containerRef],
|
refs: [containerRef],
|
||||||
callback: (event) => {
|
callback: (event) => {
|
||||||
@ -78,18 +80,13 @@ export const MultiItemFieldInput = <T,>({
|
|||||||
}
|
}
|
||||||
onClickOutside?.(() => {}, event);
|
onClickOutside?.(() => {}, event);
|
||||||
},
|
},
|
||||||
listenerId: hotkeyScope,
|
listenerId: instanceId,
|
||||||
});
|
});
|
||||||
|
|
||||||
const instanceId = useAvailableComponentInstanceIdOrThrow(
|
|
||||||
RecordFieldComponentInstanceContext,
|
|
||||||
);
|
|
||||||
|
|
||||||
useHotkeysOnFocusedElement({
|
useHotkeysOnFocusedElement({
|
||||||
focusId: instanceId,
|
focusId: instanceId,
|
||||||
keys: [Key.Escape],
|
keys: [Key.Escape],
|
||||||
callback: handleDropdownClose,
|
callback: handleDropdownClose,
|
||||||
scope: hotkeyScope,
|
|
||||||
dependencies: [handleDropdownClose],
|
dependencies: [handleDropdownClose],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -220,7 +217,6 @@ export const MultiItemFieldInput = <T,>({
|
|||||||
autoFocus
|
autoFocus
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
value={inputValue}
|
value={inputValue}
|
||||||
hotkeyScope={hotkeyScope}
|
|
||||||
hasError={!errorData.isValid}
|
hasError={!errorData.isValid}
|
||||||
renderInput={renderInput}
|
renderInput={renderInput}
|
||||||
onEscape={handleDropdownClose}
|
onEscape={handleDropdownClose}
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import { TextInput } from '@/ui/field/input/components/TextInput';
|
|||||||
|
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer';
|
import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer';
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { useNumberField } from '../../hooks/useNumberField';
|
import { useNumberField } from '../../hooks/useNumberField';
|
||||||
@ -70,7 +69,6 @@ export const NumberFieldInput = ({
|
|||||||
onEscape={handleEscape}
|
onEscape={handleEscape}
|
||||||
onShiftTab={handleShiftTab}
|
onShiftTab={handleShiftTab}
|
||||||
onTab={handleTab}
|
onTab={handleTab}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
/>
|
/>
|
||||||
</FieldInputContainer>
|
</FieldInputContainer>
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import { MultiItemFieldInput } from './MultiItemFieldInput';
|
|||||||
|
|
||||||
import { createPhonesFromFieldValue } from '@/object-record/record-field/meta-types/input/utils/phonesUtils';
|
import { createPhonesFromFieldValue } from '@/object-record/record-field/meta-types/input/utils/phonesUtils';
|
||||||
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { PhoneCountryPickerDropdownButton } from '@/ui/input/components/internal/phone/components/PhoneCountryPickerDropdownButton';
|
import { PhoneCountryPickerDropdownButton } from '@/ui/input/components/internal/phone/components/PhoneCountryPickerDropdownButton';
|
||||||
import { css } from '@emotion/react';
|
import { css } from '@emotion/react';
|
||||||
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
|
import { TEXT_INPUT_STYLE } from 'twenty-ui/theme';
|
||||||
@ -155,7 +154,6 @@ export const PhonesFieldInput = ({
|
|||||||
</StyledCustomPhoneInputContainer>
|
</StyledCustomPhoneInputContainer>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import {
|
|||||||
FieldInputClickOutsideEvent,
|
FieldInputClickOutsideEvent,
|
||||||
FieldInputEvent,
|
FieldInputEvent,
|
||||||
} from '@/object-record/record-field/types/FieldInputEvent';
|
} from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
|
import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside';
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
@ -69,8 +68,6 @@ export const RawJsonFieldInput = ({
|
|||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
} = useJsonField();
|
} = useJsonField();
|
||||||
|
|
||||||
const hotkeyScope = DEFAULT_CELL_SCOPE.scope;
|
|
||||||
|
|
||||||
const containerRef = useRef<HTMLDivElement>(null);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
const instanceId = useAvailableComponentInstanceIdOrThrow(
|
const instanceId = useAvailableComponentInstanceIdOrThrow(
|
||||||
RecordFieldComponentInstanceContext,
|
RecordFieldComponentInstanceContext,
|
||||||
@ -106,7 +103,7 @@ export const RawJsonFieldInput = ({
|
|||||||
callback: (event) => {
|
callback: (event) => {
|
||||||
handleClickOutside(event, draftValue ?? '');
|
handleClickOutside(event, draftValue ?? '');
|
||||||
},
|
},
|
||||||
listenerId: hotkeyScope,
|
listenerId: instanceId,
|
||||||
});
|
});
|
||||||
|
|
||||||
useHotkeysOnFocusedElement({
|
useHotkeysOnFocusedElement({
|
||||||
@ -114,7 +111,6 @@ export const RawJsonFieldInput = ({
|
|||||||
callback: () => {
|
callback: () => {
|
||||||
handleEscape(draftValue ?? '');
|
handleEscape(draftValue ?? '');
|
||||||
},
|
},
|
||||||
scope: hotkeyScope,
|
|
||||||
focusId: instanceId,
|
focusId: instanceId,
|
||||||
dependencies: [handleEscape, draftValue],
|
dependencies: [handleEscape, draftValue],
|
||||||
});
|
});
|
||||||
@ -124,7 +120,6 @@ export const RawJsonFieldInput = ({
|
|||||||
callback: () => {
|
callback: () => {
|
||||||
handleTab(draftValue ?? '');
|
handleTab(draftValue ?? '');
|
||||||
},
|
},
|
||||||
scope: hotkeyScope,
|
|
||||||
focusId: instanceId,
|
focusId: instanceId,
|
||||||
dependencies: [handleTab, draftValue],
|
dependencies: [handleTab, draftValue],
|
||||||
});
|
});
|
||||||
@ -134,7 +129,6 @@ export const RawJsonFieldInput = ({
|
|||||||
callback: () => {
|
callback: () => {
|
||||||
handleShiftTab(draftValue ?? '');
|
handleShiftTab(draftValue ?? '');
|
||||||
},
|
},
|
||||||
scope: hotkeyScope,
|
|
||||||
focusId: instanceId,
|
focusId: instanceId,
|
||||||
dependencies: [handleShiftTab, draftValue],
|
dependencies: [handleShiftTab, draftValue],
|
||||||
});
|
});
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import {
|
|||||||
FieldInputClickOutsideEvent,
|
FieldInputClickOutsideEvent,
|
||||||
FieldInputEvent,
|
FieldInputEvent,
|
||||||
} from '@/object-record/record-field/types/FieldInputEvent';
|
} from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { useTheme } from '@emotion/react';
|
import { useTheme } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
@ -92,7 +91,6 @@ export const RichTextFieldInput = ({
|
|||||||
inputValue: null,
|
inputValue: null,
|
||||||
onClickOutside: handleClickOutside,
|
onClickOutside: handleClickOutside,
|
||||||
onEscape: handleEscape,
|
onEscape: handleEscape,
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE.scope,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import { useSelectField } from '@/object-record/record-field/meta-types/hooks/us
|
|||||||
import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId';
|
import { SELECT_FIELD_INPUT_SELECTABLE_LIST_COMPONENT_INSTANCE_ID } from '@/object-record/record-field/meta-types/input/constants/SelectFieldInputSelectableListComponentInstanceId';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { SelectInput } from '@/ui/field/input/components/SelectInput';
|
import { SelectInput } from '@/ui/field/input/components/SelectInput';
|
||||||
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
@ -56,7 +55,6 @@ export const SelectFieldInput = ({
|
|||||||
onCancel?.();
|
onCancel?.();
|
||||||
resetSelectedItem();
|
resetSelectedItem();
|
||||||
},
|
},
|
||||||
scope: DEFAULT_CELL_SCOPE.scope,
|
|
||||||
focusId: instanceId,
|
focusId: instanceId,
|
||||||
dependencies: [onCancel, resetSelectedItem],
|
dependencies: [onCancel, resetSelectedItem],
|
||||||
});
|
});
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import {
|
|||||||
FieldInputClickOutsideEvent,
|
FieldInputClickOutsideEvent,
|
||||||
FieldInputEvent,
|
FieldInputEvent,
|
||||||
} from '@/object-record/record-field/types/FieldInputEvent';
|
} from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer';
|
import { FieldInputContainer } from '@/ui/field/input/components/FieldInputContainer';
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { turnIntoUndefinedIfWhitespacesOnly } from '~/utils/string/turnIntoUndefinedIfWhitespacesOnly';
|
import { turnIntoUndefinedIfWhitespacesOnly } from '~/utils/string/turnIntoUndefinedIfWhitespacesOnly';
|
||||||
@ -74,7 +73,6 @@ export const TextFieldInput = ({
|
|||||||
onEscape={handleEscape}
|
onEscape={handleEscape}
|
||||||
onShiftTab={handleShiftTab}
|
onShiftTab={handleShiftTab}
|
||||||
onTab={handleTab}
|
onTab={handleTab}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
/>
|
/>
|
||||||
</FieldInputContainer>
|
</FieldInputContainer>
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import { useAddressField } from '@/object-record/record-field/meta-types/hooks/u
|
|||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { FieldAddressDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue';
|
import { FieldAddressDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import {
|
import {
|
||||||
AddressInput,
|
AddressInput,
|
||||||
@ -60,7 +59,6 @@ const AddressInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [instanceId, pushFocusItemToFocusStack]);
|
}, [instanceId, pushFocusItemToFocusStack]);
|
||||||
|
|
||||||
@ -96,7 +94,6 @@ const AddressInputWithContext = ({
|
|||||||
onEscape={onEscape}
|
onEscape={onEscape}
|
||||||
onClickOutside={onClickOutside}
|
onClickOutside={onClickOutside}
|
||||||
value={value}
|
value={value}
|
||||||
hotkeyScope={DEFAULT_CELL_SCOPE.scope}
|
|
||||||
onTab={onTab}
|
onTab={onTab}
|
||||||
onShiftTab={onShiftTab}
|
onShiftTab={onShiftTab}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import { FieldContext } from '@/object-record/record-field/contexts/FieldContext
|
|||||||
import { useArrayField } from '@/object-record/record-field/meta-types/hooks/useArrayField';
|
import { useArrayField } from '@/object-record/record-field/meta-types/hooks/useArrayField';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -72,7 +71,6 @@ const ArrayInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack, instanceId]);
|
}, [pushFocusItemToFocusStack, instanceId]);
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import { FieldMetadataType } from '~/generated-metadata/graphql';
|
|||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
|
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
|
||||||
@ -78,7 +77,6 @@ const DateFieldInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack, instanceId]);
|
}, [pushFocusItemToFocusStack, instanceId]);
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import { useEmailsField } from '@/object-record/record-field/meta-types/hooks/us
|
|||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { FieldEmailsValue } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldEmailsValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -73,7 +72,6 @@ const EmailInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack, instanceId]);
|
}, [pushFocusItemToFocusStack, instanceId]);
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import { FieldContext } from '@/object-record/record-field/contexts/FieldContext
|
|||||||
import { useLinksField } from '@/object-record/record-field/meta-types/hooks/useLinksField';
|
import { useLinksField } from '@/object-record/record-field/meta-types/hooks/useLinksField';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -83,7 +82,6 @@ const LinksInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack, instanceId]);
|
}, [pushFocusItemToFocusStack, instanceId]);
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
import { MultiItemBaseInput } from '../MultiItemBaseInput';
|
|
||||||
import { ComponentDecorator } from 'twenty-ui/testing';
|
import { ComponentDecorator } from 'twenty-ui/testing';
|
||||||
|
import { MultiItemBaseInput } from '../MultiItemBaseInput';
|
||||||
|
|
||||||
const meta: Meta<typeof MultiItemBaseInput> = {
|
const meta: Meta<typeof MultiItemBaseInput> = {
|
||||||
title: 'UI/Data/Field/Input/BaseFieldInput',
|
title: 'UI/Data/Field/Input/BaseFieldInput',
|
||||||
component: MultiItemBaseInput,
|
component: MultiItemBaseInput,
|
||||||
decorators: [ComponentDecorator],
|
decorators: [ComponentDecorator],
|
||||||
args: { value: 'Lorem ipsum' },
|
args: { value: 'Lorem ipsum', instanceId: 'multi-item-base-input' },
|
||||||
};
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
|||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
|
import { StorybookFieldInputDropdownFocusIdSetterEffect } from '~/testing/components/StorybookFieldInputDropdownFocusIdSetterEffect';
|
||||||
@ -59,7 +58,6 @@ const NumberFieldInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
setIsReady(true);
|
setIsReady(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import { RecordFieldComponentInstanceContext } from '@/object-record/record-fiel
|
|||||||
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
import { FieldInputClickOutsideEvent } from '@/object-record/record-field/types/FieldInputEvent';
|
||||||
import { FieldPhonesValue } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldPhonesValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -74,7 +73,6 @@ const PhoneInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack, instanceId]);
|
}, [pushFocusItemToFocusStack, instanceId]);
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePush
|
|||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
@ -54,7 +53,6 @@ const RatingFieldInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack, instanceId]);
|
}, [pushFocusItemToFocusStack, instanceId]);
|
||||||
|
|
||||||
|
|||||||
@ -20,7 +20,6 @@ import { FieldContext } from '@/object-record/record-field/contexts/FieldContext
|
|||||||
import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode';
|
import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/useOpenFieldInputEditMode';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { RelationType } from '~/generated-metadata/graphql';
|
import { RelationType } from '~/generated-metadata/graphql';
|
||||||
@ -78,7 +77,6 @@ const RelationManyFieldInputWithContext = () => {
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: 'relation-from-many-field-input',
|
instanceId: 'relation-from-many-field-input',
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
openFieldInput({
|
openFieldInput({
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
|
|||||||
@ -18,7 +18,6 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
|
|||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { recordFieldInputLayoutDirectionLoadingComponentState } from '@/object-record/record-field/states/recordFieldInputLayoutDirectionLoadingComponentState';
|
import { recordFieldInputLayoutDirectionLoadingComponentState } from '@/object-record/record-field/states/recordFieldInputLayoutDirectionLoadingComponentState';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
@ -72,8 +71,6 @@ const RelationToOneFieldInputWithContext = ({
|
|||||||
type: FocusComponentType.DROPDOWN,
|
type: FocusComponentType.DROPDOWN,
|
||||||
instanceId: 'relation-to-one-field-input',
|
instanceId: 'relation-to-one-field-input',
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
memoizeKey: 'relation-to-one-field-input',
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack]);
|
}, [pushFocusItemToFocusStack]);
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSi
|
|||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -53,7 +52,6 @@ const RichTextFieldInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
}, [pushFocusItemToFocusStack, instanceId]);
|
}, [pushFocusItemToFocusStack, instanceId]);
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePush
|
|||||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/constants/RecordTableCellInputIdPrefix';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { Decorator, Meta, StoryObj } from '@storybook/react';
|
import { Decorator, Meta, StoryObj } from '@storybook/react';
|
||||||
@ -56,7 +55,6 @@ const TextFieldInputWithContext = ({
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: instanceId,
|
instanceId: instanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: DEFAULT_CELL_SCOPE,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
setIsReady(true);
|
setIsReady(true);
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import { RecordPickerPickableMorphItem } from '@/object-record/record-picker/typ
|
|||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
@ -106,10 +105,9 @@ export const useOpenRelationFromManyFieldInput = () => {
|
|||||||
type: FocusComponentType.DROPDOWN,
|
type: FocusComponentType.DROPDOWN,
|
||||||
instanceId: recordPickerInstanceId,
|
instanceId: recordPickerInstanceId,
|
||||||
},
|
},
|
||||||
hotkeyScope: {
|
globalHotkeysConfig: {
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
},
|
},
|
||||||
memoizeKey: recordPickerInstanceId,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[openMultipleRecordPicker, performSearch, pushFocusItemToFocusStack],
|
[openMultipleRecordPicker, performSearch, pushFocusItemToFocusStack],
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import { useSingleRecordPickerOpen } from '@/object-record/record-picker/single-
|
|||||||
import { singleRecordPickerSelectedIdComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerSelectedIdComponentState';
|
import { singleRecordPickerSelectedIdComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerSelectedIdComponentState';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
import { getRecordFieldInputInstanceId } from '@/object-record/utils/getRecordFieldInputId';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
import { usePushFocusItemToFocusStack } from '@/ui/utilities/focus/hooks/usePushFocusItemToFocusStack';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
@ -58,9 +57,9 @@ export const useOpenRelationToOneFieldInput = () => {
|
|||||||
type: FocusComponentType.OPENED_FIELD_INPUT,
|
type: FocusComponentType.OPENED_FIELD_INPUT,
|
||||||
instanceId: recordPickerInstanceId,
|
instanceId: recordPickerInstanceId,
|
||||||
},
|
},
|
||||||
// TODO: Remove this once we've fully migrated away from hotkey scopes
|
globalHotkeysConfig: {
|
||||||
hotkeyScope: { scope: DropdownHotkeyScope.Dropdown },
|
enableGlobalHotkeysConflictingWithKeyboard: false,
|
||||||
memoizeKey: recordPickerInstanceId,
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[openSingleRecordPicker, pushFocusItemToFocusStack],
|
[openSingleRecordPicker, pushFocusItemToFocusStack],
|
||||||
|
|||||||
@ -14,7 +14,6 @@ export const useRegisterInputEvents = <T>({
|
|||||||
onShiftTab,
|
onShiftTab,
|
||||||
onClickOutside,
|
onClickOutside,
|
||||||
focusId,
|
focusId,
|
||||||
hotkeyScope,
|
|
||||||
}: {
|
}: {
|
||||||
inputRef: React.RefObject<any>;
|
inputRef: React.RefObject<any>;
|
||||||
copyRef?: React.RefObject<any>;
|
copyRef?: React.RefObject<any>;
|
||||||
@ -25,15 +24,14 @@ export const useRegisterInputEvents = <T>({
|
|||||||
onShiftTab?: (inputValue: T) => void;
|
onShiftTab?: (inputValue: T) => void;
|
||||||
onClickOutside?: (event: MouseEvent | TouchEvent, inputValue: T) => void;
|
onClickOutside?: (event: MouseEvent | TouchEvent, inputValue: T) => void;
|
||||||
focusId: string;
|
focusId: string;
|
||||||
hotkeyScope: string;
|
|
||||||
}) => {
|
}) => {
|
||||||
useListenClickOutside({
|
useListenClickOutside({
|
||||||
refs: [inputRef, copyRef].filter(isDefined),
|
refs: [inputRef, copyRef].filter(isDefined),
|
||||||
callback: (event) => {
|
callback: (event) => {
|
||||||
onClickOutside?.(event, inputValue);
|
onClickOutside?.(event, inputValue);
|
||||||
},
|
},
|
||||||
|
listenerId: focusId,
|
||||||
enabled: isDefined(onClickOutside),
|
enabled: isDefined(onClickOutside),
|
||||||
listenerId: hotkeyScope,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
useHotkeysOnFocusedElement({
|
useHotkeysOnFocusedElement({
|
||||||
@ -42,7 +40,6 @@ export const useRegisterInputEvents = <T>({
|
|||||||
onEnter?.(inputValue);
|
onEnter?.(inputValue);
|
||||||
},
|
},
|
||||||
focusId,
|
focusId,
|
||||||
scope: hotkeyScope,
|
|
||||||
dependencies: [onEnter, inputValue],
|
dependencies: [onEnter, inputValue],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -52,7 +49,6 @@ export const useRegisterInputEvents = <T>({
|
|||||||
onEscape?.(inputValue);
|
onEscape?.(inputValue);
|
||||||
},
|
},
|
||||||
focusId,
|
focusId,
|
||||||
scope: hotkeyScope,
|
|
||||||
dependencies: [onEscape, inputValue],
|
dependencies: [onEscape, inputValue],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -62,7 +58,6 @@ export const useRegisterInputEvents = <T>({
|
|||||||
onTab?.(inputValue);
|
onTab?.(inputValue);
|
||||||
},
|
},
|
||||||
focusId,
|
focusId,
|
||||||
scope: hotkeyScope,
|
|
||||||
dependencies: [onTab, inputValue],
|
dependencies: [onTab, inputValue],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -72,7 +67,6 @@ export const useRegisterInputEvents = <T>({
|
|||||||
onShiftTab?.(inputValue);
|
onShiftTab?.(inputValue);
|
||||||
},
|
},
|
||||||
focusId,
|
focusId,
|
||||||
scope: hotkeyScope,
|
|
||||||
dependencies: [onShiftTab, inputValue],
|
dependencies: [onShiftTab, inputValue],
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
|
||||||
import { PageFocusId } from '@/types/PageFocusId';
|
import { PageFocusId } from '@/types/PageFocusId';
|
||||||
import { useResetFocusStackToFocusItem } from '@/ui/utilities/focus/hooks/useResetFocusStackToFocusItem';
|
import { useResetFocusStackToFocusItem } from '@/ui/utilities/focus/hooks/useResetFocusStackToFocusItem';
|
||||||
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
import { FocusComponentType } from '@/ui/utilities/focus/types/FocusComponentType';
|
||||||
@ -18,15 +17,6 @@ export const useResetFocusStackToRecordIndex = () => {
|
|||||||
enableGlobalHotkeysWithModifiers: true,
|
enableGlobalHotkeysWithModifiers: true,
|
||||||
enableGlobalHotkeysConflictingWithKeyboard: true,
|
enableGlobalHotkeysConflictingWithKeyboard: true,
|
||||||
},
|
},
|
||||||
memoizeKey: 'global',
|
|
||||||
},
|
|
||||||
hotkeyScope: {
|
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
customScopes: {
|
|
||||||
goto: true,
|
|
||||||
keyboardShortcutMenu: true,
|
|
||||||
searchRecords: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
export enum RecordIndexHotkeyScope {
|
|
||||||
RecordIndex = 'record-index',
|
|
||||||
}
|
|
||||||
@ -15,9 +15,9 @@ import { useOpenFieldInputEditMode } from '@/object-record/record-field/hooks/us
|
|||||||
|
|
||||||
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
|
||||||
import { isInlineCellInEditModeScopedState } from '@/object-record/record-inline-cell/states/isInlineCellInEditModeScopedState';
|
import { isInlineCellInEditModeScopedState } from '@/object-record/record-inline-cell/states/isInlineCellInEditModeScopedState';
|
||||||
import { DEFAULT_CELL_SCOPE } from '@/object-record/record-table/record-table-cell/hooks/useOpenRecordTableCellV2';
|
import { getDropdownFocusIdForRecordField } from '@/object-record/utils/getDropdownFocusIdForRecordField';
|
||||||
import { useGoBackToPreviousDropdownFocusId } from '@/ui/layout/dropdown/hooks/useGoBackToPreviousDropdownFocusId';
|
import { useGoBackToPreviousDropdownFocusId } from '@/ui/layout/dropdown/hooks/useGoBackToPreviousDropdownFocusId';
|
||||||
import { currentHotkeyScopeState } from '@/ui/utilities/hotkey/states/internal/currentHotkeyScopeState';
|
import { currentFocusIdSelector } from '@/ui/utilities/focus/states/currentFocusIdSelector';
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
import { useRecoilCallback, useSetRecoilState } from 'recoil';
|
import { useRecoilCallback, useSetRecoilState } from 'recoil';
|
||||||
import { useIcons } from 'twenty-ui/display';
|
import { useIcons } from 'twenty-ui/display';
|
||||||
@ -129,11 +129,17 @@ export const RecordInlineCell = ({
|
|||||||
const handleClickOutside: FieldInputClickOutsideEvent = useRecoilCallback(
|
const handleClickOutside: FieldInputClickOutsideEvent = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
(persistField, event) => {
|
(persistField, event) => {
|
||||||
const hotkeyScope = snapshot
|
const currentFocusId = snapshot
|
||||||
.getLoadable(currentHotkeyScopeState)
|
.getLoadable(currentFocusIdSelector)
|
||||||
.getValue();
|
.getValue();
|
||||||
|
|
||||||
if (hotkeyScope.scope !== DEFAULT_CELL_SCOPE.scope) {
|
const expectedFocusId = getDropdownFocusIdForRecordField(
|
||||||
|
recordId,
|
||||||
|
fieldDefinition.fieldMetadataId,
|
||||||
|
'inline-cell',
|
||||||
|
);
|
||||||
|
|
||||||
|
if (currentFocusId !== expectedFocusId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@ -142,7 +148,7 @@ export const RecordInlineCell = ({
|
|||||||
persistField();
|
persistField();
|
||||||
closeInlineCell();
|
closeInlineCell();
|
||||||
},
|
},
|
||||||
[closeInlineCell],
|
[closeInlineCell, recordId, fieldDefinition.fieldMetadataId],
|
||||||
);
|
);
|
||||||
|
|
||||||
const { getIcon } = useIcons();
|
const { getIcon } = useIcons();
|
||||||
|
|||||||
@ -1,10 +0,0 @@
|
|||||||
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
|
||||||
import { createFamilyState } from '@/ui/utilities/state/utils/createFamilyState';
|
|
||||||
|
|
||||||
export const customEditHotkeyScopeForFieldScopedState = createFamilyState<
|
|
||||||
HotkeyScope | null,
|
|
||||||
string
|
|
||||||
>({
|
|
||||||
key: 'customEditHotkeyScopeForFieldScopedState',
|
|
||||||
defaultValue: null,
|
|
||||||
});
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
|
||||||
import { createFamilyState } from '@/ui/utilities/state/utils/createFamilyState';
|
|
||||||
|
|
||||||
export const parentHotkeyScopeForFieldScopedState = createFamilyState<
|
|
||||||
HotkeyScope | null,
|
|
||||||
string
|
|
||||||
>({
|
|
||||||
key: 'parentHotkeyScopeForFieldScopedState',
|
|
||||||
defaultValue: null,
|
|
||||||
});
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
export enum InlineCellHotkeyScope {
|
|
||||||
InlineCell = 'inline-cell',
|
|
||||||
}
|
|
||||||
@ -11,7 +11,6 @@ import { useHasObjectReadOnlyPermission } from '@/settings/roles/hooks/useHasObj
|
|||||||
import { CreateNewButton } from '@/ui/input/relation-picker/components/CreateNewButton';
|
import { CreateNewButton } from '@/ui/input/relation-picker/components/CreateNewButton';
|
||||||
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
@ -91,7 +90,6 @@ export const MultipleRecordPicker = ({
|
|||||||
handleSubmit();
|
handleSubmit();
|
||||||
},
|
},
|
||||||
focusId,
|
focusId,
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
|
||||||
dependencies: [handleSubmit],
|
dependencies: [handleSubmit],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import { multipleRecordPickerPickableRecordIdsMatchingSearchComponentSelector }
|
|||||||
import { getMultipleRecordPickerSelectableListId } from '@/object-record/record-picker/multiple-record-picker/utils/getMultipleRecordPickerSelectableListId';
|
import { getMultipleRecordPickerSelectableListId } from '@/object-record/record-picker/multiple-record-picker/utils/getMultipleRecordPickerSelectableListId';
|
||||||
import { RecordPickerPickableMorphItem } from '@/object-record/record-picker/types/RecordPickerPickableMorphItem';
|
import { RecordPickerPickableMorphItem } from '@/object-record/record-picker/types/RecordPickerPickableMorphItem';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList';
|
||||||
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
||||||
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
|
||||||
@ -99,7 +98,6 @@ export const MultipleRecordPickerMenuItems = ({
|
|||||||
selectableListInstanceId={selectableListComponentInstanceId}
|
selectableListInstanceId={selectableListComponentInstanceId}
|
||||||
selectableItemIdArray={pickableRecordIds}
|
selectableItemIdArray={pickableRecordIds}
|
||||||
focusId={focusId}
|
focusId={focusId}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
>
|
>
|
||||||
{pickableRecordIds.map((recordId) => {
|
{pickableRecordIds.map((recordId) => {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -10,9 +10,10 @@ import { RecordPickerNoRecordFoundMenuItem } from '@/object-record/record-picker
|
|||||||
import { SingleRecordPickerMenuItem } from '@/object-record/record-picker/single-record-picker/components/SingleRecordPickerMenuItem';
|
import { SingleRecordPickerMenuItem } from '@/object-record/record-picker/single-record-picker/components/SingleRecordPickerMenuItem';
|
||||||
import { SingleRecordPickerComponentInstanceContext } from '@/object-record/record-picker/single-record-picker/states/contexts/SingleRecordPickerComponentInstanceContext';
|
import { SingleRecordPickerComponentInstanceContext } from '@/object-record/record-picker/single-record-picker/states/contexts/SingleRecordPickerComponentInstanceContext';
|
||||||
import { singleRecordPickerSelectedIdComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerSelectedIdComponentState';
|
import { singleRecordPickerSelectedIdComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerSelectedIdComponentState';
|
||||||
|
import { singleRecordPickerShouldShowInitialLoadingComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerShouldShowInitialLoadingComponentState';
|
||||||
|
import { singleRecordPickerShouldShowSkeletonComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerShouldShowSkeletonComponentState';
|
||||||
import { SingleRecordPickerRecord } from '@/object-record/record-picker/single-record-picker/types/SingleRecordPickerRecord';
|
import { SingleRecordPickerRecord } from '@/object-record/record-picker/single-record-picker/types/SingleRecordPickerRecord';
|
||||||
import { getSingleRecordPickerSelectableListId } from '@/object-record/record-picker/single-record-picker/utils/getSingleRecordPickerSelectableListId';
|
import { getSingleRecordPickerSelectableListId } from '@/object-record/record-picker/single-record-picker/utils/getSingleRecordPickerSelectableListId';
|
||||||
import { DropdownHotkeyScope } from '@/ui/layout/dropdown/constants/DropdownHotkeyScope';
|
|
||||||
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
|
||||||
import { isSelectedItemIdComponentFamilySelector } from '@/ui/layout/selectable-list/states/selectors/isSelectedItemIdComponentFamilySelector';
|
import { isSelectedItemIdComponentFamilySelector } from '@/ui/layout/selectable-list/states/selectors/isSelectedItemIdComponentFamilySelector';
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
@ -23,8 +24,6 @@ import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/
|
|||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
import { IconComponent } from 'twenty-ui/display';
|
import { IconComponent } from 'twenty-ui/display';
|
||||||
import { MenuItemSelect } from 'twenty-ui/navigation';
|
import { MenuItemSelect } from 'twenty-ui/navigation';
|
||||||
import { singleRecordPickerShouldShowInitialLoadingComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerShouldShowInitialLoadingComponentState';
|
|
||||||
import { singleRecordPickerShouldShowSkeletonComponentState } from '@/object-record/record-picker/single-record-picker/states/singleRecordPickerShouldShowSkeletonComponentState';
|
|
||||||
|
|
||||||
export type SingleRecordPickerMenuItemsProps = {
|
export type SingleRecordPickerMenuItemsProps = {
|
||||||
EmptyIcon?: IconComponent;
|
EmptyIcon?: IconComponent;
|
||||||
@ -77,7 +76,6 @@ export const SingleRecordPickerMenuItems = ({
|
|||||||
onCancel?.();
|
onCancel?.();
|
||||||
},
|
},
|
||||||
focusId,
|
focusId,
|
||||||
scope: DropdownHotkeyScope.Dropdown,
|
|
||||||
dependencies: [onCancel, resetSelectedItem],
|
dependencies: [onCancel, resetSelectedItem],
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -101,7 +99,6 @@ export const SingleRecordPickerMenuItems = ({
|
|||||||
<SelectableList
|
<SelectableList
|
||||||
selectableListInstanceId={selectableListComponentInstanceId}
|
selectableListInstanceId={selectableListComponentInstanceId}
|
||||||
selectableItemIdArray={selectableItemIds}
|
selectableItemIdArray={selectableItemIds}
|
||||||
hotkeyScope={DropdownHotkeyScope.Dropdown}
|
|
||||||
focusId={focusId}
|
focusId={focusId}
|
||||||
>
|
>
|
||||||
{emptyLabel && (
|
{emptyLabel && (
|
||||||
|
|||||||
@ -1,19 +1,17 @@
|
|||||||
import styled from '@emotion/styled';
|
|
||||||
import { useRecoilCallback } from 'recoil';
|
|
||||||
|
|
||||||
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
|
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { RecordTable } from '@/object-record/record-table/components/RecordTable';
|
import { RecordTable } from '@/object-record/record-table/components/RecordTable';
|
||||||
|
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
||||||
|
import { RecordTableContextProvider } from '@/object-record/record-table/components/RecordTableContextProvider';
|
||||||
import { EntityDeleteContext } from '@/object-record/record-table/contexts/EntityDeleteHookContext';
|
import { EntityDeleteContext } from '@/object-record/record-table/contexts/EntityDeleteHookContext';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
|
import { PageFocusId } from '@/types/PageFocusId';
|
||||||
|
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
||||||
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
|
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
|
||||||
import { useSaveCurrentViewFields } from '@/views/hooks/useSaveCurrentViewFields';
|
import { useSaveCurrentViewFields } from '@/views/hooks/useSaveCurrentViewFields';
|
||||||
import { mapColumnDefinitionsToViewFields } from '@/views/utils/mapColumnDefinitionToViewField';
|
import { mapColumnDefinitionsToViewFields } from '@/views/utils/mapColumnDefinitionToViewField';
|
||||||
|
import styled from '@emotion/styled';
|
||||||
import { RecordIndexHotkeyScope } from '@/object-record/record-index/types/RecordIndexHotkeyScope';
|
import { useRecoilCallback } from 'recoil';
|
||||||
import { RecordTableComponentInstance } from '@/object-record/record-table/components/RecordTableComponentInstance';
|
|
||||||
import { RecordTableContextProvider } from '@/object-record/record-table/components/RecordTableContextProvider';
|
|
||||||
import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement';
|
|
||||||
import { RecordUpdateContext } from '../contexts/EntityUpdateMutationHookContext';
|
import { RecordUpdateContext } from '../contexts/EntityUpdateMutationHookContext';
|
||||||
import { useRecordTable } from '../hooks/useRecordTable';
|
import { useRecordTable } from '../hooks/useRecordTable';
|
||||||
|
|
||||||
@ -50,8 +48,7 @@ export const RecordTableWithWrappers = ({
|
|||||||
useHotkeysOnFocusedElement({
|
useHotkeysOnFocusedElement({
|
||||||
keys: ['ctrl+a,meta+a'],
|
keys: ['ctrl+a,meta+a'],
|
||||||
callback: handleSelectAllRows,
|
callback: handleSelectAllRows,
|
||||||
focusId: recordTableId,
|
focusId: PageFocusId.RecordIndex,
|
||||||
scope: RecordIndexHotkeyScope.RecordIndex,
|
|
||||||
dependencies: [handleSelectAllRows],
|
dependencies: [handleSelectAllRows],
|
||||||
options: {
|
options: {
|
||||||
enableOnFormTags: false,
|
enableOnFormTags: false,
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
|
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
|
||||||
|
import { useResetTableRowSelection } from '@/object-record/record-table/hooks/internal/useResetTableRowSelection';
|
||||||
import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState';
|
import { isRowSelectedComponentFamilyState } from '@/object-record/record-table/record-table-row/states/isRowSelectedComponentFamilyState';
|
||||||
import { allRowsSelectedStatusComponentSelector } from '@/object-record/record-table/states/selectors/allRowsSelectedStatusComponentSelector';
|
import { allRowsSelectedStatusComponentSelector } from '@/object-record/record-table/states/selectors/allRowsSelectedStatusComponentSelector';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
@ -20,6 +21,8 @@ export const useSelectAllRows = (recordTableId?: string) => {
|
|||||||
recordTableId,
|
recordTableId,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const resetTableRowSelection = useResetTableRowSelection(recordTableId);
|
||||||
|
|
||||||
const selectAllRows = useRecoilCallback(
|
const selectAllRows = useRecoilCallback(
|
||||||
({ set, snapshot }) =>
|
({ set, snapshot }) =>
|
||||||
() => {
|
() => {
|
||||||
@ -33,6 +36,10 @@ export const useSelectAllRows = (recordTableId?: string) => {
|
|||||||
recordIndexAllRecordIdsSelector,
|
recordIndexAllRecordIdsSelector,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (allRowsSelectedStatus === 'all') {
|
||||||
|
resetTableRowSelection();
|
||||||
|
}
|
||||||
|
|
||||||
for (const recordId of allRecordIds) {
|
for (const recordId of allRecordIds) {
|
||||||
const isSelected =
|
const isSelected =
|
||||||
allRowsSelectedStatus === 'none' ||
|
allRowsSelectedStatus === 'none' ||
|
||||||
@ -44,6 +51,7 @@ export const useSelectAllRows = (recordTableId?: string) => {
|
|||||||
[
|
[
|
||||||
allRowsSelectedStatusSelector,
|
allRowsSelectedStatusSelector,
|
||||||
recordIndexAllRecordIdsSelector,
|
recordIndexAllRecordIdsSelector,
|
||||||
|
resetTableRowSelection,
|
||||||
isRowSelectedFamilyState,
|
isRowSelectedFamilyState,
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user