developer guide
Data Grid Fill Handle and Series Fill
The fill handle extends a selection by dragging its corner: repeat one value down a column, or continue a run of numbers or dates, with month ends carried across properly rather than by adding thirty days.
Developer guide › Editing › Data Grid Fill Handle and Series Fill
Filling a series
Dragging the fill handle continues what it can recognise rather than repeating the block. Detection is per column, so dragging three columns down continues three independent series.
What is recognised
1, 2, 3 // → 4, 5, 6 constant difference, two or more values
5, 10, 15 // → 20, 25 any step, including negative and fractional
2026-01-01 … // → the next day, week or whatever the gap is
15 Jan, 15 Feb // → 15 Mar whole months, holding the day of month
31 Jan, 28 Feb // → 31 Mar, 30 Apr month ends stay on the month end
'x', 'y' // → x, y, x, y nothing recognised, so the block repeats
7 // → 7, 7, 7 one value is a copy, not a series
Months step as months. 15 January to 15 February is thirty-one days, and continuing in days would land on 18 March and drift further every step. A month step holds the date the user picked, and clamps where the month is short: 31 January plus a month is 28 February, not 3 March.
Month ends are their own case. 31 Jan, 28 Feb is a month
series whose second value has already been clamped, so the two share no day of month and the
day-preserving rule cannot see it. Where every source value is the last day of its own month,
the fill stays on the month end: 31 March, 30 April, 31 May, and 29 February in a leap year.
Values that share a day of month keep the day-preserving answer, so 30 Apr, 30 Jun
still gives 30 August rather than the 31st.
One limit worth knowing. Filling upwards is not supported; the handle extends downwards only.
Supplying your own series
selection: {
fill: ({ source, target, direction }) => target.map((t, i) => nextCode(source, i)),
}
A domain series (order codes, fiscal periods, seat numbers) is not something the grid
can infer, so selection.fill takes precedence when you supply it. It must return
one value per target row; anything else is ignored in favour of the built-in detection,
rather than being partly applied.