Skip to content

Commit 7550d4c

Browse files
author
pipeline
committed
v29.1.39 is released
1 parent 1f4b4e4 commit 7550d4c

File tree

236 files changed

+23225
-335
lines changed

Some content is hidden

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

236 files changed

+23225
-335
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-
## 29.1.38 (2025-04-15)
5+
## 29.1.39 (2025-04-22)
66

77
### Barcode
88

controls/calendars/CHANGELOG.md

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

33
## [Unreleased]
44

5-
## 29.1.38 (2025-04-15)
5+
## 29.1.39 (2025-04-22)
6+
7+
### TimePicker
8+
9+
#### Bug Fixes
10+
11+
- `#I705507` - Fixed an issue where a null value still displayed as `12:00` when the mask was enabled.
12+
13+
## 29.1.35 (2025-04-01)
614

715
### DatePicker
816

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": "18.32.5",
3+
"version": "29.1.35",
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/spec/calendar/calendar.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4002,7 +4002,7 @@ describe(' Islamic Calendar', () => {
40024002
calendar.appendTo('#calendar');
40034003
calendar.values = [new Date('5/5/2017'), new Date('5/6/2017'), new Date('5/9/2017')];
40044004
calendar.dataBind();
4005-
expect(calendar.values.length).toBe(3);
4005+
expect(calendar.values.length).toBe(2);
40064006
});
40074007

40084008
// it('Islamic calendar-enabling the date values of disabled dates', function () {debugger

