UNPKG

vue-bokeh

Version:

A wrapper around bokehjs embedded

1,263 lines (1,128 loc) 1.89 MB
window.Bokeh = Bokeh = (function() { var define = undefined; return (function outer(modules, cache, entry) { function newRequire(name) { if (!cache[name]) { if (!modules[name]) { var err = new Error('Cannot find module \'' + name + '\''); err.code = 'MODULE_NOT_FOUND'; throw err; } var m = cache[name] = {exports: {}}; var moduleRequire = function foo(x) { var id = modules[name][1][x]; return newRequire(id ? id : x); } moduleRequire.modules = newRequire.modules; modules[name][0].call(m.exports, moduleRequire, m, m.exports, outer, modules, cache, entry); } return cache[name].exports; } newRequire.modules = modules; var lastEntryResult = null; for (var i = 0; i < entry.length; i++) { lastEntryResult = newRequire(entry[i]); } return lastEntryResult; }) ({"base":[function(require,module,exports){ var Models, _, _get_mod_cache, _mod_cache, index, locations, logger, make_cache, overrides, hasProp = {}.hasOwnProperty; _ = require("underscore"); logger = require("./core/logging").logger; require("./core/util/underscore").patch(); locations = require("./common/models"); overrides = {}; make_cache = function(locations) { var mod, modname, name, ref, result, spec, subname, subspec, suffix; result = {}; for (name in locations) { spec = locations[name]; if (_.isArray(spec)) { subspec = spec[0]; suffix = (ref = spec[1]) != null ? ref : ""; for (subname in subspec) { mod = subspec[subname]; modname = subname + suffix; result[modname] = mod; } } else { result[name] = spec; } } return result; }; _mod_cache = null; _get_mod_cache = function() { if (_mod_cache == null) { _mod_cache = make_cache(locations); } return _mod_cache; }; Models = function(typename) { var mod, mod_cache; mod_cache = _get_mod_cache(); if (overrides[typename]) { return overrides[typename]; } mod = mod_cache[typename]; if (mod == null) { throw new Error("Module `" + typename + "' does not exists. The problem may be two fold. Either a model was requested that's available in an extra bundle, e.g. a widget, or a custom model was requested, but it wasn't registered before first usage."); } return mod.Model; }; Models.register = function(name, model) { return overrides[name] = model; }; Models.unregister = function(name) { return delete overrides[name]; }; Models.register_locations = function(locations, force, errorFn) { var cache, mod_cache, module, name, results; if (force == null) { force = false; } if (errorFn == null) { errorFn = null; } mod_cache = _get_mod_cache(); cache = make_cache(locations); results = []; for (name in cache) { if (!hasProp.call(cache, name)) continue; module = cache[name]; if (force || !mod_cache.hasOwnProperty(name)) { results.push(mod_cache[name] = module); } else { results.push(typeof errorFn === "function" ? errorFn(name) : void 0); } } return results; }; Models.registered_names = function() { return Object.keys(_get_mod_cache()); }; index = {}; module.exports = { overrides: overrides, index: index, Models: Models }; },{"./common/models":"common/models","./core/logging":"core/logging","./core/util/underscore":"core/util/underscore","underscore":"underscore"}],"client":[function(require,module,exports){ var ClientConnection, ClientSession, DEFAULT_SERVER_WEBSOCKET_URL, DEFAULT_SESSION_ID, Document, HasProps, Message, ModelChangedEvent, Promise, RootAddedEvent, RootRemovedEvent, _, logger, message_handlers, pull_session, ref; _ = require("underscore"); Promise = require("es6-promise").Promise; HasProps = require("./core/has_props"); logger = require("./core/logging").logger; ref = require("./document"), Document = ref.Document, ModelChangedEvent = ref.ModelChangedEvent, RootAddedEvent = ref.RootAddedEvent, RootRemovedEvent = ref.RootRemovedEvent; DEFAULT_SERVER_WEBSOCKET_URL = "ws://localhost:5006/ws"; DEFAULT_SESSION_ID = "default"; Message = (function() { function Message(header1, metadata1, content1) { this.header = header1; this.metadata = metadata1; this.content = content1; this.buffers = []; } Message.assemble = function(header_json, metadata_json, content_json) { var content, e, error1, header, metadata; try { header = JSON.parse(header_json); metadata = JSON.parse(metadata_json); content = JSON.parse(content_json); return new Message(header, metadata, content); } catch (error1) { e = error1; logger.error("Failure parsing json " + e + " " + header_json + " " + metadata_json + " " + content_json, e); throw e; } }; Message.create_header = function(msgtype, options) { var header; header = { 'msgid': _.uniqueId(), 'msgtype': msgtype }; return _.extend(header, options); }; Message.create = function(msgtype, header_options, content) { var header; if (content == null) { content = {}; } header = Message.create_header(msgtype, header_options); return new Message(header, {}, content); }; Message.prototype.send = function(socket) { var content_json, e, error1, header_json, metadata_json; try { header_json = JSON.stringify(this.header); metadata_json = JSON.stringify(this.metadata); content_json = JSON.stringify(this.content); socket.send(header_json); socket.send(metadata_json); return socket.send(content_json); } catch (error1) { e = error1; logger.error("Error sending ", this, e); throw e; } }; Message.prototype.complete = function() { if ((this.header != null) && (this.metadata != null) && (this.content != null)) { if ('num_buffers' in this.header) { return this.buffers.length === this.header['num_buffers']; } else { return true; } } else { return false; } }; Message.prototype.add_buffer = function(buffer) { return this.buffers.push(buffer); }; Message.prototype._header_field = function(field) { if (field in this.header) { return this.header[field]; } else { return null; } }; Message.prototype.msgid = function() { return this._header_field('msgid'); }; Message.prototype.msgtype = function() { return this._header_field('msgtype'); }; Message.prototype.sessid = function() { return this._header_field('sessid'); }; Message.prototype.reqid = function() { return this._header_field('reqid'); }; Message.prototype.problem = function() { if (!('msgid' in this.header)) { return "No msgid in header"; } else if (!('msgtype' in this.header)) { return "No msgtype in header"; } else { return null; } }; return Message; })(); message_handlers = { 'PATCH-DOC': function(connection, message) { return connection._for_session(function(session) { return session._handle_patch(message); }); }, 'OK': function(connection, message) { return logger.debug("Unhandled OK reply to " + (message.reqid())); }, 'ERROR': function(connection, message) { return logger.error("Unhandled ERROR reply to " + (message.reqid()) + ": " + message.content['text']); } }; ClientConnection = (function() { ClientConnection._connection_count = 0; function ClientConnection(url1, id, _on_have_session_hook, _on_closed_permanently_hook) { this.url = url1; this.id = id; this._on_have_session_hook = _on_have_session_hook; this._on_closed_permanently_hook = _on_closed_permanently_hook; this._number = ClientConnection._connection_count; ClientConnection._connection_count = this._number + 1; if (this.url == null) { this.url = DEFAULT_SERVER_WEBSOCKET_URL; } if (this.id == null) { this.id = DEFAULT_SESSION_ID; } logger.debug("Creating websocket " + this._number + " to '" + this.url + "' session '" + this.id + "'"); this.socket = null; this.closed_permanently = false; this._fragments = []; this._partial = null; this._current_handler = null; this._pending_ack = null; this._pending_replies = {}; this.session = null; } ClientConnection.prototype._for_session = function(f) { if (this.session !== null) { return f(this.session); } }; ClientConnection.prototype.connect = function() { var error, error1, versioned_url; if (this.closed_permanently) { return Promise.reject(new Error("Cannot connect() a closed ClientConnection")); } if (this.socket != null) { return Promise.reject(new Error("Already connected")); } this._fragments = []; this._partial = null; this._pending_replies = {}; this._current_handler = null; try { versioned_url = this.url + "?bokeh-protocol-version=1.0&bokeh-session-id=" + this.id; if (window.MozWebSocket != null) { this.socket = new MozWebSocket(versioned_url); } else { this.socket = new WebSocket(versioned_url); } return new Promise((function(_this) { return function(resolve, reject) { _this.socket.binarytype = "arraybuffer"; _this.socket.onopen = function() { return _this._on_open(resolve, reject); }; _this.socket.onmessage = function(event) { return _this._on_message(event); }; _this.socket.onclose = function(event) { return _this._on_close(event); }; return _this.socket.onerror = function() { return _this._on_error(reject); }; }; })(this)); } catch (error1) { error = error1; logger.error("websocket creation failed to url: " + this.url); logger.error(" - " + error); return Promise.reject(error); } }; ClientConnection.prototype.close = function() { if (!this.closed_permanently) { logger.debug("Permanently closing websocket connection " + this._number); this.closed_permanently = true; if (this.socket != null) { this.socket.close(1000, "close method called on ClientConnection " + this._number); } this._for_session(function(session) { return session._connection_closed(); }); if (this._on_closed_permanently_hook != null) { this._on_closed_permanently_hook(); return this._on_closed_permanently_hook = null; } } }; ClientConnection.prototype._schedule_reconnect = function(milliseconds) { var retry; retry = (function(_this) { return function() { if (true || _this.closed_permanently) { if (!_this.closed_permanently) { logger.info("Websocket connection " + _this._number + " disconnected, will not attempt to reconnect"); } } else { logger.debug("Attempting to reconnect websocket " + _this._number); return _this.connect(); } }; })(this); return setTimeout(retry, milliseconds); }; ClientConnection.prototype.send = function(message) { var e, error1; try { if (this.socket === null) { throw new Error("not connected so cannot send " + message); } return message.send(this.socket); } catch (error1) { e = error1; return logger.error("Error sending message ", e, message); } }; ClientConnection.prototype.send_with_reply = function(message) { var promise; promise = new Promise((function(_this) { return function(resolve, reject) { _this._pending_replies[message.msgid()] = [resolve, reject]; return _this.send(message); }; })(this)); return promise.then(function(message) { if (message.msgtype() === 'ERROR') { throw new Error("Error reply " + message.content['text']); } else { return message; } }, function(error) { throw error; }); }; ClientConnection.prototype._pull_doc_json = function() { var message, promise; message = Message.create('PULL-DOC-REQ', {}); promise = this.send_with_reply(message); return promise.then(function(reply) { if (!('doc' in reply.content)) { throw new Error("No 'doc' field in PULL-DOC-REPLY"); } return reply.content['doc']; }, function(error) { throw error; }); }; ClientConnection.prototype._repull_session_doc = function() { if (this.session === null) { logger.debug("Pulling session for first time"); } else { logger.debug("Repulling session"); } return this._pull_doc_json().then((function(_this) { return function(doc_json) { var document, patch, patch_message; if (_this.session === null) { if (_this.closed_permanently) { return logger.debug("Got new document after connection was already closed"); } else { document = Document.from_json(doc_json); patch = Document._compute_patch_since_json(doc_json, document); if (patch.events.length > 0) { logger.debug("Sending " + patch.events.length + " changes from model construction back to server"); patch_message = Message.create('PATCH-DOC', {}, patch); _this.send(patch_message); } _this.session = new ClientSession(_this, document, _this.id); logger.debug("Created a new session from new pulled doc"); if (_this._on_have_session_hook != null) { _this._on_have_session_hook(_this.session); return _this._on_have_session_hook = null; } } } else { _this.session.document.replace_with_json(doc_json); return logger.debug("Updated existing session with new pulled doc"); } }; })(this), function(error) { throw error; })["catch"](function(error) { if (console.trace != null) { console.trace(error); } return logger.error("Failed to repull session " + error); }); }; ClientConnection.prototype._on_open = function(resolve, reject) { logger.info("Websocket connection " + this._number + " is now open"); this._pending_ack = [resolve, reject]; return this._current_handler = (function(_this) { return function(message) { return _this._awaiting_ack_handler(message); }; })(this); }; ClientConnection.prototype._on_message = function(event) { var e, error1; try { return this._on_message_unchecked(event); } catch (error1) { e = error1; return logger.error("Error handling message: " + e + ", " + event); } }; ClientConnection.prototype._on_message_unchecked = function(event) { var msg, problem; if (this._current_handler == null) { logger.error("got a message but haven't set _current_handler"); } if (event.data instanceof ArrayBuffer) { if ((this._partial != null) && !this._partial.complete()) { this._partial.add_buffer(event.data); } else { this._close_bad_protocol("Got binary from websocket but we were expecting text"); } } else if (this._partial != null) { this._close_bad_protocol("Got text from websocket but we were expecting binary"); } else { this._fragments.push(event.data); if (this._fragments.length === 3) { this._partial = Message.assemble(this._fragments[0], this._fragments[1], this._fragments[2]); this._fragments = []; problem = this._partial.problem(); if (problem !== null) { this._close_bad_protocol(problem); } } } if ((this._partial != null) && this._partial.complete()) { msg = this._partial; this._partial = null; return this._current_handler(msg); } }; ClientConnection.prototype._on_close = function(event) { var pop_pending, promise_funcs; logger.info("Lost websocket " + this._number + " connection, " + event.code + " (" + event.reason + ")"); this.socket = null; if (this._pending_ack != null) { this._pending_ack[1](new Error("Lost websocket connection, " + event.code + " (" + event.reason + ")")); this._pending_ack = null; } pop_pending = function() { var promise_funcs, ref1, reqid; ref1 = this._pending_replies; for (reqid in ref1) { promise_funcs = ref1[reqid]; delete this._pending_replies[reqid]; return promise_funcs; } return null; }; promise_funcs = pop_pending(); while (promise_funcs !== null) { promise_funcs[1]("Disconnected"); promise_funcs = pop_pending(); } if (!this.closed_permanently) { return this._schedule_reconnect(2000); } }; ClientConnection.prototype._on_error = function(reject) { logger.debug("Websocket error on socket " + this._number); return reject(new Error("Could not open websocket")); }; ClientConnection.prototype._close_bad_protocol = function(detail) { logger.error("Closing connection: " + detail); if (this.socket != null) { return this.socket.close(1002, detail); } }; ClientConnection.prototype._awaiting_ack_handler = function(message) { if (message.msgtype() === "ACK") { this._current_handler = (function(_this) { return function(message) { return _this._steady_state_handler(message); }; })(this); this._repull_session_doc(); if (this._pending_ack != null) { this._pending_ack[0](this); return this._pending_ack = null; } } else { return this._close_bad_protocol("First message was not an ACK"); } }; ClientConnection.prototype._steady_state_handler = function(message) { var promise_funcs; if (message.reqid() in this._pending_replies) { promise_funcs = this._pending_replies[message.reqid()]; delete this._pending_replies[message.reqid()]; return promise_funcs[0](message); } else if (message.msgtype() in message_handlers) { return message_handlers[message.msgtype()](this, message); } else { return logger.debug("Doing nothing with message " + (message.msgtype())); } }; return ClientConnection; })(); ClientSession = (function() { function ClientSession(_connection, document1, id) { this._connection = _connection; this.document = document1; this.id = id; this._current_patch = null; this.document_listener = (function(_this) { return function(event) { return _this._document_changed(event); }; })(this); this.document.on_change(this.document_listener); } ClientSession.prototype.close = function() { return this._connection.close(); }; ClientSession.prototype._connection_closed = function() { return this.document.remove_on_change(this.document_listener); }; ClientSession.prototype.request_server_info = function() { var message, promise; message = Message.create('SERVER-INFO-REQ', {}); promise = this._connection.send_with_reply(message); return promise.then(function(reply) { return reply.content; }); }; ClientSession.prototype.force_roundtrip = function() { return this.request_server_info().then(function(ignored) { return void 0; }); }; ClientSession.prototype._should_suppress_on_change = function(patch, event) { var event_json, i, j, k, l, len, len1, len2, len3, patch_new, ref1, ref2, ref3, ref4; if (event instanceof ModelChangedEvent) { ref1 = patch.content['events']; for (i = 0, len = ref1.length; i < len; i++) { event_json = ref1[i]; if (event_json['kind'] === 'ModelChanged' && event_json['model']['id'] === event.model.id && event_json['attr'] === event.attr) { patch_new = event_json['new']; if (event.new_ instanceof HasProps) { if (typeof patch_new === 'object' && 'id' in patch_new && patch_new['id'] === event.new_.id) { return true; } } else if (_.isEqual(patch_new, event.new_)) { return true; } } } } else if (event instanceof RootAddedEvent) { ref2 = patch.content['events']; for (j = 0, len1 = ref2.length; j < len1; j++) { event_json = ref2[j]; if (event_json['kind'] === 'RootAdded' && event_json['model']['id'] === event.model.id) { return true; } } } else if (event instanceof RootRemovedEvent) { ref3 = patch.content['events']; for (k = 0, len2 = ref3.length; k < len2; k++) { event_json = ref3[k]; if (event_json['kind'] === 'RootRemoved' && event_json['model']['id'] === event.model.id) { return true; } } } else if (event instanceof TitleChangedEvent) { ref4 = patch.content['events']; for (l = 0, len3 = ref4.length; l < len3; l++) { event_json = ref4[l]; if (event_json['kind'] === 'TitleChanged' && event_json['title'] === event.title) { return true; } } } return false; }; ClientSession.prototype._document_changed = function(event) { var patch; if ((this._current_patch != null) && this._should_suppress_on_change(this._current_patch, event)) { return; } if (event instanceof ModelChangedEvent && !(event.attr in event.model.serializable_attributes())) { return; } patch = Message.create('PATCH-DOC', {}, this.document.create_json_patch([event])); return this._connection.send(patch); }; ClientSession.prototype._handle_patch = function(message) { this._current_patch = message; try { return this.document.apply_json_patch(message.content); } finally { this._current_patch = null; } }; return ClientSession; })(); pull_session = function(url, session_id) { var connection, promise, rejecter; rejecter = null; connection = null; promise = new Promise(function(resolve, reject) { connection = new ClientConnection(url, session_id, function(session) { var e, error1; try { return resolve(session); } catch (error1) { e = error1; logger.error("Promise handler threw an error, closing session " + error); session.close(); throw e; } }, function() { return reject(new Error("Connection was closed before we successfully pulled a session")); }); return connection.connect().then(function(whatever) {}, function(error) { logger.error("Failed to connect to Bokeh server " + error); throw error; }); }); promise.close = function() { return connection.close(); }; return promise; }; module.exports = { pull_session: pull_session, DEFAULT_SERVER_WEBSOCKET_URL: DEFAULT_SERVER_WEBSOCKET_URL, DEFAULT_SESSION_ID: DEFAULT_SESSION_ID }; },{"./core/has_props":"core/has_props","./core/logging":"core/logging","./document":"document","es6-promise":"es6-promise","underscore":"underscore"}],"common/build_views":[function(require,module,exports){ var _, build_views, jQueryUIPrefixer; _ = require("underscore"); build_views = function(view_storage, view_models, options, view_types) { var created_views, i, i_model, j, key, len, len1, model, newmodels, to_remove, view_specific_option; if (view_types == null) { view_types = []; } created_views = []; newmodels = _.filter(view_models, function(x) { return !_.has(view_storage, x.id); }); for (i_model = i = 0, len = newmodels.length; i < len; i_model = ++i) { model = newmodels[i_model]; view_specific_option = _.extend({}, options, { 'model': model }); if (i_model < view_types.length) { view_storage[model.id] = new view_types[i_model](view_specific_option); } else { view_storage[model.id] = new model.default_view(view_specific_option); } view_storage[model.id].$el.find("*[class*='ui-']").each(function(idx, el) { return el.className = jQueryUIPrefixer(el); }); created_views.push(view_storage[model.id]); } to_remove = _.difference(_.keys(view_storage), _.pluck(view_models, 'id')); for (j = 0, len1 = to_remove.length; j < len1; j++) { key = to_remove[j]; view_storage[key].remove(); delete view_storage[key]; } return created_views; }; jQueryUIPrefixer = function(el) { var classList, prefixedClassList; if (el.className == null) { return; } classList = el.className.split(" "); prefixedClassList = _.map(classList, function(a) { a = a.trim(); if (a.indexOf("ui-") === 0) { return "bk-" + a; } else { return a; } }); return prefixedClassList.join(" "); }; build_views.jQueryUIPrefixer = jQueryUIPrefixer; module.exports = build_views = build_views; },{"underscore":"underscore"}],"common/hittest":[function(require,module,exports){ var HitTestResult, check_2_segments_intersect, create_hit_test_result, dist_2_pts, dist_to_segment, dist_to_segment_squared, nullreturner, point_in_poly, sqr, validate_bbox_coords; point_in_poly = function(x, y, px, py) { var i, inside, j, ref, x1, x2, y1, y2; inside = false; x1 = px[px.length - 1]; y1 = py[py.length - 1]; for (i = j = 0, ref = px.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { x2 = px[i]; y2 = py[i]; if ((y1 < y) !== (y2 < y)) { if (x1 + (y - y1) / (y2 - y1) * (x2 - x1) < x) { inside = !inside; } } x1 = x2; y1 = y2; } return inside; }; nullreturner = function() { return null; }; HitTestResult = (function() { function HitTestResult() { this['0d'] = { glyph: null, get_view: nullreturner, indices: [] }; this['1d'] = { indices: [] }; this['2d'] = {}; } Object.defineProperty(HitTestResult.prototype, '_0d', { get: function() { return this['0d']; } }); Object.defineProperty(HitTestResult.prototype, '_1d', { get: function() { return this['1d']; } }); Object.defineProperty(HitTestResult.prototype, '_2d', { get: function() { return this['2d']; } }); HitTestResult.prototype.is_empty = function() { return this._0d.indices.length === 0 && this._1d.indices.length === 0; }; return HitTestResult; })(); create_hit_test_result = function() { return new HitTestResult(); }; validate_bbox_coords = function(arg, arg1) { var ref, ref1, x0, x1, y0, y1; x0 = arg[0], x1 = arg[1]; y0 = arg1[0], y1 = arg1[1]; if (x0 > x1) { ref = [x1, x0], x0 = ref[0], x1 = ref[1]; } if (y0 > y1) { ref1 = [y1, y0], y0 = ref1[0], y1 = ref1[1]; } return { minX: x0, minY: y0, maxX: x1, maxY: y1 }; }; sqr = function(x) { return x * x; }; dist_2_pts = function(vx, vy, wx, wy) { return sqr(vx - wx) + sqr(vy - wy); }; dist_to_segment_squared = function(p, v, w) { var l2, t; l2 = dist_2_pts(v.x, v.y, w.x, w.y); if (l2 === 0) { return dist_2_pts(p.x, p.y, v.x, v.y); } t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; if (t < 0) { return dist_2_pts(p.x, p.y, v.x, v.y); } if (t > 1) { return dist_2_pts(p.x, p.y, w.x, w.y); } return dist_2_pts(p.x, p.y, v.x + t * (w.x - v.x), v.y + t * (w.y - v.y)); }; dist_to_segment = function(p, v, w) { return Math.sqrt(dist_to_segment_squared(p, v, w)); }; check_2_segments_intersect = function(l0_x0, l0_y0, l0_x1, l0_y1, l1_x0, l1_y0, l1_x1, l1_y1) { /* Check if 2 segments (l0 and l1) intersect. Returns a structure with the following attributes: * hit (boolean): whether the 2 segments intersect * x (float): x coordinate of the intersection point * y (float): y coordinate of the intersection point */ var a, b, den, num1, num2, x, y; den = ((l1_y1 - l1_y0) * (l0_x1 - l0_x0)) - ((l1_x1 - l1_x0) * (l0_y1 - l0_y0)); if (den === 0) { return { hit: false, x: null, y: null }; } else { a = l0_y0 - l1_y0; b = l0_x0 - l1_x0; num1 = ((l1_x1 - l1_x0) * a) - ((l1_y1 - l1_y0) * b); num2 = ((l0_x1 - l0_x0) * a) - ((l0_y1 - l0_y0) * b); a = num1 / den; b = num2 / den; x = l0_x0 + (a * (l0_x1 - l0_x0)); y = l0_y0 + (a * (l0_y1 - l0_y0)); return { hit: (a > 0 && a < 1) && (b > 0 && b < 1), x: x, y: y }; } }; module.exports = { point_in_poly: point_in_poly, HitTestResult: HitTestResult, create_hit_test_result: create_hit_test_result, dist_2_pts: dist_2_pts, dist_to_segment: dist_to_segment, check_2_segments_intersect: check_2_segments_intersect, validate_bbox_coords: validate_bbox_coords }; },{}],"common/models":[function(require,module,exports){ module.exports = { SelectionManager: require('./selection_manager'), Selector: require('./selector'), ToolEvents: require('./tool_events'), Arrow: require('../models/annotations/arrow'), BoxAnnotation: require('../models/annotations/box_annotation'), ColorBar: require('../models/annotations/color_bar'), Label: require('../models/annotations/label'), LabelSet: require('../models/annotations/label_set'), Legend: require('../models/annotations/legend'), PolyAnnotation: require('../models/annotations/poly_annotation'), Span: require('../models/annotations/span'), Title: require('../models/annotations/title'), Tooltip: require('../models/annotations/tooltip'), OpenHead: require('../models/annotations/arrow_head').OpenHead, NormalHead: require('../models/annotations/arrow_head').NormalHead, VeeHead: require('../models/annotations/arrow_head').VeeHead, CategoricalAxis: require('../models/axes/categorical_axis'), DatetimeAxis: require('../models/axes/datetime_axis'), LinearAxis: require('../models/axes/linear_axis'), LogAxis: require('../models/axes/log_axis'), CustomJS: require('../models/callbacks/customjs'), OpenURL: require('../models/callbacks/open_url'), Canvas: require('../models/canvas/canvas'), CartesianFrame: require('../models/canvas/cartesian_frame'), BasicTickFormatter: require('../models/formatters/basic_tick_formatter'), CategoricalTickFormatter: require('../models/formatters/categorical_tick_formatter'), DatetimeTickFormatter: require('../models/formatters/datetime_tick_formatter'), LogTickFormatter: require('../models/formatters/log_tick_formatter'), FuncTickFormatter: require('../models/formatters/func_tick_formatter'), NumeralTickFormatter: require('../models/formatters/numeral_tick_formatter'), PrintfTickFormatter: require('../models/formatters/printf_tick_formatter'), AnnularWedge: require('../models/glyphs/annular_wedge'), Annulus: require('../models/glyphs/annulus'), Arc: require('../models/glyphs/arc'), Bezier: require('../models/glyphs/bezier'), Circle: require('../models/glyphs/circle'), Ellipse: require('../models/glyphs/ellipse'), Gear: require('../models/glyphs/gear'), HBar: require('../models/glyphs/hbar'), Image: require('../models/glyphs/image'), ImageRGBA: require('../models/glyphs/image_rgba'), ImageURL: require('../models/glyphs/image_url'), Line: require('../models/glyphs/line'), MultiLine: require('../models/glyphs/multi_line'), Oval: require('../models/glyphs/oval'), Patch: require('../models/glyphs/patch'), Patches: require('../models/glyphs/patches'), Quad: require('../models/glyphs/quad'), Quadratic: require('../models/glyphs/quadratic'), Ray: require('../models/glyphs/ray'), Rect: require('../models/glyphs/rect'), Segment: require('../models/glyphs/segment'), Text: require('../models/glyphs/text'), VBar: require('../models/glyphs/vbar'), Wedge: require('../models/glyphs/wedge'), Grid: require('../models/grids/grid'), Column: require('../models/layouts/column'), Row: require('../models/layouts/row'), Spacer: require('../models/layouts/spacer'), WidgetBox: require('../models/layouts/widget_box'), CategoricalMapper: require('../models/mappers/categorical_mapper'), GridMapper: require('../models/mappers/grid_mapper'), LinearColorMapper: require('../models/mappers/linear_color_mapper'), LinearMapper: require('../models/mappers/linear_mapper'), LogColorMapper: require('../models/mappers/log_color_mapper'), LogMapper: require('../models/mappers/log_mapper'), Transform: require('../models/transforms/transform'), Jitter: require('../models/transforms/jitter'), Interpolator: require('../models/transforms/interpolator'), LinearInterpolator: require('../models/transforms/linear_interpolator'), StepInterpolator: require('../models/transforms/step_interpolator'), Asterisk: require('../models/markers/index').Asterisk, CircleCross: require('../models/markers/index').CircleCross, CircleX: require('../models/markers/index').CircleX, Cross: require('../models/markers/index').Cross, Diamond: require('../models/markers/index').Diamond, DiamondCross: require('../models/markers/index').DiamondCross, InvertedTriangle: require('../models/markers/index').InvertedTriangle, Square: require('../models/markers/index').Square, SquareCross: require('../models/markers/index').SquareCross, SquareX: require('../models/markers/index').SquareX, Triangle: require('../models/markers/index').Triangle, X: require('../models/markers/index').X, Plot: require('../models/plots/plot'), GMapPlot: require('../models/plots/gmap_plot'), DataRange1d: require('../models/ranges/data_range1d'), FactorRange: require('../models/ranges/factor_range'), Range1d: require('../models/ranges/range1d'), GlyphRenderer: require('../models/renderers/glyph_renderer'), AjaxDataSource: require('../models/sources/ajax_data_source'), ColumnDataSource: require('../models/sources/column_data_source'), GeoJSONDataSource: require('../models/sources/geojson_data_source'), AdaptiveTicker: require('../models/tickers/adaptive_ticker'), BasicTicker: require('../models/tickers/basic_ticker'), CategoricalTicker: require('../models/tickers/categorical_ticker'), CompositeTicker: require('../models/tickers/composite_ticker'), ContinuousTicker: require('../models/tickers/continuous_ticker'), DatetimeTicker: require('../models/tickers/datetime_ticker'), DaysTicker: require('../models/tickers/days_ticker'), FixedTicker: require('../models/tickers/fixed_ticker'), LogTicker: require('../models/tickers/log_ticker'), MonthsTicker: require('../models/tickers/months_ticker'), SingleIntervalTicker: require('../models/tickers/single_interval_ticker'), YearsTicker: require('../models/tickers/years_ticker'), TileRenderer: require('../models/tiles/tile_renderer'), TileSource: require('../models/tiles/tile_source'), TMSTileSource: require('../models/tiles/tms_tile_source'), WMTSTileSource: require('../models/tiles/wmts_tile_source'), QUADKEYTileSource: require('../models/tiles/quadkey_tile_source'), BBoxTileSource: require('../models/tiles/bbox_tile_source'), DynamicImageRenderer: require('../models/tiles/dynamic_image_renderer'), ImageSource: require('../models/tiles/image_source'), Toolbar: require('../models/tools/toolbar'), ToolbarBox: require('../models/tools/toolbar_box'), ButtonTool: require('../models/tools/button_tool'), ActionTool: require('../models/tools/actions/action_tool'), SaveTool: require('../models/tools/actions/save_tool'), UndoTool: require('../models/tools/actions/undo_tool'), RedoTool: require('../models/tools/actions/redo_tool'), ResetTool: require('../models/tools/actions/reset_tool'), HelpTool: require('../models/tools/actions/help_tool'), BoxSelectTool: require('../models/tools/gestures/box_select_tool'), BoxZoomTool: require('../models/tools/gestures/box_zoom_tool'), GestureTool: require('../models/tools/gestures/gesture_tool'), LassoSelectTool: require('../models/tools/gestures/lasso_select_tool'), PanTool: require('../models/tools/gestures/pan_tool'), PolySelectTool: require('../models/tools/gestures/poly_select_tool'), SelectTool: require('../models/tools/gestures/select_tool'), ResizeTool: require('../models/tools/gestures/resize_tool'), TapTool: require('../models/tools/gestures/tap_tool'), WheelZoomTool: require('../models/tools/gestures/wheel_zoom_tool'), CrosshairTool: require('../models/tools/inspectors/crosshair_tool'), HoverTool: require('../models/tools/inspectors/hover_tool'), InspectTool: require('../models/tools/inspectors/inspect_tool') }; },{"../models/annotations/arrow":"models/annotations/arrow","../models/annotations/arrow_head":"models/annotations/arrow_head","../models/annotations/box_annotation":"models/annotations/box_annotation","../models/annotations/color_bar":"models/annotations/color_bar","../models/annotations/label":"models/annotations/label","../models/annotations/label_set":"models/annotations/label_set","../models/annotations/legend":"models/annotations/legend","../models/annotations/poly_annotation":"models/annotations/poly_annotation","../models/annotations/span":"models/annotations/span","../models/annotations/title":"models/annotations/title","../models/annotations/tooltip":"models/annotations/tooltip","../models/axes/categorical_axis":"models/axes/categorical_axis","../models/axes/datetime_axis":"models/axes/datetime_axis","../models/axes/linear_axis":"models/axes/linear_axis","../models/axes/log_axis":"models/axes/log_axis","../models/callbacks/customjs":"models/callbacks/customjs","../models/callbacks/open_url":"models/callbacks/open_url","../models/canvas/canvas":"models/canvas/canvas","../models/canvas/cartesian_frame":"models/canvas/cartesian_frame","../models/formatters/basic_tick_formatter":"models/formatters/basic_tick_formatter","../models/formatters/categorical_tick_formatter":"models/formatters/categorical_tick_formatter","../models/formatters/datetime_tick_formatter":"models/formatters/datetime_tick_formatter","../models/formatters/func_tick_formatter":"models/formatters/func_tick_formatter","../models/formatters/log_tick_formatter":"models/formatters/log_tick_formatter","../models/formatters/numeral_tick_formatter":"models/formatters/numeral_tick_formatter","../models/formatters/printf_tick_formatter":"models/formatters/printf_tick_formatter","../models/glyphs/annular_wedge":"models/glyphs/annular_wedge","../models/glyphs/annulus":"models/glyphs/annulus","../models/glyphs/arc":"models/glyphs/arc","../models/glyphs/bezier":"models/glyphs/bezier","../models/glyphs/circle":"models/glyphs/circle","../models/glyphs/ellipse":"models/glyphs/ellipse","../models/glyphs/gear":"models/glyphs/gear","../models/glyphs/hbar":"models/glyphs/hbar","../models/glyphs/image":"models/glyphs/image","../models/glyphs/image_rgba":"models/glyphs/image_rgba","../models/glyphs/image_url":"models/glyphs/image_url","../models/glyphs/line":"models/glyphs/line","../models/glyphs/multi_line":"models/glyphs/multi_line","../models/glyphs/oval":"models/glyphs/oval","../models/glyphs/patch":"models/glyphs/patch","../models/glyphs/patches":"models/glyphs/patches","../models/glyphs/quad":"models/glyphs/quad","../models/glyphs/quadratic":"models/glyphs/quadratic","../models/glyphs/ray":"models/glyphs/ray","../models/glyphs/rect":"models/glyphs/rect","../models/glyphs/segment":"models/glyphs/segment","../models/glyphs/text":"models/glyphs/text","../models/glyphs/vbar":"models/glyphs/vbar","../models/glyphs/wedge":"models/glyphs/wedge","../models/grids/grid":"models/grids/grid","../models/layouts/column":"models/layouts/column","../models/layouts/row":"models/layouts/row","../models/layouts/spacer":"models/layouts/spacer","../models/layouts/widget_box":"models/layouts/widget_box","../models/mappers/categorical_mapper":"models/mappers/categorical_mapper","../models/mappers/grid_mapper":"models/mappers/grid_mapper","../models/mappers/linear_color_mapper":"models/mappers/linear_color_mapper","../models/mappers/linear_mapper":"models/mappers/linear_mapper","../models/mappers/log_color_mapper":"models/mappers/log_color_mapper","../models/mappers/log_mapper":"models/mappers/log_mapper","../models/markers/index":"models/markers/index","../models/plots/gmap_plot":"models/plots/gmap_plot","../models/plots/plot":"models/plots/plot","../models/ranges/data_range1d":"models/ranges/data_range1d","../models/ranges/factor_range":"models/ranges/factor_range","../models/ranges/range1d":"models/ranges/range1d","../models/renderers/glyph_renderer":"models/renderers/glyph_renderer","../models/sources/ajax_data_source":"models/sources/ajax_data_source","../models/sources/column_data_source":"models/sources/column_data_source","../models/sources/geojson_data_source":"models/sources/geojson_data_source","../models/tickers/adaptive_ticker":"models/tickers/adaptive_ticker","../models/tickers/basic_ticker":"models/tickers/basic_ticker","../models/tickers/categorical_ticker":"models/tickers/categorical_ticker","../models/tickers/composite_ticker":"models/tickers/composite_ticker","../models/tickers/continuous_ticker":"models/tickers/continuous_ticker","../models/tickers/datetime_ticker":"models/tickers/datetime_ticker","../models/tickers/days_ticker":"models/tickers/days_ticker","../models/tickers/fixed_ticker":"models/tickers/fixed_ticker","../models/tickers/log_ticker":"models/tickers/log_ticker","../models/tickers/months_ticker":"models/tickers/months_ticker","../models/tickers/single_interval_ticker":"models/tickers/single_interval_ticker","../models/tickers/years_ticker":"models/tickers/years_ticker","../models/tiles/bbox_tile_source":"models/tiles/bbox_tile_source","../models/tiles/dynamic_image_renderer":"models/tiles/dynamic_image_renderer","../models/tiles/image_source":"models/tiles/image_source","../models/tiles/quadkey_tile_source":"models/tiles/quadkey_tile_source","../models/tiles/tile_renderer":"models/tiles/tile_renderer","../models/tiles/tile_source":"models/tiles/tile_source","../models/tiles/tms_tile_source":"models/tiles/tms_tile_source","../models/tiles/wmts_tile_source":"models/tiles/wmts_tile_source","../models/tools/actions/action_tool":"models/tools/actions/action_tool","../models/tools/actions/help_tool":"models/tools/actions/help_tool","../models/tools/actions/redo_tool":"models/tools/actions/redo_tool","../models/tools/actions/reset_tool":"models/tools/actions/reset_tool","../models/tools/actions/save_tool":"models/tools/actions/save_tool","../models/tools/actions/undo_tool":"models/tools/actions/undo_tool","../models/tools/button_tool":"models/tools/button_tool","../models/tools/gestures/box_select_tool":"models/tools/gestures/box_select_tool","../models/tools/gestures/box_zoom_tool":"models/tools/gestures/box_zoom_tool","../models/tools/gestures/gesture_tool":"models/tools/gestures/gesture_tool","../models/tools/gestures/lasso_select_tool":"models/tools/gestures/lasso_select_tool","../models/tools/gestures/pan_tool":"models/tools/gestures/pan_tool","../models/tools/gestures/poly_select_tool":"models/tools/gestures/poly_select_tool","../models/tools/gestures/resize_tool":"models/tools/gestures/resize_tool","../models/tools/gestures/select_tool":"models/tools/gestures/select_tool","../models/tools/gestures/tap_tool":"models/tools/gestures/tap_tool","../models/tools/gestures/wheel_zoom_tool":"models/tools/gestures/wheel_zoom_tool","../models/tools/inspectors/crosshair_tool":"models/tools/inspectors/crosshair_tool","../models/tools/inspectors/hover_tool":"models/tools/inspectors/hover_tool","../models/tools/inspectors/inspect_tool":"models/tools/inspectors/inspect_tool","../models/tools/toolbar":"models/tools/toolbar","../models/tools/toolbar_box":"models/tools/toolbar_box","../models/transforms/interpolator":"models/transforms/interpolator","../models/transforms/jitter":"models/transforms/jitter","../models/transforms/linear_interpolator":"models/transforms/linear_interpolator","../models/transforms/step_interpolator":"models/transforms/step_interpolator","../models/transforms/transform":"models/transforms/transform","./selection_manager":"common/selection_manager","./selector":"common/selector","./tool_events":"common/tool_events"}],"common/selection_manager":[function(require,module,exports){ var HasProps, SelectionManager, Selector, _, hittest, logger, p, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; _ = require("underscore"); HasProps = require("../core/has_props"); logger = require("../core/logging").logger; Selector = require("./selector"); hittest = require("./hittest"); p = require("../core/properties"); SelectionManager = (function(superClass) { extend(SelectionManager, superClass); function SelectionManager() { return SelectionManager.__super__.constructor.apply(this, arguments); } SelectionManager.prototype.type = 'SelectionManager'; SelectionManager.internal({ source: [p.Any] }); SelectionManager.prototype.initialize = function(attrs, options) { SelectionManager.__super__.initialize.call(this, attrs, options); this.selectors = {}; this.inspectors = {}; return this.last_inspection_was_empty = {}; }; SelectionManager.prototype.select = function(tool, renderer_view, geometry, final, append) { var indices, selector, source; if (append == null) { append = false; } source = this.get('source'); if (source !== renderer_view.mget('data_source')) { logger.warn('select called with mis-matched data sources'); } indices = renderer_view.hit_test(geometry); if (indices != null) { selector = this._get_selector(renderer_view); selector.update(indices, final, append); this.get('source').set({ "selected": selector.get('indices') }); source.trigger('select'); source.trigger('select-' + renderer_view.mget('id')); return !indices.is_empty(); } else { return false; } }; SelectionManager.prototype.inspect = function(tool, renderer_view, geometry, data) { var indices, inspector, r_id, source; source = this.get('source'); if (source !== renderer_view.mget('data_source')) { logger.warn('inspect called with mis-matched data sources'); } indices = renderer_view.hit_test(geometry); if (indices != null) { r_id = renderer_view.model.id; if (indices.is_empty()) { if (this.last_inspection_was_empty[r_id] == null) { this.last_inspection_was_empty[r_id] = false; } if (this.last_inspection_was_empty[r_id]) { return; } else { this.last_inspection_was_empty[r_id] = true; } } else { this.last_inspection_was_empty[r_id] = false; } inspector = this._get_inspector(renderer_view); inspector.update(indices, true, false, true); this.get('source').set({ "inspected": inspector.get('indices') }, { "silent": true }); source.trigger('inspect', indices, tool, renderer_view, source, data); source.trigger("inspect" + (renderer_view.mget('id')), indices, tool, renderer_view, source, data); return !indices.is_empty(); } else { return false; } }; SelectionManager.prototype.clear = function(rview) { var k, ref, s, selector; if (rview != null) { selector = this._get_selector(rview); selector.clear(); } else { ref = this.selectors; for (k in ref) { s = ref[k]; s.clear(); } } return this.get('source').set({ "selected": hittest.create_hit_test_result() }); }; SelectionManager.prototype._get_selector = function(rview) { _.setdefault(this.selectors, rview.model.id, new Selector()); return this.selectors[rview.model.id]; }; SelectionManager.prototype._get_inspector = function(rview) { _.setdefault(this.inspectors, rview.model.id, new Selector()); return this.inspectors[rview.model.id]; }; return SelectionManager; })(HasProps); module.exports = SelectionManager; },{"../core/has_props":"core/has_props","../core/logging":"core/logging","../core/properties":"core/properties","./hittest":"common/hittest","./selector":"common/selector","underscore":"underscore"}],"common/selector":[function(require,module,exports){ var HasProps, Selector, _, hittest, logger, p, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; _ = require("underscore"); HasProps = require("../core/has_props"); hittest = require("./hittest"); logger = require("../core/logging").logger; p = require("../core/properties"); Selector = (function(superClass) { extend(Selector, superClass); function Selector() { return Selector.__super__.constructor.apply(this, arguments); } Selector.prototype.type = 'Selector'; Selector.prototype.update = function(indices, final, append, silent) { if (silent == null) { silent = false; } this.set('timestamp', new Date(), { silent: silent }); this.set('final', final, { silent: silent }); if (append) { indices['0d'].indices = _.union(this.get('indices')['0d'].indices, indices['0d'].indices); indices['0d'].glyph = this.get('indices')['0d'].glyph || indices['0d'].glyph; indices['1d'].indices = _.union(this.get('indices')['1d'].indices, indices['1d'].indices); in