refactor: remove "core" naming from views and eliminate converter layer (#18667)

## Summary

- **Remove all "core" prefixes** from the views system — the
metadata-based storage migration is complete, so `CoreView`,
`coreViewsSelector`, `getCoreViews`, etc. are now just `View`,
`viewsSelector`, `getViews`
- **Eliminate the entire converter layer** (15 files, ~850 lines
deleted) — `convertCoreViewToView` and all sub-converters were either
no-ops or trivially adding `__typename` / mapping identical enum values.
Local enums now re-export from generated GraphQL types directly (single
source of truth)
- **Unify `View` and `ViewWithRelations`** into one type —
`ViewWithRelations` is now a type alias for `View`, selectors return
data directly without conversion

### Backend
- Rename `@ObjectType('CoreView')` → `@ObjectType('View')` (and all
sub-entities)
- Rename resolver methods: `getCoreViews` → `getViews`, `createCoreView`
→ `createView`, etc.
- Rename `FIND_ALL_CORE_VIEWS_GRAPHQL_OPERATION` →
`FIND_ALL_VIEWS_GRAPHQL_OPERATION`

### Frontend
- Delete 15 converter files (`convertGqlView*ToView*`,
`convertView*ToGql`, `convertViewWithRelationsToView`)
- Re-export `ViewType`, `ViewKey`, `ViewFilterGroupLogicalOperator` from
generated enums (no more duplicate enum definitions with different
casing)
- Replace `ViewOpenRecordInType` with `ViewOpenRecordIn` from generated
- Remove `__typename` from all local view sub-types
- Remove unused `variant` from `ViewFilter`, make `displayValue` and
`definition` optional
- Rename ~45 GraphQL query/mutation files and all selectors to drop
"core" prefix
- Delete unused `viewsWithRelationsSelector`
This commit is contained in:
Charles Bochet
2026-03-16 09:57:18 +01:00
committed by GitHub
parent 6340b9e2f7
commit 5c745059ad
440 changed files with 2934 additions and 3856 deletions
@@ -1,9 +1,9 @@
/* oxlint-disable no-console, lingui/no-unlocalized-strings */
import { graphqlRequest, writeGeneratedFile } from './utils.js';
const FIND_ALL_CORE_VIEWS_QUERY = `
query FindAllCoreViews {
getCoreViews {
const FIND_ALL_VIEWS_QUERY = `
query FindAllViews {
getViews {
id
name
objectMetadataId
@@ -101,19 +101,19 @@ export const generateViews = async (token: string) => {
const data = (await graphqlRequest(
'/metadata',
FIND_ALL_CORE_VIEWS_QUERY,
FIND_ALL_VIEWS_QUERY,
token,
)) as {
getCoreViews: Record<string, unknown>[];
getViews: Record<string, unknown>[];
};
console.log(` Got ${data.getCoreViews.length} views.`);
console.log(` Got ${data.getViews.length} views.`);
writeGeneratedFile(
'metadata/views/mock-views-data.ts',
'mockedCoreViews',
'CoreViewWithRelations[]',
"import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';",
data.getCoreViews,
'mockedViews',
'ViewWithRelations[]',
"import { type ViewWithRelations } from '@/views/types/ViewWithRelations';",
data.getViews,
);
};
File diff suppressed because one or more lines are too long
@@ -15,7 +15,7 @@ import { recordStoreFamilySelector } from '@/object-record/record-store/states/s
import { getTabListInstanceIdFromPageLayoutId } from '@/page-layout/utils/getTabListInstanceIdFromPageLayoutId';
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
import { useStore } from 'jotai';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
export const useGetBrowsingContext = () => {
const store = useStore();
@@ -102,7 +102,7 @@ export const useGetBrowsingContext = () => {
);
const currentView = store.get(
coreViewFromViewIdFamilySelector.selectorFamily({
viewFromViewIdFamilySelector.selectorFamily({
viewId: currentViewId ?? '',
}),
);
@@ -6,7 +6,7 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat
import { useShowAuthModal } from '@/ui/layout/hooks/useShowAuthModal';
import { useAtomFamilyStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilyStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { useLocation, useParams, useSearchParams } from 'react-router-dom';
import { AppPath } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
@@ -62,7 +62,7 @@ export const MainContextStoreProvider = () => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const metadataStore = useAtomFamilyStateValue(metadataStoreState, 'views');
const coreViews = useAtomStateValue(coreViewsSelector);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
@@ -72,7 +72,7 @@ export const MainContextStoreProvider = () => {
const { getLastVisitedViewIdFromObjectNamePlural } = useLastVisitedView();
const viewIdQueryParamView = coreViews.find(
const viewIdQueryParamView = views.find(
(view) => view.id === viewIdQueryParamRaw,
);
@@ -86,7 +86,7 @@ export const MainContextStoreProvider = () => {
objectMetadataItem?.namePlural ?? '',
);
const lastVisitedView = coreViews.find(
const lastVisitedView = views.find(
(view) => view.id === lastVisitedViewIdRaw,
);
@@ -96,13 +96,13 @@ export const MainContextStoreProvider = () => {
? lastVisitedViewIdRaw
: undefined;
const indexViewId = coreViews.find(
const indexViewId = views.find(
(view) =>
view.objectMetadataId === objectMetadataItem?.id &&
view.key === ViewKey.INDEX,
)?.id;
const firstAvailableViewId = coreViews.find(
const firstAvailableViewId = views.find(
(view) =>
view.objectMetadataId === objectMetadataItem?.id &&
view.type !== ViewType.FIELDS_WIDGET,
@@ -8,7 +8,7 @@ import { useSetLastVisitedViewForObjectMetadataNamePlural } from '@/navigation/h
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useAtomComponentState';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { useEffect } from 'react';
type MainContextStoreProviderEffectProps = {
@@ -52,7 +52,7 @@ export const MainContextStoreProviderEffect = ({
MAIN_CONTEXT_STORE_INSTANCE_ID,
);
const view = useAtomFamilySelectorValue(coreViewFromViewIdFamilySelector, {
const view = useAtomFamilySelectorValue(viewFromViewIdFamilySelector, {
viewId: viewId ?? '',
});
@@ -18,7 +18,7 @@ export const getViewType = ({
}
if (isRecordIndexPage) {
return view?.type === ViewType.Kanban
return view?.type === ViewType.KANBAN
? ContextStoreViewType.Kanban
: ContextStoreViewType.Table;
}
@@ -12,7 +12,7 @@ export const useLoadMockedMinimalMetadata = () => {
resetMetadataStore();
const [
{ generatedMockObjectMetadataItems },
{ mockedCoreViews },
{ mockedViews },
{ mockedNavigationMenuItems },
] = await Promise.all([
import('~/testing/utils/generatedMockObjectMetadataItems'),
@@ -37,7 +37,7 @@ export const useLoadMockedMinimalMetadata = () => {
flatViewGroups,
flatViewFilterGroups,
flatViewFieldGroups,
} = splitViewWithRelated(mockedCoreViews);
} = splitViewWithRelated(mockedViews);
updateDraft('views', flatViews, MOCKED_COLLECTION_HASH);
updateDraft('viewFields', flatViewFields, MOCKED_COLLECTION_HASH);
@@ -12,9 +12,9 @@ import { useStore } from 'jotai';
import { useCallback } from 'react';
import { isDefined } from 'twenty-shared/utils';
import {
FindAllCoreViewsDocument,
FindAllViewsDocument,
FindAllRecordPageLayoutsDocument,
FindFieldsWidgetCoreViewsDocument,
FindFieldsWidgetViewsDocument,
FindManyLogicFunctionsDocument,
FindManyNavigationMenuItemsDocument,
type ObjectMetadataItemsQuery,
@@ -91,19 +91,19 @@ export const useLoadStaleMetadataEntities = () => {
fetchPromises.push(
Promise.all([
client.query({
query: FindAllCoreViewsDocument,
query: FindAllViewsDocument,
variables: { viewTypes: INDEX_VIEW_TYPES },
fetchPolicy: 'network-only',
}),
client.query({
query: FindFieldsWidgetCoreViewsDocument,
query: FindFieldsWidgetViewsDocument,
variables: { viewTypes: FIELDS_WIDGET_VIEW_TYPES },
fetchPolicy: 'network-only',
}),
]).then(([indexViewsResult, fieldsWidgetViewsResult]) => {
const allViews = [
...(indexViewsResult.data?.getCoreViews ?? []),
...(fieldsWidgetViewsResult.data?.getCoreViews ?? []),
...(indexViewsResult.data?.getViews ?? []),
...(fieldsWidgetViewsResult.data?.getViews ?? []),
];
const {
@@ -1,7 +1,7 @@
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
export type FlatView = Omit<
CoreViewWithRelations,
ViewWithRelations,
| 'viewFields'
| 'viewFieldGroups'
| 'viewGroups'
@@ -1,5 +1,5 @@
import { type CoreViewFieldEssential } from '@/views/types/CoreViewWithRelations';
import { type ViewFieldEssential } from '@/views/types/ViewWithRelations';
export type FlatViewField = CoreViewFieldEssential & {
export type FlatViewField = ViewFieldEssential & {
viewId: string;
};
@@ -1,6 +1,3 @@
import { type CoreViewFieldGroupEssential } from '@/views/types/CoreViewWithRelations';
import { type ViewFieldGroupEssential } from '@/views/types/ViewWithRelations';
export type FlatViewFieldGroup = Omit<
CoreViewFieldGroupEssential,
'viewFields'
>;
export type FlatViewFieldGroup = Omit<ViewFieldGroupEssential, 'viewFields'>;
@@ -1,5 +1,5 @@
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
export type FlatViewFilter = CoreViewWithRelations['viewFilters'][number] & {
export type FlatViewFilter = ViewWithRelations['viewFilters'][number] & {
viewId: string;
};
@@ -1,7 +1,7 @@
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
type ViewFilterGroupRelation = NonNullable<
CoreViewWithRelations['viewFilterGroups']
ViewWithRelations['viewFilterGroups']
>[number];
export type FlatViewFilterGroup = ViewFilterGroupRelation;
@@ -1,5 +1,5 @@
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
export type FlatViewGroup = CoreViewWithRelations['viewGroups'][number] & {
export type FlatViewGroup = ViewWithRelations['viewGroups'][number] & {
viewId: string;
};
@@ -1,5 +1,5 @@
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
export type FlatViewSort = CoreViewWithRelations['viewSorts'][number] & {
export type FlatViewSort = ViewWithRelations['viewSorts'][number] & {
viewId: string;
};
@@ -5,7 +5,7 @@ import { type FlatViewFilter } from '@/metadata-store/types/FlatViewFilter';
import { type FlatViewFilterGroup } from '@/metadata-store/types/FlatViewFilterGroup';
import { type FlatViewGroup } from '@/metadata-store/types/FlatViewGroup';
import { type FlatViewSort } from '@/metadata-store/types/FlatViewSort';
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
type SplitResult = {
flatViews: FlatView[];
@@ -18,7 +18,7 @@ type SplitResult = {
};
export const splitViewWithRelated = (
viewsWithRelated: CoreViewWithRelations[],
viewsWithRelated: ViewWithRelations[],
): SplitResult => {
const flatViews: FlatView[] = [];
const flatViewFields: FlatViewField[] = [];
@@ -31,7 +31,7 @@ export const NavigationMenuItemIcon = ({
navigationMenuItem.itemType === NavigationMenuItemType.RECORD;
const isViewWithOverlay =
navigationMenuItem.itemType === NavigationMenuItemType.VIEW &&
navigationMenuItem.viewKey !== ViewKey.Index;
navigationMenuItem.viewKey !== ViewKey.INDEX;
const objectMetadataItem = objectMetadataItems.find(
(item) => item.nameSingular === navigationMenuItem.objectNameSingular,
@@ -57,7 +57,7 @@ export const WorkspaceNavigationMenuItemFolderDragClone = ({
>
<NavigationDrawerSubItem
secondaryLabel={
navigationMenuItem.viewKey === ViewKey.Index
navigationMenuItem.viewKey === ViewKey.INDEX
? undefined
: getNavigationMenuItemSecondaryLabel({
objectMetadataItems,
@@ -11,9 +11,8 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat
import { NavigationDrawerSubItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSubItem';
import { getNavigationSubItemLeftAdornment } from '@/ui/navigation/navigation-drawer/utils/getNavigationSubItemLeftAdornment';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { ViewKey } from '@/views/types/ViewKey';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
type WorkspaceNavigationMenuItemFolderSubItemProps = {
navigationMenuItem: ProcessedNavigationMenuItem;
@@ -38,8 +37,7 @@ export const WorkspaceNavigationMenuItemFolderSubItem = ({
isNavigationMenuInEditModeState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const coreViews = useAtomStateValue(coreViewsSelector);
const views = coreViews.map(convertCoreViewToView);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItem =
navigationMenuItem.itemType === NavigationMenuItemType.VIEW ||
navigationMenuItem.itemType === NavigationMenuItemType.RECORD
@@ -67,7 +65,7 @@ export const WorkspaceNavigationMenuItemFolderSubItem = ({
return (
<NavigationDrawerSubItem
secondaryLabel={
navigationMenuItem.viewKey === ViewKey.Index
navigationMenuItem.viewKey === ViewKey.INDEX
? undefined
: getNavigationMenuItemSecondaryLabel({
objectMetadataItems,
@@ -24,8 +24,7 @@ import { validateAndExtractWorkspaceFolderId } from '@/navigation-menu-item/util
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { useStore } from 'jotai';
export const useHandleAddToNavigationDrop = () => {
@@ -42,7 +41,7 @@ export const useHandleAddToNavigationDrop = () => {
const { openNavigationMenuItemInSidePanel } =
useOpenNavigationMenuItemInSidePanel();
const { objectMetadataItems } = useObjectMetadataItems();
const coreViews = useAtomStateValue(coreViewsSelector);
const views = useAtomStateValue(viewsSelector);
const { getIcon } = useIcons();
const setIsNavigationMenuInEditMode = useSetAtomState(
isNavigationMenuInEditModeState,
@@ -128,7 +127,6 @@ export const useHandleAddToNavigationDrop = () => {
return;
}
case NavigationMenuItemType.OBJECT: {
const views = coreViews.map(convertCoreViewToView);
const objectMetadataIdsInWorkspace = getObjectMetadataIdsInDraft(
currentDraft,
views,
@@ -159,7 +157,6 @@ export const useHandleAddToNavigationDrop = () => {
return;
}
case NavigationMenuItemType.VIEW: {
const views = coreViews.map(convertCoreViewToView);
const view = views.find((v) => v.id === payload.viewId);
const viewObjectMetadataItem = view
? objectMetadataItems.find(
@@ -214,7 +211,7 @@ export const useHandleAddToNavigationDrop = () => {
addObjectToDraft,
addRecordToDraft,
addViewToDraft,
coreViews,
views,
getIcon,
navigationMenuItemsDraft,
objectMetadataItems,
@@ -6,8 +6,7 @@ import { recordIdentifierToObjectRecordIdentifier } from '@/navigation-menu-item
import { sortNavigationMenuItems } from '@/navigation-menu-item/utils/sortNavigationMenuItems';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { type ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useNavigationMenuItemsData } from './useNavigationMenuItemsData';
@@ -26,14 +25,12 @@ type NavigationMenuItemFolderEntry = Pick<
>;
export const useNavigationMenuItemsByFolder = () => {
const coreViews = useAtomStateValue(coreViewsSelector);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const { navigationMenuItems, workspaceNavigationMenuItems } =
useNavigationMenuItemsData();
const views = coreViews.map(convertCoreViewToView);
const allNavigationMenuItems = [
...workspaceNavigationMenuItems,
...navigationMenuItems,
@@ -2,9 +2,8 @@ import { isDefined } from 'twenty-shared/utils';
import { getObjectMetadataIdsInDraft } from '@/navigation-menu-item/utils/getObjectMetadataIdsInDraft';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { ViewKey } from '@/views/types/ViewKey';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
type NavigationMenuItemDraft = {
id?: string;
@@ -15,8 +14,7 @@ type NavigationMenuItemDraft = {
export const useNavigationMenuObjectMetadataFromDraft = (
currentDraft: NavigationMenuItemDraft[],
) => {
const coreViews = useAtomStateValue(coreViewsSelector);
const views = coreViews.map(convertCoreViewToView);
const views = useAtomStateValue(viewsSelector);
const objectMetadataIdsInWorkspace = getObjectMetadataIdsInDraft(
currentDraft,
@@ -25,7 +23,7 @@ export const useNavigationMenuObjectMetadataFromDraft = (
const objectMetadataIdsWithIndexView = new Set(
views
.filter((view) => view.key === ViewKey.Index)
.filter((view) => view.key === ViewKey.INDEX)
.map((view) => view.objectMetadataId),
);
@@ -7,7 +7,7 @@ export const useObjectNavItemColor = (objectNameSingular: string): string => {
const objectNavItem = items.find(
(item) =>
'viewKey' in item &&
item.viewKey === ViewKey.Index &&
item.viewKey === ViewKey.INDEX &&
item.objectNameSingular === objectNameSingular,
);
return (
@@ -2,13 +2,11 @@ import { useSelectedNavigationMenuItemEditItem } from '@/navigation-menu-item/ho
import { getObjectMetadataForNavigationMenuItem } from '@/navigation-menu-item/utils/getObjectMetadataForNavigationMenuItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
export const useSelectedNavigationMenuItemEditItemObjectMetadata = () => {
const { selectedItem } = useSelectedNavigationMenuItemEditItem();
const coreViews = useAtomStateValue(coreViewsSelector);
const views = coreViews.map(convertCoreViewToView);
const views = useAtomStateValue(viewsSelector);
const { objectMetadataItems } = useObjectMetadataItems();
const selectedItemObjectMetadata = selectedItem
@@ -7,8 +7,7 @@ import { recordIdentifierToObjectRecordIdentifier } from '@/navigation-menu-item
import { sortNavigationMenuItems } from '@/navigation-menu-item/utils/sortNavigationMenuItems';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { type ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useNavigationMenuItemsData } from './useNavigationMenuItemsData';
@@ -16,9 +15,7 @@ import { useNavigationMenuItemsData } from './useNavigationMenuItemsData';
export const useSortedNavigationMenuItems = () => {
const { navigationMenuItems, workspaceNavigationMenuItems } =
useNavigationMenuItemsData();
const coreViews = useAtomStateValue(coreViewsSelector).map(
convertCoreViewToView,
);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const targetRecordIdentifiers = useMemo(() => {
@@ -67,13 +64,13 @@ export const useSortedNavigationMenuItems = () => {
return sortNavigationMenuItems(
navigationMenuItems,
true,
coreViews,
views,
objectMetadataItems,
targetRecordIdentifiers,
);
}, [
navigationMenuItems,
coreViews,
views,
objectMetadataItems,
targetRecordIdentifiers,
]);
@@ -87,7 +84,7 @@ export const useSortedNavigationMenuItems = () => {
return true;
}
if (isDefined(item.viewId)) {
return coreViews.some((view) => view.id === item.viewId);
return views.some((view) => view.id === item.viewId);
}
const itemTargetRecordId = item.targetRecordId;
@@ -101,13 +98,13 @@ export const useSortedNavigationMenuItems = () => {
return sortNavigationMenuItems(
filtered,
true,
coreViews,
views,
objectMetadataItems,
targetRecordIdentifiers,
);
}, [
workspaceNavigationMenuItems,
coreViews,
views,
objectMetadataItems,
targetRecordIdentifiers,
]);
@@ -4,8 +4,7 @@ import { isNavigationMenuItemFolder } from '@/navigation-menu-item/utils/isNavig
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { isDefined } from 'twenty-shared/utils';
import { useNavigationMenuItemsData } from './useNavigationMenuItemsData';
@@ -15,9 +14,7 @@ export const useWorkspaceNavigationMenuItems = (): {
} => {
const { workspaceNavigationMenuItems: rawWorkspaceNavigationMenuItems } =
useNavigationMenuItemsData();
const coreViews = useAtomStateValue(coreViewsSelector);
const views = coreViews.map(convertCoreViewToView);
const views = useAtomStateValue(viewsSelector);
const workspaceFolderIds = useMemo(
() =>
@@ -10,8 +10,7 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { isDefined } from 'twenty-shared/utils';
import { useNavigationMenuItemsByFolder } from './useNavigationMenuItemsByFolder';
@@ -35,12 +34,10 @@ export const useWorkspaceSectionItems = (): FlatWorkspaceItem[] => {
const { workspaceNavigationMenuItemsSorted } = useSortedNavigationMenuItems();
const { workspaceNavigationMenuItemsByFolder } =
useNavigationMenuItemsByFolder();
const coreViews = useAtomStateValue(coreViewsSelector);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const views = coreViews.map(convertCoreViewToView);
const flatWorkspaceItems = workspaceNavigationMenuItems
.filter((item) => !isDefined(item.folderId))
.sort((a, b) => a.position - b.position);
@@ -37,7 +37,7 @@ describe('sortNavigationMenuItems', () => {
name: 'All People',
objectMetadataId: 'metadata-id',
icon: 'IconUser',
key: ViewKey.Index,
key: ViewKey.INDEX,
};
const mockObjectRecordIdentifier: ObjectRecordIdentifier = {
@@ -42,7 +42,7 @@ export const sortNavigationMenuItems = (
const namePlural = objectMetadataItem.namePlural;
const isIndexView = view.key === ViewKey.Index;
const isIndexView = view.key === ViewKey.INDEX;
const labelIdentifier =
isIndexView && isDefined(objectMetadataItem)
? objectMetadataItem.labelPlural
@@ -16,7 +16,7 @@ import {
import { mockedUserData } from '~/testing/mock-data/users';
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
import { getMockObjectMetadataItemOrThrow } from '~/testing/utils/getMockObjectMetadataItemOrThrow';
import { setTestCoreViewsInMetadataStore } from '~/testing/utils/setTestCoreViewsInMetadataStore';
import { setTestViewsInMetadataStore } from '~/testing/utils/setTestViewsInMetadataStore';
import { setTestObjectMetadataItemsInMetadataStore } from '~/testing/utils/setTestObjectMetadataItemsInMetadataStore';
const Wrapper = ({ children }: { children: ReactNode }) =>
@@ -43,7 +43,7 @@ const renderHooks = ({
useEffect(() => {
if (withExistingView) {
setTestCoreViewsInMetadataStore(jotaiStore, [
setTestViewsInMetadataStore(jotaiStore, [
{
id: 'viewId',
name: 'Test View',
@@ -68,7 +68,7 @@ const renderHooks = ({
},
]);
} else {
setTestCoreViewsInMetadataStore(jotaiStore, []);
setTestViewsInMetadataStore(jotaiStore, []);
}
if (withCurrentUser) {
@@ -5,8 +5,7 @@ import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilte
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
import { getObjectPermissionsFromMapByObjectMetadataId } from '@/settings/roles/role-permissions/objects-permissions/utils/getObjectPermissionsFromMapByObjectMetadataId';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import isEmpty from 'lodash.isempty';
import { useCallback, useMemo } from 'react';
import { AppPath, SettingsPath } from 'twenty-shared/types';
@@ -43,17 +42,15 @@ export const useDefaultHomePagePath = () => {
[readableAlphaSortedActiveNonSystemObjectMetadataItems],
);
const coreViews = useAtomStateValue(coreViewsSelector);
const views = useAtomStateValue(viewsSelector);
const getFirstView = useCallback(
(objectMetadataItemId: string | undefined | null) => {
const views = coreViews.map(convertCoreViewToView);
return views.find(
(view) => view.objectMetadataId === objectMetadataItemId,
);
},
[coreViews],
[views],
);
const firstObjectPathInfo = useMemo<ObjectPathInfo | null>(() => {
@@ -1,7 +1,7 @@
import { lastVisitedViewPerObjectMetadataItemState } from '@/navigation/states/lastVisitedViewPerObjectMetadataItemState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
import { useCallback } from 'react';
import { isDefined } from 'twenty-shared/utils';
import { useStore } from 'jotai';
@@ -16,11 +16,9 @@ export const useSetLastVisitedViewForObjectMetadataNamePlural = () => {
objectNamePlural: string;
viewId: string;
}) => {
const views = store.get(coreViewsSelector.atom);
const views = store.get(viewsSelector.atom);
const view = views.find(
(view: CoreViewWithRelations) => view.id === viewId,
);
const view = views.find((view: ViewWithRelations) => view.id === viewId);
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
@@ -82,7 +82,7 @@ export const NavigationDrawerItemForObjectMetadataItem = ({
const isViewWithCustomName =
isView &&
navigationMenuItem?.viewKey !== ViewKey.Index &&
navigationMenuItem?.viewKey !== ViewKey.INDEX &&
isDefined(navigationMenuItem?.labelIdentifier);
const label = isRecord
@@ -4,8 +4,7 @@ import { NavigationDrawerItemForObjectMetadataItem } from '@/object-metadata/com
import type { WorkspaceSectionItemContentProps } from '@/object-metadata/components/WorkspaceSectionItemContentProps';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
type NavigationDrawerSectionForWorkspaceItemObjectContentProps =
WorkspaceSectionItemContentProps;
@@ -17,8 +16,7 @@ export const NavigationDrawerSectionForWorkspaceItemObjectContent = ({
onActiveObjectMetadataItemClick,
}: NavigationDrawerSectionForWorkspaceItemObjectContentProps) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const coreViews = useAtomStateValue(coreViewsSelector);
const views = coreViews.map(convertCoreViewToView);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItem = getObjectMetadataForNavigationMenuItem(
item as ProcessedNavigationMenuItem,
objectMetadataItems,
@@ -24,8 +24,7 @@ import { NavigationDrawerSection } from '@/ui/navigation/navigation-drawer/compo
import { NavigationDrawerSectionTitle } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSectionTitle';
import { useNavigationSection } from '@/ui/navigation/navigation-drawer/hooks/useNavigationSection';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { styled } from '@linaria/react';
import { themeCssVariables } from 'twenty-ui/theme-constants';
@@ -64,8 +63,7 @@ export const NavigationDrawerSectionForWorkspaceItems = ({
);
const { toggleNavigationSection, isNavigationSectionOpen } =
useNavigationSection('Workspace');
const coreViews = useAtomStateValue(coreViewsSelector);
const views = coreViews.map(convertCoreViewToView);
const views = useAtomStateValue(viewsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
@@ -1,11 +1,11 @@
import {
CreateOneObjectMetadataItemDocument,
FindManyCoreViewsDocument,
FindManyViewsDocument,
} from '~/generated-metadata/graphql';
export const query = CreateOneObjectMetadataItemDocument;
export const findManyCoreViewsQuery = FindManyCoreViewsDocument;
export const findManyViewsQuery = FindManyViewsDocument;
export const variables = {
input: {
@@ -4,7 +4,7 @@ import { useCreateOneObjectMetadataItem } from '@/object-metadata/hooks/useCreat
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
import {
findManyCoreViewsQuery,
findManyViewsQuery,
query,
responseData,
variables,
@@ -52,14 +52,14 @@ const mocks = [
},
{
request: {
query: findManyCoreViewsQuery,
query: findManyViewsQuery,
variables: {
objectMetadataId: responseData.id,
},
},
result: jest.fn(() => ({
data: {
getCoreViews: [],
getViews: [],
},
})),
},
@@ -10,10 +10,10 @@ import {
import { jestExpectSuccessfulMetadataRequestResult } from '@/object-metadata/hooks/__tests__/utils/jest-expect-metadata-request-status.util';
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
import { FIND_ALL_CORE_VIEWS } from '@/views/graphql/queries/findAllCoreViews';
import { FIND_ALL_VIEWS } from '@/views/graphql/queries/findAllViews';
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
import { mockedUserData } from '~/testing/mock-data/users';
import { mockedCoreViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import { mockedViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import {
query as findManyObjectMetadataItemsQuery,
responseData as findManyObjectMetadataItemsResponseData,
@@ -44,12 +44,12 @@ const mocks = [
},
{
request: {
query: FIND_ALL_CORE_VIEWS,
query: FIND_ALL_VIEWS,
variables: {},
},
result: jest.fn(() => ({
data: {
getCoreViews: mockedCoreViews,
getViews: mockedViews,
},
})),
},
@@ -6,7 +6,7 @@ import { recordIndexOpenRecordInState } from '@/object-record/record-index/state
import { type ObjectRecord } from '@/object-record/types/ObjectRecord';
import { canOpenObjectInSidePanel } from '@/object-record/utils/canOpenObjectInSidePanel';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
import { t } from '@lingui/core/macro';
import { type MouseEvent } from 'react';
import { isDefined } from 'twenty-shared/utils';
@@ -62,13 +62,13 @@ export const RecordChip = ({
);
const canOpenInSidePanel = canOpenObjectInSidePanel(objectNameSingular);
const isSidePanelViewOpenRecordInType =
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL &&
const isSidePanelViewOpenRecordIn =
recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL &&
canOpenInSidePanel;
const handleCustomClick = isDefined(onClick)
? onClick
: isSidePanelViewOpenRecordInType
: isSidePanelViewOpenRecordIn
? (_event: MouseEvent<HTMLElement>) => {
openRecordInSidePanel({
recordId: record.id,
@@ -14,7 +14,7 @@ import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState';
import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { coreViewsFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector';
import { viewsFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/viewsFromObjectMetadataItemFamilySelector';
import { ViewKey } from '@/views/types/ViewKey';
import { ViewType, viewTypeIconMapping } from '@/views/types/ViewType';
import { useDestroyViewFromCurrentState } from '@/views/view-picker/hooks/useDestroyViewFromCurrentState';
@@ -51,7 +51,7 @@ export const ObjectOptionsDropdownCustomView = ({
const customViewData = currentView
? {
...currentView,
key: ViewKey.Custom,
key: null,
name: currentView.name || t`Custom View`,
}
: null;
@@ -67,11 +67,11 @@ export const ObjectOptionsDropdownCustomView = ({
: undefined;
const viewsOnCurrentObject = useAtomFamilySelectorValue(
coreViewsFromObjectMetadataItemFamilySelector,
viewsFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: objectMetadataItem.id },
);
const isDefaultView = currentView?.key === ViewKey.Index;
const isDefaultView = currentView?.key === ViewKey.INDEX;
const isLastView = viewsOnCurrentObject.length <= 1;
const recordIndexCalendarLayout = useAtomStateValue(
@@ -106,10 +106,10 @@ export const ObjectOptionsDropdownCustomView = ({
'Layout',
'Visibility',
'Fields',
...(customViewData?.type === ViewType.Calendar
...(customViewData?.type === ViewType.CALENDAR
? ['CalendarDateField', 'CalendarView']
: []),
...(customViewData?.type !== ViewType.Calendar ? ['Group'] : []),
...(customViewData?.type !== ViewType.CALENDAR ? ['Group'] : []),
'Delete view',
];
@@ -140,7 +140,7 @@ export const ObjectOptionsDropdownCustomView = ({
focused={selectedItemId === 'Layout'}
onClick={() => onContentChange('layout')}
LeftIcon={viewTypeIconMapping(
customViewData?.type ?? ViewType.Table,
customViewData?.type ?? ViewType.TABLE,
)}
text={t`Layout`}
contextualText={`${capitalize(customViewData?.type ?? '')}`}
@@ -169,7 +169,7 @@ export const ObjectOptionsDropdownCustomView = ({
</DropdownMenuItemsContainer>
<DropdownMenuSeparator />
<DropdownMenuItemsContainer scrollable={false}>
{customViewData?.type === ViewType.Calendar && (
{customViewData?.type === ViewType.CALENDAR && (
<>
<div id="calendar-date-field-picker-menu-item">
<SelectableListItem
@@ -227,7 +227,7 @@ export const ObjectOptionsDropdownCustomView = ({
hasSubMenu
/>
</SelectableListItem>
{customViewData?.type !== ViewType.Calendar && (
{customViewData?.type !== ViewType.CALENDAR && (
<div id="group-by-menu-item">
<SelectableListItem
itemId="Group"
@@ -17,7 +17,6 @@ import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/use
import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { useUpdateCurrentView } from '@/views/hooks/useUpdateCurrentView';
import { type GraphQLView } from '@/views/types/GraphQLView';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewType, viewTypeIconMapping } from '@/views/types/ViewType';
import { useGetAvailableFieldsForCalendar } from '@/views/view-picker/hooks/useGetAvailableFieldsForCalendar';
import { useGetAvailableFieldsToGroupRecordsBy } from '@/views/view-picker/hooks/useGetAvailableFieldsToGroupRecordsBy';
@@ -37,7 +36,10 @@ import {
OverflowingTextWithTooltip,
} from 'twenty-ui/display';
import { MenuItem, MenuItemSelect, MenuItemToggle } from 'twenty-ui/navigation';
import { ViewCalendarLayout } from '~/generated-metadata/graphql';
import {
ViewCalendarLayout,
ViewOpenRecordIn,
} from '~/generated-metadata/graphql';
export const ObjectOptionsDropdownLayoutContent = () => {
const { t } = useLingui();
@@ -92,8 +94,8 @@ export const ObjectOptionsDropdownLayoutContent = () => {
closeDropdown(dropdownId);
return;
}
if (currentView?.type !== ViewType.Kanban) {
await setAndPersistViewType(ViewType.Kanban);
if (currentView?.type !== ViewType.KANBAN) {
await setAndPersistViewType(ViewType.KANBAN);
}
};
@@ -106,8 +108,8 @@ export const ObjectOptionsDropdownLayoutContent = () => {
closeDropdown(dropdownId);
return;
}
if (currentView?.type !== ViewType.Calendar) {
await setAndPersistViewType(ViewType.Calendar);
if (currentView?.type !== ViewType.CALENDAR) {
await setAndPersistViewType(ViewType.CALENDAR);
}
};
@@ -115,15 +117,15 @@ export const ObjectOptionsDropdownLayoutContent = () => {
const nbsp = '\u00A0';
const selectableItemIdArray = [
ViewType.Table,
...(isDefaultView ? [] : [ViewType.Kanban]),
...(!isDefaultView ? [ViewType.Calendar] : []),
ViewOpenRecordInType.SIDE_PANEL,
...(currentView?.type === ViewType.Kanban ? ['Group'] : []),
...(currentView?.type === ViewType.Calendar
ViewType.TABLE,
...(isDefaultView ? [] : [ViewType.KANBAN]),
...(!isDefaultView ? [ViewType.CALENDAR] : []),
ViewOpenRecordIn.SIDE_PANEL,
...(currentView?.type === ViewType.KANBAN ? ['Group'] : []),
...(currentView?.type === ViewType.CALENDAR
? ['CalendarView', 'CalendarDateField']
: []),
...(currentView?.type !== ViewType.Table ? ['Compact view'] : []),
...(currentView?.type !== ViewType.TABLE ? ['Compact view'] : []),
];
const selectedItemId = useAtomComponentStateValue(
@@ -152,48 +154,48 @@ export const ObjectOptionsDropdownLayoutContent = () => {
>
<DropdownMenuItemsContainer scrollable={false}>
<SelectableListItem
itemId={ViewType.Table}
itemId={ViewType.TABLE}
onEnter={() => {
setAndPersistViewType(ViewType.Table);
setAndPersistViewType(ViewType.TABLE);
}}
>
<MenuItemSelect
LeftIcon={IconTable}
text={t`Table`}
selected={currentView?.type === ViewType.Table}
focused={selectedItemId === ViewType.Table}
selected={currentView?.type === ViewType.TABLE}
focused={selectedItemId === ViewType.TABLE}
onClick={async () => {
if (currentView?.type !== ViewType.Table) {
await setAndPersistViewType(ViewType.Table);
if (currentView?.type !== ViewType.TABLE) {
await setAndPersistViewType(ViewType.TABLE);
}
}}
/>
</SelectableListItem>
<SelectableListItem
itemId={ViewType.Calendar}
itemId={ViewType.CALENDAR}
onEnter={() => {
setAndPersistViewType(ViewType.Calendar);
setAndPersistViewType(ViewType.CALENDAR);
}}
>
<MenuItemSelect
LeftIcon={viewTypeIconMapping(ViewType.Calendar)}
LeftIcon={viewTypeIconMapping(ViewType.CALENDAR)}
text={t`Calendar`}
selected={currentView?.type === ViewType.Calendar}
focused={selectedItemId === ViewType.Calendar}
selected={currentView?.type === ViewType.CALENDAR}
focused={selectedItemId === ViewType.CALENDAR}
onClick={handleSelectCalendarViewType}
/>
</SelectableListItem>
<SelectableListItem
itemId={ViewType.Kanban}
itemId={ViewType.KANBAN}
onEnter={() => {
setAndPersistViewType(ViewType.Kanban);
setAndPersistViewType(ViewType.KANBAN);
}}
>
<MenuItemSelect
LeftIcon={viewTypeIconMapping(ViewType.Kanban)}
LeftIcon={viewTypeIconMapping(ViewType.KANBAN)}
text={t`Kanban`}
disabled={isDefaultView}
focused={selectedItemId === ViewType.Kanban}
focused={selectedItemId === ViewType.KANBAN}
contextualText={
isDefaultView ? (
<>
@@ -207,14 +209,14 @@ export const ObjectOptionsDropdownLayoutContent = () => {
) : undefined
}
contextualTextPosition="right"
selected={currentView?.type === ViewType.Kanban}
selected={currentView?.type === ViewType.KANBAN}
onClick={handleSelectKanbanViewType}
/>
</SelectableListItem>
</DropdownMenuItemsContainer>
<DropdownMenuSeparator />
<DropdownMenuItemsContainer scrollable={false}>
{currentView?.type === ViewType.Calendar && (
{currentView?.type === ViewType.CALENDAR && (
<>
<SelectableListItem
itemId="CalendarDateField"
@@ -253,15 +255,15 @@ export const ObjectOptionsDropdownLayoutContent = () => {
</>
)}
<SelectableListItem
itemId={ViewOpenRecordInType.SIDE_PANEL}
itemId={ViewOpenRecordIn.SIDE_PANEL}
onEnter={() => {
onContentChange('layoutOpenIn');
}}
>
<MenuItem
focused={selectedItemId === ViewOpenRecordInType.SIDE_PANEL}
focused={selectedItemId === ViewOpenRecordIn.SIDE_PANEL}
LeftIcon={
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL
recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL
? IconLayoutSidebarRight
: IconLayoutNavbar
}
@@ -270,7 +272,7 @@ export const ObjectOptionsDropdownLayoutContent = () => {
onContentChange('layoutOpenIn');
}}
contextualText={
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL
recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL
? t`Side Panel`
: t`Record Page`
}
@@ -278,7 +280,7 @@ export const ObjectOptionsDropdownLayoutContent = () => {
hasSubMenu
/>
</SelectableListItem>
{currentView?.type === ViewType.Kanban && (
{currentView?.type === ViewType.KANBAN && (
<SelectableListItem
itemId="Group"
onEnter={() => {
@@ -302,7 +304,7 @@ export const ObjectOptionsDropdownLayoutContent = () => {
/>
</SelectableListItem>
)}
{currentView?.type !== ViewType.Table && (
{currentView?.type !== ViewType.TABLE && (
<SelectableListItem
itemId="Compact view"
onEnter={() => {
@@ -14,7 +14,7 @@ import { selectedItemIdComponentState } from '@/ui/layout/selectable-list/states
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
import { t } from '@lingui/core/macro';
import {
IconChevronLeft,
@@ -41,8 +41,8 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => {
);
const selectableItemIdArray = [
ViewOpenRecordInType.SIDE_PANEL,
ViewOpenRecordInType.RECORD_PAGE,
ViewOpenRecordIn.SIDE_PANEL,
ViewOpenRecordIn.RECORD_PAGE,
];
return (
@@ -64,13 +64,13 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => {
selectableItemIdArray={selectableItemIdArray}
>
<SelectableListItem
itemId={ViewOpenRecordInType.SIDE_PANEL}
itemId={ViewOpenRecordIn.SIDE_PANEL}
onEnter={() => {
if (!canOpenInSidePanel) {
return;
}
setAndPersistOpenRecordIn(
ViewOpenRecordInType.SIDE_PANEL,
ViewOpenRecordIn.SIDE_PANEL,
currentView,
);
}}
@@ -78,17 +78,15 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => {
<MenuItemSelect
LeftIcon={IconLayoutSidebarRight}
text={t`Side Panel`}
selected={
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL
}
focused={selectedItemId === ViewOpenRecordInType.SIDE_PANEL}
selected={recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL}
focused={selectedItemId === ViewOpenRecordIn.SIDE_PANEL}
onClick={() => {
if (!canOpenInSidePanel) {
return;
}
setAndPersistOpenRecordIn(
ViewOpenRecordInType.SIDE_PANEL,
ViewOpenRecordIn.SIDE_PANEL,
currentView,
);
}}
@@ -96,10 +94,10 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => {
/>
</SelectableListItem>
<SelectableListItem
itemId={ViewOpenRecordInType.RECORD_PAGE}
itemId={ViewOpenRecordIn.RECORD_PAGE}
onEnter={() =>
setAndPersistOpenRecordIn(
ViewOpenRecordInType.RECORD_PAGE,
ViewOpenRecordIn.RECORD_PAGE,
currentView,
)
}
@@ -108,15 +106,15 @@ export const ObjectOptionsDropdownLayoutOpenInContent = () => {
LeftIcon={IconLayoutNavbar}
text={t`Record Page`}
selected={
recordIndexOpenRecordIn === ViewOpenRecordInType.RECORD_PAGE
recordIndexOpenRecordIn === ViewOpenRecordIn.RECORD_PAGE
}
onClick={() =>
setAndPersistOpenRecordIn(
ViewOpenRecordInType.RECORD_PAGE,
ViewOpenRecordIn.RECORD_PAGE,
currentView,
)
}
focused={selectedItemId === ViewOpenRecordInType.RECORD_PAGE}
focused={selectedItemId === ViewOpenRecordIn.RECORD_PAGE}
/>
</SelectableListItem>
</SelectableList>
@@ -6,7 +6,7 @@ import { ViewKey } from '@/views/types/ViewKey';
export const ObjectOptionsDropdownMenuContent = () => {
const { currentView } = useGetCurrentViewOnly();
const isDefaultView = currentView?.key === ViewKey.Index;
const isDefaultView = currentView?.key === ViewKey.INDEX;
if (isDefaultView) {
return <ObjectOptionsDropdownDefaultView />;
@@ -127,7 +127,7 @@ export const ObjectOptionsDropdownRecordGroupFieldsContent = () => {
/>
<DropdownMenuSeparator />
<DropdownMenuItemsContainer>
{viewType === ViewType.Table && (
{viewType === ViewType.TABLE && (
<MenuItemSelect
text={t`None`}
selected={!isDefined(recordIndexGroupFieldMetadataItem)}
@@ -108,7 +108,7 @@ const createStory = (contentId: ObjectOptionsContentId | null): Story => ({
>
<ObjectOptionsDropdownContext.Provider
value={{
viewType: ViewType.Table,
viewType: ViewType.TABLE,
objectMetadataItem: companyObjectMetadataItem,
recordIndexId: instanceId,
currentContentId: contentId,
@@ -5,10 +5,9 @@ import { useRecordIndexContextOrThrow } from '@/object-record/record-index/conte
import { useLoadRecordIndexStates } from '@/object-record/record-index/hooks/useLoadRecordIndexStates';
import { recordIndexViewTypeState } from '@/object-record/record-index/states/recordIndexViewTypeState';
import { useUpdateCurrentView } from '@/views/hooks/useUpdateCurrentView';
import { coreViewsSelector } from '@/views/states/selectors/coreViewsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { type GraphQLView } from '@/views/types/GraphQLView';
import { ViewType, viewTypeIconMapping } from '@/views/types/ViewType';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { useGetAvailableFieldsForCalendar } from '@/views/view-picker/hooks/useGetAvailableFieldsForCalendar';
import { useGetAvailableFieldsToGroupRecordsBy } from '@/views/view-picker/hooks/useGetAvailableFieldsToGroupRecordsBy';
import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState';
@@ -38,27 +37,25 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => {
}),
);
const existingCoreViews = store.get(coreViewsSelector.atom);
const existingViews = store.get(viewsSelector.atom);
if (!isDefined(currentViewId)) {
throw new Error('No view id found');
}
const currentCoreView = existingCoreViews.find(
(coreView) => coreView.id === currentViewId,
const currentView = existingViews.find(
(view) => view.id === currentViewId,
);
if (!isDefined(currentCoreView)) {
if (!isDefined(currentView)) {
throw new Error('No current view found');
}
const currentView = convertCoreViewToView(currentCoreView);
const updateCurrentViewParams: Partial<GraphQLView> = {};
updateCurrentViewParams.type = viewType;
switch (viewType) {
case ViewType.Kanban: {
case ViewType.KANBAN: {
if (availableFieldsForGrouping.length === 0) {
throw new Error('No fields for kanban - should not happen');
}
@@ -76,7 +73,7 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => {
await updateCurrentView(updateCurrentViewParams);
return;
}
case ViewType.Table: {
case ViewType.TABLE: {
if (shouldChangeIcon(currentView.icon, currentView.type)) {
updateCurrentViewParams.icon =
viewTypeIconMapping(viewType).displayName;
@@ -86,7 +83,7 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => {
setRecordIndexViewType(viewType);
return;
}
case ViewType.Calendar: {
case ViewType.CALENDAR: {
if (availableFieldsForCalendar.length === 0) {
throw new Error('No date fields for calendar');
}
@@ -115,7 +112,7 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => {
updateCurrentViewParams.mainGroupByFieldMetadataId = null;
return await updateCurrentView(updateCurrentViewParams);
}
case ViewType.FieldsWidget: {
case ViewType.FIELDS_WIDGET: {
return;
}
default: {
@@ -139,20 +136,20 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => {
oldViewType: ViewType,
): boolean => {
if (
oldViewType === ViewType.Kanban &&
oldIcon === viewTypeIconMapping(ViewType.Kanban).displayName
oldViewType === ViewType.KANBAN &&
oldIcon === viewTypeIconMapping(ViewType.KANBAN).displayName
) {
return true;
}
if (
oldViewType === ViewType.Table &&
oldIcon === viewTypeIconMapping(ViewType.Table).displayName
oldViewType === ViewType.TABLE &&
oldIcon === viewTypeIconMapping(ViewType.TABLE).displayName
) {
return true;
}
if (
oldViewType === ViewType.Calendar &&
oldIcon === viewTypeIconMapping(ViewType.Calendar).displayName
oldViewType === ViewType.CALENDAR &&
oldIcon === viewTypeIconMapping(ViewType.CALENDAR).displayName
) {
return true;
}
@@ -4,7 +4,7 @@ import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomStat
import { useStore } from 'jotai';
import { useUpdateCurrentView } from '@/views/hooks/useUpdateCurrentView';
import { type GraphQLView } from '@/views/types/GraphQLView';
import { type ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { type ViewOpenRecordIn } from '~/generated-metadata/graphql';
import { viewPickerInputNameComponentState } from '@/views/view-picker/states/viewPickerInputNameComponentState';
import { viewPickerSelectedIconComponentState } from '@/views/view-picker/states/viewPickerSelectedIconComponentState';
import { useCallback } from 'react';
@@ -27,7 +27,7 @@ export const useUpdateObjectViewOptions = () => {
const { updateCurrentView } = useUpdateCurrentView();
const setAndPersistOpenRecordIn = useCallback(
(openRecordIn: ViewOpenRecordInType, view: GraphQLView | undefined) => {
(openRecordIn: ViewOpenRecordIn, view: GraphQLView | undefined) => {
if (!view) return;
setRecordIndexOpenRecordIn(openRecordIn);
store.set(recordIndexOpenRecordInState.atom, openRecordIn);
@@ -16,7 +16,7 @@ const StyledColumnContainer = styled.div`
export const RecordBoardColumns = () => {
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
visibleRecordGroupIdsComponentFamilySelector,
ViewType.Kanban,
ViewType.KANBAN,
);
return (
@@ -41,7 +41,7 @@ export const RecordBoardFetchMoreInViewTriggerComponent = () => {
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
visibleRecordGroupIdsComponentFamilySelector,
ViewType.Kanban,
ViewType.KANBAN,
);
const componentWidth =
@@ -29,7 +29,7 @@ const StyledHeaderContainer = styled.div`
export const RecordBoardHeader = () => {
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
visibleRecordGroupIdsComponentFamilySelector,
ViewType.Kanban,
ViewType.KANBAN,
);
return (
@@ -24,7 +24,7 @@ export const useRecordBoardCardNavigation = (recordBoardId?: string) => {
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
visibleRecordGroupIdsComponentFamilySelector,
ViewType.Kanban,
ViewType.KANBAN,
);
const recordIdsByGroupState = useAtomComponentFamilyStateCallbackState(
@@ -17,7 +17,7 @@ import { useAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useAtomC
import { useAtomFamilyStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilyStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
import { styled } from '@linaria/react';
import { useContext } from 'react';
import { themeCssVariables } from 'twenty-ui/theme-constants';
@@ -76,7 +76,7 @@ export const RecordBoardCardHeader = () => {
const recordStore = useAtomFamilyStateValue(recordStoreFamilyState, recordId);
const triggerEvent =
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL
recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL
? 'CLICK'
: 'MOUSE_DOWN';
@@ -6,7 +6,7 @@ import { MenuItem } from 'twenty-ui/navigation';
export const RecordBoardColumnDropdownMenu = () => {
const recordGroupActions = useRecordGroupActions({
viewType: ViewType.Kanban,
viewType: ViewType.KANBAN,
});
return (
@@ -25,9 +25,9 @@ import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorato
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { mockedCoreViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import { mockedViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
import { setTestCoreViewsInMetadataStore } from '~/testing/utils/setTestCoreViewsInMetadataStore';
import { setTestViewsInMetadataStore } from '~/testing/utils/setTestViewsInMetadataStore';
const meta: Meta<typeof RecordCalendarMonth> = {
title: 'Modules/ObjectRecord/RecordCalendar/Month',
@@ -44,9 +44,7 @@ const meta: Meta<typeof RecordCalendarMonth> = {
instanceId,
);
const mockCoreView = mockedCoreViews.find(
(v) => v.name === 'All Companies',
)!;
const mockView = mockedViews.find((v) => v.name === 'All Companies')!;
const setContextStoreCurrentViewId = useSetAtomComponentState(
contextStoreCurrentViewIdComponentState,
@@ -71,14 +69,14 @@ const meta: Meta<typeof RecordCalendarMonth> = {
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
setTestCoreViewsInMetadataStore(jotaiStore, [mockCoreView]);
setContextStoreCurrentViewId(mockCoreView.id);
setTestViewsInMetadataStore(jotaiStore, [mockView]);
setContextStoreCurrentViewId(mockView.id);
setCurrentRecordFields(columns);
setIsLoaded(true);
}, [
setContextStoreCurrentViewId,
setCurrentRecordFields,
mockCoreView,
mockView,
columns,
]);
@@ -22,7 +22,7 @@ import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDrop
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector';
import { indexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/indexViewIdFromObjectMetadataItemFamilySelector';
import { useLingui } from '@lingui/react/macro';
import {
AppPath,
@@ -107,7 +107,7 @@ export const RecordDetailRelationSection = ({
);
const indexViewId = useAtomFamilySelectorValue(
coreIndexViewIdFromObjectMetadataItemFamilySelector,
indexViewIdFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: relationObjectMetadataItem.id },
);
@@ -54,7 +54,7 @@ export const RecordIndexContainer = () => {
<ObjectOptionsDropdown
recordIndexId={recordIndexId}
objectMetadataItem={objectMetadataItem}
viewType={recordIndexViewType ?? ViewType.Table}
viewType={recordIndexViewType ?? ViewType.TABLE}
/>
}
/>
@@ -64,12 +64,12 @@ export const RecordIndexContainer = () => {
/>
</SpreadsheetImportProvider>
<RecordIndexFiltersToContextStoreEffect />
{recordIndexViewType === ViewType.Table && (
{recordIndexViewType === ViewType.TABLE && (
<>
<RecordIndexTableContainer recordTableId={recordIndexId} />
</>
)}
{recordIndexViewType === ViewType.Kanban && (
{recordIndexViewType === ViewType.KANBAN && (
<StyledContainerWithPadding>
<RecordBoardContainer
recordBoardId={recordIndexId}
@@ -78,7 +78,7 @@ export const RecordIndexContainer = () => {
/>
</StyledContainerWithPadding>
)}
{recordIndexViewType === ViewType.Calendar && (
{recordIndexViewType === ViewType.CALENDAR && (
<StyledContainerWithPadding>
<RecordIndexCalendarContainer
recordCalendarInstanceId={recordIndexId}
@@ -4,7 +4,7 @@ import { useLoadRecordIndexStates } from '@/object-record/record-index/hooks/use
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { useCreateDefaultViewForObject } from '@/views/hooks/useCreateDefaultViewForObject';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { useEffect, useState } from 'react';
import { isDefined } from 'twenty-shared/utils';
@@ -18,7 +18,7 @@ export const RecordIndexLoadBaseOnContextStoreEffect = () => {
undefined,
);
const view = useAtomFamilySelectorValue(coreViewFromViewIdFamilySelector, {
const view = useAtomFamilySelectorValue(viewFromViewIdFamilySelector, {
viewId: contextStoreCurrentViewId ?? '',
});
@@ -5,7 +5,7 @@ import { useNavigationMenuItemsData } from '@/navigation-menu-item/hooks/useNavi
import { getStandardObjectIconColor } from '@/navigation-menu-item/utils/getStandardObjectIconColor';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector';
import { indexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/indexViewIdFromObjectMetadataItemFamilySelector';
import { isDefined } from 'twenty-shared/utils';
import { useIcons } from 'twenty-ui/display';
@@ -16,7 +16,7 @@ export const RecordIndexPageHeaderIcon = ({
}) => {
const { workspaceNavigationMenuItems } = useNavigationMenuItemsData();
const coreIndexViewId = useAtomFamilySelectorValue(
coreIndexViewIdFromObjectMetadataItemFamilySelector,
indexViewIdFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: objectMetadataItem?.id ?? '' },
);
const { getIcon } = useIcons();
@@ -109,7 +109,7 @@ describe('useRecordData', () => {
pageSize: 30,
callback,
delayMs: 0,
viewType: ViewType.Kanban,
viewType: ViewType.KANBAN,
}),
{
wrapper: Wrapper,
@@ -51,7 +51,7 @@ export const useRecordIndexLazyFetchRecords = ({
pageSize = EXPORT_TABLE_DATA_DEFAULT_PAGE_SIZE,
recordIndexId,
callback,
viewType = ViewType.Table,
viewType = ViewType.TABLE,
}: UseRecordDataOptions) => {
const { hiddenBoardFields } = useObjectOptionsForBoard({
objectNameSingular: objectMetadataItem.nameSingular,
@@ -129,7 +129,7 @@ export const useRecordIndexLazyFetchRecords = ({
};
})
.filter(isDefined),
...(hiddenKanbanFieldColumn && viewType === ViewType.Kanban
...(hiddenKanbanFieldColumn && viewType === ViewType.KANBAN
? [hiddenKanbanFieldColumn]
: []),
];
@@ -7,12 +7,11 @@ import { useAtomComponentStateCallbackState } from '@/ui/utilities/state/jotai/h
import { usePerformViewAPIUpdate } from '@/views/hooks/internal/usePerformViewAPIUpdate';
import { useGetViewFromState } from '@/views/hooks/useGetViewFromState';
import { type ViewGroup } from '@/views/types/ViewGroup';
import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView';
import { useStore } from 'jotai';
import { useCallback } from 'react';
import { isDefined } from 'twenty-shared/utils';
import { v4 } from 'uuid';
import { type CoreView } from '~/generated-metadata/graphql';
import { type View as GqlView } from '~/generated-metadata/graphql';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
export const useHandleRecordGroupField = () => {
@@ -60,12 +59,11 @@ export const useHandleRecordGroupField = () => {
});
if (updatedViewResult.status === 'successful') {
const updatedCoreView = updatedViewResult.response.data
?.updateCoreView as CoreView;
const updatedView = updatedViewResult.response.data
?.updateView as GqlView;
if (isDefined(updatedCoreView)) {
const updatedViewConverted = convertCoreViewToView(updatedCoreView);
await loadRecordIndexStates(updatedViewConverted, objectMetadataItem);
if (isDefined(updatedView)) {
await loadRecordIndexStates(updatedView, objectMetadataItem);
}
}
@@ -84,7 +82,6 @@ export const useHandleRecordGroupField = () => {
.map(
(option, index) =>
({
__typename: 'ViewGroup',
id: v4(),
fieldValue: option.value,
isVisible: true,
@@ -97,7 +94,6 @@ export const useHandleRecordGroupField = () => {
fieldMetadataItem.isNullable === true
) {
viewGroupsToCreate.push({
__typename: 'ViewGroup',
id: v4(),
fieldValue: '',
isVisible: true,
@@ -9,7 +9,7 @@ import { recordIndexOpenRecordInState } from '@/object-record/record-index/state
import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
import { canOpenObjectInSidePanel } from '@/object-record/utils/canOpenObjectInSidePanel';
import { useAtomComponentStateCallbackState } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateCallbackState';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
import { useStore } from 'jotai';
import { useCallback } from 'react';
import { AppPath } from 'twenty-shared/types';
@@ -72,7 +72,7 @@ export const useOpenRecordFromIndexView = () => {
if (
!isMobile &&
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL &&
recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL &&
canOpenObjectInSidePanel(objectNameSingular)
) {
openRecordInSidePanel({
@@ -1,8 +1,7 @@
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { createAtomState } from '@/ui/utilities/state/jotai/utils/createAtomState';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
export const recordIndexOpenRecordInState =
createAtomState<ViewOpenRecordInType>({
key: 'recordIndexOpenRecordInState',
defaultValue: ViewOpenRecordInType.SIDE_PANEL,
});
export const recordIndexOpenRecordInState = createAtomState<ViewOpenRecordIn>({
key: 'recordIndexOpenRecordInState',
defaultValue: ViewOpenRecordIn.SIDE_PANEL,
});
@@ -12,10 +12,10 @@ import { RecordTableDecorator } from '~/testing/decorators/RecordTableDecorator'
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { graphqlMocks } from '~/testing/graphqlMocks';
import { mockedCompanyRecords } from '~/testing/mock-data/generated/data/companies/mock-companies-data';
import { mockedCoreViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import { mockedViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import { sleep } from '~/utils/sleep';
const companyView = mockedCoreViews.find((v) => v.name === 'All Companies')!;
const companyView = mockedViews.find((v) => v.name === 'All Companies')!;
const meta: Meta = {
title: 'Modules/ObjectRecord/RecordTable/RecordTable',
@@ -12,7 +12,7 @@ import { RECORD_TABLE_CELL_INPUT_ID_PREFIX } from '@/object-record/record-table/
import { RECORD_TABLE_COLUMN_MIN_WIDTH } from '@/object-record/record-table/constants/RecordTableColumnMinWidth';
import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
type RecordTableContextProviderProps = {
viewBarId: string;
@@ -47,7 +47,7 @@ export const RecordTableContextProvider = ({
recordIndexOpenRecordInState,
);
const triggerEvent =
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL
recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL
? 'CLICK'
: 'MOUSE_DOWN';
@@ -15,7 +15,7 @@ import { canOpenObjectInSidePanel } from '@/object-record/utils/canOpenObjectInS
import { useAtomComponentFamilyStateCallbackState } from '@/ui/utilities/state/jotai/hooks/useAtomComponentFamilyStateCallbackState';
import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
import { useStore } from 'jotai';
import { useCallback } from 'react';
import { AppPath } from 'twenty-shared/types';
@@ -88,7 +88,7 @@ export const useCreateNewIndexRecord = ({
});
if (
recordIndexOpenRecordIn === ViewOpenRecordInType.SIDE_PANEL &&
recordIndexOpenRecordIn === ViewOpenRecordIn.SIDE_PANEL &&
canOpenObjectInSidePanel(objectMetadataItem.nameSingular)
) {
openRecordInSidePanel({
@@ -26,7 +26,7 @@ export const RecordTableRecordGroupsBody = () => {
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
visibleRecordGroupIdsComponentFamilySelector,
ViewType.Table,
ViewType.TABLE,
);
if (isRecordTableInitialLoading && allRecordIds.length === 0) {
@@ -27,7 +27,7 @@ import { clickOutsideListenerIsActivatedComponentState } from '@/ui/utilities/po
import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState';
import { useStore } from 'jotai';
import { useCallback } from 'react';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { ViewOpenRecordIn } from '~/generated-metadata/graphql';
export type OpenTableCellArgs = {
initialValue?: string;
@@ -110,7 +110,7 @@ export const useOpenRecordTableCell = (recordTableId: string) => {
const openRecordIn = store.get(recordIndexOpenRecordInState.atom);
if (openRecordIn === ViewOpenRecordInType.SIDE_PANEL) {
if (openRecordIn === ViewOpenRecordIn.SIDE_PANEL) {
activateRecordTableRow(cellPosition.row);
unfocusRecordTableRow();
}
@@ -10,7 +10,7 @@ import { useCurrentWidget } from '@/page-layout/widgets/hooks/useCurrentWidget';
import { useTargetRecord } from '@/ui/layout/contexts/useTargetRecord';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector';
import { indexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/indexViewIdFromObjectMetadataItemFamilySelector';
import { styled } from '@linaria/react';
import { t } from '@lingui/core/macro';
import { Link } from 'react-router-dom';
@@ -94,7 +94,7 @@ export const WidgetActionFieldSeeAll = () => {
);
const indexViewId = useAtomFamilySelectorValue(
coreIndexViewIdFromObjectMetadataItemFamilySelector,
indexViewIdFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: relationObjectMetadataItem?.id ?? '' },
);
@@ -21,13 +21,13 @@ import { FieldsWidget } from '@/page-layout/widgets/fields/components/FieldsWidg
import { WidgetComponentInstanceContext } from '@/page-layout/widgets/states/contexts/WidgetComponentInstanceContext';
import { LayoutRenderingProvider } from '@/ui/layout/contexts/LayoutRenderingContext';
import { jotaiStore } from '@/ui/utilities/state/jotai/jotaiStore';
import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
import { CoreObjectNameSingular } from 'twenty-shared/types';
import { ComponentDecorator } from 'twenty-ui/testing';
import {
ViewOpenRecordIn as CoreViewOpenRecordIn,
ViewType as CoreViewType,
ViewVisibility as CoreViewVisibility,
ViewOpenRecordIn,
ViewType,
ViewVisibility,
PageLayoutTabLayoutMode,
PageLayoutType,
WidgetConfigurationType,
@@ -39,7 +39,7 @@ import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMeta
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
import { getMockFieldMetadataItemOrThrow } from '~/testing/utils/getMockFieldMetadataItemOrThrow';
import { getMockObjectMetadataItemOrThrow } from '~/testing/utils/getMockObjectMetadataItemOrThrow';
import { setTestCoreViewsInMetadataStore } from '~/testing/utils/setTestCoreViewsInMetadataStore';
import { setTestViewsInMetadataStore } from '~/testing/utils/setTestViewsInMetadataStore';
import { setTestObjectMetadataItemsInMetadataStore } from '~/testing/utils/setTestObjectMetadataItemsInMetadataStore';
const companyObjectMetadataItem = getMockObjectMetadataItemOrThrow(
@@ -183,26 +183,25 @@ const createFieldsWidget = (viewId: string | null): PageLayoutWidget => ({
deletedAt: null,
});
const createCoreView = (
overrides: Partial<CoreViewWithRelations> = {},
): CoreViewWithRelations => ({
const createView = (
overrides: Partial<ViewWithRelations> = {},
): ViewWithRelations => ({
id: FIELDS_VIEW_ID,
name: 'Company Fields',
objectMetadataId: companyObjectMetadataItem.id,
type: CoreViewType.FIELDS_WIDGET,
type: ViewType.FIELDS_WIDGET,
icon: 'IconList',
key: null,
shouldHideEmptyGroups: false,
position: 0,
isCompact: false,
openRecordIn: CoreViewOpenRecordIn.SIDE_PANEL,
openRecordIn: ViewOpenRecordIn.SIDE_PANEL,
viewFields: [],
viewGroups: [],
viewFilters: [],
viewSorts: [],
visibility: CoreViewVisibility.WORKSPACE,
visibility: ViewVisibility.WORKSPACE,
createdByUserWorkspaceId: null,
__typename: 'CoreView',
...overrides,
});
@@ -284,7 +283,7 @@ export const WithViewFieldGroups: Story = {
),
];
const coreView = createCoreView({
const view = createView({
viewFields: [...contactInfoFields, ...businessFields],
viewFieldGroups: [
createViewFieldGroup(
@@ -309,7 +308,7 @@ export const WithViewFieldGroups: Story = {
generatedMockObjectMetadataItems,
);
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
setTestCoreViewsInMetadataStore(jotaiStore, [coreView]);
setTestViewsInMetadataStore(jotaiStore, [view]);
jotaiStore.set(
pageLayoutPersistedComponentState.atomFamily({
instanceId: PAGE_LAYOUT_TEST_INSTANCE_ID,
@@ -375,7 +374,7 @@ export const WithViewFieldGroups: Story = {
export const WithInlineViewFields: Story = {
render: () => {
const coreView = createCoreView({
const view = createView({
viewFields: [
createViewField('vf-name', nameField.id, 0),
createViewField('vf-employees', employeesField.id, 1),
@@ -395,7 +394,7 @@ export const WithInlineViewFields: Story = {
generatedMockObjectMetadataItems,
);
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
setTestCoreViewsInMetadataStore(jotaiStore, [coreView]);
setTestViewsInMetadataStore(jotaiStore, [view]);
jotaiStore.set(
pageLayoutPersistedComponentState.atomFamily({
instanceId: PAGE_LAYOUT_TEST_INSTANCE_ID,
@@ -461,7 +460,7 @@ export const WithInlineViewFields: Story = {
export const Empty: Story = {
render: () => {
const coreView = createCoreView({
const view = createView({
viewFieldGroups: [
createViewFieldGroup('group-empty', 'Empty Group', 0, [], false),
],
@@ -479,7 +478,7 @@ export const Empty: Story = {
generatedMockObjectMetadataItems,
);
jotaiStore.set(isMinimalMetadataReadyState.atom, true);
setTestCoreViewsInMetadataStore(jotaiStore, [coreView]);
setTestViewsInMetadataStore(jotaiStore, [view]);
jotaiStore.set(
pageLayoutPersistedComponentState.atomFamily({
instanceId: PAGE_LAYOUT_TEST_INSTANCE_ID,
@@ -12,7 +12,7 @@ import { useUserFirstDayOfTheWeek } from '@/ui/input/components/internal/date/ho
import { useUserTimezone } from '@/ui/input/components/internal/date/hooks/useUserTimezone';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector';
import { indexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/indexViewIdFromObjectMetadataItemFamilySelector';
import { lazy, Suspense } from 'react';
import { useNavigate } from 'react-router-dom';
import { AppPath } from 'twenty-shared/types';
@@ -82,7 +82,7 @@ export const GraphWidgetBarChartRenderer = () => {
);
const indexViewId = useAtomFamilySelectorValue(
coreIndexViewIdFromObjectMetadataItemFamilySelector,
indexViewIdFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: objectMetadataItem.id },
);
@@ -12,7 +12,7 @@ import { useUserFirstDayOfTheWeek } from '@/ui/input/components/internal/date/ho
import { useUserTimezone } from '@/ui/input/components/internal/date/hooks/useUserTimezone';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector';
import { indexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/indexViewIdFromObjectMetadataItemFamilySelector';
import { type LineSeries, type Point } from '@nivo/line';
import { lazy, Suspense } from 'react';
import { useNavigate } from 'react-router-dom';
@@ -90,7 +90,7 @@ export const GraphWidgetLineChartRenderer = () => {
);
const indexViewId = useAtomFamilySelectorValue(
coreIndexViewIdFromObjectMetadataItemFamilySelector,
indexViewIdFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: objectMetadataItem.id },
);
@@ -11,7 +11,7 @@ import { useUserFirstDayOfTheWeek } from '@/ui/input/components/internal/date/ho
import { useUserTimezone } from '@/ui/input/components/internal/date/hooks/useUserTimezone';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector';
import { indexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/indexViewIdFromObjectMetadataItemFamilySelector';
import { lazy, Suspense } from 'react';
import { useNavigate } from 'react-router-dom';
import { AppPath } from 'twenty-shared/types';
@@ -53,7 +53,7 @@ export const GraphWidgetPieChartRenderer = () => {
isPageLayoutInEditModeComponentState,
);
const indexViewId = useAtomFamilySelectorValue(
coreIndexViewIdFromObjectMetadataItemFamilySelector,
indexViewIdFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: objectMetadataItem.id },
);
@@ -37,7 +37,7 @@ export const SidePanelObjectViewRecordInfo = () => {
const label =
processedItem.itemType === NavigationMenuItemType.RECORD
? selectedItemObjectMetadata?.labelSingular
: processedItem.viewKey === ViewKey.Index
: processedItem.viewKey === ViewKey.INDEX
? t`Object`
: t`View`;
@@ -112,7 +112,7 @@ export const SidePanelNavigationMenuItemEditPage = () => {
showColorOption={
selectedItem &&
'viewKey' in selectedItem &&
selectedItem.viewKey === ViewKey.Index
selectedItem.viewKey === ViewKey.INDEX
}
/>
);
@@ -44,7 +44,7 @@ export const SidePanelNewSidebarItemObjectSubPage = () => {
const objectMetadataIdsWithDisplayableViews = new Set(
views
.filter((view) => view.key !== ViewKey.Index)
.filter((view) => view.key !== ViewKey.INDEX)
.map((view) => view.objectMetadataId),
);
@@ -43,7 +43,7 @@ export const SidePanelNewSidebarItemObjectSystemPickerSubPage = () => {
const objectMetadataIdsWithDisplayableViews = new Set(
views
.filter((view) => view.key !== ViewKey.Index)
.filter((view) => view.key !== ViewKey.INDEX)
.map((view) => view.objectMetadataId),
);
@@ -31,7 +31,7 @@ export const SidePanelNewSidebarItemViewObjectPickerSubPage = () => {
views
.filter(
(view) =>
view.key !== ViewKey.Index && view.type !== ViewType.FieldsWidget,
view.key !== ViewKey.INDEX && view.type !== ViewType.FIELDS_WIDGET,
)
.map((view) => view.objectMetadataId),
);
@@ -52,8 +52,8 @@ export const SidePanelNewSidebarItemViewPickerSubView = ({
.filter(
(view) =>
view.objectMetadataId === selectedObjectMetadataIdForView &&
view.key !== ViewKey.Index &&
view.type !== ViewType.FieldsWidget &&
view.key !== ViewKey.INDEX &&
view.type !== ViewType.FIELDS_WIDGET &&
view.visibility === ViewVisibility.WORKSPACE,
)
.sort((a, b) => a.position - b.position);
@@ -31,7 +31,7 @@ export const SidePanelNewSidebarItemViewSystemPickerSubPage = () => {
views
.filter(
(view) =>
view.key !== ViewKey.Index && view.type !== ViewType.FieldsWidget,
view.key !== ViewKey.INDEX && view.type !== ViewType.FIELDS_WIDGET,
)
.map((view) => view.objectMetadataId),
);
@@ -12,7 +12,7 @@ import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataI
import { SidePanelItemWithAddToNavigationDrag } from '@/side-panel/components/SidePanelItemWithAddToNavigationDrag';
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector';
import { indexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/indexViewIdFromObjectMetadataItemFamilySelector';
type SidePanelObjectMenuItemProps = {
objectMetadataItem: ObjectMetadataItem;
@@ -41,7 +41,7 @@ export const SidePanelObjectMenuItem = ({
objectMetadataItem.id,
);
const defaultViewId = useAtomFamilySelectorValue(
coreIndexViewIdFromObjectMetadataItemFamilySelector,
indexViewIdFromObjectMetadataItemFamilySelector,
{ objectMetadataItemId: objectMetadataItem.id },
);
const Icon = getIcon(objectMetadataItem.icon);
@@ -2,7 +2,6 @@ import { type ViewField } from '@/views/types/ViewField';
export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
{
__typename: 'ViewField',
id: '5168be09-f200-40f5-9e04-29d607de06e5',
fieldMetadataId: '20202020-7fbd-41ad-b64d-25a15ff62f04',
size: 150,
@@ -13,7 +12,6 @@ export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
updatedAt: '2023-11-23T15:38:03.706Z',
},
{
__typename: 'ViewField',
id: '5ece850b-76fd-4135-9b99-06d49cad14ae',
fieldMetadataId: '20202020-a61d-4b78-b998-3fd88b4f73a1',
size: 170,
@@ -24,7 +22,6 @@ export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
updatedAt: '2023-11-23T15:38:03.706Z',
},
{
__typename: 'ViewField',
id: '604dbdbb-df01-4e47-921b-f9963109f912',
fieldMetadataId: '20202020-0739-495d-8e70-c0807f6b2268',
size: 150,
@@ -35,7 +32,6 @@ export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
updatedAt: '2023-11-23T15:38:03.706Z',
},
{
__typename: 'ViewField',
id: '7cbc36c8-37c6-4561-8c46-ddb316ddd121',
fieldMetadataId: '20202020-4dc2-47c9-bb15-6e6f19ba9e46',
size: 150,
@@ -46,7 +42,6 @@ export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
updatedAt: '2023-11-23T15:38:03.706Z',
},
{
__typename: 'ViewField',
id: 'a7d19be3-1ce9-479b-9453-2930a381e07c',
fieldMetadataId: '20202020-5e4e-4007-a630-8a2617914889',
size: 100,
@@ -57,7 +52,6 @@ export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
updatedAt: '2023-11-23T15:38:03.706Z',
},
{
__typename: 'ViewField',
id: 'cafacdc8-cbfc-4545-8242-94787f144ace',
fieldMetadataId: 'REPLACE_ME',
size: 180,
@@ -68,7 +62,6 @@ export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
updatedAt: '2023-11-23T15:38:03.706Z',
},
{
__typename: 'ViewField',
id: 'f0cc50c9-b9b6-405b-a1c0-23f7698ea731',
fieldMetadataId: '20202020-ad10-4117-a039-3f04b7a5f939',
size: 170,
@@ -79,7 +72,6 @@ export const SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS = [
updatedAt: '2023-11-23T15:38:03.706Z',
},
] as (ViewField & {
__typename: string;
createdAt: string;
viewId: string;
updatedAt: string;
@@ -6,7 +6,7 @@ import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/use
import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { hasInitializedAnyFieldFilterComponentFamilyState } from '@/views/states/hasInitializedAnyFieldFilterComponentFamilyState';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { useEffect } from 'react';
import { isDefined } from 'twenty-shared/utils';
@@ -17,12 +17,9 @@ export const ViewBarAnyFieldFilterEffect = () => {
const { objectMetadataItem, recordIndexId } = useRecordIndexContextOrThrow();
const currentView = useAtomFamilySelectorValue(
coreViewFromViewIdFamilySelector,
{
viewId: contextStoreCurrentViewId ?? '',
},
);
const currentView = useAtomFamilySelectorValue(viewFromViewIdFamilySelector, {
viewId: contextStoreCurrentViewId ?? '',
});
const [hasInitializedAnyFieldFilter, setHasInitializedAnyFieldFilter] =
useAtomComponentFamilyState(
@@ -6,7 +6,7 @@ import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/use
import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { hasInitializedCurrentRecordFieldsComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordFieldsComponentFamilyState';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { mapViewFieldToRecordField } from '@/views/utils/mapViewFieldToRecordField';
import { useEffect } from 'react';
import { isDefined } from 'twenty-shared/utils';
@@ -18,12 +18,9 @@ export const ViewBarRecordFieldEffect = () => {
const { objectMetadataItem } = useRecordIndexContextOrThrow();
const currentView = useAtomFamilySelectorValue(
coreViewFromViewIdFamilySelector,
{
viewId: contextStoreCurrentViewId ?? '',
},
);
const currentView = useAtomFamilySelectorValue(viewFromViewIdFamilySelector, {
viewId: contextStoreCurrentViewId ?? '',
});
const [
hasInitializedCurrentRecordFields,
@@ -7,7 +7,7 @@ import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSe
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { useMapViewFiltersToFilters } from '@/views/hooks/useMapViewFiltersToFilters';
import { hasInitializedCurrentRecordFiltersComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordFiltersComponentFamilyState';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { useEffect } from 'react';
import { isDefined } from 'twenty-shared/utils';
@@ -18,12 +18,9 @@ export const ViewBarRecordFilterEffect = () => {
const { objectMetadataItem, recordIndexId } = useRecordIndexContextOrThrow();
const currentView = useAtomFamilySelectorValue(
coreViewFromViewIdFamilySelector,
{
viewId: contextStoreCurrentViewId ?? '',
},
);
const currentView = useAtomFamilySelectorValue(viewFromViewIdFamilySelector, {
viewId: contextStoreCurrentViewId ?? '',
});
const [
hasInitializedCurrentRecordFilters,
@@ -6,7 +6,7 @@ import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/use
import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { hasInitializedCurrentRecordFilterGroupsComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordFilterGroupsComponentFamilyState';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { mapViewFilterGroupsToRecordFilterGroups } from '@/views/utils/mapViewFilterGroupsToRecordFilterGroups';
import { useEffect } from 'react';
import { isDefined } from 'twenty-shared/utils';
@@ -18,12 +18,9 @@ export const ViewBarRecordFilterGroupEffect = () => {
const { objectMetadataItem, recordIndexId } = useRecordIndexContextOrThrow();
const currentView = useAtomFamilySelectorValue(
coreViewFromViewIdFamilySelector,
{
viewId: contextStoreCurrentViewId ?? '',
},
);
const currentView = useAtomFamilySelectorValue(viewFromViewIdFamilySelector, {
viewId: contextStoreCurrentViewId ?? '',
});
const [
hasInitializedCurrentRecordFilterGroups,
@@ -6,7 +6,7 @@ import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/use
import { useSetAtomComponentState } from '@/ui/utilities/state/jotai/hooks/useSetAtomComponentState';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
import { hasInitializedCurrentRecordSortsComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordSortsComponentFamilyState';
import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector';
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { useEffect } from 'react';
import { isDefined } from 'twenty-shared/utils';
@@ -17,12 +17,9 @@ export const ViewBarRecordSortEffect = () => {
const { objectMetadataItem, recordIndexId } = useRecordIndexContextOrThrow();
const currentView = useAtomFamilySelectorValue(
coreViewFromViewIdFamilySelector,
{
viewId: contextStoreCurrentViewId ?? '',
},
);
const currentView = useAtomFamilySelectorValue(viewFromViewIdFamilySelector, {
viewId: contextStoreCurrentViewId ?? '',
});
const [
hasInitializedCurrentRecordSorts,
@@ -25,7 +25,7 @@ export const ViewFieldsHiddenDropdownSection = () => {
});
const handleChangeFieldVisibility =
viewType === ViewType.Kanban
viewType === ViewType.KANBAN
? handleBoardFieldVisibilityChange
: changeRecordFieldVisibility;
@@ -39,7 +39,7 @@ export const ViewFieldsVisibleDropdownSection = () => {
useGetFieldMetadataItemByIdOrThrow();
const handleReorderFields =
viewType === ViewType.Kanban
viewType === ViewType.KANBAN
? handleReorderBoardFields
: processOptionDropdownDragEnd;
@@ -47,7 +47,7 @@ export const ViewFieldsVisibleDropdownSection = () => {
useChangeRecordFieldVisibility(recordIndexId);
const handleChangeFieldVisibility =
viewType === ViewType.Kanban
viewType === ViewType.KANBAN
? handleBoardFieldVisibilityChange
: changeRecordFieldVisibility;
@@ -24,9 +24,9 @@ import { ContextStoreDecorator } from '~/testing/decorators/ContextStoreDecorato
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { mockedCoreViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import { mockedViews } from '~/testing/mock-data/generated/metadata/views/mock-views-data';
import { generatedMockObjectMetadataItems } from '~/testing/utils/generatedMockObjectMetadataItems';
import { setTestCoreViewsInMetadataStore } from '~/testing/utils/setTestCoreViewsInMetadataStore';
import { setTestViewsInMetadataStore } from '~/testing/utils/setTestViewsInMetadataStore';
const meta: Meta<typeof ViewBarFilterDropdown> = {
title: 'Modules/Views/ViewBarFilterDropdown',
@@ -43,9 +43,7 @@ const meta: Meta<typeof ViewBarFilterDropdown> = {
instanceId,
);
const mockCoreView = mockedCoreViews.find(
(v) => v.name === 'All Companies',
)!;
const mockView = mockedViews.find((v) => v.name === 'All Companies')!;
const setContextStoreCurrentViewId = useSetAtomComponentState(
contextStoreCurrentViewIdComponentState,
@@ -70,14 +68,14 @@ const meta: Meta<typeof ViewBarFilterDropdown> = {
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
setTestCoreViewsInMetadataStore(jotaiStore, [mockCoreView]);
setContextStoreCurrentViewId(mockCoreView.id);
setTestViewsInMetadataStore(jotaiStore, [mockView]);
setContextStoreCurrentViewId(mockView.id);
setCurrentRecordFields(columns);
setIsLoaded(true);
}, [
setContextStoreCurrentViewId,
setCurrentRecordFields,
mockCoreView,
mockView,
columns,
]);
@@ -1,7 +1,7 @@
import { gql } from '@apollo/client';
export const VIEW_FIELD_FRAGMENT = gql`
fragment ViewFieldFragment on CoreViewField {
fragment ViewFieldFragment on ViewField {
id
fieldMetadataId
viewId
@@ -3,7 +3,7 @@ import { gql } from '@apollo/client';
export const VIEW_FIELD_GROUP_FRAGMENT = gql`
${VIEW_FIELD_FRAGMENT}
fragment ViewFieldGroupFragment on CoreViewFieldGroup {
fragment ViewFieldGroupFragment on ViewFieldGroup {
id
name
position
@@ -1,7 +1,7 @@
import { gql } from '@apollo/client';
export const VIEW_FILTER_FRAGMENT = gql`
fragment ViewFilterFragment on CoreViewFilter {
fragment ViewFilterFragment on ViewFilter {
id
fieldMetadataId
operand
@@ -1,7 +1,7 @@
import { gql } from '@apollo/client';
export const VIEW_FILTER_GROUP_FRAGMENT = gql`
fragment ViewFilterGroupFragment on CoreViewFilterGroup {
fragment ViewFilterGroupFragment on ViewFilterGroup {
id
parentViewFilterGroupId
logicalOperator
@@ -14,7 +14,7 @@ export const VIEW_FRAGMENT = gql`
${VIEW_SORT_FRAGMENT}
${VIEW_GROUP_FRAGMENT}
fragment ViewFragment on CoreView {
fragment ViewFragment on View {
id
name
objectMetadataId
@@ -1,7 +1,7 @@
import { gql } from '@apollo/client';
export const VIEW_GROUP_FRAGMENT = gql`
fragment ViewGroupFragment on CoreViewGroup {
fragment ViewGroupFragment on ViewGroup {
id
isVisible
fieldValue
@@ -1,7 +1,7 @@
import { gql } from '@apollo/client';
export const VIEW_SORT_FRAGMENT = gql`
fragment ViewSortFragment on CoreViewSort {
fragment ViewSortFragment on ViewSort {
id
fieldMetadataId
direction
@@ -1,11 +0,0 @@
import { VIEW_FIELD_FRAGMENT } from '@/views/graphql/fragments/viewFieldFragment';
import { gql } from '@apollo/client';
export const CREATE_MANY_CORE_VIEW_FIELDS = gql`
${VIEW_FIELD_FRAGMENT}
mutation CreateManyCoreViewFields($inputs: [CreateViewFieldInput!]!) {
createManyCoreViewFields(inputs: $inputs) {
...ViewFieldFragment
}
}
`;
@@ -1,11 +0,0 @@
import { VIEW_GROUP_FRAGMENT } from '@/views/graphql/fragments/viewGroupFragment';
import { gql } from '@apollo/client';
export const CREATE_MANY_CORE_VIEW_GROUPS = gql`
${VIEW_GROUP_FRAGMENT}
mutation CreateManyCoreViewGroups($inputs: [CreateViewGroupInput!]!) {
createManyCoreViewGroups(inputs: $inputs) {
...ViewGroupFragment
}
}
`;
@@ -1,12 +1,10 @@
import { VIEW_FIELD_GROUP_FRAGMENT } from '@/views/graphql/fragments/viewFieldGroupFragment';
import { gql } from '@apollo/client';
export const CREATE_MANY_CORE_VIEW_FIELD_GROUPS = gql`
export const CREATE_MANY_VIEW_FIELD_GROUPS = gql`
${VIEW_FIELD_GROUP_FRAGMENT}
mutation CreateManyCoreViewFieldGroups(
$inputs: [CreateViewFieldGroupInput!]!
) {
createManyCoreViewFieldGroups(inputs: $inputs) {
mutation CreateManyViewFieldGroups($inputs: [CreateViewFieldGroupInput!]!) {
createManyViewFieldGroups(inputs: $inputs) {
...ViewFieldGroupFragment
}
}

Some files were not shown because too many files have changed in this diff Show More