Skip to content

Commit caf1904

Browse files
author
pipeline
committed
v28.1.41 is released
1 parent bdbf4ad commit caf1904

File tree

157 files changed

+1771
-651
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

157 files changed

+1771
-651
lines changed

controls/barcodegenerator/CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 28.1.39 (2024-01-14)
5+
## 28.1.41 (2025-01-21)
66

77
### Barcode
88

controls/buttons/CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 28.1.39 (2024-01-14)
5+
## 28.1.41 (2025-01-21)
66

77
### Switch
88

controls/calendars/CHANGELOG.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
## [Unreleased]
44

5+
## 28.1.41 (2025-01-21)
6+
7+
### DatePicker
8+
9+
#### Bug Fixes
10+
11+
- `#I675886` - Fixed an issue where values were not updated correctly when a mask was configured.
12+
513
## 28.1.39 (2024-01-14)
614

715
### DateRangePicker
@@ -1211,4 +1219,4 @@ TimePicker component is the pre-filled dropdown list with the time values 12/24
12111219

12121220
- **StrictMode** - Allows to entering the only valid time in a textbox.
12131221

1214-
- **Accessibility** - Provided with built-in accessibility support which helps to access all the TimePicker component features through the keyboard, screen readers, or other assistive technology devices.
1222+
- **Accessibility** - Provided with built-in accessibility support which helps to access all the TimePicker component features through the keyboard, screen readers, or other assistive technology devices.

controls/calendars/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@syncfusion/ej2-calendars",
3-
"version": "28.1.37",
3+
"version": "28.1.39",
44
"description": "A complete package of date or time components with built-in features such as date formatting, inline editing, multiple (range) selection, range restriction, month and year selection, strict mode, and globalization.",
55
"author": "Syncfusion Inc.",
66
"license": "SEE LICENSE IN license",