controls/calendars/src/calendar/calendar.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -1719,20 +1719,28 @@ export class CalendarBase extends Component<HTMLElement> implements INotifyPrope
17191719
for (let skipIndex: number = 0; skipIndex < copyValues.length; skipIndex++) {
17201720
const tempValue: Date = copyValues[skipIndex as number];
17211721
const type: string = (this.calendarMode === 'Gregorian') ? 'gregorian' : 'islamic';
1722+
let tempValueFormat: object;
17221723
let tempValueString: string;
1724+
let tempValueDate: object;
17231725
if (this.calendarMode === 'Gregorian') {
1724-
tempValueString = this.globalize.formatDate(tempValue, { type: 'date', skeleton: 'yMd' });
1726+
tempValueFormat = { type: 'date', skeleton: 'yMd' };
1727+
tempValueString = this.globalize.formatDate(tempValue, tempValueFormat);
1728+
tempValueDate = this.globalize.parseDate(tempValueString, tempValueFormat);
17251729
} else {
1726-
tempValueString = this.globalize.formatDate(tempValue, { type: 'dateTime', skeleton: 'full', calendar: 'islamic' });
1730+
tempValueFormat = { type: 'date', skeleton: 'yMd', calendar: 'islamic' };
1731+
tempValueString = this.globalize.formatDate(tempValue, tempValueFormat);
1732+
tempValueDate = this.globalize.parseDate(tempValueString, tempValueFormat);
17271733
}
17281734
const minFormatOption: object = { type: 'date', skeleton: 'yMd', calendar: type };
17291735
const minStringValue: string = this.globalize.formatDate(this.min, minFormatOption);
17301736
const minString: string = minStringValue;
17311737
const maxFormatOption: object = { type: 'date', skeleton: 'yMd', calendar: type };
17321738
const maxStringValue: string = this.globalize.formatDate(this.max, maxFormatOption);
17331739
const maxString: string = maxStringValue;
1734-
if (+new Date(tempValueString) < +new Date(minString) ||
1735-
+new Date(tempValueString) > +new Date(maxString)) {
1740+
const minDate: object = this.globalize.parseDate(minString, minFormatOption);
1741+
const maxDate: object = this.globalize.parseDate(maxString, maxFormatOption);
1742+
1743+
if (+tempValueDate < +minDate || +tempValueDate > +maxDate) {
17361744
copyValues.splice(skipIndex, 1);
17371745
skipIndex = -1;
17381746
}

controls/calendars/src/timepicker/timepicker.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2384,7 +2384,8 @@ export class TimePicker extends Component<HTMLElement> implements IInput {
23842384
const formatStr: string = null;
23852385
let today: string = this.globalize.formatDate(new Date(), { format: formatStr, skeleton: 'short', type: 'date' });
23862386
let value: Date = null;
2387-
if (typeof val === 'string') {
2387+
if (typeof val === 'string' && !(this.enableMask && this.maskedDateValue &&
2388+
this.inputElement.value === this.maskedDateValue && !this.value)) {
23882389
if (val.toUpperCase().indexOf('AM') > -1 || val.toUpperCase().indexOf('PM') > -1) {
23892390
today = this.defaultCulture.formatDate(new Date(), { format: formatStr, skeleton: 'short', type: 'date' });
23902391
value = isNaN(+new Date(today + ' ' + val)) ? null : new Date(new Date(today + ' ' + val).setMilliseconds(0));

controls/charts/CHANGELOG.md

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

33
## [Unreleased]
44

5-
## 29.1.38 (2025-04-15)
5+
## 29.1.39 (2025-04-22)
66

77
### 3DChart
88

controls/data/CHANGELOG.md

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

33
## [Unreleased]
44

5-
## 29.1.38 (2025-04-15)
5+
## 29.1.39 (2025-04-22)
66

77
### DataManager
88

controls/diagrams/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#### Bug Fixes
1010

1111
- `#I706720` - Added localization support for `SearchResults` and `noItemsToDisplay` texts in the symbol palette.
12+
- `#I709691` - The connector will now be routed properly without overlapping nodes in the child-to-parent connection flow.
1213

1314
## 29.1.37 (2025-04-08)
1415

controls/diagrams/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@syncfusion/ej2-diagrams",
3-
"version": "29.1.37",
3+
"version": "29.1.38",
44
"description": "Feature-rich diagram control to create diagrams like flow charts, organizational charts, mind maps, and BPMN diagrams. Its rich feature set includes built-in shapes, editing, serializing, exporting, printing, overview, data binding, and automatic layouts.",
55
"author": "Syncfusion Inc.",
66
"license": "SEE LICENSE IN license",

controls/diagrams/src/diagram/interaction/command-manager.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,7 @@ export class CommandHandler {
12781278
// 939249: Duplicate Ports Added to Group After Grouping and Undoing.
12791279
obj.annotations = (group.annotations as ShapeAnnotationModel[]);
12801280
obj.ports = (group.ports as PointPortModel[]);
1281+
obj.zIndex = group.zIndex;
12811282
obj.style = group.style;
12821283
const entry: HistoryEntry = { type: 'Group', undoObject: obj, redoObject: obj, category: 'Internal' };
12831284
this.addHistoryEntry(entry);

controls/diagrams/src/diagram/interaction/line-distribution.ts

+52-14
Original file line numberDiff line numberDiff line change
@@ -841,13 +841,15 @@ export class LineDistribution {
841841
let overlappCollection = [];
842842
if (sourceLevel < targetLevel) {
843843
for (let i = 0; i < collection.length; i++) {
844-
if (i > sourceLevel && i < targetLevel) {
844+
//EJ2-949872 - Connector Lines Overlapping Nodes in Child-to-Parent Flow
845+
if (i >= sourceLevel && i <= targetLevel) {
845846
overlappCollection.push(collection[parseInt(i.toString(), 10)]);
846847
}
847848
}
848849
} else {
849850
for (let i = 0; i < collection.length; i++) {
850-
if (i < sourceLevel && i > targetLevel) {
851+
//EJ2-949872 - Connector Lines Overlapping Nodes in Child-to-Parent Flow
852+
if (i <= sourceLevel && i >= targetLevel) {
851853
overlappCollection.push(collection[parseInt(i.toString(), 10)]);
852854
}
853855
}
@@ -867,29 +869,65 @@ export class LineDistribution {
867869
(diagram as any).routingConnectors = [];
868870
}
869871
//To find whether the connector is overlapping with the nodes in the overlapping collection.
872+
let connectorBounds: Rect = this.getConnectorBounds(connector);
870873
// eslint-disable-next-line no-labels
871874
overlapping:
872875
for(let count = 0; count < overLapNodesCollection.length;count++){
873876
let bounds = overLapNodesCollection[parseInt(count.toString(), 10)].wrapper.bounds;
874-
for (let i = 0; i < connector.segments.length; i++) {
875-
let points = (connector.segments[parseInt(i.toString(), 10)] as any).points;
876-
for (let j = 0; j < points.length; j++) {
877-
let lineStart = points[parseInt(j.toString(), 10)];
878-
let lineEnd = points[j + 1];
879-
if (lineEnd) {
880-
let connectorPoints = this.pointsAlongLine(lineStart, lineEnd);
881-
isInsideBounds = this.pointInsideBounds(connectorPoints, bounds);
882-
if (isInsideBounds) {
883-
(diagram as any).routingConnectors.push(connector);
884-
// eslint-disable-next-line no-labels
885-
break overlapping;
877+
//EJ2-949872 - Connector Lines Overlapping Nodes in Child-to-Parent Flow
878+
if(connectorBounds.intersects(bounds)){
879+
for (let i = 0; i < connector.segments.length; i++) {
880+
let points = (connector.segments[parseInt(i.toString(), 10)] as any).points;
881+
for (let j = 0; j < points.length; j++) {
882+
let lineStart = points[parseInt(j.toString(), 10)];
883+
let lineEnd = points[j + 1];
884+
if (lineEnd) {
885+
let connectorPoints = this.pointsAlongLine(lineStart, lineEnd);
886+
isInsideBounds = this.pointInsideBounds(connectorPoints, bounds);
887+
if (isInsideBounds) {
888+
(diagram as any).routingConnectors.push(connector);
889+
// eslint-disable-next-line no-labels
890+
break overlapping;
891+
}
886892
}
887893
}
888894
}
889895
}
890896
}
891897
}
892898
}
899+
/**
900+
* Calculates the bounds of a connector by iterating through its segments and points.
901+
* @param connector Provide the connector value.
902+
* @returns An object representing the bounds of the connector.
903+
*/
904+
private getConnectorBounds(connector: Connector): Rect {
905+
let minX : number = Number.MAX_VALUE;
906+
let minY : number = Number.MAX_VALUE;
907+
let maxX : number= Number.MIN_VALUE;
908+
let maxY : number= Number.MIN_VALUE;
909+
// Iterate through all segments of the connector
910+
/* eslint-disable */
911+
for (let i = 0; i < connector.segments.length; i++) {
912+
const segment = connector.segments[i];
913+
const points = (segment as any).points;
914+
// Iterate through all points in the segment
915+
for (let j = 0; j < points.length; j++) {
916+
const point = points[j];
917+
minX = Math.min(minX, point.x);
918+
minY = Math.min(minY, point.y);
919+
maxX = Math.max(maxX, point.x);
920+
maxY = Math.max(maxY, point.y);
921+
}
922+
}
923+
//Return the bounds as an object
924+
return new Rect(
925+
minX,
926+
minY,
927+
maxX - minX,
928+
maxY - minY
929+
);
930+
}
893931
/**
894932
* Calculates points along a line between two given points.
895933
* @param start The starting point of the line.

controls/diagrams/src/diagram/objects/undo-redo.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,13 @@ export class UndoRedo {
620620
if (diagram.diagramActions & DiagramAction.UndoRedo) {
621621
isUndoRedo = true;
622622
}
623-
updateSwimLaneObject(diagram, node, swimlane, obj);
623+
//Swimlane break - Phase collapsed upon serialization after resizing and undo-redo.
624+
let widthDiff: number = 0; let heightDiff: number = 0;
625+
if (obj.wrapper && obj.wrapper.actualSize && node.wrapper && node.wrapper.actualSize) {
626+
widthDiff = obj.wrapper.actualSize.width - node.wrapper.actualSize.width;
627+
heightDiff = obj.wrapper.actualSize.height - node.wrapper.actualSize.height;
628+
}
629+
updateSwimLaneObject(diagram, node, swimlane, obj, widthDiff, heightDiff);
624630
if (isRow) {
625631
grid.updateRowHeight(obj.rowIndex, obj.wrapper.actualSize.height, true, padding, isUndoRedo);
626632
swimlane.height = swimlane.wrapper.height = grid.height;

controls/diagrams/src/diagram/utility/swim-lane-util.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,7 @@ export function updateSwimLaneObject(diagram: Diagram, obj: Node, swimLane: Node
967967
if (curPhase) {
968968
const gridPhase: Canvas = grid.rows[curPhase.rowIndex].cells[curPhase.columnIndex];
969969
const gridPhaseMinWidth: number = gridPhase.minWidth;
970-
if ( phases[parseInt(p.toString(), 10)].offset < gridPhaseMinWidth) {
970+
if ( phases[parseInt(p.toString(), 10)].offset < gridPhaseMinWidth && !isUndoRedo) {
971971
phases[parseInt(p.toString(), 10)].offset = gridPhaseMinWidth;
972972
}
973973
}
@@ -989,7 +989,7 @@ export function updateSwimLaneObject(diagram: Diagram, obj: Node, swimLane: Node
989989
if (curPhase) {
990990
const gridPhase: Canvas = grid.rows[curPhase.rowIndex].cells[curPhase.columnIndex];
991991
const gridPhaseMinHeight: number = gridPhase.minHeight;
992-
if ( phases[parseInt(p.toString(), 10)].offset < gridPhaseMinHeight) {
992+
if ( phases[parseInt(p.toString(), 10)].offset < gridPhaseMinHeight && !isUndoRedo) {
993993
phases[parseInt(p.toString(), 10)].offset = gridPhaseMinHeight;
994994
}
995995
}

controls/documenteditor/CHANGELOG.md

+13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22

33
## [Unreleased]
44

5+
## 29.1.39 (2025-04-22)
6+
7+
### DocumentEditor
8+
9+
#### Bug Fixes
10+
11+
- `#I705934` - Fixed the issue where paragraph borders were splitting during merge field insertion using the `insertField` API.
12+
- `#I706158` - Improved cell content control insertion behaviour and resolved border rendering issues.
13+
- `#I708026` - Fixed the overlapping issue with header tags.
14+
- `#I705207` - Addressed the layout issue caused by section breaks during document editing.
15+
- `#I705451` - Resolved the revision pane issue when opening documents using the Document Editor open API.
16+
- `#I703602` - Fixed the `isComplete` flag incorrectly remaining true when dragging the mouse outside the Document Editor view.
17+
518
## 29.1.38 (2025-04-15)
619

720
### DocumentEditor

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": "29.1.37",
3+
"version": "29.1.38",
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-container/document-editor-container.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,9 @@ export class DocumentEditorContainer extends Component<HTMLElement> implements I
12751275
setTimeout(() => {
12761276
if (!isNullOrUndefined(this.documentEditor)) {
12771277
this.showPropertiesPaneOnSelection();
1278+
if (this.documentEditor.documentHelper.isSelectionActive) {
1279+
this.documentEditor.documentHelper.isSelectionCompleted = false;
1280+
}
12781281
let eventArgs: ContainerSelectionChangeEventArgs = { source: this, isCompleted: this.documentEditor.documentHelper.isSelectionCompleted };
12791282
this.trigger(selectionChangeEvent, eventArgs);
12801283
this.documentEditor.documentHelper.isSelectionCompleted = true;

controls/documenteditor/src/document-editor-container/tool-bar/tool-bar.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { showSpinner, hideSpinner, DialogUtility } from '@syncfusion/ej2-popups'
88
import { ToolbarItem, BeforeFileOpenArgs } from '../../document-editor/base';
99
import { XmlHttpRequestHandler, beforePaneSwitchEvent, toolbarClickEvent, beforeFileOpenEvent } from '../../document-editor/base/index';
1010
import { CustomToolbarItemModel } from '../../document-editor/base/events-helper';
11-
import { beforeXmlHttpRequestSend, XmlHttpRequestEventArgs, ProtectionType, SectionBreakType } from './../../index';
11+
import { beforeXmlHttpRequestSend, XmlHttpRequestEventArgs, ProtectionType, SectionBreakType, TextPosition } from './../../index';
1212
import { ListView, SelectEventArgs as ListSelectEventArgs } from '@syncfusion/ej2-lists';
1313
import { HelperMethods } from './../../index';
1414

@@ -1057,6 +1057,9 @@ export class Toolbar {
10571057
}
10581058
}
10591059
}
1060+
if (this.documentEditor.selection.isCellOrRowSelected()) {
1061+
this.toolbar.enableItems(document.getElementById(id + INSERT_LINK_ID).parentElement, false);
1062+
}
10601063
if (!isProtectedContent || this.container.showPropertiesPane) {
10611064
if (isProtectedContent) {
10621065
enable = this.container.showPropertiesPane;

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -963,17 +963,17 @@ export class ContextMenu {
963963
editField.style.display = 'block';
964964
} else {
965965
let start: TextPosition = selection.start;
966-
let end: TextPosition = selection.end;
966+
// let end: TextPosition = selection.end;
967967
if (selection.contextType === 'List'
968968
&& owner.selectionModule.getListLevel(start.paragraph).listLevelPattern !== 'Bullet') {
969969
continueNumbering.style.display = 'block';
970970
restartAt.style.display = 'block';
971971
(restartAt.nextSibling as HTMLElement).style.display = 'block';
972972
}
973-
let isCellOrRowSelected: boolean = start.paragraph.isInsideTable && (!end.paragraph.isInsideTable
974-
|| start.paragraph.associatedCell !== end.paragraph.associatedCell
975-
|| selection.isCellSelected(start.paragraph.associatedCell, start, end));
976-
if (isCellOrRowSelected) {
973+
// let isCellOrRowSelected: boolean = start.paragraph.isInsideTable && (!end.paragraph.isInsideTable
974+
// || start.paragraph.associatedCell !== end.paragraph.associatedCell
975+
// || selection.isCellSelected(start.paragraph.associatedCell, start, end));
976+
if (selection.isCellOrRowSelected()) {
977977
hyperlink.classList.add('e-disabled');
978978
} else {
979979
if (hyperlink.classList.contains('e-disabled')) {

0 commit comments

Comments
 (0)