Skip to content
6 changes: 6 additions & 0 deletions static/app/components/replays/table/replayTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ type Props = SortProps & {
highlightedRowIndex?: number;
query?: Query;
ref?: RefObject<HTMLDivElement | null>;
stickyHeader?: boolean;
};

export default function ReplayTable({
Expand All @@ -43,6 +44,8 @@ export default function ReplayTable({
showDropdownFilters,
highlightedRowIndex = -1,
sort,
// stickyHeader only works if the table is inside a scrollable container
stickyHeader = false,
}: Props) {
const gridTemplateColumns = columns.map(col => col.width ?? 'max-content').join(' ');
const hasInteractiveColumn = columns.some(col => col.interactive);
Expand All @@ -59,6 +62,7 @@ export default function ReplayTable({
replays={replays}
onSortClick={onSortClick}
sort={sort}
stickyHeader={stickyHeader}
/>
<SimpleTable.Empty>
<LoadingIndicator />
Expand All @@ -79,6 +83,7 @@ export default function ReplayTable({
onSortClick={onSortClick}
replays={replays}
sort={sort}
stickyHeader={stickyHeader}
/>

<SimpleTable.Empty>
Expand All @@ -102,6 +107,7 @@ export default function ReplayTable({
onSortClick={onSortClick}
replays={replays}
sort={sort}
stickyHeader={stickyHeader}
/>
{replays.length === 0 && (
<SimpleTable.Empty>{t('No replays found')}</SimpleTable.Empty>
Expand Down
15 changes: 13 additions & 2 deletions static/app/components/replays/table/replayTableHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,29 @@ type Props = {
replays: ReplayListRecord[];
onSortClick?: (key: string) => void;
sort?: Sort;
stickyHeader?: boolean;
};

export default function ReplayTableHeader({columns, replays, onSortClick, sort}: Props) {
export default function ReplayTableHeader({
columns,
replays,
onSortClick,
sort,
stickyHeader,
}: Props) {
const listItemCheckboxState = useListItemCheckboxContext();
const {countSelected, isAllSelected, isAnySelected, queryKey, selectAll, selectedIds} =
listItemCheckboxState;
const queryOptions = parseQueryKey(queryKey).options;
const queryString = queryOptions?.query?.query;

const headerStyle: React.CSSProperties = stickyHeader
? {position: 'sticky', top: 0}
: {};

return (
<Fragment>
<TableHeader>
<TableHeader style={headerStyle}>
{columns.map(({Header, sortKey}, columnIndex) => (
<SimpleTable.HeaderCell
key={`${sortKey}-${columnIndex}`}
Expand Down
1 change: 1 addition & 0 deletions static/app/views/replays/detail/playlist/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export default function Playlist() {
query={location.query}
replays={replays}
showDropdownFilters={false}
stickyHeader
/>
);
}
Loading