Skip to content

Commit 00209f7

Browse files

File tree

136 files changed

+4885
-845
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

136 files changed

+4885
-845
lines changed

packages/twenty-front/src/generated-metadata/graphql.ts

Lines changed: 250 additions & 28 deletions
Large diffs are not rendered by default.

packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/record-page-layout-actions/components/CancelRecordPageLayoutSingleRecordAction.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
import { Action } from '@/action-menu/actions/components/Action';
2-
import { useSelectedRecordIdOrThrow } from '@/action-menu/actions/record-actions/single-record/hooks/useSelectedRecordIdOrThrow';
32
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
43
import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow';
54
import { useRecordPageLayoutIdFromRecordStoreOrThrow } from '@/page-layout/hooks/useRecordPageLayoutIdFromRecordStoreOrThrow';
65
import { useResetDraftPageLayoutToPersistedPageLayout } from '@/page-layout/hooks/useResetDraftPageLayoutToPersistedPageLayout';
76
import { useSetIsPageLayoutInEditMode } from '@/page-layout/hooks/useSetIsPageLayoutInEditMode';
87

98
export const CancelRecordPageLayoutSingleRecordAction = () => {
10-
const recordId = useSelectedRecordIdOrThrow();
11-
129
const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow();
1310

1411
const { pageLayoutId } = useRecordPageLayoutIdFromRecordStoreOrThrow({
15-
id: recordId,
1612
targetObjectNameSingular: objectMetadataItem.nameSingular,
1713
});
1814

packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/record-page-layout-actions/components/EditRecordPageLayoutSingleRecordAction.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
import { Action } from '@/action-menu/actions/components/Action';
2-
import { useSelectedRecordIdOrThrow } from '@/action-menu/actions/record-actions/single-record/hooks/useSelectedRecordIdOrThrow';
32
import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow';
43
import { useRecordPageLayoutIdFromRecordStoreOrThrow } from '@/page-layout/hooks/useRecordPageLayoutIdFromRecordStoreOrThrow';
54
import { useSetIsPageLayoutInEditMode } from '@/page-layout/hooks/useSetIsPageLayoutInEditMode';
65
import { useResetLocationHash } from 'twenty-ui/utilities';
76

87
export const EditRecordPageLayoutSingleRecordAction = () => {
9-
const recordId = useSelectedRecordIdOrThrow();
10-
118
const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow();
129

1310
const { pageLayoutId } = useRecordPageLayoutIdFromRecordStoreOrThrow({
14-
id: recordId,
1511
targetObjectNameSingular: objectMetadataItem.nameSingular,
1612
});
1713

packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/record-page-layout-actions/components/SaveRecordPageLayoutSingleRecordAction.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import { Action } from '@/action-menu/actions/components/Action';
2-
import { useSelectedRecordIdOrThrow } from '@/action-menu/actions/record-actions/single-record/hooks/useSelectedRecordIdOrThrow';
32
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
43
import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow';
54
import { useRecordPageLayoutIdFromRecordStoreOrThrow } from '@/page-layout/hooks/useRecordPageLayoutIdFromRecordStoreOrThrow';
5+
import { useSaveFieldsWidgetGroups } from '@/page-layout/hooks/useSaveFieldsWidgetGroups';
66
import { useSavePageLayout } from '@/page-layout/hooks/useSavePageLayout';
77
import { useSetIsPageLayoutInEditMode } from '@/page-layout/hooks/useSetIsPageLayoutInEditMode';
88

99
export const SaveRecordPageLayoutSingleRecordAction = () => {
10-
const recordId = useSelectedRecordIdOrThrow();
11-
1210
const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow();
1311

1412
const { pageLayoutId } = useRecordPageLayoutIdFromRecordStoreOrThrow({
15-
id: recordId,
1613
targetObjectNameSingular: objectMetadataItem.nameSingular,
1714
});
1815

1916
const { savePageLayout } = useSavePageLayout(pageLayoutId);
17+
const { saveFieldsWidgetGroups } = useSaveFieldsWidgetGroups({
18+
pageLayoutId,
19+
});
2020

2121
const { setIsPageLayoutInEditMode } =
2222
useSetIsPageLayoutInEditMode(pageLayoutId);
@@ -27,6 +27,8 @@ export const SaveRecordPageLayoutSingleRecordAction = () => {
2727
const result = await savePageLayout();
2828

2929
if (result.status === 'successful') {
30+
await saveFieldsWidgetGroups();
31+
3032
closeCommandMenu();
3133
setIsPageLayoutInEditMode(false);
3234
}

packages/twenty-front/src/modules/app/hooks/useExecuteTasksOnAnyLocationChange.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useRecoilCallback } from 'recoil';
33
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
44
import { contextStoreIsPageInEditModeComponentState } from '@/context-store/states/contextStoreIsPageInEditModeComponentState';
55
import { currentPageLayoutIdState } from '@/page-layout/states/currentPageLayoutIdState';
6+
import { hasInitializedFieldsWidgetGroupsDraftComponentState } from '@/page-layout/states/hasInitializedFieldsWidgetGroupsDraftComponentState';
67
import { isPageLayoutInEditModeComponentState } from '@/page-layout/states/isPageLayoutInEditModeComponentState';
78
import { pageLayoutCurrentLayoutsComponentState } from '@/page-layout/states/pageLayoutCurrentLayoutsComponentState';
89
import { pageLayoutDraftComponentState } from '@/page-layout/states/pageLayoutDraftComponentState';
@@ -69,6 +70,13 @@ export const useExecuteTasksOnAnyLocationChange = () => {
6970
false,
7071
);
7172

73+
set(
74+
hasInitializedFieldsWidgetGroupsDraftComponentState.atomFamily({
75+
instanceId: pageLayoutId,
76+
}),
77+
{},
78+
);
79+
7280
set(currentPageLayoutIdState, null);
7381
}
7482

packages/twenty-front/src/modules/command-menu/pages/page-layout/components/CommandMenuPageLayoutFieldsLayout.tsx

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ import { SidePanelSubPageNavigationHeader } from '@/command-menu/pages/common/co
33
import { usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord } from '@/command-menu/pages/page-layout/hooks/usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord';
44
import { useWidgetInEditMode } from '@/command-menu/pages/page-layout/hooks/useWidgetInEditMode';
55
import { useTemporaryFieldsConfiguration } from '@/page-layout/hooks/useTemporaryFieldsConfiguration';
6-
import { type FieldsConfiguration } from '@/page-layout/types/FieldsConfiguration';
76
import { FieldsConfigurationEditor } from '@/page-layout/widgets/fields/components/FieldsConfigurationEditor';
7+
import { FieldsWidgetGroupsDraftInitializationEffect } from '@/page-layout/widgets/fields/components/FieldsWidgetGroupsDraftInitializationEffect';
88
import styled from '@emotion/styled';
99
import { t } from '@lingui/core/macro';
10-
import { useState } from 'react';
1110
import { isDefined } from 'twenty-shared/utils';
11+
import {
12+
type FieldsConfiguration,
13+
WidgetConfigurationType,
14+
} from '~/generated-metadata/graphql';
1215

1316
const StyledOuterContainer = styled.div`
1417
display: flex;
@@ -28,25 +31,23 @@ const StyledContainer = styled.div`
2831
export const CommandMenuPageLayoutFieldsLayout = () => {
2932
const { goBackFromCommandMenu } = useCommandMenuHistory();
3033

31-
const { pageLayoutId, objectNameSingular } =
34+
const { pageLayoutId } =
3235
usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord();
3336

3437
const { widgetInEditMode } = useWidgetInEditMode(pageLayoutId);
35-
const defaultFieldsConfiguration =
36-
useTemporaryFieldsConfiguration(objectNameSingular);
37-
const [fieldsConfiguration, setFieldsConfiguration] =
38-
useState<FieldsConfiguration>(defaultFieldsConfiguration);
38+
const temporaryFieldsConfiguration = useTemporaryFieldsConfiguration();
3939

4040
if (!isDefined(widgetInEditMode)) {
4141
return null;
4242
}
4343

44-
const handleConfigurationChange = (
45-
updatedConfiguration: FieldsConfiguration,
46-
) => {
47-
// TODO: replace with a call to updatePageLayoutWidget
48-
setFieldsConfiguration(updatedConfiguration);
49-
};
44+
const widgetConfiguration = widgetInEditMode.configuration;
45+
46+
const fieldsConfiguration: FieldsConfiguration =
47+
isDefined(widgetConfiguration) &&
48+
widgetConfiguration.configurationType === WidgetConfigurationType.FIELDS
49+
? (widgetConfiguration as FieldsConfiguration)
50+
: temporaryFieldsConfiguration;
5051

5152
return (
5253
<StyledOuterContainer>
@@ -55,9 +56,14 @@ export const CommandMenuPageLayoutFieldsLayout = () => {
5556
onBackClick={goBackFromCommandMenu}
5657
/>
5758
<StyledContainer>
59+
<FieldsWidgetGroupsDraftInitializationEffect
60+
viewId={fieldsConfiguration.viewId ?? null}
61+
pageLayoutId={pageLayoutId}
62+
widgetId={widgetInEditMode.id}
63+
/>
5864
<FieldsConfigurationEditor
59-
configuration={fieldsConfiguration}
60-
onChange={handleConfigurationChange}
65+
pageLayoutId={pageLayoutId}
66+
widgetId={widgetInEditMode.id}
6167
/>
6268
</StyledContainer>
6369
</StyledOuterContainer>

packages/twenty-front/src/modules/command-menu/pages/page-layout/components/CommandMenuPageLayoutFieldsSettings.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import { useNavigatePageLayoutCommandMenu } from '@/command-menu/pages/page-layo
66
import { usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord } from '@/command-menu/pages/page-layout/hooks/usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord';
77
import { useWidgetInEditMode } from '@/command-menu/pages/page-layout/hooks/useWidgetInEditMode';
88
import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages';
9-
import { useTemporaryFieldsConfiguration } from '@/page-layout/hooks/useTemporaryFieldsConfiguration';
9+
import { useFieldsWidgetGroups } from '@/page-layout/widgets/fields/hooks/useFieldsWidgetGroups';
1010
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
1111
import styled from '@emotion/styled';
1212
import { useLingui } from '@lingui/react/macro';
1313
import { isDefined } from 'twenty-shared/utils';
1414
import { IconLayoutSidebarRight } from 'twenty-ui/display';
15+
import { type FieldsConfiguration } from '~/generated-metadata/graphql';
1516

1617
const StyledContainer = styled.div`
1718
display: flex;
@@ -33,15 +34,22 @@ export const CommandMenuPageLayoutFieldsSettings = () => {
3334
usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord();
3435

3536
const { widgetInEditMode } = useWidgetInEditMode(pageLayoutId);
36-
const fieldsConfiguration =
37-
useTemporaryFieldsConfiguration(objectNameSingular);
37+
38+
const fieldsConfiguration = widgetInEditMode?.configuration as
39+
| FieldsConfiguration
40+
| undefined;
41+
42+
const { groups } = useFieldsWidgetGroups({
43+
viewId: fieldsConfiguration?.viewId ?? null,
44+
objectNameSingular,
45+
});
3846

3947
if (!isDefined(widgetInEditMode)) {
4048
return null;
4149
}
4250

43-
const totalFieldsCount = fieldsConfiguration.sections.reduce(
44-
(count, section) => count + section.fields.length,
51+
const totalFieldsCount = groups.reduce(
52+
(count, group) => count + group.fields.length,
4553
0,
4654
);
4755

packages/twenty-front/src/modules/command-menu/pages/page-layout/components/dropdown-content/ChartDateGranularitySelectionDropdownContent.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { type ChartConfiguration } from '@/command-menu/pages/page-layout/types/
55
import { getDateGranularityLabel } from '@/command-menu/pages/page-layout/utils/getDateGranularityLabel';
66
import { isWidgetConfigurationOfType } from '@/command-menu/pages/page-layout/utils/isWidgetConfigurationOfType';
77
import { type FieldConfiguration } from '@/page-layout/types/FieldConfiguration';
8-
import { type FieldsConfiguration } from '@/page-layout/types/FieldsConfiguration';
98
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
109
import { DropdownComponentInstanceContext } from '@/ui/layout/dropdown/contexts/DropdownComponentInstanceContext';
1110
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
@@ -17,7 +16,10 @@ import { useRecoilComponentValueV2 } from '@/ui/utilities/state/jotai/hooks/useR
1716
import { ObjectRecordGroupByDateGranularity } from 'twenty-shared/types';
1817
import { isDefined } from 'twenty-shared/utils';
1918
import { MenuItemSelect } from 'twenty-ui/navigation';
20-
import { type WidgetConfiguration } from '~/generated-metadata/graphql';
19+
import {
20+
type FieldsConfiguration,
21+
type WidgetConfiguration,
22+
} from '~/generated-metadata/graphql';
2123

2224
type ChartDateGranularitySelectionDropdownContentProps = {
2325
axis?: 'primary' | 'secondary';

packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@ export const usePageLayoutIdForRecordPageLayoutFromContextStoreTargetedRecord =
3232
throw new Error('Only one record should be selected');
3333
}
3434

35-
const recordId: string = targetedRecordsRule.selectedRecordIds[0];
36-
3735
const { pageLayoutId } = useRecordPageLayoutIdFromRecordStoreOrThrow({
38-
id: recordId,
3936
targetObjectNameSingular: objectMetadataItem.nameSingular,
4037
});
4138

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
import { type ChartWidget } from '@/command-menu/pages/page-layout/types/ChartWidget';
22
import { isWidgetConfigurationOfTypeGraph } from '@/command-menu/pages/page-layout/utils/isWidgetConfigurationOfTypeGraph';
33
import { type PageLayoutWidget } from '@/page-layout/types/PageLayoutWidget';
4-
import { type WidgetConfiguration } from '~/generated-metadata/graphql';
54

65
export const isChartWidget = (
76
pageLayoutWidget: PageLayoutWidget,
87
): pageLayoutWidget is ChartWidget => {
9-
return isWidgetConfigurationOfTypeGraph(
10-
// TODO: Remove this cast when we FieldsConfiguration and FieldConfiguration are in the backend
11-
pageLayoutWidget.configuration as WidgetConfiguration,
12-
);
8+
return isWidgetConfigurationOfTypeGraph(pageLayoutWidget.configuration);
139
};

0 commit comments

Comments
 (0)