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:
@@ -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
-6
@@ -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,
|
||||
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
+6
-6
@@ -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[] = [];
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ export const WorkspaceNavigationMenuItemFolderDragClone = ({
|
||||
>
|
||||
<NavigationDrawerSubItem
|
||||
secondaryLabel={
|
||||
navigationMenuItem.viewKey === ViewKey.Index
|
||||
navigationMenuItem.viewKey === ViewKey.INDEX
|
||||
? undefined
|
||||
: getNavigationMenuItemSecondaryLabel({
|
||||
objectMetadataItems,
|
||||
|
||||
+3
-5
@@ -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,
|
||||
|
||||
+3
-6
@@ -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,
|
||||
|
||||
+2
-5
@@ -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,
|
||||
|
||||
+3
-5
@@ -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),
|
||||
);
|
||||
|
||||
|
||||
+1
-1
@@ -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
-4
@@ -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
-10
@@ -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,
|
||||
]);
|
||||
|
||||
+2
-5
@@ -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(
|
||||
() =>
|
||||
|
||||
+2
-5
@@ -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);
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@ describe('sortNavigationMenuItems', () => {
|
||||
name: 'All People',
|
||||
objectMetadataId: 'metadata-id',
|
||||
icon: 'IconUser',
|
||||
key: ViewKey.Index,
|
||||
key: ViewKey.INDEX,
|
||||
};
|
||||
|
||||
const mockObjectRecordIdentifier: ObjectRecordIdentifier = {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+3
-3
@@ -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>(() => {
|
||||
|
||||
+4
-6
@@ -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);
|
||||
|
||||
|
||||
+1
-1
@@ -82,7 +82,7 @@ export const NavigationDrawerItemForObjectMetadataItem = ({
|
||||
|
||||
const isViewWithCustomName =
|
||||
isView &&
|
||||
navigationMenuItem?.viewKey !== ViewKey.Index &&
|
||||
navigationMenuItem?.viewKey !== ViewKey.INDEX &&
|
||||
isDefined(navigationMenuItem?.labelIdentifier);
|
||||
|
||||
const label = isRecord
|
||||
|
||||
+2
-4
@@ -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,
|
||||
|
||||
+2
-4
@@ -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);
|
||||
|
||||
+2
-2
@@ -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: {
|
||||
|
||||
+3
-3
@@ -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: [],
|
||||
},
|
||||
})),
|
||||
},
|
||||
|
||||
+4
-4
@@ -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,
|
||||
|
||||
+9
-9
@@ -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"
|
||||
|
||||
+38
-36
@@ -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={() => {
|
||||
|
||||
+13
-15
@@ -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>
|
||||
|
||||
+1
-1
@@ -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 />;
|
||||
|
||||
+1
-1
@@ -127,7 +127,7 @@ export const ObjectOptionsDropdownRecordGroupFieldsContent = () => {
|
||||
/>
|
||||
<DropdownMenuSeparator />
|
||||
<DropdownMenuItemsContainer>
|
||||
{viewType === ViewType.Table && (
|
||||
{viewType === ViewType.TABLE && (
|
||||
<MenuItemSelect
|
||||
text={t`None`}
|
||||
selected={!isDefined(recordIndexGroupFieldMetadataItem)}
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+15
-18
@@ -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;
|
||||
}
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ const StyledColumnContainer = styled.div`
|
||||
export const RecordBoardColumns = () => {
|
||||
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
|
||||
visibleRecordGroupIdsComponentFamilySelector,
|
||||
ViewType.Kanban,
|
||||
ViewType.KANBAN,
|
||||
);
|
||||
|
||||
return (
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ export const RecordBoardFetchMoreInViewTriggerComponent = () => {
|
||||
|
||||
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
|
||||
visibleRecordGroupIdsComponentFamilySelector,
|
||||
ViewType.Kanban,
|
||||
ViewType.KANBAN,
|
||||
);
|
||||
|
||||
const componentWidth =
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ const StyledHeaderContainer = styled.div`
|
||||
export const RecordBoardHeader = () => {
|
||||
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
|
||||
visibleRecordGroupIdsComponentFamilySelector,
|
||||
ViewType.Kanban,
|
||||
ViewType.KANBAN,
|
||||
);
|
||||
|
||||
return (
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ export const useRecordBoardCardNavigation = (recordBoardId?: string) => {
|
||||
|
||||
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
|
||||
visibleRecordGroupIdsComponentFamilySelector,
|
||||
ViewType.Kanban,
|
||||
ViewType.KANBAN,
|
||||
);
|
||||
|
||||
const recordIdsByGroupState = useAtomComponentFamilyStateCallbackState(
|
||||
|
||||
+2
-2
@@ -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';
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import { MenuItem } from 'twenty-ui/navigation';
|
||||
|
||||
export const RecordBoardColumnDropdownMenu = () => {
|
||||
const recordGroupActions = useRecordGroupActions({
|
||||
viewType: ViewType.Kanban,
|
||||
viewType: ViewType.KANBAN,
|
||||
});
|
||||
|
||||
return (
|
||||
|
||||
+6
-8
@@ -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,
|
||||
]);
|
||||
|
||||
|
||||
+2
-2
@@ -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 },
|
||||
);
|
||||
|
||||
|
||||
+4
-4
@@ -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}
|
||||
|
||||
+2
-2
@@ -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 ?? '',
|
||||
});
|
||||
|
||||
|
||||
+2
-2
@@ -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();
|
||||
|
||||
+1
-1
@@ -109,7 +109,7 @@ describe('useRecordData', () => {
|
||||
pageSize: 30,
|
||||
callback,
|
||||
delayMs: 0,
|
||||
viewType: ViewType.Kanban,
|
||||
viewType: ViewType.KANBAN,
|
||||
}),
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
|
||||
+2
-2
@@ -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]
|
||||
: []),
|
||||
];
|
||||
|
||||
+5
-9
@@ -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,
|
||||
|
||||
+2
-2
@@ -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({
|
||||
|
||||
+5
-6
@@ -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,
|
||||
});
|
||||
|
||||
+2
-2
@@ -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',
|
||||
|
||||
+2
-2
@@ -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';
|
||||
|
||||
|
||||
+2
-2
@@ -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({
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ export const RecordTableRecordGroupsBody = () => {
|
||||
|
||||
const visibleRecordGroupIds = useAtomComponentFamilySelectorValue(
|
||||
visibleRecordGroupIdsComponentFamilySelector,
|
||||
ViewType.Table,
|
||||
ViewType.TABLE,
|
||||
);
|
||||
|
||||
if (isRecordTableInitialLoading && allRecordIds.length === 0) {
|
||||
|
||||
+2
-2
@@ -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();
|
||||
}
|
||||
|
||||
+2
-2
@@ -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 ?? '' },
|
||||
);
|
||||
|
||||
|
||||
+17
-18
@@ -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,
|
||||
|
||||
+2
-2
@@ -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 },
|
||||
);
|
||||
|
||||
|
||||
+2
-2
@@ -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 },
|
||||
);
|
||||
|
||||
|
||||
+2
-2
@@ -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 },
|
||||
);
|
||||
|
||||
|
||||
+1
-1
@@ -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`;
|
||||
|
||||
|
||||
+1
-1
@@ -112,7 +112,7 @@ export const SidePanelNavigationMenuItemEditPage = () => {
|
||||
showColorOption={
|
||||
selectedItem &&
|
||||
'viewKey' in selectedItem &&
|
||||
selectedItem.viewKey === ViewKey.Index
|
||||
selectedItem.viewKey === ViewKey.INDEX
|
||||
}
|
||||
/>
|
||||
);
|
||||
|
||||
+1
-1
@@ -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),
|
||||
);
|
||||
|
||||
|
||||
+1
-1
@@ -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),
|
||||
);
|
||||
|
||||
|
||||
+1
-1
@@ -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),
|
||||
);
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
+1
-1
@@ -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),
|
||||
);
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
-8
@@ -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,
|
||||
|
||||
+4
-7
@@ -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,
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ export const ViewFieldsHiddenDropdownSection = () => {
|
||||
});
|
||||
|
||||
const handleChangeFieldVisibility =
|
||||
viewType === ViewType.Kanban
|
||||
viewType === ViewType.KANBAN
|
||||
? handleBoardFieldVisibilityChange
|
||||
: changeRecordFieldVisibility;
|
||||
|
||||
|
||||
+2
-2
@@ -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;
|
||||
|
||||
|
||||
+6
-8
@@ -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
-1
@@ -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
|
||||
}
|
||||
}
|
||||
`;
|
||||
+3
-5
@@ -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
Reference in New Issue
Block a user