import * as React from "react";
import * as ReactDom from "react-dom";
import { map } from "lodash/fp";
import { Kaavio } from "./Kaavio";
/**
* Checks if an object is a DOM element
*
* @param {object} o HTML element or String
* @return {Boolean} returns true if object is a DOM element
*/
function isElement(o) {
return typeof HTMLElement === "object"
? o instanceof HTMLElement ||
o instanceof SVGElement ||
o instanceof SVGSVGElement //DOM2
: o &&
typeof o === "object" &&
o !== null &&
o.nodeType === 1 &&
typeof o.nodeName === "string";
}
/**
* Initialize the global constructor for JqueryKaavioPlugin
*
* @param {object} window
* @param {object} [$] optional jQuery or Zepto instance
* @return
*/
module.exports = function(window, $) {
("use strict");
/**
*
*/
if (typeof $ !== undefined) {
/**
* jQuery plugin entry point. Only if jQuery is defined.
* If option is 'get' then returns an array of jqueryKaavioPlugin public instances.
* Otherwise returns an jQuery object to allow chaining.
*
* @param {string} option
* @return {object} array || jQuery object
*/
$.fn.kaavio = function(option) {
// Instantiate Kaavio for all elements
var $return = this.each(function() {
var $this = $(this);
var data = $this.data("kaavio");
var options = typeof option == "object" && option;
if (!data) {
$this.data("kaavio", function() {
return ReactDom.render(
,
this
);
});
}
});
if (option === "get") {
// Return an array of Kaavio instances
return $.map(this, function(a) {
return $(a)
.data("kaavio")
.getPublicInstance();
});
} else {
// Return jQuery object
return $return;
}
};
}
/**
* Globally available method
* Returns an array of public instances
*
* @param {string} selector
* @param {object} option
* @return {array}
*/
window.jqueryKaavioPlugin = function(selector, option) {
var $elements;
if (isElement(selector)) {
$elements = [[selector]];
} else {
$elements = document.querySelector(selector);
}
return map(function(element) {
if (element.data === undefined) {
element.data = {};
}
var data;
var options = typeof option == "object" ? option : {};
if (element.data.kaavio === undefined) {
element.data.kaavio = data = ReactDom.render(
,
element
);
} else {
data = element.data.kaavio;
}
return data.getPublicInstance();
}, $elements[0]);
};
};