Skip to content

Commit 7437151

Browse files
author
pipeline
committed
v19.3.44 is released
1 parent e538cf3 commit 7437151

File tree

178 files changed

+2935
-530
lines changed

Some content is hidden

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

178 files changed

+2935
-530
lines changed

controls/base/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"gulp-sass": "^3.1.0",
5252
"gulp-typescript": "^3.1.6",
5353
"requirejs": "^2.3.3",
54-
"typescript": "3.3.1",
54+
"typescript": "2.3.4",
5555
"canteen": "^1.0.5",
5656
"jasmine-ajax": "^3.3.1",
5757
"jasmine-core": "^2.6.1",

controls/buttons/CHANGELOG.md

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

33
## [Unreleased]
44

5+
## 19.3.44 (2021-10-05)
6+
7+
### Chips
8+
9+
#### Bug Fixes
10+
11+
- `F167517` - The issue with "JEST test case failure with Chip component" has been resolved.
12+
513
## 19.2.47 (2021-07-13)
614

715
### Checkbox

controls/buttons/src/chips/chip-list.ts

+10-9
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,8 @@ export class ChipList extends Component<HTMLElement> implements INotifyPropertyC
417417
}
418418

419419
private createChip(): void {
420-
this.innerText = this.element.innerText.trim();
420+
// eslint-disable-next-line
421+
this.innerText = (this.element.innerText && this.element.innerText.length !== 0) ? this.element.innerText.trim() : this.element.innerText;
421422
this.element.innerHTML = '';
422423
this.chipCreation(this.type === 'chip' ? [this.innerText ? this.innerText : this.text] : this.chips);
423424
}
@@ -789,7 +790,7 @@ export class ChipList extends Component<HTMLElement> implements INotifyPropertyC
789790
this.deleteHandler(observedArgs.element, observedArgs.index);
790791
this.selectionHandler(chipWrapper);
791792
(chipData as ClickEventArgs).selected = observedArgs.element.classList.contains(classNames.active);
792-
let selectedItemArgs: ClickEventArgs = chipData as ClickEventArgs;
793+
const selectedItemArgs: ClickEventArgs = chipData as ClickEventArgs;
793794
this.trigger('click', selectedItemArgs);
794795
}
795796
});
@@ -911,15 +912,15 @@ export class ChipList extends Component<HTMLElement> implements INotifyPropertyC
911912
case 'selection':
912913
case 'enableDelete':
913914
case 'enabled':
914-
this.refresh();
915+
this.refresh();
915916
break;
916917
case 'cssClass':
917-
if (!this.chipType()) {
918-
removeClass([this.element], oldProp.cssClass.toString().split(' ').filter((css: string) => css));
919-
addClass([this.element], newProp.cssClass.toString().split(' ').filter((css: string) => css));
920-
} else {
921-
this.refresh();
922-
}
918+
if (!this.chipType()) {
919+
removeClass([this.element], oldProp.cssClass.toString().split(' ').filter((css: string) => css));
920+
addClass([this.element], newProp.cssClass.toString().split(' ').filter((css: string) => css));
921+
} else {
922+
this.refresh();
923+
}
923924
break;
924925
case 'selectedChips':
925926
removeClass(this.element.querySelectorAll('.e-active'), 'e-active');

controls/calendars/styles/calendar/_bootstrap-dark-definition.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ $calendar-today-bg-style: none !default;
167167
$calendar-today-bg-hover-color: $grey-white !default;
168168
$calendar-today-border-color: 1px solid $brand-primary !default;
169169
$calendar-selected-box-shadow: none !default;
170-
$calendar-selected-border-color: 1px solid transparent !default;
170+
$calendar-selected-border-color: none !default;
171171
//pending
172172
$calendar-today-color: $grey-light-font !default;
173173
$calendar-today-focus-color: $grey-light-font !default;

controls/calendars/styles/calendar/_bootstrap-definition.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ $calendar-today-bg-style: none !default;
168168
$calendar-today-bg-hover-color: $grey-white !default;
169169
$calendar-today-border-color: 1px solid $brand-primary !default;
170170
$calendar-selected-box-shadow: none !default;
171-
$calendar-selected-border-color: 1px solid transparent !default;
171+
$calendar-selected-border-color: none !default;
172172
//pending
173173
$calendar-today-color: $grey-light-font !default;
174174
$calendar-today-focused-font-color: $grey-light-font !default;