controls/calendars/src/maskbase/masked-date-time.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ export class MaskedDateTime {
328328
return;
329329
}
330330
this.isDayPart = true;
331-
this.dayTypeCount = this.dayTypeCount + 1;
331+
const maxDaysInMonth: number = new Date(newDateValue.getFullYear(), newDateValue.getMonth() + 1, 0).getDate();
332+
this.dayTypeCount += (this.dayTypeCount === 0 && (parseInt(date + '0', 10) > maxDaysInMonth)) ? 2 : 1;
332333
} else {
333334
this.isDayPart = false;
334335
this.dayTypeCount = this.isDateZero ? this.dayTypeCount + 1 : this.dayTypeCount;
@@ -450,7 +451,7 @@ export class MaskedDateTime {
450451
newDateValue.setHours(Math.floor(newDateValue.getHours() / 12) * 12 + (this.hour % 12));
451452
this.isNavigate = this.hour.toString().length === 2;
452453
this.isHourPart = true;
453-
this.hourTypeCount = this.hourTypeCount + 1;
454+
this.hourTypeCount = (this.hourTypeCount === 0 && this.hour && (parseInt(this.hour + '0', 10) > 12)) ? 2 : this.hourTypeCount + 1;
454455
break;
455456
case 'H':
456457
this.hour = (this.isHourPart && newDateValue.getHours().toString().length < 2 &&
@@ -466,7 +467,7 @@ export class MaskedDateTime {
466467
newDateValue.setHours(this.hour);
467468
this.isNavigate = this.hour.toString().length === 2;
468469
this.isHourPart = true;
469-
this.hourTypeCount = this.hourTypeCount + 1;
470+
this.hourTypeCount = (this.hourTypeCount === 0 && this.hour && (parseInt(this.hour + '0', 10) > 23)) ? 2 : this.hourTypeCount + 1;
470471
break;
471472
case 'm':
472473
{
@@ -483,7 +484,7 @@ export class MaskedDateTime {
483484
newDateValue.setMinutes(minutes);
484485
this.isNavigate = minutes.toString().length === 2;
485486
this.isMinutePart = true;
486-
this.minuteTypeCount = this.minuteTypeCount + 1;
487+
this.minuteTypeCount = (this.minuteTypeCount === 0 && (parseInt(minutes + '0', 10) > 59)) ? 2 : this.minuteTypeCount + 1;
487488
break;
488489
}
489490
case 's':
@@ -501,7 +502,7 @@ export class MaskedDateTime {
501502
newDateValue.setSeconds(seconds);
502503
this.isNavigate = seconds.toString().length === 2;
503504
this.isSecondsPart = true;
504-
this.secondTypeCount = this.secondTypeCount + 1;
505+
this.secondTypeCount = (this.secondTypeCount === 0 && (parseInt(seconds + '0', 10) > 59)) ? 2 : this.secondTypeCount + 1;
505506
break;
506507
}
507508
case 'a':

controls/charts/CHANGELOG.md

+15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22

33
## [Unreleased]
44

5+
## 28.1.41 (2025-01-21)
6+
7+
### Chart
8+
9+
#### Bug Fixes
10+
11+
- `#I651775` - The data label position for the stacked column now renders properly.
12+
- `#F195744` - The tooltip for the stacking column series now renders properly during keyboard navigation.
13+
14+
### Bullet Chart
15+
16+
#### Bug Fixes
17+
18+
- `#I676482` - The bullet chart will render properly even when the range is set to empty.
19+
520
## 28.1.39 (2024-01-14)
621

722
### Chart

controls/charts/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@syncfusion/ej2-charts",
3-
"version": "28.1.38",
3+
"version": "28.1.39",
44
"description": "Feature-rich chart control with built-in support for over 25 chart types, technical indictors, trendline, zooming, tooltip, selection, crosshair and trackball.",
55
"author": "Syncfusion Inc.",
66
"license": "SEE LICENSE IN license",

controls/charts/spec/chart/series/stacking-column-series.spec.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -1896,15 +1896,17 @@ describe('Chart Control', () => {
18961896
loaded = function (args) {
18971897
let legendElement = document.getElementById('container_Series_0_Point_0_Text_0').getAttribute('x');
18981898
let legendElement1 = document.getElementById('container_Series_1_Point_0_Text_0').getAttribute('x');
1899-
expect(legendElement).toBe('36.4');
1900-
expect(legendElement1).toBe('36.4');
1899+
expect(legendElement).toBe('16');
1900+
expect(legendElement1).toBe('16');
19011901
legendElement = document.getElementById('container_Series_0_Point_0_Text_0').getAttribute('y');
19021902
legendElement1 = document.getElementById('container_Series_1_Point_0_Text_0').getAttribute('y');
1903-
expect(legendElement).toBe('336.3104248046875');
1904-
expect(legendElement1).toBe('322.5380078125');
1903+
expect(legendElement).toBe('132.31040954589844');
1904+
expect(legendElement1).toBe('127.8333958943685');
19051905
done();
19061906
};
19071907
chartObj.loaded = loaded;
1908+
chartObj.height = '240px';
1909+
chartObj.width = '336px';
19081910
chartObj.refresh();
19091911
});
19101912
});

controls/charts/src/bullet-chart/bullet-chart.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ export class BulletChart extends Component<HTMLElement> implements INotifyProper
660660
if (!this.minimum) {
661661
this.minimum = 0;
662662
}
663-
if (!this.maximum) {
663+
if (!this.maximum && this.ranges.length) {
664664
this.maximum = 0;
665665
for (let i: number = 0; i < this.ranges.length; i++) {
666666
this.maximum = this.maximum > this.ranges[i as number].end ? this.maximum : this.ranges[i as number].end;

controls/charts/src/chart/chart.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -3647,8 +3647,10 @@ export class Chart extends Component<HTMLElement> implements INotifyPropertyChan
36473647
const pointIndex: number = +(targetId.split('_Series_')[1].replace('_Symbol', '').split('_Point_')[1]);
36483648
const pointRegion: ChartLocation = this.visibleSeries[seriesIndex as number].points[pointIndex as number].
36493649
symbolLocations[0];
3650-
this.mouseX = pointRegion.x + this.initialClipRect.x;
3651-
this.mouseY = pointRegion.y + this.initialClipRect.y;
3650+
this.mouseX = pointRegion.x + this.initialClipRect.x - (this.visibleSeries[seriesIndex as number].type.indexOf('StackingBar') > -1 ?
3651+
this.visibleSeries[seriesIndex as number].marker.height / 2 : 0);
3652+
this.mouseY = pointRegion.y + this.initialClipRect.y + (this.visibleSeries[seriesIndex as number].type.indexOf('StackingColumn') > -1 ?
3653+
this.visibleSeries[seriesIndex as number].marker.height / 2 : 0);
36523654
if (this.highlightModule) {
36533655
this.highlightModule.highlightChart(document.getElementById(targetId), 'mousemove');
36543656
this.highlightModule.completeSelection(document.getElementById(targetId), 'mousemove');

controls/charts/src/chart/series/data-label.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ export class DataLabel {
456456
if (!(dataLabel.enableRotation === true && dataLabel.angle !== 0) &&
457457
!((rect.y > (clipRect.y + clipRect.height)) || (rect.x > (clipRect.x + clipRect.width)) ||
458458
(rect.x + rect.width < 0) || (rect.y + rect.height < 0))) {
459-
rect.x = rect.x < 0 ? padding : rect.x;
459+
rect.x = rect.x < 0 ? (series.type === 'StackingColumn' && !this.inverted ? 0 : padding) : rect.x;
460460
rect.y = (rect.y < 0 && !this.chart.requireInvertedAxis) && !(dataLabel.labelIntersectAction === 'None') ? padding : rect.y;
461461
rect.x -= (rect.x + rect.width) > (clipRect.x + clipRect.width) ? (rect.x + rect.width)
462462
- (clipRect.x + clipRect.width) + padding : 0;
@@ -608,8 +608,12 @@ export class DataLabel {
608608
const margin: MarginModel = this.margin;
609609
const textLength: number = (series.marker.dataLabel.enableRotation ? textSize.width :
610610
(!this.inverted ? textSize.height : textSize.width));
611-
this.extraSpace = this.borderWidth + textLength / 2 + (position !== 'Outer' && series.type.indexOf('Column') > -1 &&
612-
(Math.abs(rect.height - textSize.height) < padding) ? 0 : padding);
611+
if (position === 'Bottom' && series.type === 'StackingColumn' && !this.inverted && rect.height < textSize.height) {
612+
this.extraSpace = this.borderWidth + ((Math.abs(rect.height - textSize.height / 2) < padding) ? 0 : padding);
613+
} else {
614+
this.extraSpace = this.borderWidth + textLength / 2 + (position !== 'Outer' && series.type.indexOf('Column') > -1 &&
615+
(Math.abs(rect.height - textSize.height) < padding) ? 0 : padding);
616+
}
613617
if (series.type === 'StackingColumn100' || series.type === 'StackingBar100') {
614618
position = (position === 'Outer') ? 'Top' : position;
615619
} else if (series.type.indexOf('Range') > -1) {

controls/data/CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 28.1.39 (2024-01-14)
5+
## 28.1.41 (2025-01-21)
66

77
### DataManager
88

controls/diagrams/CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 28.1.39 (2024-01-14)
5+
## 28.1.41 (2025-01-21)
66

77
### Diagram
88

controls/documenteditor/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@syncfusion/ej2-documenteditor",
3-
"version": "28.1.38",
3+
"version": "28.1.39",
44
"description": "Feature-rich document editor control with built-in support for context menu, options pane and dialogs.",
55
"keywords": [
66
"ej2",

controls/documenteditor/src/document-editor/implementation/editor/editor-helper.ts

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export class HelperMethods {
8181
text = text.replace('\v', ' ');
8282
text = text.replace('\t', ' ');
8383
text = text.replace('/', ' ');
84+
text = text.replace(String.fromCharCode(160), ' ');
8485

8586
const stringarr: string[] = text.split(' ');
8687
const spellColl: any = [];

controls/documenteditor/src/document-editor/implementation/editor/editor.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -11548,6 +11548,13 @@ export class Editor {
1154811548
}
1154911549

1155011550
private applyCharFormat(paragraph: ParagraphWidget, selection: Selection, start: TextPosition, end: TextPosition, property: string, value: Object, update: boolean): BlockWidget {
11551+
let previousSplittedWidget: ParagraphWidget = paragraph.previousSplitWidget as ParagraphWidget;
11552+
let isPageBreak: boolean = false;
11553+
if (!isNullOrUndefined(previousSplittedWidget) && previousSplittedWidget instanceof ParagraphWidget) {
11554+
if (previousSplittedWidget.isEndsWithPageBreak) {
11555+
isPageBreak = true;
11556+
}
11557+
}
1155111558
paragraph = paragraph.combineWidget(this.owner.viewer) as ParagraphWidget;
1155211559
let startOffset: number = 0;
1155311560
let length: number = selection.getParagraphLength(paragraph);
@@ -11633,14 +11640,13 @@ export class Editor {
1163311640
j += index;
1163411641

1163511642
if (endOffset <= count + inlineLength) {
11636-
break;
11643+
break;
1163711644
}
1163811645
count += inlineLength;
1163911646
}
1164011647
}
1164111648
let endParagraph: ParagraphWidget = end.paragraph;
11642-
11643-
this.documentHelper.layout.reLayoutParagraph(paragraph, startLineWidget, 0);
11649+
this.documentHelper.layout.reLayoutParagraph(paragraph, isPageBreak ? 0 : startLineWidget, 0);
1164411650

1164511651
if (paragraph.equals(endParagraph)) {
1164611652
return undefined;

controls/documenteditor/src/document-editor/implementation/spell-check/spell-checker.ts

+4
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,10 @@ export class SpellChecker {
981981
httpRequest.setRequestHeader('Content-Type', 'application/json');
982982
let headers = this.documentHelper.owner.headers;
983983
/* eslint-disable @typescript-eslint/no-explicit-any */
984+
if (isByPage)
985+
{
986+
word = word.replace(String.fromCharCode(160), ' ');
987+
}
984988
const spellCheckData: any = { LanguageID: languageID, TexttoCheck: word, CheckSpelling: checkSpelling, CheckSuggestion: checkSuggestion, AddWord: addWord };
985989
const httprequestEventArgs: XmlHttpRequestEventArgs = { serverActionType: 'SpellCheck', headers: headers, timeout: 0, cancel: false, withCredentials: false };
986990
headers = httprequestEventArgs.headers;

controls/documenteditor/src/document-editor/implementation/viewer/page.ts

+4
Original file line numberDiff line numberDiff line change
@@ -4904,6 +4904,10 @@ export abstract class ElementBox {
49044904
* @private
49054905
*/
49064906
public isSpellChecked?: boolean = false;
4907+
/**
4908+
* @private
4909+
*/
4910+
public isSpellCheckTriggred: boolean = false;
49074911
/**
49084912
* @private
49094913
*/

controls/documenteditor/src/document-editor/implementation/viewer/render.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { SpellChecker } from '../spell-check/spell-checker';
2121
import { Revision } from '../track-changes/track-changes';
2222
import { WColumnFormat, WSectionFormat } from '../format';
2323
import { FontScriptType, TextWrappingStyle } from '../../index';
24-
import { TextSizeInfo } from './text-helper';
24+
import { TextHelper, TextSizeInfo } from './text-helper';
2525
import { DocumentCanvasElement, DocumentCanvasRenderingContext2D } from './document-canvas';
2626
import { Dictionary } from '../../base/dictionary';
2727
import { getPathString, PathSegment, pathSegmentCollection, PointModel, processPathData, splitArrayCollection, transformPath } from '../utility/path-util';
@@ -90,7 +90,7 @@ export class Renderer {
9090
return this.documentHelper.owner.viewer;
9191
}
9292
public renderWidgets(page: Page, left: number, top: number, width: number, height: number): void {
93-
if (isNullOrUndefined(this.pageCanvas) || isNullOrUndefined(page)) {
93+
if (isNullOrUndefined(this.pageCanvas) || isNullOrUndefined(page) || isNullOrUndefined(page.bodyWidgets)) {
9494
return;
9595
}
9696
this.pageContext.fillStyle = HelperMethods.getColor(this.documentHelper.backgroundColor);
@@ -1798,7 +1798,7 @@ private calculatePathBounds(data: string): Rect {
17981798
elementBox.canTrigger = true;
17991799
}
18001800
elementBox.isVisible = false;
1801-
if (!elementBox.isSpellChecked || elementBox.line.paragraph.isChangeDetected) {
1801+
if ((!elementBox.isSpellChecked && !elementBox.isSpellCheckTriggred) || elementBox.line.paragraph.isChangeDetected) {
18021802
elementBox.ischangeDetected = true;
18031803
}
18041804
}
@@ -2340,7 +2340,7 @@ private calculatePathBounds(data: string): Rect {
23402340
left -= elementBox.width;
23412341
}
23422342
if (this.documentHelper.owner.isSpellCheck) {
2343-
if (((this.documentHelper.owner.isSpellCheck && !this.spellChecker.removeUnderline) && (this.documentHelper.triggerSpellCheck || elementBox.canTrigger) && elementBox.text !== ' ' && !this.documentHelper.isScrollHandler && (isNullOrUndefined(elementBox.previousNode) || !(elementBox.previousNode instanceof FieldElementBox && (elementBox.previousNode as FieldElementBox).fieldType === 2)))) {
2343+
if (((this.documentHelper.owner.isSpellCheck && !this.spellChecker.removeUnderline) && (this.documentHelper.triggerSpellCheck || elementBox.canTrigger) && elementBox.text !== ' ' && elementBox.text.trim() !== '' && !this.documentHelper.textHelper.containsSpecialCharAlone(elementBox.text) && !this.documentHelper.isScrollHandler && (isNullOrUndefined(elementBox.previousNode) || !(elementBox.previousNode instanceof FieldElementBox && (elementBox.previousNode as FieldElementBox).fieldType === 2)))) {
23442344
elementBox.canTrigger = true;
23452345
this.leftPosition = this.pageLeft;
23462346
this.topPosition = this.pageTop;
@@ -2370,6 +2370,7 @@ private calculatePathBounds(data: string): Rect {
23702370
} else if (elementBox.ischangeDetected || this.documentHelper.triggerElementsOnLoading) {
23712371
elementBox.ischangeDetected = false;
23722372
this.handleChangeDetectedElements(elementBox, underlineY, left, top, format.baselineAlignment);
2373+
elementBox.isSpellCheckTriggred = true;
23732374
}
23742375
}
23752376
}

controls/drawings/CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## [Unreleased]
44

5-
## 28.1.39 (2024-01-14)
5+
## 28.1.41 (2025-01-21)
66

77
### Drawings
88

controls/dropdowns/CHANGELOG.md

+20
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,26 @@
22

33
## [Unreleased]
44

5+
## 28.1.41 (2025-01-21)
6+
7+
### ComboBox
8+
9+
#### Bug Fixes
10+
11+
- `#I679101` - Fixed the issue where an error was encountered when filtering in the ComboBox with custom values disabled and virtualization enabled.
12+
13+
### DropDownTree
14+
15+
#### Bug Fixes
16+
17+
- `#I678070` - The issue change event is not triggered when checking SelectAll checkbox after dynamically selecting any node in the Dropdown Tree component has been resolved.
18+
19+
### MultiSelect
20+
21+
#### Bug Fixes
22+
23+
- `#I662148` - Fixed an issue where the value was not bound to the Multiselect component.
24+
525
## 28.1.39 (2024-01-14)
626

727
### ListBox

controls/dropdowns/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@syncfusion/ej2-dropdowns",
3-
"version": "28.1.38",
3+
"version": "28.1.39",
44
"description": "Essential JS 2 DropDown Components",
55
"author": "Syncfusion Inc.",
66
"license": "SEE LICENSE IN license",

0 commit comments

Comments
 (0)