Getting Started
Steps for getting started with the FlexPie control in AngularJS applications:
- Add references to AngularJS, Wijmo, and Wijmo's AngularJS directives.
-
Include the Wijmo directives in the app module:
var app = angular.module('app', ['wj']);
- Add a controller to provide data and logic.
- Add a Wijmo FlexPie control to the page and bind it to your data.
- (Optional) Add some CSS to customize the input control's appearance.
HTML
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/bootstrap.css"/>
<link rel="stylesheet" type="text/css" href="css/wijmo.css" />
<link href="css/app.css" rel="stylesheet" type="text/css" />
<script src="scripts/angular.js" type="text/javascript"></script>
<script src="scripts/wijmo.js" type="text/javascript"></script>
<script src="scripts/wijmo.chart.js" type="text/javascript"></script>
<script src="scripts/wijmo.angular.js" type="text/javascript"></script>
<script src="scripts/app.js" type="text/javascript"></script>
</head>
<body ng-app="app" ng-controller="appCtrl">
<!-- this is the FlexPie directive -->
<wj-flex-pie
items-source="itemsSource"
binding="value"
binding-name="name">
</wj-flex-pie>
</body>
</html>
JS
// declare app module
var app = angular.module('app', ['wj']);
// controller provides data
app.controller('simpleCtrl', function appCtrl($scope) {
var names = ['Oranges', 'Apples', 'Pears', 'Bananas', 'Pineapples'],
data = [];
// populate itemsSource
for (var i = 0; i < names.length; i++) {
data.push({
name: names[i],
value: Math.round(Math.random() * 100)
});
}
$scope.itemsSource = data;
});
Result (live):
Basic Features
The FlexPie control has five basic properties that allow you to customize its layout and appearance:
-
innerRadius: Specifies the control's inner radius to support donut charts.
-
offset: Specifies the offset of the pie slices from the center of the control.
-
startAngle: Starting at the nine o'clock position, specifies the angle to start drawing pie slices.
-
palette: Specifies an array of default colors to be used when rendering pie slices.
-
reversed: Determines whether the control should draw pie slices clockwise (false) or counterclockwise (true).
The example below allows you to see what happens when you change these properties. Also, clicking on a pie slice will
display a tooltip for the data point.
HTML
<wj-flex-pie
control="chart"
items-source="itemsSource"
binding="value"
binding-name="name"
inner-radius="{{ innerRadius }}"
offset="{{ offset }}"
start-angle="{{ startAngle }}"
reversed="{{ reversed }}">
</wj-flex-pie>
<div class="form-horizontal">
<div class="form-group">
<label class="col-md-3 control-label">Inner Radius</label>
<div class="col-md-9">
<wj-input-number control="inputInnerRadius"
value="ctx.innerRadius"
min="0"
max="1"
step=".1"
format="n">
</wj-input-number>
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label">Offset</label>
<div class="col-md-9">
<wj-input-number control="inputOffset"
value="ctx.offset"
min="0"
max="1"
step=".1"
format="n">
</wj-input-number>
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label">Start Angle</label>
<div class="col-md-9">
<wj-input-number control="inputStartAngle"
value="ctx.startAngle"
min="-360"
max="360"
step="45">
</wj-input-number>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-3 col-md-9">
<wj-menu
header="Palette: <b>{{ palette }}</b>"
items-source="palettes"
item-clicked="paletteChanged(s, e)">
</wj-menu>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-3 col-md-9">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="reversed"> Reversed?
</label>
</div>
</div>
</div>
</div>
JS
$scope.itemsSource = dataSvc.getData();
$scope.chart = null;
$scope.inputInnerRadius = null;
$scope.inputOffset = null;
$scope.inputStartAngle = null;
$scope.innerRadius = 0;
$scope.offset = 0;
$scope.startAngle = 0;
$scope.reversed = false;
$scope.palette = 'standard';
$scope.palettes = 'standard,cocoa,coral,dark,highcontrast,light,midnight,modern,organic,slate,zen,cyborg,superhero,flatly,darkly,cerulan'.split(',');
$scope.ctx = {
innerRadius: 0,
offset: 0,
startAngle: 0
};
$scope.$watch('ctx.innerRadius', function () {
var innerRadius = $scope.inputInnerRadius,
val = $scope.ctx.innerRadius;
if (innerRadius != null) {
if (val < innerRadius.min || val > innerRadius.max) {
return;
}
$scope.innerRadius = val;
}
});
$scope.$watch('ctx.offset', function () {
var offset = $scope.inputOffset,
val = $scope.ctx.offset;
if (offset != null) {
if (val < offset.min || val > offset.max) {
return;
}
$scope.offset = val;
}
});
$scope.$watch('ctx.startAngle', function () {
var startAngle = $scope.inputStartAngle,
val = $scope.ctx.startAngle;
if (startAngle != null) {
if (val < startAngle.min || val > startAngle.max) {
return;
}
$scope.startAngle = val;
}
});
$scope.paletteChanged = function (sender) {
var p = $scope.palettes[sender.selectedIndex];
$scope.palette = p;
$scope.chart.palette = wijmo.chart.Palettes[p];
};
Legend and Titles
The legend properties can be used to customize the appearance of the chart's legend. The
header and footer properties can be used to add titles to the FlexPie control as well.
The following example allows you to change the FlexPie's legend.position, header, and
footer properties in real-time.
HTML
<wj-flex-pie
items-source="itemsSource"
binding="value"
binding-name="name"
header="{{ header }}"
footer="{{ footer }}">
<wj-flex-chart-legend position="{{ legendPosition }}"></wj-flex-chart-legend>
</wj-flex-pie>
<div class="form-horizontal">
<div class="form-group">
<label class="col-md-3 control-label">Header</label>
<div class="col-md-9">
<input
type="text"
class="form-control"
ng-model="header"
placeholder="Specify the FlexPie's header" />
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label">Footer</label>
<div class="col-md-9">
<input
type="text"
class="form-control"
ng-model="footer"
placeholder="Specify the FlexPie's footer" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-3 col-md-9">
<wj-menu header="Legend Position" value="legendPosition">
<wj-menu-item value="'None'">None</wj-menu-item>
<wj-menu-item value="'Left'">Left</wj-menu-item>
<wj-menu-item value="'Top'">Top</wj-menu-item>
<wj-menu-item value="'Right'">Right</wj-menu-item>
<wj-menu-item value="'Bottom'">Bottom</wj-menu-item>
</wj-menu>
</div>
</div>
</div>
JS
$scope.itemsSource = dataSvc.getData();
$scope.header = 'Fruit By Value';
$scope.footer = '2014 GrapeCity, inc.';
$scope.legendPosition = 'Right';
Selection
The FlexPie control allows you to select data points by clicking or touching a pie slice. Use the selectionMode
property to specify whether you want to allow selection by data point or no selection at all (default).
Setting the selctionMode property to Point causes the FlexPie to update the selection property when
the user clicks on a pie slice, and to apply the "wj-state-selected" class to the selected element. Setting the FlexPie's
selectionMode property to Series or None will disable selections within the control.
The FlexPie offers three additional properties to customize the selection:
-
selectedItemOffset: Specifies the offset of the selected pie slice from the center of the control.
-
selectedItemPosition: Specifies the position of the selected pie slice. The available options are Top, Bottom,
Left, Right, and None (default).
-
isAnimated: Determines whether or not to animate the selection.
HTML
<wj-flex-pie
items-source="itemsSource"
binding="value"
binding-name="name"
selection-mode="Point"
selected-item-position="{{ selectedPosition }}"
selected-item-offset="{{ selectedOffset }}"
is-animated="{{ isAnimated }}">
</wj-flex-pie>
<div class="form-horizontal">
<div class="form-group">
<label class="col-md-3 control-label">Selected Item Offset</label>
<div class="col-md-9">
<wj-input-number control="inputSelectedOffset"
value="ctx.selectedOffset"
min="0"
max=".5"
step=".1"
format="n">
</wj-input-number>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-3 col-md-9">
<wj-menu header="Selected Item Position" value="selectedPosition">
<wj-menu-item value="'None'">None</wj-menu-item>
<wj-menu-item value="'Left'">Left</wj-menu-item>
<wj-menu-item value="'Top'">Top</wj-menu-item>
<wj-menu-item value="'Right'">Right</wj-menu-item>
<wj-menu-item value="'Bottom'">Bottom</wj-menu-item>
</wj-menu>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-3 col-md-9">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="isAnimated"> Is Animated?
</label>
</div>
</div>
</div>
</div>
JS
$scope.itemsSource = dataSvc.getData();
$scope.selectedPosition = 'Top';
$scope.selectedOffset = 0;
$scope.isAnimated = true;
$scope.inputSelectedOffset = null;
$scope.ctx = { selectedOffset: 0};
$scope.$watch('ctx.selectedOffset', function () {
var selectedOffset = $scope.inputSelectedOffset,
val = $scope.ctx.selectedOffset;
if (selectedOffset != null) {
if (val < selectedOffset.min || val > selectedOffset.max) {
return;
}
$scope.selectedOffset = val;
}
});
Theming
The appearance of the FlexPie control is largely defined in CSS. In addition to the default theme, we
include several professionally designed themes that customize the appearance of all Wijmo controls to
achieve a consistent, attractive look.
You can customize the appearance of the FlexPie control using CSS. To do this, copy the CSS rules from the
default theme to a new CSS file and modify the properties as needed.
In this example, we added the "custom-pie-chart" CSS class to the control and defined some CSS rules to
change the fill, font family, and font weight of the header, footer, and legend.
HTML
<wj-flex-pie
items-source="itemsSource"
binding="value"
binding-name="name"
header="Header"
footer="Footer"
class="custom-pie-chart">
</wj-flex-pie>
JS
$scope.itemsSource = dataSvc.getData();
CSS
.custom-pie-chart.wj-flexchart .wj-header .wj-title,
.custom-pie-chart.wj-flexchart .wj-footer .wj-title,
.custom-pie-chart.wj-flexchart .wj-legend > .wj-label {
fill: #666;
font-family: 'Courier New', Courier, monospace;
font-weight: bold;
}
Result (live):