controls/calendars/styles/calendar/_bootstrap4-definition.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ $calendar-today-bg-style: $white !default;
168168
$calendar-today-bg-hover-color: darken($gray-100, 2%) !default;
169169
$calendar-today-border-color: 1px solid $primary !default;
170170
$calendar-selected-box-shadow: none !default;
171-
$calendar-selected-border-color: 1px solid transparent !default;
171+
$calendar-selected-border-color: none !default;
172172
//pending
173173
$calendar-today-color: $gray-900 !default;
174174
$calendar-today-focused-font-color: $gray-900 !default;

controls/calendars/styles/datepicker/bootstrap5-dark.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-dark-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-dark-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-dark-definition.scss';
43
@import '../calendar/bootstrap5-dark-definition.scss';
54
@import 'bootstrap5-dark-definition.scss';

controls/calendars/styles/datepicker/bootstrap5.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-definition.scss';
43
@import '../calendar/bootstrap5-definition.scss';
54
@import 'bootstrap5-definition.scss';

controls/calendars/styles/daterangepicker/bootstrap5-dark.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-dark-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-dark-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-dark-definition.scss';
43
@import '../calendar/bootstrap5-dark-definition.scss';
54
@import 'bootstrap5-dark-definition.scss';

controls/calendars/styles/daterangepicker/bootstrap5.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-definition.scss';
43
@import '../calendar/bootstrap5-definition.scss';
54
@import 'bootstrap5-definition.scss';

controls/calendars/styles/datetimepicker/bootstrap5-dark.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-dark-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-dark-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-dark-definition.scss';
43
@import 'ej2-buttons/styles/button/bootstrap5-dark-definition.scss';
54
@import '../datepicker/bootstrap5-dark-definition.scss';

controls/calendars/styles/datetimepicker/bootstrap5.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-definition.scss';
43
@import 'ej2-buttons/styles/button/bootstrap5-definition.scss';
54
@import '../datepicker/bootstrap5-definition.scss';

controls/calendars/styles/timepicker/bootstrap5-dark.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-dark-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-dark-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-dark-definition.scss';
43
@import 'bootstrap5-dark-definition.scss';
54
@import 'icons/bootstrap5-dark.scss';

controls/calendars/styles/timepicker/bootstrap5.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
@import 'ej2-base/styles/bootstrap5-definition.scss';
2-
@import 'ej2-inputs/styles/input/bootstrap5-definition.scss';
32
@import 'ej2-popups/styles/popup/bootstrap5-definition.scss';
43
@import 'bootstrap5-definition.scss';
54
@import 'icons/bootstrap5.scss';
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

controls/charts/CHANGELOG.md

+11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22

33
## [Unreleased]
44

5+
## 19.3.44 (2021-10-05)
6+
7+
### Chart
8+
9+
#### Bug Fixes
10+
11+
- `#I342789` - Tooltip fade out duration works properly on mobile device.
12+
- `#F168868` - `OnZooming` event is now triggering properly.
13+
- `#I339227` - Logarithmic axis range is working fine even value "0" is given.
14+
- `#F169237` - Spline curve is not proper for null values is fixed.
15+
516
## 19.3.43 (2021-09-30)
617

