import styled from '@emotion/styled'; import { Button, ButtonGroup, IconButton, IconChevronDown, IconPlus, MenuItem, } from 'twenty-ui'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { UPDATE_VIEW_BUTTON_DROPDOWN_ID } from '@/views/constants/UpdateViewButtonDropdownId'; import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryParams'; import { useAreViewFilterGroupsDifferentFromRecordFilterGroups } from '@/views/hooks/useAreViewFilterGroupsDifferentFromRecordFilterGroups'; import { useAreViewFiltersDifferentFromRecordFilters } from '@/views/hooks/useAreViewFiltersDifferentFromRecordFilters'; import { useAreViewSortsDifferentFromRecordSorts } from '@/views/hooks/useAreViewSortsDifferentFromRecordSorts'; import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; import { useSaveCurrentViewFiltersAndSorts } from '@/views/hooks/useSaveCurrentViewFiltersAndSorts'; import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId'; import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode'; import { viewPickerReferenceViewIdComponentState } from '@/views/view-picker/states/viewPickerReferenceViewIdComponentState'; import { t } from '@lingui/core/macro'; const StyledContainer = styled.div` border-radius: ${({ theme }) => theme.border.radius.md}; display: inline-flex; margin-right: ${({ theme }) => theme.spacing(2)}; position: relative; `; export type UpdateViewButtonGroupProps = { hotkeyScope: HotkeyScope; }; export const UpdateViewButtonGroup = ({ hotkeyScope, }: UpdateViewButtonGroupProps) => { const { saveCurrentViewFilterAndSorts } = useSaveCurrentViewFiltersAndSorts(); const { setViewPickerMode } = useViewPickerMode(); const currentViewId = useRecoilComponentValueV2( contextStoreCurrentViewIdComponentState, ); const { closeDropdown: closeUpdateViewButtonDropdown } = useDropdown( UPDATE_VIEW_BUTTON_DROPDOWN_ID, ); const { openDropdown: openViewPickerDropdown } = useDropdown( VIEW_PICKER_DROPDOWN_ID, ); const { currentView } = useGetCurrentViewOnly(); const setViewPickerReferenceViewId = useSetRecoilComponentStateV2( viewPickerReferenceViewIdComponentState, ); const openViewPickerInCreateMode = () => { if (!currentViewId) { return; } openViewPickerDropdown(); setViewPickerReferenceViewId(currentViewId); setViewPickerMode('create-from-current'); closeUpdateViewButtonDropdown(); }; const handleCreateViewClick = () => { openViewPickerInCreateMode(); }; const handleSaveAsNewViewClick = () => { openViewPickerInCreateMode(); }; const handleUpdateViewClick = async () => { await saveCurrentViewFilterAndSorts(); }; const { hasFiltersQueryParams } = useViewFromQueryParams(); const { viewFilterGroupsAreDifferentFromRecordFilterGroups } = useAreViewFilterGroupsDifferentFromRecordFilterGroups(); const { viewFiltersAreDifferentFromRecordFilters } = useAreViewFiltersDifferentFromRecordFilters(); const { viewSortsAreDifferentFromRecordSorts } = useAreViewSortsDifferentFromRecordSorts(); const canShowButton = (viewFiltersAreDifferentFromRecordFilters || viewSortsAreDifferentFromRecordSorts || viewFilterGroupsAreDifferentFromRecordFilterGroups) && !hasFiltersQueryParams; if (!canShowButton) { return <>; } return ( {currentView?.key !== 'INDEX' ? (