Skip to content

Commit 7eee9a0

Browse files
author
pipeline
committed
v28.1.38 is released
1 parent fc0bec9 commit 7eee9a0

File tree

142 files changed

+7122
-772
lines changed

Some content is hidden

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

142 files changed

+7122
-772
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.37 (2024-12-31)
5+
## 28.1.38 (2025-01-07)
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.37 (2024-12-31)
5+
## 28.1.38 (2025-01-07)
66

77
### Switch
88

controls/calendars/CHANGELOG.md

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

33
## [Unreleased]
44

5-
## 28.1.37 (2024-12-31)
5+
## 28.1.38 (2025-01-07)
66

77
### DateRangePicker
88

controls/charts/CHANGELOG.md

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

33
## [Unreleased]
44

5+
## 28.1.38 (2025-01-07)
6+
7+
### Chart
8+
9+
#### Bug Fixes
10+
11+
- `#F195601` - The console error no longer occurs when rendering a single data point with a multilevel label.
12+
- `#I676165` - Exporting a chart with complex properties to CSV or XLSX now functions correctly.
13+
14+
### Accumulation Chart
15+
16+
#### Bug Fixes
17+
18+
- `#I674361` - The subtitle now renders correctly even when its length exceeds that of the title.
19+
520
## 28.1.37 (2024-12-31)
621

722
### Chart
@@ -11,7 +26,7 @@
1126
- `#I667080` - The column series now renders properly when the width is set in pixels and `enableSideBySidePlacement` is set to false.
1227
- `#I654525` - The y-axis now dynamically adjusts to accommodate negative ranges when the negative error bar exceeds the minimum value.
1328

14-
## 28.1.36
29+
## 28.1.36 (2024-12-24)
1530

1631
### Chart
1732

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.35",
3+
"version": "28.1.37",
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/error-bar.spec.ts