718
### Chart

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -1640,6 +1640,7 @@ export class AccumulationChart extends Component<HTMLElement> implements INotify
16401640
*
16411641
* @private
16421642
*/
1643+
// tslint:disable-next-line:max-func-body-length
16431644
public onPropertyChanged(newProp: AccumulationChartModel, oldProp: AccumulationChartModel): void {
16441645
const update: { refreshElements: boolean, refreshBounds: boolean } = {
16451646
refreshElements: false, refreshBounds: false
@@ -1695,10 +1696,12 @@ export class AccumulationChart extends Component<HTMLElement> implements INotify
16951696
extend(this.changeVisibleSeries(this.visibleSeries, i), series, null, true);
16961697
seriesRefresh = true;
16971698
}
1698-
if (newProp.series[i] && !isNullOrUndefined(newProp.series[i].explodeIndex) && newProp.series[i].explodeIndex >= 0
1699-
&& newProp.series[i].explodeIndex !== oldProp.series[i].explodeIndex) {
1699+
if (newProp.series[i] && !isNullOrUndefined(newProp.series[i].explodeIndex) && newProp.series[i].explodeIndex >= 0
1700+
&& newProp.series[i].explodeIndex !== oldProp.series[i].explodeIndex) {
17001701
this.accBaseModule.explodePoints(newProp.series[i].explodeIndex, this);
17011702
this.accBaseModule.deExplodeAll(newProp.series[i].explodeIndex, this.enableAnimation ? 300 : 0);
1703+
} else if (newProp.series[i].explodeIndex < 0) {
1704+
this.accBaseModule.deExplodeAll(newProp.series[i].explodeIndex, this.enableAnimation ? 300 : 0);
17021705
}
17031706
}
17041707
if (seriesRefresh) {

controls/charts/src/chart/chart.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -2440,15 +2440,21 @@ export class Chart extends Component<HTMLElement> implements INotifyPropertyChan
24402440
}
24412441
}
24422442
private renderBorder(): void {
2443-
if(this.stockChart) {
2444-
return;
2445-
}
2443+
let x: number = 0;
2444+
let y: number = 0;
24462445
const width: number = this.border.width;
24472446
const backGroundImage: string = this.backgroundImage;
24482447
const fillColor: string = backGroundImage ? 'transparent' : (this.background || this.themeStyle.background);
2448+
if (this.stockChart && this.stockChart.legendSettings.visible && this.stockChart.stockLegendModule) {
2449+
if (this.stockChart.legendSettings.position === "Top") {
2450+
y += this.stockChart.stockLegendModule.legendBounds.height;
2451+
} else if (this.stockChart.legendSettings.position === "Left") {
2452+
x += this.stockChart.stockLegendModule.legendBounds.width;
2453+
}
2454+
}
24492455
const rect: RectOption = new RectOption(
24502456
this.element.id + '_ChartBorder', fillColor, this.border, 1,
2451-
new Rect(width * 0.5, width * 0.5, this.availableSize.width - width, this.availableSize.height - width));
2457+
new Rect(width * 0.5 + x, width * 0.5 + y, this.availableSize.width - width, this.availableSize.height - width));
24522458

24532459
this.htmlObject = redrawElement(this.redraw, this.element.id + '_ChartBorder', rect, this.renderer) as HTMLElement
24542460
|| this.renderer.drawRectangle(rect) as HTMLElement;

controls/charts/src/chart/legend/legend.ts

+8
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,14 @@ export class Legend extends BaseLegend {
382382
}
383383
private refreshSeries(seriesCollection: Series[]): void {
384384
for (const series of seriesCollection) {
385+
if (series.type.indexOf('Spline') > -1 ) {
386+
const isArea: boolean = (series.type.indexOf('Area') > -1 || series.drawType.indexOf('Area') > -1);
387+
const isRange: boolean = series.type.indexOf('Range') > -1;
388+
this.chart[
389+
'spline' + (isArea ? isRange ? 'RangeArea' : 'Area' : '') + 'SeriesModule'
390+
].findSplinePoint(series);
391+
}
392+
385393
series.position = undefined;
386394
}
387395
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,7 @@ export class SeriesBase extends ChildProperty<SeriesBase> {
12421242
}
12431243
this.yMin = isLogAxis ?
12441244
Math.min(this.yMin, (isNullOrUndefined(seriesMinY) || isNaN(seriesMinY) || (seriesMinY === 0) ||
1245-
(seriesMinY.toString() === '')) ? this.yMin : seriesMinY) :
1245+
(seriesMinY.toString() === "0") || (seriesMinY.toString() === '')) ? this.yMin : seriesMinY) :
12461246
Math.min(this.yMin, (isNullOrUndefined(seriesMinY) || isNaN(seriesMinY)) ? this.yMin : seriesMinY);
12471247
this.yMax = Math.max(this.yMax, (isNullOrUndefined(yValue) || isNaN(yValue)) ? this.yMax : yValue);
12481248
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export class Tooltip extends BaseTooltip {
5353
if (!chart.crosshair.enable) {
5454
this.tooltip();
5555
if (chart.tooltip.fadeOutMode === 'Move') {
56-
this.removeTooltip(2000);
56+
this.removeTooltip(chart.tooltip.fadeOutDuration);
5757
}
5858
} else if (chart.startMove && chart.tooltip.fadeOutMode === 'Move') {
5959
this.removeTooltip(2000);

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

+10-6
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,10 @@ export class Zoom {
181181
this.performDefferedZoom(chart);
182182
});
183183
} else {
184-
this.performDefferedZoom(chart);
185-
this.redrawOnZooming(chart, false);
184+
this.chart.trigger(onZooming, zoomingEventArgs, () => {
185+
this.performDefferedZoom(chart);
186+
this.redrawOnZooming(chart, false);
187+
});
186188
}
187189
}
188190

