require('./core/core.datasetController')(Chart);
require('./core/core.layoutService')(Chart);
require('./core/core.legend')(Chart);
+require('./core/core.plugin.js')(Chart);
require('./core/core.scale')(Chart);
require('./core/core.scaleService')(Chart);
require('./core/core.title')(Chart);
--- /dev/null
+"use strict";
+
+module.exports = function(Chart) {
+ var helpers = Chart.helpers;
+
+ // Plugins are stored here
+ Chart.plugins = [];
+ Chart.pluginService = {
+ // Register a new plugin
+ register: function(plugin) {
+ if (Chart.plugins.indexOf(plugin) === -1) {
+ Chart.plugins.push(plugin);
+ }
+ },
+
+ // Remove a registered plugin
+ remove: function(plugin) {
+ var idx = Chart.plugins.indexOf(plugin);
+ if (idx !== -1) {
+ Chart.plugins.splice(idx, 1);
+ }
+ },
+
+ // Iterate over all plugins
+ notifyPlugins: function(method, chartInstance, scope) {
+ helpers.each(Chart.plugins, function(plugin) {
+ if (plugin[method] && typeof plugin[method] === 'function') {
+ plugin[method].call(scope, chartInstance);
+ }
+ }, scope);
+ }
+ };
+
+ Chart.PluginBase = Chart.Element.extend({
+ // Plugin methods. All functions are passed the chart instance
+
+ // Called at start of chart init
+ beforeInit: helpers.noop,
+
+ // Called at end of chart init
+ afterInit: helpers.noop,
+
+ // Called at start of update
+ beforeUpdate: helpers.noop,
+
+ // Called at end of update
+ afterUpdate: helpers.noop,
+
+ // Called at start of draw
+ beforeDraw: helpers.noop,
+
+ // Called at end of draw
+ afterDraw: helpers.noop,
+ });
+};
\ No newline at end of file
--- /dev/null
+// Plugin tests
+describe('Test the plugin system', function() {
+ beforeEach(function() {
+ Chart.plugins = [];
+ });
+
+ it ('Should register plugins', function() {
+ var myplugin = {};
+ Chart.pluginService.register(myplugin);
+ expect(Chart.plugins.length).toBe(1);
+
+ // Should only add plugin once
+ Chart.pluginService.register(myplugin);
+ expect(Chart.plugins.length).toBe(1);
+ });
+
+ it ('Should allow unregistering plugins', function() {
+ var myplugin = {};
+ Chart.pluginService.register(myplugin);
+ expect(Chart.plugins.length).toBe(1);
+
+ // Should only add plugin once
+ Chart.pluginService.remove(myplugin);
+ expect(Chart.plugins.length).toBe(0);
+
+ // Removing a plugin that doesn't exist should not error
+ Chart.pluginService.remove(myplugin);
+ });
+
+ it ('Should allow notifying plugins', function() {
+ var myplugin = {
+ count: 0,
+ trigger: function(chart) {
+ myplugin.count = chart.count;
+ }
+ };
+ Chart.pluginService.register(myplugin);
+
+ Chart.pluginService.notifyPlugins('trigger', { count: 10 });
+
+ expect(myplugin.count).toBe(10);
+ });
+});