fix: remove add record on workflow runs/versions (#18448)

## Summary

- Disable manual record creation (add button, + header button, add new
row) for **WorkflowRun** and **WorkflowVersion** objects since these are
system-managed and should not be created manually
- Fix vertical centering of the record table empty state placeholder
(regression from `styled(Component)` refactor in #18430 — the wrapper
lost `height: 100%` / `width: 100%`)

## Test plan

- [ ] Navigate to Workflow Runs index page → empty state should show
centered placeholder **without** "Add a Workflow Run" button
- [ ] Navigate to Workflow Versions index page → empty state should show
centered placeholder **without** "Add a Workflow Version" button
- [ ] Navigate to any other object index page (e.g. People, Companies) →
empty state should still show the "Add a ..." button and be centered
- [ ] Verify the + button in the record table header is hidden for
workflow runs/versions
- [ ] Verify the "Add New" row at the bottom of the table is hidden for
workflow runs/versions
This commit is contained in:
Charles Bochet 2026-03-05 23:57:34 +01:00 committed by GitHub
parent e27a8b5107
commit b421efbff7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 33 additions and 2 deletions

View file

@ -4,6 +4,7 @@ import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useU
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
import { useCreateNewIndexRecord } from '@/object-record/record-table/hooks/useCreateNewIndexRecord';
import { RecordTableActionRow } from '@/object-record/record-table/record-table-row/components/RecordTableActionRow';
import { isRecordTableCreateDisabled } from '@/object-record/record-table/utils/isRecordTableCreateDisabled';
import { useLoadRecordsToVirtualRows } from '@/object-record/record-table/virtualization/hooks/useLoadRecordsToVirtualRows';
import { totalNumberOfRecordsToVirtualizeComponentState } from '@/object-record/record-table/virtualization/states/totalNumberOfRecordsToVirtualizeComponentState';
import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue';
@ -65,6 +66,10 @@ export const RecordTableNoRecordGroupAddNew = () => {
return null;
}
if (isRecordTableCreateDisabled(objectMetadataItem.nameSingular)) {
return null;
}
return (
<RecordTableActionRow
onClick={handleButtonClick}

View file

@ -2,6 +2,7 @@ import { useObjectPermissionsForObject } from '@/object-record/hooks/useObjectPe
import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObjectMetadataReadOnly';
import { hasAnySoftDeleteFilterOnViewComponentSelector } from '@/object-record/record-filter/states/hasAnySoftDeleteFilterOnView';
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
import { isRecordTableCreateDisabled } from '@/object-record/record-table/utils/isRecordTableCreateDisabled';
import { useScrollWrapperHTMLElement } from '@/ui/utilities/scroll/hooks/useScrollWrapperHTMLElement';
import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue';
import { styled } from '@linaria/react';
@ -17,6 +18,9 @@ import {
} from 'twenty-ui/layout';
const StyledEmptyPlaceholderOuterContainer = styled.div`
height: 100%;
width: 100%;
> * {
align-items: flex-start;
}
@ -77,7 +81,8 @@ export const RecordTableEmptyStateDisplay = (
{'buttonComponent' in props && props.buttonComponent}
{'buttonTitle' in props &&
!isReadOnly &&
!hasAnySoftDeleteFilterOnView && (
!hasAnySoftDeleteFilterOnView &&
!isRecordTableCreateDisabled(objectMetadataItem.nameSingular) && (
<Button
Icon={props.ButtonIcon}
title={props.buttonTitle}

View file

@ -2,6 +2,7 @@ import { isObjectMetadataReadOnly } from '@/object-record/read-only/utils/isObje
import { hasAnySoftDeleteFilterOnViewComponentSelector } from '@/object-record/record-filter/states/hasAnySoftDeleteFilterOnView';
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
import { useCreateNewIndexRecord } from '@/object-record/record-table/hooks/useCreateNewIndexRecord';
import { isRecordTableCreateDisabled } from '@/object-record/record-table/utils/isRecordTableCreateDisabled';
import { useAtomComponentSelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentSelectorValue';
import { styled } from '@linaria/react';
import { IconPlus } from 'twenty-ui/display';
@ -45,7 +46,8 @@ export const RecordTableHeaderLabelIdentifierCellPlusButton = () => {
!isMobile &&
!isReadOnly &&
hasObjectUpdatePermissions &&
!hasAnySoftDeleteFilterOnView && (
!hasAnySoftDeleteFilterOnView &&
!isRecordTableCreateDisabled(objectMetadataItem.nameSingular) && (
<StyledHeaderIcon>
<LightIconButton
Icon={IconPlus}

View file

@ -5,6 +5,7 @@ import { recordIndexGroupFieldMetadataItemComponentState } from '@/object-record
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
import { useCreateNewIndexRecord } from '@/object-record/record-table/hooks/useCreateNewIndexRecord';
import { RecordTableActionRow } from '@/object-record/record-table/record-table-row/components/RecordTableActionRow';
import { isRecordTableCreateDisabled } from '@/object-record/record-table/utils/isRecordTableCreateDisabled';
import { useAtomFamilyStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilyStateValue';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { t } from '@lingui/core/macro';
@ -42,6 +43,10 @@ export const RecordTableRecordGroupSectionAddNew = () => {
return null;
}
if (isRecordTableCreateDisabled(objectMetadataItem.nameSingular)) {
return null;
}
return (
<RecordTableActionRow
LeftIcon={IconPlus}

View file

@ -0,0 +1,14 @@
import { CoreObjectNameSingular } from 'twenty-shared/types';
const OBJECTS_WITHOUT_MANUAL_RECORD_CREATION: readonly CoreObjectNameSingular[] =
[CoreObjectNameSingular.WorkflowRun, CoreObjectNameSingular.WorkflowVersion];
export const isRecordTableCreateDisabled = (
objectNameSingular: string,
): boolean => {
const isDisabled = OBJECTS_WITHOUT_MANUAL_RECORD_CREATION.includes(
objectNameSingular as CoreObjectNameSingular,
);
return isDisabled;
};