@@ -299,8 +301,10 @@ export class Zoom {
299301
this.chart.trigger(onZooming, onZoomingEventArg, () => { this.zoomingRect = new Rect(0, 0, 0, 0);
300302
this.performZoomRedraw(chart); });
301303
} else {
302-
this.zoomingRect = new Rect(0, 0, 0, 0);
303-
this.redrawOnZooming(chart);
304+
this.chart.trigger(onZooming, onZoomingEventArg, () => {
305+
this.zoomingRect = new Rect(0, 0, 0, 0);
306+
this.redrawOnZooming(chart);
307+
});
304308
}
305309
}
306310

@@ -388,7 +392,7 @@ export class Zoom {
388392
if (!onZoomingEventArgs.cancel && this.chart.isBlazor) {
389393
this.chart.trigger(onZooming, onZoomingEventArgs, () => { this.performZoomRedraw(chart); });
390394
} else {
391-
this.redrawOnZooming(chart);
395+
this.chart.trigger(onZooming, onZoomingEventArgs, () => { this.redrawOnZooming(chart); });
392396
}
393397
}
394398

@@ -502,7 +506,7 @@ export class Zoom {
502506
}
503507
}
504508
const onZoomingEventArgs: IZoomingEventArgs = { cancel: false, axisCollection: zoomedAxisCollection, name: onZooming };
505-
if (!onZoomingEventArgs.cancel && this.chart.isBlazor) {
509+
if (!onZoomingEventArgs.cancel) {
506510
this.chart.trigger(onZooming, onZoomingEventArgs);
507511
}
508512
}

