UNPKG

25 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var React = require("react");
4var ReactDom = require("react-dom");
5var fp_1 = require("lodash/fp");
6var Pvjs_1 = require("./Pvjs");
7(function (window, $) {
8 ("use strict");
9 var Utils = {
10 /**
11 * Checks if an object is a DOM element
12 *
13 * @param {object} o HTML element or String
14 * @return {Boolean} returns true if object is a DOM element
15 */
16 isElement: function (o) {
17 return typeof HTMLElement === "object"
18 ? o instanceof HTMLElement ||
19 o instanceof SVGElement ||
20 o instanceof SVGSVGElement //DOM2
21 : o &&
22 typeof o === "object" &&
23 o !== null &&
24 o.nodeType === 1 &&
25 typeof o.nodeName === "string";
26 },
27 proxy: function proxy(fn, context) {
28 return function () {
29 fn.apply(context, arguments);
30 };
31 }
32 };
33 var Renderer = {
34 destroyRender: function (pvjs) {
35 var options = pvjs.options;
36 console.log("TODO: destroyRender");
37 },
38 render: function (pvjs) {
39 var element = pvjs.element, options = pvjs.options;
40 var pvjson = options.pvjson;
41 if (element.data === undefined) {
42 element.data = {};
43 }
44 var data;
45 if (element.data.pvjs === undefined) {
46 element.data.pvjs = data = ReactDom.render(React.createElement(Pvjs_1.Pvjs, { pvjson: pvjson }), pvjs["$element"][0][0]);
47 }
48 else {
49 data = element.data.pvjs;
50 }
51 }
52 };
53 /**
54 * PvjsJQuery constructor
55 *
56 * @param {object} element Dom element
57 * @param {object} options
58 */
59 var PvjsJQuery = function (element, options) {
60 this.init(element, options);
61 };
62 var instanceCounter = 0, optionsDefault = {
63 fitToContainer: true,
64 uri: null,
65 fileType: "",
66 pvjson: null,
67 selector: null // selector instance
68 };
69 /**
70 * PvjsJQuery initialisation
71 *
72 * @param {object} element Dom element
73 * @param {object} options
74 */
75 PvjsJQuery.prototype.init = function (element, options) {
76 // select and empty the element
77 this.$element = $(element);
78 this.$element.empty();
79 // Clone and fill options
80 this.options = fp_1.cloneDeep(optionsDefault);
81 this.options = fp_1.assign(this.options, options);
82 // Make this instance unique
83 this.instanceId = ++instanceCounter;
84 // Init events object
85 this.events = {};
86 this.initContainer();
87 };
88 /**
89 * Creates DOM container and parses its sizes.
90 * Adds loading state to container.
91 * Adds hook for loaded event to remove loading state
92 */
93 PvjsJQuery.prototype.initContainer = function () {
94 var pvjs = this;
95 // Get container sizes
96 var boundingRect = this.$element[0][0].getBoundingClientRect();
97 this.element_width = +boundingRect.width; // TODO take in account paddings, margins and border
98 this.element_height = +boundingRect.height; // TODO take in account paddings, margins and border
99 };
100 /**
101 * Init and render
102 */
103 PvjsJQuery.prototype.render = function () {
104 var pvjs = this;
105 Renderer.render(pvjs);
106 // Listen for renderer errors
107 this.on("error.renderer", function () {
108 Renderer.destroyRender(pvjs);
109 });
110 };
111 PvjsJQuery.prototype.destroy = function () {
112 // Send destroy message
113 this.trigger("destroy.pvjs", { message: "User requested pvjs destroy" }, false);
114 // Destroy renderer
115 Renderer.destroyRender(this);
116 // Off all events
117 for (var e in this.events) {
118 this.off(e);
119 }
120 // Clean data
121 this.$element[0][0].data = undefined;
122 if ($) {
123 $(this.$element[0][0]).removeData("pvjs");
124 }
125 // Clean HTML
126 // jQuery
127 $(this.$element[0][0]).empty();
128 };
129 /**
130 * Returns an instance for public usage
131 * @return {object}
132 */
133 PvjsJQuery.prototype.getPublicInstance = function () {
134 var that = this;
135 if (this.publicInstance === undefined) {
136 // Initialise public instance
137 this.publicInstance = {
138 instanceId: this.instanceId,
139 $element: this.$element,
140 destroy: Utils.proxy(this.destroy, this),
141 on: Utils.proxy(this.on, this),
142 off: Utils.proxy(this.off, this),
143 trigger: Utils.proxy(this.trigger, this),
144 render: Utils.proxy(this.render, this),
145 pan: function (point) {
146 if (that.panZoom) {
147 that.panZoom.pan(point);
148 }
149 },
150 panBy: function (point) {
151 if (that.panZoom) {
152 that.panZoom.panBy(point);
153 }
154 },
155 getPan: function () {
156 return that.panZoom.getPan();
157 },
158 zoom: function (scale) {
159 if (that.panZoom) {
160 that.panZoom.zoom(scale);
161 }
162 },
163 zoomBy: function (scale) {
164 if (that.panZoom) {
165 that.panZoom.zoomBy(scale);
166 }
167 },
168 zoomAtPoint: function (scale, point) {
169 if (that.panZoom) {
170 that.panZoom.zoomAtPoint(scale, point);
171 }
172 },
173 zoomAtPointBy: function (scale, point) {
174 if (that.panZoom) {
175 that.panZoom.zoomAtPointBy(scale, point);
176 }
177 },
178 getZoom: function () {
179 return that.panZoom.getZoom();
180 },
181 getOptions: function () {
182 return fp_1.cloneDeep(that.options);
183 }
184 };
185 }
186 return this.publicInstance;
187 };
188 /**
189 * Register an event listener
190 *
191 * @param {string} topic
192 * @param {Function} callback
193 */
194 PvjsJQuery.prototype.on = function (topic, callback) {
195 var namespace = null, eventName = topic;
196 if (topic.indexOf(".") !== -1) {
197 var pieces = topic.split(".");
198 eventName = pieces[0];
199 namespace = pieces[1];
200 }
201 if (!this.events.hasOwnProperty(eventName)) {
202 this.events[eventName] = [];
203 }
204 this.events[eventName].push({
205 callback: callback,
206 namespace: namespace
207 });
208 };
209 /**
210 * Removes an event listener
211 * Returns true if listener was removed
212 *
213 * @param {string} topic
214 * @param {Function} callback
215 * @return {bool}
216 */
217 PvjsJQuery.prototype.off = function (topic, callback) {
218 var namespace = null, eventName = topic, flagRemove = true;
219 callback = callback || null;
220 if (topic.indexOf(".") !== -1) {
221 var pieces = topic.split(".");
222 eventName = pieces[0];
223 namespace = pieces[1];
224 }
225 // Check if such an event is registered
226 if (!this.events.hasOwnProperty(eventName)) {
227 return false;
228 }
229 var queue = this.events[topic];
230 for (var i = queue.length - 1; i >= 0; i--) {
231 flagRemove = true;
232 if (namespace && queue[i].namespace !== namespace) {
233 flagRemove = false;
234 }
235 if (callback && queue[i].callback !== callback) {
236 flagRemove = false;
237 }
238 if (flagRemove) {
239 queue.splice(i, 1);
240 }
241 }
242 return true;
243 };
244 /**
245 * Triggers an event. Async by default.
246 * Returns true if there is at least one listener
247 *
248 * @param {string} topic
249 * @param {object} message
250 * @param {bool} async By default true
251 * @return {bool}
252 */
253 PvjsJQuery.prototype.trigger = function (topic, message, async) {
254 var namespace = null, eventName = topic;
255 if (topic.indexOf(".") !== -1) {
256 var pieces = topic.split(".");
257 eventName = pieces[0];
258 namespace = pieces[1];
259 }
260 if (!this.events.hasOwnProperty(eventName)) {
261 return false;
262 }
263 var queue = this.events[eventName];
264 if (queue.length === 0) {
265 return false;
266 }
267 if (async === undefined) {
268 async = true;
269 }
270 // Use a function as i may change meanwhile
271 var callAsync = function (i) {
272 setTimeout(function () {
273 queue[i].callback(message);
274 }, 0);
275 };
276 for (var i = 0; i < queue.length; i++) {
277 if (namespace && queue[i].namespace && namespace !== queue[i].namespace) {
278 continue;
279 }
280 if (async) {
281 // freeze i
282 callAsync(i);
283 }
284 else {
285 queue[i].callback(message);
286 }
287 }
288 return true;
289 };
290 /**
291 *
292 */
293 if ($) {
294 /**
295 * jQuery plugin entry point. Only if jQuery is defined.
296 * If option is 'get' then returns an array of pvjs public instances.
297 * Otherwise returns an jQuery object to allow chaining.
298 *
299 * @param {string} option
300 * @return {object} array || jQuery object
301 */
302 $.fn.pvjs = function (option) {
303 // Instantiate PvjsJQuery for all elements
304 var $return = this.each(function () {
305 var $this = $(this), data = $this.data("pvjs"), options = typeof option == "object" && option;
306 if (!data) {
307 $this.data("pvjs", new PvjsJQuery(this, options));
308 }
309 });
310 if (option === "get") {
311 // Return an array of PvjsJQuery instances
312 return $.map(this, function (a) {
313 return $(a).data("pvjs").getPublicInstance();
314 });
315 }
316 else {
317 // Return jQuery object
318 return $return;
319 }
320 };
321 }
322 /**
323 * Globally available method
324 * Returns an array of public instances
325 *
326 * @param {string} selector
327 * @param {object} option
328 * @return {array}
329 */
330 window["$pvjs"] = function (selector, option) {
331 var $elements;
332 if (Utils.isElement(selector)) {
333 $elements = [selector];
334 }
335 else {
336 $elements = document.querySelectorAll(selector);
337 }
338 return fp_1.map(function (element) {
339 if (element.data === undefined) {
340 element.data = {};
341 }
342 var data, options = typeof option == "object" ? option : {};
343 if (element.data.pvjs === undefined) {
344 element.data.pvjs = data = new PvjsJQuery(element, options);
345 }
346 else {
347 data = element.data.pvjs;
348 }
349 return data.getPublicInstance();
350 }, $elements);
351 };
352})(window, window["jQuery"] || null);
353//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHZqcy5qcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHZqcy5qcXVlcnkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQStCO0FBQy9CLG9DQUFzQztBQUN0QyxnQ0FBbUQ7QUFDbkQsK0JBQThCO0FBRTlCLENBQUMsVUFBUyxNQUFNLEVBQUUsQ0FBQztJQUNqQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRWYsSUFBSSxLQUFLLEdBQUc7UUFDVjs7Ozs7T0FLRDtRQUNDLFNBQVMsRUFBRSxVQUFTLENBQUM7WUFDbkIsTUFBTSxDQUFDLE9BQU8sV0FBVyxLQUFLLFFBQVE7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFDLFlBQVksV0FBVztvQkFDdEIsQ0FBQyxZQUFZLFVBQVU7b0JBQ3ZCLENBQUMsWUFBWSxhQUFhLENBQUMsTUFBTTtnQkFDckMsQ0FBQyxDQUFDLENBQUM7b0JBQ0MsT0FBTyxDQUFDLEtBQUssUUFBUTtvQkFDckIsQ0FBQyxLQUFLLElBQUk7b0JBQ1YsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDO29CQUNoQixPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUUsT0FBTztZQUMvQixNQUFNLENBQUM7Z0JBQ0wsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUM7SUFDRixJQUFJLFFBQVEsR0FBRztRQUNiLGFBQWEsRUFBRSxVQUFTLElBQUk7WUFDbEIsSUFBQSxzQkFBTyxDQUFVO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxFQUFFLFVBQVMsSUFBSTtZQUNYLElBQUEsc0JBQU8sRUFBRSxzQkFBTyxDQUFVO1lBQzFCLElBQUEsdUJBQU0sQ0FBYTtZQUMz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
\No newline at end of file