Add ADD NEW cta as the last row (#13594)
<img width="961" height="478" alt="Screenshot 2025-08-04 at 14 34 07" src="https://github.com/user-attachments/assets/42e266d2-7329-4eb7-9d22-78402800f646" /> --------- Co-authored-by: nitin <142569587+ehconitin@users.noreply.github.com>
This commit is contained in:
+49
@@ -0,0 +1,49 @@
|
||||
import { useObjectPermissionsForObject } from '@/object-record/hooks/useObjectPermissionsForObject';
|
||||
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
|
||||
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 { hasRecordTableFetchedAllRecordsComponentStateV2 } from '@/object-record/record-table/states/hasRecordTableFetchedAllRecordsComponentStateV2';
|
||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||
import { t } from '@lingui/core/macro';
|
||||
import { IconPlus } from 'twenty-ui/display';
|
||||
|
||||
export const RecordTableAddNew = () => {
|
||||
const { objectMetadataItem } = useRecordTableContextOrThrow();
|
||||
|
||||
const recordIds = useRecoilComponentValueV2(
|
||||
recordIndexAllRecordIdsComponentSelector,
|
||||
);
|
||||
|
||||
const hasRecordTableFetchedAllRecords = useRecoilComponentValueV2(
|
||||
hasRecordTableFetchedAllRecordsComponentStateV2,
|
||||
);
|
||||
|
||||
const { createNewIndexRecord } = useCreateNewIndexRecord({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const objectPermissions = useObjectPermissionsForObject(
|
||||
objectMetadataItem.id,
|
||||
);
|
||||
|
||||
const hasObjectUpdatePermissions = objectPermissions.canUpdateObjectRecords;
|
||||
|
||||
if (!hasObjectUpdatePermissions || !hasRecordTableFetchedAllRecords) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<RecordTableActionRow
|
||||
draggableId="add-new-record"
|
||||
draggableIndex={recordIds.length + 1}
|
||||
LeftIcon={IconPlus}
|
||||
text={t`Add new`}
|
||||
onClick={() => {
|
||||
createNewIndexRecord({
|
||||
position: 'last',
|
||||
});
|
||||
}}
|
||||
/>
|
||||
);
|
||||
};
|
||||
+2
@@ -1,4 +1,5 @@
|
||||
import { recordIndexAllRecordIdsComponentSelector } from '@/object-record/record-index/states/selectors/recordIndexAllRecordIdsComponentSelector';
|
||||
import { RecordTableAddNew } from '@/object-record/record-table/components/RecordTableAddNew';
|
||||
import { RecordTableBodyDroppablePlaceholder } from '@/object-record/record-table/record-table-body/components/RecordTableBodyDroppablePlaceholder';
|
||||
import { RecordTableBodyFetchMoreLoader } from '@/object-record/record-table/record-table-body/components/RecordTableBodyFetchMoreLoader';
|
||||
import { RecordTableAggregateFooter } from '@/object-record/record-table/record-table-footer/components/RecordTableAggregateFooter';
|
||||
@@ -27,6 +28,7 @@ export const RecordTableNoRecordGroupRows = () => {
|
||||
/>
|
||||
);
|
||||
})}
|
||||
<RecordTableAddNew />
|
||||
<RecordTableBodyFetchMoreLoader />
|
||||
<RecordTableBodyDroppablePlaceholder />
|
||||
{!isRecordTableInitialLoading && allRecordIds.length > 0 && (
|
||||
|
||||
+11
-7
@@ -14,6 +14,14 @@ const StyledRecordTableDraggableTr = styled(RecordTableDraggableTr)`
|
||||
&:hover {
|
||||
background-color: ${({ theme }) => theme.background.transparent.light};
|
||||
}
|
||||
|
||||
td {
|
||||
border-bottom: 1px solid ${({ theme }) => theme.border.color.light};
|
||||
|
||||
&:first-of-type {
|
||||
border-bottom: 1px solid ${({ theme }) => theme.background.primary};
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
const StyledIconContainer = styled(RecordTableTd)`
|
||||
@@ -40,10 +48,6 @@ const StyledText = styled.span`
|
||||
vertical-align: middle;
|
||||
`;
|
||||
|
||||
const StyledEmptyTd = styled.td`
|
||||
border-bottom: 1px solid ${({ theme }) => theme.border.color.light};
|
||||
`;
|
||||
|
||||
type RecordTableActionRowProps = {
|
||||
draggableId: string;
|
||||
draggableIndex: number;
|
||||
@@ -82,9 +86,9 @@ export const RecordTableActionRow = ({
|
||||
<StyledRecordTableTdTextContainer className="disable-shadow">
|
||||
<StyledText>{text}</StyledText>
|
||||
</StyledRecordTableTdTextContainer>
|
||||
<StyledEmptyTd colSpan={visibleTableColumns.length - 1} />
|
||||
<StyledEmptyTd />
|
||||
<StyledEmptyTd />
|
||||
<td colSpan={visibleTableColumns.length - 1} aria-hidden />
|
||||
<td aria-hidden />
|
||||
<td aria-hidden />
|
||||
</StyledRecordTableDraggableTr>
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user