Skip to content

Commit a15d846

Browse files
Merge branch '25_1_ng_nested_fix' of https://github.com/GoodDayForSurf/DevExtreme into 25_1_ng_nested_fix
2 parents b774595 + 6fd06ac commit a15d846

File tree

20 files changed

+650
-466
lines changed

20 files changed

+650
-466
lines changed
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
In this example, the PieChart component combines all values below the **threshold** property in one category called _«others»_.
2-
<!--split-->
1+
DevExtreme PieChart supports small value grouping. To enable this functionality, configure the [smallValuesGrouping](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) object in [series](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/) or [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/commonSeriesSettings/). This demo sets **smallValuesGrouping**.[mode](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/) to *"smallValueThreshold"* and specifies the [threshold](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#threshold) property.
2+
<!--split-->
3+
4+
You can also set **smallValuesGrouping**.**mode** to *"topN"*. In this mode, PieChart displays a predefined number of the largest data points (specified with [topCount](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/smallValuesGrouping/#topCount)) and groups the rest.

e2e/testcafe-devextreme/tests/dataGrid/common/scrolling.ts

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ async function getRightScrollOffset(dataGrid: DataGrid): Promise<number> {
2020
return maxHorizontalOffset - scrollLeft;
2121
}
2222

23-
function getData(rowCount, colCount): Record<string, string>[] {
23+
function getData(rowCount: number, colCount: number): Record<string, string>[] {
2424
const items: Record<string, string>[] = [];
2525
for (let i = 0; i < rowCount; i += 1) {
2626
const item: Record<string, string> = {};
2727
for (let j = 0; j < colCount; j += 1) {
28-
item[`field_${i}_${j}`] = `val_${i}_${j}`;
28+
item[`field_${j}`] = `val_${i}_${j}`;
2929
}
3030
items.push(item);
3131
}
@@ -1824,3 +1824,62 @@ test('DataGrid - Scrolling position is reset to far right on an attempt to scrol
18241824
enabled: false,
18251825
},
18261826
}));
1827+
1828+
[true, false].forEach((nativeScroll) => {
1829+
type TestCaseWindow = typeof window & { dataGridScrollableEventValues?: number[] };
1830+
1831+
test(
1832+
`Should not scroll back on top with virtual scrolling and adaptive master detail (nativeScroll: ${nativeScroll}) [T1278804]`,
1833+
async (t) => {
1834+
// NOTE: idx + 1 logic inside POM
1835+
const adaptiveCellIdx = 101;
1836+
const scrollValuesThreshold = 100;
1837+
1838+
const dataGrid = new DataGrid('#container');
1839+
const firstRow = dataGrid.getDataRow(0);
1840+
const firstDataCell = firstRow.getDataCell(0);
1841+
const adaptiveCell = firstRow.getCommandCell(adaptiveCellIdx);
1842+
const scrollContainer = dataGrid.getScrollContainer();
1843+
1844+
await t
1845+
.click(firstDataCell.element)
1846+
.click(adaptiveCell.element);
1847+
1848+
await t
1849+
.scroll(scrollContainer, 0, 1000)
1850+
.scroll(scrollContainer, 0, 1000);
1851+
1852+
const scrollOffsets = await t
1853+
.eval(() => (window as TestCaseWindow).dataGridScrollableEventValues) as number[];
1854+
1855+
const hasSmallScrollValues = scrollOffsets.some((offset) => offset < scrollValuesThreshold);
1856+
await t.expect(hasSmallScrollValues).notOk();
1857+
},
1858+
).before(async () => {
1859+
await createWidget('dxDataGrid', {
1860+
dataSource: getData(3, 100).map((item, idx) => ({ ...item, id: idx })),
1861+
keyExpr: 'id',
1862+
columnHidingEnabled: true,
1863+
focusedRowEnabled: true,
1864+
scrolling: {
1865+
mode: 'virtual',
1866+
useNative: nativeScroll,
1867+
},
1868+
onContentReady: ({ component }) => {
1869+
const testWindow = window as TestCaseWindow;
1870+
1871+
component.getScrollable().on('scroll', ({ scrollOffset: { top } }) => {
1872+
if (!Array.isArray(testWindow.dataGridScrollableEventValues)) {
1873+
testWindow.dataGridScrollableEventValues = [];
1874+
}
1875+
1876+
testWindow.dataGridScrollableEventValues.push(top);
1877+
});
1878+
},
1879+
width: 400,
1880+
height: 400,
1881+
});
1882+
}).after(async (t) => t.eval(() => {
1883+
delete (window as TestCaseWindow).dataGridScrollableEventValues;
1884+
}));
1885+
});

packages/devextreme/js/__internal/core/utils/m_date.ts

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -425,33 +425,37 @@ function getDateIntervalByString(intervalString) {
425425
return result;
426426
}
427427

428-
function sameDate(date1, date2) {
428+
function sameDate(date1, date2): boolean {
429429
return sameMonthAndYear(date1, date2) && date1.getDate() === date2.getDate();
430430
}
431431

432-
function sameMonthAndYear(date1, date2) {
432+
function sameMonthAndYear(date1, date2): boolean {
433433
return sameYear(date1, date2) && date1.getMonth() === date2.getMonth();
434434
}
435435

436-
function sameYear(date1, date2) {
436+
function sameYear(date1, date2): boolean {
437437
return date1 && date2 && date1.getFullYear() === date2.getFullYear();
438438
}
439439

440-
function sameHoursAndMinutes(date1, date2) {
440+
function sameHoursAndMinutes(date1, date2): boolean {
441441
return date1 && date2 && date1.getHours() === date2.getHours() && date1.getMinutes() === date2.getMinutes();
442442
}
443443

444-
const sameDecade = function (date1, date2) {
445-
if (!isDefined(date1) || !isDefined(date2)) return;
444+
const sameDecade = function (date1, date2): boolean {
445+
if (!isDefined(date1) || !isDefined(date2)) {
446+
return false;
447+
}
446448

447449
const startDecadeDate1 = date1.getFullYear() - date1.getFullYear() % 10;
448450
const startDecadeDate2 = date2.getFullYear() - date2.getFullYear() % 10;
449451

450452
return date1 && date2 && startDecadeDate1 === startDecadeDate2;
451453
};
452454

453-
const sameCentury = function (date1, date2) {
454-
if (!isDefined(date1) || !isDefined(date2)) return;
455+
const sameCentury = function (date1, date2): boolean {
456+
if (!isDefined(date1) || !isDefined(date2)) {
457+
return false;
458+
}
455459

456460
const startCenturyDate1 = date1.getFullYear() - date1.getFullYear() % 100;
457461
const startCenturyDate2 = date2.getFullYear() - date2.getFullYear() % 100;
@@ -540,41 +544,56 @@ function getLastDateInYear(year) {
540544

541545
function getDayWeekNumber(date, firstDayOfWeek) {
542546
let day = date.getDay() - firstDayOfWeek + 1;
543-
if (day <= 0) { day += DAYS_IN_WEEK; }
547+
if (day <= 0) {
548+
day += DAYS_IN_WEEK;
549+
}
544550

545551
return day;
546552
}
547553

548-
function getWeekNumber(date, firstDayOfWeek, rule) {
549-
const firstWeekDayInYear = getDayWeekNumber(getFirstDateInYear(date.getFullYear()), firstDayOfWeek);
554+
function getWeekNumber(date, firstDayOfWeek, rule): number {
555+
const firstWeekDayInYear = getDayWeekNumber(
556+
getFirstDateInYear(date.getFullYear()),
557+
firstDayOfWeek,
558+
);
550559
const lastWeekDayInYear = getDayWeekNumber(getLastDateInYear(date.getFullYear()), firstDayOfWeek);
551560
const daysInFirstWeek = DAYS_IN_WEEK - firstWeekDayInYear + 1;
552561

553562
let weekNumber = Math.ceil((getDayNumber(date) - daysInFirstWeek) / 7);
554563
switch (rule) {
555564
case 'fullWeek': {
556-
if (daysInFirstWeek === DAYS_IN_WEEK) { weekNumber++; }
565+
if (daysInFirstWeek === DAYS_IN_WEEK) {
566+
weekNumber += 1;
567+
}
557568
if (weekNumber === 0) {
558569
const lastDateInPreviousYear = getLastDateInYear(date.getFullYear() - 1);
559570
return getWeekNumber(lastDateInPreviousYear, firstDayOfWeek, rule);
560571
}
561572
return weekNumber;
562573
}
563574
case 'firstDay': {
564-
if (daysInFirstWeek > 0) { weekNumber++; }
575+
if (daysInFirstWeek > 0) {
576+
weekNumber += 1;
577+
}
565578

566579
const isSunday = firstWeekDayInYear === SUNDAY_WEEK_NUMBER
567580
|| lastWeekDayInYear === SUNDAY_WEEK_NUMBER;
568-
if ((weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isSunday) || weekNumber === 54) { weekNumber = 1; }
581+
if ((weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isSunday) || weekNumber === 54) {
582+
weekNumber = 1;
583+
}
569584

570585
return weekNumber;
571586
}
572587
case 'firstFourDays': {
573-
if (daysInFirstWeek > 3) { weekNumber++; }
588+
if (daysInFirstWeek > 3) {
589+
weekNumber += 1;
590+
}
574591

575592
const isThursday = firstWeekDayInYear === THURSDAY_WEEK_NUMBER
576593
|| lastWeekDayInYear === THURSDAY_WEEK_NUMBER;
577-
if (weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isThursday) { weekNumber = 1; }
594+
if (weekNumber > USUAL_WEEK_COUNT_IN_YEAR && !isThursday) {
595+
weekNumber = 1;
596+
}
578597

579598
if (weekNumber === 0) {
580599
const lastDateInPreviousYear = getLastDateInYear(date.getFullYear() - 1);
@@ -583,6 +602,7 @@ function getWeekNumber(date, firstDayOfWeek, rule) {
583602
return weekNumber;
584603
}
585604
default:
605+
return weekNumber;
586606
break;
587607
}
588608
}
@@ -699,7 +719,7 @@ const makeDate = function (date) {
699719
};
700720

701721
const getDatesOfInterval = function (startDate, endDate, step) {
702-
const result: any[] = [];
722+
const result: Date[] = [];
703723
let currentDate = new Date(startDate.getTime());
704724

705725
while (currentDate < endDate) {

packages/devextreme/js/__internal/grids/grid_core/keyboard_navigation/m_keyboard_navigation.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3006,7 +3006,9 @@ const adaptiveColumns = (Base: ModuleType<AdaptiveColumnsController>) => class A
30063006
protected _hideVisibleColumnInView({ view, isCommandColumn, visibleIndex }) {
30073007
super._hideVisibleColumnInView({ view, isCommandColumn, visibleIndex });
30083008
if (view.name === ROWS_VIEW) {
3009-
this._rowsView.renderFocusState(null);
3009+
this._rowsView.renderFocusState({
3010+
preventScroll: shouldPreventScroll(this),
3011+
});
30103012
}
30113013
}
30123014
};

0 commit comments

Comments
 (0)