controls/charts/src/common/utils/export.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ export class ExportUtils {
257257
id: 'Svg_Export_Element',
258258
width: 200, height: 200
259259
});
260-
controls.map((control: Chart | RangeNavigator | AccumulationChart | BulletChart) => {
260+
controls.map((control: Chart | RangeNavigator | AccumulationChart | BulletChart | StockChart) => {
261261
const svg: Node = control.svgObject.cloneNode(true);
262262
const groupEle: Element = control.renderer.createGroup({
263263
style: (isNullOrUndefined(isVertical) || isVertical) ? 'transform: translateY(' + height + 'px)' :
@@ -272,10 +272,20 @@ export class ExportUtils {
272272
if (!isCanvas) {
273273
groupEle.appendChild(svg);
274274
}
275-
width = (isNullOrUndefined(isVertical) || isVertical) ? Math.max(control.availableSize.width, width) :
276-
width + control.availableSize.width;
277-
height = (isNullOrUndefined(isVertical) || isVertical) ? height + control.availableSize.height :
278-
Math.max(control.availableSize.height, height);
275+
let top: number = 0;
276+
let left: number = 0;
277+
if ((control as StockChart).stockLegendModule && (control as StockChart).legendSettings.visible) {
278+
if ((control as StockChart).legendSettings.position === "Bottom" || (control as StockChart).legendSettings.position === "Top"
279+
|| (control as StockChart).legendSettings.position === "Auto") {
280+
top += (control as StockChart).stockLegendModule.legendBounds.height;
281+
} else if ((control as StockChart).legendSettings.position === "Left" || (control as StockChart).legendSettings.position === "Right") {
282+
left += (control as StockChart).stockLegendModule.legendBounds.width;
283+
}
284+
}
285+
width = (isNullOrUndefined(isVertical) || isVertical) ? Math.max(control.availableSize.width + left, width) :
286+
width + control.availableSize.width + left;
287+
height = (isNullOrUndefined(isVertical) || isVertical) ? height + control.availableSize.height + top :
288+
Math.max(control.availableSize.height + top, height);
279289

280290
if (!isCanvas) {
281291
svgObject.appendChild(groupEle);

controls/charts/src/range-navigator/range-navigator.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -913,12 +913,18 @@ export class RangeNavigator extends Component<HTMLElement> {
913913
* Creating a background element to the svg object
914914
*/
915915
private renderChartBackground(): void {
916-
if(this.stockChart) {
917-
return;
916+
let top: number = 0;
917+
let left: number = 0;
918+
if (this.stockChart && this.stockChart.legendSettings.visible && this.stockChart.stockLegendModule) {
919+
if (this.stockChart.legendSettings.position === "Top") {
920+
top += this.stockChart.stockLegendModule.legendBounds.height;
921+
} else if (this.stockChart.legendSettings.position === "Left") {
922+
left += this.stockChart.stockLegendModule.legendBounds.width;
923+
}
918924
}
919925
const rect: RectOption = new RectOption(
920926
this.element.id + '_ChartBorder', this.background || this.themeStyle.background, { width: 0, color: 'transparent' }, 1,
921-
new Rect(0, 0, this.availableSize.width, this.availableSize.height));
927+
new Rect(left, top, this.availableSize.width, this.availableSize.height));
922928
this.svgObject.appendChild(this.renderer.drawRectangle(rect) as HTMLElement);
923929
}
924930

controls/charts/src/stock-chart/renderer/toolbar-selector.ts

+6
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,9 @@ export class ToolBarSelector {
374374
// eslint-disable-next-line @typescript-eslint/indent
375375
'translate(' + 0 + ',' + (stockChart.cartesianChart.cartesianChartSize.height + additionalRect.height) + ')');
376376
}
377+
if (this.stockChart.legendSettings.visible && this.stockChart.stockLegendModule) {
378+
(getElement(stockChart.element.id + '_chart_legend_g') as HTMLElement).style.transform = 'translateY(' + additionalRect.height + 'px)';
379+
}
377380
stockChart.chart.exportModule.export(type, 'StockChart', null, [stockChart], null, stockChart.svgObject.clientHeight);
378381
remove(getElement(this.stockChart.element.id + '_additionalExport'));
379382
(getElement(stockID + 'chart') as HTMLElement).style.transform = 'translateY(0px)';
@@ -382,6 +385,9 @@ export class ToolBarSelector {
382385
// eslint-disable-next-line @typescript-eslint/indent
383386
'translate(' + 0 + ',' + (stockChart.cartesianChart.cartesianChartSize.height) + ')');
384387
}
388+
if (this.stockChart.legendSettings.visible && this.stockChart.stockLegendModule) {
389+
(getElement(stockChart.element.id + '_chart_legend_g') as HTMLElement).style.transform = 'translateY(0px)';
390+
}
385391
this.stockChart.svgObject.setAttribute('height', (svgHeight.height).toString());
386392
}
387393
}

controls/diagrams/CHANGELOG.md

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

33
## [Unreleased]
44

5-
## 19.3.43 (2021-09-30)
5+
## 19.3.44 (2021-10-05)
66

77
### Diagram
88

@@ -16,6 +16,7 @@
1616
- `#I339619` - The issue "An exception occurs when save and load the swimlane with BPMN children" has been fixed.
1717
- `#I339487` - The issue "The connector drawing object does not snap to near by port" has been fixed.
1818
- `#I342173` - The issue "An exception occurs when clear the diagram using Clear API" has been fixed.
19+
- `#I337722` - The issue "Connector Position not Updated Properly when rotating it with segments" has been fixed.
1920

2021
## 19.2.56 (2021-08-17)
2122

controls/diagrams/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
[![coverage](http://ej2.syncfusion.com/badges/ej2-diagrams/coverage.svg)](http://ej2.syncfusion.com/badges/ej2-diagrams)
2+
13
# ej2-diagrams
24

35
The diagram component visually represents information. It is also used to create diagrams like flow charts, organizational charts, mind maps, and BPMN either through code or a visual interface.

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": "19.2.61",
3+
"version": "19.2.62",
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",

0 commit comments

Comments
 (0)