+40
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,46 @@ describe('Chart Control', () => {
11571157
chartObj.refresh();
11581158
});
11591159
});
1160+
1161+
describe('Chart error bar series auto range update', () => {
1162+
let chartObj: Chart;
1163+
let elem: HTMLElement;
1164+
let loaded: EmitType<ILoadedEventArgs>;
1165+
beforeAll(() => {
1166+
elem = createElement('div', { id: 'container' });
1167+
document.body.appendChild(elem);
1168+
chartObj = new Chart(
1169+
{
1170+
series: [{
1171+
dataSource: [{ x: 2005, y: 28 }, { x: 2006, y: 25 },{ x: 2007, y: 26 }, { x: 2008, y: 47 },
1172+
{ x: 2009, y: 32 }, { x: 2010, y: 35 }, { x: 2011, y: 30 }],
1173+
xName: 'x', yName: 'y',
1174+
errorBar: {
1175+
visible: true,
1176+
errorBarColorMapping: 'color',
1177+
verticalError: 'error'
1178+
},
1179+
type: 'Line'
1180+
}],
1181+
1182+
});
1183+
chartObj.appendTo('#container');
1184+
1185+
});
1186+
afterAll((): void => {
1187+
elem.remove();
1188+
chartObj.destroy();
1189+
});
1190+
it('Checking for minimum error', (): void => {
1191+
loaded = (args: Object): void => {
1192+
const element: Element = document.getElementById('container1_AxisLabel_10');
1193+
expect(element.textContent === '50').toBe(true);
1194+
};
1195+
chartObj.loaded = loaded;
1196+
chartObj.refresh();
1197+
});
1198+
1199+
});
11601200
it('memory leak', () => {
11611201
profile.sample();
11621202
let average: any = inMB(profile.averageChange)

controls/charts/spec/pie/base/accumulation.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ describe('accumulation and Doughnut Control Checking', () => {
176176
accumulation.subTitle = 'Syncfusion accumulation subTitleSyncfusionaccumulationTitleSyncfusion';
177177
accumulation.dataBind();
178178
text = getElement(id + '_subTitle');
179-
expect(text.childNodes.length == 2).toBe(true);
179+
expect(text.childNodes.length == 1).toBe(true);
180180
});
181181

182182
it('Checking the title font size', () => {
@@ -214,7 +214,7 @@ describe('accumulation and Doughnut Control Checking', () => {
214214
accumulation.subTitleStyle.textOverflow = 'Trim';
215215
accumulation.dataBind();
216216
text = getElement(id + '_subTitle');
217-
expect(text.textContent.indexOf('...') != -1).toBe(true);
217+
expect(text.textContent.indexOf('...') == -1).toBe(true);
218218
});
219219
it('Checking the border color', () => {
220220
accumulation.border.width = 2;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1796,7 +1796,7 @@ export class AccumulationChart extends Component<HTMLElement> implements INotify
17961796
titleWidth = measureText(titleText, this.titleStyle, this.themeStyle.chartSubTitleFont).width;
17971797
maxWidth = titleWidth > maxWidth ? titleWidth : maxWidth;
17981798
}
1799-
this.subTitleCollection = getTitle(this.subTitle, this.subTitleStyle, maxWidth, this.enableRtl,
1799+
this.subTitleCollection = getTitle(this.subTitle, this.subTitleStyle, this.initialClipRect.width, this.enableRtl,
18001800
this.themeStyle.chartSubTitleFont);
18011801
subTitleHeight = (measureText(this.subTitle, this.subTitleStyle,
18021802
this.themeStyle.chartSubTitleFont).height * this.subTitleCollection.length);

controls/charts/src/chart/axis/multi-level-labels.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ export class MultiLevelLabel {
281281
const groupLabel: MultiLevelLabels = <MultiLevelLabels>axis.multiLevelLabels[labelIndex as number];
282282
const categoryType: BorderType = groupLabel.categories[categoryIndex as number].type;
283283
const width: number = gap + padding;
284-
let height: number = this.xAxisMultiLabelHeight[labelIndex as number] + padding;
284+
let height: number = isNullOrUndefined(this.xAxisMultiLabelHeight[labelIndex as number]) ? 0 :
285+
(this.xAxisMultiLabelHeight[labelIndex as number] + padding);
285286
const scrollBarHeight: number = axis.labelPosition === 'Outside' ? axis.scrollBarHeight : 0;
286287
const x: number = startX + axisRect.x;
287288
const y: number = ((!opposedPosition && isOutside) || (opposedPosition && !isOutside)) ? (startY + axisRect.y +

controls/charts/src/chart/print-export/export.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { IExportEventArgs } from '../model/chart-interface';
1010
import { IPDFArgs } from '../../common/model/interface';
1111
import { Workbook } from '@syncfusion/ej2-excel-export';
1212
import { ErrorBarSettingsModel, Series, SeriesModel, AxisModel } from '../../chart';
13+
import { getValue } from '@syncfusion/ej2-base';
1314

1415
/**
1516
* Defines the cell style in an Excel export.
@@ -503,7 +504,11 @@ export class Export {
503504
let usedValueCount: number = isXValue ? 0 : 1;
504505
const usedValueLength: number = this.series[seriesCount as number].type === 'BoxAndWhisker' ? requiredValues[seriesCount as number].length - 1 : requiredValues[seriesCount as number].length;
505506
for (; usedValueCount < usedValueLength; usedValueCount++) {
506-
let value: string | boolean | number | Date = (usedValueCount !== 0 && (this.series[seriesCount as number].type === 'BoxAndWhisker' || (this.series[seriesCount as number] as Series).category === 'Pareto')) ? (this.series[seriesCount as number] as Series).points[dataCount as number][requiredValues[seriesCount as number][usedValueCount as number]] : dataSource[dataCount as number][requiredValues[seriesCount as number][usedValueCount as number]];
507+
const cellValue: Object = (this.series[seriesCount as number] as Series).enableComplexProperty ?
508+
getValue(requiredValues[seriesCount as number][usedValueCount as number],
509+
dataSource[dataCount as number]) :
510+
dataSource[dataCount as number][requiredValues[seriesCount as number][usedValueCount as number]];
511+
let value: string | boolean | number | Date = (usedValueCount !== 0 && (this.series[seriesCount as number].type === 'BoxAndWhisker' || (this.series[seriesCount as number] as Series).category === 'Pareto')) ? (this.series[seriesCount as number] as Series).points[dataCount as number][requiredValues[seriesCount as number][usedValueCount as number]] : cellValue;
507512
if (value === null && type === 'CSV') {
508513
value = '';
509514
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1223,8 +1223,8 @@ export class SeriesBase extends ChildProperty<SeriesBase> {
12231223
}
12241224
}
12251225
this.yMax += !isNaN(maxVerticalError) && isNullOrUndefined(this.yAxis.maximum) ? maxVerticalError : 0;
1226-
this.yMin = !isNaN(minVerticalError) && minVerticalError < this.yMin && isNullOrUndefined(this.yAxis.minimum) ?
1227-
minVerticalError : this.yMin;
1226+
this.yMin = !isNaN(minVerticalError) && minVerticalError < this.yMin && minVerticalError < 0 &&
1227+
isNullOrUndefined(this.yAxis.minimum) ? minVerticalError : this.yMin;
12281228
}
12291229
}
12301230
}

controls/charts/src/chart/user-interaction/crosshair.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -396,13 +396,12 @@ export class Crosshair {
396396
pathElement.setAttribute('stroke-width', ' ' + borderwidth);
397397
}
398398
else if (this.chart.theme.indexOf('Fluent2') > -1) {
399-
pathElement.setAttribute('box-shadow', '0px 1.6px 3.6px 0px #00000021, 0px 0.3px 0.9px 0px #0000001A');
400-
pathElement.setAttribute('filter', Browser.isIE ? '' : 'url(#' + shadowId + ')');
401399
let shadow: string = '<filter id="' + shadowId + '" height="130%"><feGaussianBlur in="SourceAlpha" stdDeviation="3"/>';
402400
shadow += '<feOffset dx="-1" dy="3.6" result="offsetblur"/><feComponentTransfer><feFuncA type="linear" slope="0.2"/>';
403401
shadow += '</feComponentTransfer><feMerge><feMergeNode/><feMergeNode in="SourceGraphic"/></feMerge></filter>';
404402
const defElement: Element = this.chart.renderer.createDefs();
405403
defElement.setAttribute('id', this.chart.element.id + 'SVG_tooltip_definition');
404+
pathElement.setAttribute('filter', Browser.isIE ? '' : 'url(#' + shadowId + ')');
406405
pathElement.appendChild(defElement);
407406
defElement.innerHTML = shadow;
408407
}

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.37 (2024-12-31)
5+
## 28.1.38 (2025-01-07)
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.37 (2024-12-31)
5+
## 28.1.38 (2025-01-07)
66

77
### Diagram
88

controls/documenteditor/CHANGELOG.md

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

33
## [Unreleased]
44

5+
## 28.1.38 (2025-01-07)
6+
7+
### DocumentEditor
8+
9+
#### Bug Fixes
10+
11+
- `#I665316` - Fixed layout issue during editing due to start and end fields being in different paragraphs.
12+
- `#I664308` - Addressed the problem of HTML content not copying correctly to the clipboard when copying table content with block content control.
13+
- `#I669203` - Corrected the issue where revisions in headers were not reflected in the track changes pane due to existing header/footer conditions.
14+
- `#I675010` - Resolved script error encountered when removing inline contents that include field elements.
15+
- `#I658140` - Improved performance when inserting text into split table cells across multiple pages.
16+
- `#I665482` - Fixed script error that occurred when pasting content from Microsoft Word into the Document Editor after selecting table cell content.
17+
518
## 28.1.37 (2024-12-31)
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": "28.1.35",
3+
"version": "28.1.37",
44
"description": "Feature-rich document editor control with built-in support for context menu, options pane and dialogs.",
55
"keywords": [
66
"ej2",

controls/documenteditor/spec/implementation/content-control.spec.ts

+88-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { DocumentEditor } from '../../src/document-editor/document-editor';
22
import { createElement } from '@syncfusion/ej2-base';
3-
import { Editor} from '../../src/index';
3+
import { ContentControlInfo, Editor} from '../../src/index';
44
import { TestHelper } from '../test-helper.spec';
55
import { Selection } from '../../src/index';
66
import { EditorHistory } from '../../src/document-editor/implementation/editor-history/editor-history';
@@ -108,7 +108,7 @@ describe('check apply content control', () => {
108108
editor.editorModule.insertContentControl('CheckBox');
109109
editor.selection.handleLeftKey();
110110
expect(editor.documentHelper.contentControlCollection[0].contentControlProperties.isChecked).toBe(false);
111-
editor.editorModule.toggleContentControlCheckBox(editor.documentHelper.contentControlCollection[0]);
111+
editor.editorModule.toggleContentControlCheckBox(editor.documentHelper.contentControlCollection[0], !editor.documentHelper.contentControlCollection[0].contentControlProperties.isChecked);
112112
expect(editor.documentHelper.contentControlCollection[0].contentControlProperties.isChecked).toBe(true);
113113
});
114114
it('validate text insertion after content control',()=>{
@@ -120,4 +120,89 @@ describe('check apply content control', () => {
120120
editor.editor.insertText("Text after CC");
121121
expect(editor.selection.start.currentWidget.children.length > count).toBe(true);
122122
})
123-
});
123+
});
124+
125+
describe('Validate getContentControinfo', () => {
126+
let editor: DocumentEditor;
127+
beforeAll((): void => {
128+
let ele: HTMLElement = createElement('div', { id: 'container' });
129+
document.body.appendChild(ele);
130+
editor = new DocumentEditor({ enableEditor: true, isReadOnly: false });
131+
DocumentEditor.Inject(Editor, Selection, EditorHistory); editor.enableEditorHistory = true;
132+
(editor.documentHelper as any).containerCanvasIn = TestHelper.containerCanvas;
133+
(editor.documentHelper as any).selectionCanvasIn = TestHelper.selectionCanvas;
134+
(editor.documentHelper.render as any).pageCanvasIn = TestHelper.pageCanvas;
135+
(editor.documentHelper.render as any).selectionCanvasIn = TestHelper.pageSelectionCanvas;
136+
editor.appendTo('#container');
137+
});
138+
afterAll((done): void => {
139+
editor.destroy();
140+
document.body.removeChild(document.getElementById('container'));
141+
editor = undefined;
142+
setTimeout(function () {
143+
document.body.innerHTML = '';
144+
done();
145+
}, 1000);
146+
});
147+
it('apply plain text content control', () => {
148+
console.log('apply plain text content control');
149+
editor.openBlank();
150+
editor.editorModule.insertText('Insering the plain text content control and using using getContentControlInfo method');
151+
editor.selection.selectAll();
152+
editor.editorModule.insertContentControl('Text');
153+
editor.selection.select('0;0;10', '0;0;10');
154+
let contentControlInfo: ContentControlInfo = editor.selectionModule.getContentControlInfo();
155+
expect(contentControlInfo.value).toBe('Insering the plain text content control and using using getContentControlInfo method');
156+
expect(contentControlInfo.type).toBe('Text');
157+
contentControlInfo.value = contentControlInfo.value + ' added new text';
158+
editor.importContentControlData([contentControlInfo]);
159+
editor.selection.select('0;0;10', '0;0;10');
160+
contentControlInfo = editor.selectionModule.getContentControlInfo();
161+
expect(contentControlInfo.value).toBe('Insering the plain text content control and using using getContentControlInfo method added new text');
162+
});
163+
it('apply combo box content control', () => {
164+
console.log('apply combo box content control');
165+
editor.openBlank();
166+
editor.editorModule.insertText('sample');
167+
editor.selection.selectAll();
168+
editor.editorModule.insertContentControl('ComboBox');
169+
editor.selection.select('0;0;5', '0;0;5');
170+
let contentControlInfo: ContentControlInfo = editor.selectionModule.getContentControlInfo();
171+
expect(contentControlInfo.value).toBe('sample');
172+
expect(contentControlInfo.type).toBe('ComboBox');
173+
contentControlInfo.value = 'new value';
174+
editor.importContentControlData([contentControlInfo]);
175+
editor.selection.select('0;0;5', '0;0;5');
176+
contentControlInfo = editor.selectionModule.getContentControlInfo();
177+
expect(contentControlInfo.value).toBe('new value');
178+
});
179+
it('apply check box content control', () => {
180+
console.log('apply check box content control');
181+
editor.openBlank();
182+
editor.editorModule.insertContentControl('CheckBox');
183+
editor.selection.select('0;0;1', '0;0;1');
184+
let contentControlInfo: ContentControlInfo = editor.selectionModule.getContentControlInfo();
185+
expect(contentControlInfo.value).toBe('false');
186+
expect(contentControlInfo.type).toBe('CheckBox');
187+
contentControlInfo.value = 'true';
188+
editor.importContentControlData([contentControlInfo]);
189+
editor.selection.select('0;0;1', '0;0;1');
190+
contentControlInfo = editor.selectionModule.getContentControlInfo();
191+
expect(contentControlInfo.value).toBe('true');
192+
});
193+
it('apply date picker content control', () => {
194+
console.log('apply date picker content control');
195+
editor.openBlank();
196+
editor.editorModule.insertContentControl('Date','5/12/24');
197+
editor.selection.select('0;0;3', '0;0;3');
198+
let contentControlInfo: ContentControlInfo = editor.selectionModule.getContentControlInfo();
199+
expect(contentControlInfo.value).toBe('5/12/24');
200+
expect(contentControlInfo.type).toBe('Date');
201+
contentControlInfo.value = '6/12/24';
202+
editor.importContentControlData([contentControlInfo]);
203+
editor.selection.select('0;0;3', '0;0;3');
204+
contentControlInfo = editor.selectionModule.getContentControlInfo();
205+
expect(contentControlInfo.value).toBe('6/12/24');
206+
});
207+
208+
});

controls/documenteditor/spec/implementation/editor_4.spec.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,8 @@ describe('XML set content Control API validation', () => {
697697
expect(editor.documentHelper.contentControlCollection[0].contentControlProperties.xmlMapping.prefixMapping).toBe('http://schemas.microsoft.com/vsto/samples');
698698
});
699699
it('validate setContentControlInfo sets all cc properties',()=>{
700-
editor.editor.insertContentControl('RichText','OriginalText');
700+
editor.openBlank();
701+
editor.editor.insertContentControl('Text','OriginalText');
701702
let oldInfo = editor.selection.getContentControlInfo();
702703
if (oldInfo)
703704
{

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -3809,17 +3809,18 @@ export class DocumentEditor extends Component<HTMLElement> implements INotifyPro
38093809
* @param {ContentControlInfo[]} contentControlInfo - The array of content control information to be imported.
38103810
* @returns {ContentControlInfo[]} The processed content control information.
38113811
*/
3812-
public importContentControlData(contentControlInfo: ContentControlInfo[]): ContentControlInfo[]{
3812+
public importContentControlData(contentControlInfo: ContentControlInfo[]): ContentControlInfo[] {
38133813
for (let i: number = 0; i < contentControlInfo.length; i++) {
38143814
const contentInfo: ContentControlInfo = contentControlInfo[parseInt(i.toString(), 10)];
38153815
for (let j: number = 0; j < this.documentHelper.contentControlCollection.length; j++) {
38163816
const contentControl: ContentControl = this.documentHelper.contentControlCollection[parseInt(j.toString(), 10)];
3817-
if (contentInfo.title === contentControl.contentControlProperties.title) {
3817+
if (contentInfo.type === contentControl.contentControlProperties.type
3818+
&& contentInfo.title === contentControl.contentControlProperties.title) {
38183819
this.editorModule.updateContentControl(contentControl, contentInfo.value);
38193820
}
38203821
}
38213822
}
3822-
return[];
3823+
return [];
38233824
}
38243825
/**
38253826
* Exports the content control values.

0 commit comments

Comments
 (0)