Reset Tab Page Layout (#19453)

## Context
- Add "Reset to default" for page layout tabs and widgets — backend
mutation resets overrides, reactivates deactivated children, and deletes
custom children
- Fix override write bug where mutating an overridable property (e.g.
widget title) on a standard-app entity incorrectly overwrote the base
column instead of writing to the overrides JSONB —
PageLayoutUpdateService now uses resolveFlatEntityOverridableProperties
for accurate diffing and routes properties through
sanitizeOverridableEntityInput
- Deprecate isOverridden - We need more time to think about this
feature. Currently this adds too much complexity for a very small
benefit



https://github.com/user-attachments/assets/a84546c8-1e15-4d9e-a489-0825cf8b8ed2
This commit is contained in:
Weiko
2026-04-08 18:43:57 +02:00
committed by GitHub
parent 2267c56f15
commit 238018dc7b
94 changed files with 1000 additions and 619 deletions
@@ -149,7 +149,6 @@ const createPageLayoutWithWidget = (
position: 0,
pageLayoutId: PAGE_LAYOUT_TEST_INSTANCE_ID,
widgets: [widget],
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -272,7 +271,6 @@ export const WithNumberChart: Story = {
aggregateFieldMetadataId: idField.id,
displayDataLabel: true,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -359,7 +357,6 @@ export const WithGaugeChart: Story = {
aggregateFieldMetadataId: idField.id,
displayDataLabel: false,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -450,7 +447,6 @@ export const WithBarChart: Story = {
axisNameDisplay: AxisNameDisplay.BOTH,
displayDataLabel: false,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -544,7 +540,6 @@ export const SmallWidget: Story = {
aggregateFieldMetadataId: idField.id,
displayDataLabel: true,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -642,7 +637,6 @@ export const MediumWidget: Story = {
axisNameDisplay: AxisNameDisplay.BOTH,
displayDataLabel: false,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -740,7 +734,6 @@ export const LargeWidget: Story = {
axisNameDisplay: AxisNameDisplay.BOTH,
displayDataLabel: false,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -834,7 +827,6 @@ export const WideWidget: Story = {
aggregateFieldMetadataId: idField.id,
displayDataLabel: true,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -932,7 +924,6 @@ export const TallWidget: Story = {
axisNameDisplay: AxisNameDisplay.BOTH,
displayDataLabel: false,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1026,7 +1017,6 @@ export const WithManyToOneRelationFieldWidget: Story = {
fieldMetadataId: accountOwnerField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1145,7 +1135,6 @@ export const WithOneToManyRelationFieldWidget: Story = {
fieldMetadataId: companyPeopleField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1256,7 +1245,6 @@ export const OneToManyRelationFieldWidgetWithSeeAllButton: Story = {
fieldMetadataId: companyPeopleField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1394,7 +1382,6 @@ export const OnMobile: Story = {
aggregateFieldMetadataId: idField.id,
displayDataLabel: true,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1492,7 +1479,6 @@ export const InSidePanel: Story = {
aggregateFieldMetadataId: idField.id,
displayDataLabel: true,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1651,7 +1637,6 @@ export const Catalog: CatalogStory<Story, typeof WidgetRenderer> = {
aggregateFieldMetadataId: idField.id,
displayDataLabel: true,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1744,7 +1729,6 @@ export const Catalog: CatalogStory<Story, typeof WidgetRenderer> = {
position: 0,
pageLayoutId: PAGE_LAYOUT_TEST_INSTANCE_ID,
widgets: [widget],
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1757,7 +1741,6 @@ export const Catalog: CatalogStory<Story, typeof WidgetRenderer> = {
position: 1,
pageLayoutId: PAGE_LAYOUT_TEST_INSTANCE_ID,
widgets: [],
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1772,7 +1755,6 @@ export const Catalog: CatalogStory<Story, typeof WidgetRenderer> = {
position: 0,
pageLayoutId: PAGE_LAYOUT_TEST_INSTANCE_ID,
widgets: [widget],
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -297,7 +297,6 @@ const createPageLayoutWithWidget = (
position: 0,
pageLayoutId: PAGE_LAYOUT_TEST_INSTANCE_ID,
widgets: [widget],
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -351,7 +350,6 @@ export const TextFieldWidget: Story = {
fieldMetadataId: nameField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -445,7 +443,6 @@ export const AddressFieldWidget: Story = {
fieldMetadataId: addressField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -542,7 +539,6 @@ export const NumberFieldWidget: Story = {
fieldMetadataId: employeesField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -636,7 +632,6 @@ export const LinkFieldWidget: Story = {
fieldMetadataId: linkedinField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -730,7 +725,6 @@ export const ManyToOneRelationFieldWidget: Story = {
fieldMetadataId: accountOwnerField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -834,7 +828,6 @@ export const OneToManyRelationFieldWidget: Story = {
fieldMetadataId: companyPeopleField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -930,7 +923,6 @@ export const BooleanFieldWidget: Story = {
fieldMetadataId: idealCustomerProfileField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1023,7 +1015,6 @@ export const CurrencyFieldWidget: Story = {
fieldMetadataId: annualRecurringRevenueField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1116,7 +1107,6 @@ export const EmailsFieldWidget: Story = {
fieldMetadataId: personEmailsField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1210,7 +1200,6 @@ export const PhonesFieldWidget: Story = {
fieldMetadataId: personPhonesField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1304,7 +1293,6 @@ export const SelectFieldWidget: Story = {
fieldMetadataId: opportunityStageField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1399,7 +1387,6 @@ export const MultiSelectFieldWidget: Story = {
fieldMetadataId: companyWorkPolicyField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1497,7 +1484,6 @@ export const TimelineActivityRelationFieldWidget: Story = {
fieldMetadataId: timelineActivityWorkspaceMemberField.id,
fieldDisplayMode: FieldDisplayMode.FIELD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1596,7 +1582,6 @@ export const ManyToOneRelationCardWidget: Story = {
fieldMetadataId: accountOwnerField.id,
fieldDisplayMode: FieldDisplayMode.CARD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1708,7 +1693,6 @@ export const OneToManyRelationCardWidget: Story = {
fieldMetadataId: companyPeopleField.id,
fieldDisplayMode: FieldDisplayMode.CARD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1803,7 +1787,6 @@ export const TimelineActivityRelationCardWidget: Story = {
fieldMetadataId: timelineActivityWorkspaceMemberField.id,
fieldDisplayMode: FieldDisplayMode.CARD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -1964,7 +1947,6 @@ export const OneToManyRelationCardWidgetWithProgressiveLoading: Story = {
fieldMetadataId: companyPeopleField.id,
fieldDisplayMode: FieldDisplayMode.CARD,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -147,7 +147,6 @@ const createPageLayoutWithWidget = (
position: 0,
pageLayoutId: PAGE_LAYOUT_TEST_INSTANCE_ID,
widgets: [widget],
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -177,7 +176,6 @@ const createFieldsWidget = (viewId: string | null): PageLayoutWidget => ({
configurationType: WidgetConfigurationType.FIELDS,
viewId,
},
isOverridden: false,
createdAt: '2024-01-01T00:00:00Z',
updatedAt: '2024-01-01T00:00:00Z',
deletedAt: null,
@@ -217,7 +215,6 @@ const createViewField = (
isVisible: true,
size: 200,
aggregateOperation: null,
isOverridden: false,
viewId: FIELDS_VIEW_ID,
...(viewFieldGroupId !== undefined && { viewFieldGroupId }),
});
@@ -233,7 +230,6 @@ const createViewFieldGroup = (
name,
position,
isVisible,
isOverridden: false,
viewId: FIELDS_VIEW_ID,
viewFields,
});
@@ -13,7 +13,6 @@ const buildViewField = (
isVisible: true,
size: 100,
aggregateOperation: null,
isOverridden: false,
...overrides,
});
@@ -24,7 +23,6 @@ const buildExistingViewField = (overrides: Partial<ViewField>): ViewField => ({
isVisible: true,
size: 100,
aggregateOperation: null,
isOverridden: false,
...overrides,
});